refactor(extensions): simplify lib helpers, tool registration and kit-doctor
Behavior-preserving cleanups: - extract shared resolveBaseUrl helper for jira/confluence base-URL logic - extract shared registerTool helper; port jira/gitlab/confluence tools to it - make scanSecrets declarative (filter/map) - collapse ok/warn pair into status() and drop double existsSync in kit-doctor Typecheck clean; npm test 71 PASS, 0 FAIL.
This commit is contained in:
+52
-68
@@ -9,6 +9,7 @@
|
||||
* DISABLE: remove/rename this file from extensions/.
|
||||
*/
|
||||
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
||||
import { registerTool, type ToolSpec } from "./lib/tools.ts";
|
||||
import {
|
||||
issueGet,
|
||||
issueCreate,
|
||||
@@ -19,22 +20,20 @@ import {
|
||||
linkMr,
|
||||
} from "./lib/jira.ts";
|
||||
|
||||
function tool(name: string, description: string, parameters: Record<string, unknown>, run: (params: any) => Promise<unknown>) {
|
||||
return { name, description, parameters, run };
|
||||
}
|
||||
|
||||
export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
const tools = [
|
||||
tool(
|
||||
"jira_issue_get",
|
||||
"Получить тикет Jira по ключу (summary, status, description).",
|
||||
{ type: "object", properties: { key: { type: "string", description: "Ключ задачи, например PROJ-123" } }, required: ["key"] },
|
||||
async (p) => issueGet(p.key),
|
||||
),
|
||||
tool(
|
||||
"jira_issue_create",
|
||||
"Создать задачу в Jira.",
|
||||
{
|
||||
const tools: ToolSpec[] = [
|
||||
{
|
||||
name: "jira_issue_get",
|
||||
description: "Получить тикет Jira по ключу (summary, status, description).",
|
||||
errorPrefix: "jira",
|
||||
parameters: { type: "object", properties: { key: { type: "string", description: "Ключ задачи, например PROJ-123" } }, required: ["key"] },
|
||||
run: async (p) => issueGet(p.key),
|
||||
},
|
||||
{
|
||||
name: "jira_issue_create",
|
||||
description: "Создать задачу в Jira.",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
projectKey: { type: "string", description: "Ключ проекта, например PROJ" },
|
||||
@@ -47,12 +46,13 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["projectKey", "summary", "issuetype"],
|
||||
},
|
||||
async (p) => issueCreate(p),
|
||||
),
|
||||
tool(
|
||||
"jira_issue_update",
|
||||
"Обновить поля задачи Jira (summary/description/status и т.п.). Status переводит по доступным переходам.",
|
||||
{
|
||||
run: async (p) => issueCreate(p),
|
||||
},
|
||||
{
|
||||
name: "jira_issue_update",
|
||||
description: "Обновить поля задачи Jira (summary/description/status и т.п.). Status переводит по доступным переходам.",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
key: { type: "string", description: "Ключ задачи" },
|
||||
@@ -65,12 +65,13 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["key"],
|
||||
},
|
||||
async (p) => issueUpdate(p.key, p),
|
||||
),
|
||||
tool(
|
||||
"jira_issue_comment",
|
||||
"Добавить комментарий к тикету Jira.",
|
||||
{
|
||||
run: async (p) => issueUpdate(p.key, p),
|
||||
},
|
||||
{
|
||||
name: "jira_issue_comment",
|
||||
description: "Добавить комментарий к тикету Jira.",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
key: { type: "string", description: "Ключ задачи" },
|
||||
@@ -78,12 +79,13 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["key", "text"],
|
||||
},
|
||||
async (p) => issueComment(p.key, p.text),
|
||||
),
|
||||
tool(
|
||||
"jira_issue_transition",
|
||||
"Перевести тикет Jira в статус (To Do / In Progress / Review / Done).",
|
||||
{
|
||||
run: async (p) => issueComment(p.key, p.text),
|
||||
},
|
||||
{
|
||||
name: "jira_issue_transition",
|
||||
description: "Перевести тикет Jira в статус (To Do / In Progress / Review / Done).",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
key: { type: "string", description: "Ключ задачи" },
|
||||
@@ -91,12 +93,13 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["key", "target"],
|
||||
},
|
||||
async (p) => setStatus(p.key, p.target),
|
||||
),
|
||||
tool(
|
||||
"jira_search",
|
||||
"Найти тикеты Jira по JQL-запросу.",
|
||||
{
|
||||
run: async (p) => setStatus(p.key, p.target),
|
||||
},
|
||||
{
|
||||
name: "jira_search",
|
||||
description: "Найти тикеты Jira по JQL-запросу.",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
jql: { type: "string", description: "JQL, например 'project = PROJ AND status != Done'" },
|
||||
@@ -104,12 +107,13 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["jql"],
|
||||
},
|
||||
async (p) => search(p.jql, p.maxResults),
|
||||
),
|
||||
tool(
|
||||
"jira_link_mr",
|
||||
"Привязать ссылку на merge request к тикету Jira (комментарий со ссылкой).",
|
||||
{
|
||||
run: async (p) => search(p.jql, p.maxResults),
|
||||
},
|
||||
{
|
||||
name: "jira_link_mr",
|
||||
description: "Привязать ссылку на merge request к тикету Jira (комментарий со ссылкой).",
|
||||
errorPrefix: "jira",
|
||||
parameters: {
|
||||
type: "object",
|
||||
properties: {
|
||||
key: { type: "string", description: "Ключ задачи" },
|
||||
@@ -118,29 +122,9 @@ export default function jiraToolsExtension(pi: ExtensionAPI) {
|
||||
},
|
||||
required: ["key", "mrUrl"],
|
||||
},
|
||||
async (p) => linkMr(p.key, p.mrUrl, p.title),
|
||||
),
|
||||
run: async (p) => linkMr(p.key, p.mrUrl, p.title),
|
||||
},
|
||||
];
|
||||
|
||||
for (const t of tools) {
|
||||
pi.registerTool({
|
||||
name: t.name,
|
||||
label: t.name,
|
||||
description: t.description,
|
||||
parameters: t.parameters as any,
|
||||
async execute(_id: string, params: unknown) {
|
||||
try {
|
||||
const out = await t.run(params ?? {});
|
||||
return { content: [{ type: "text", text: JSON.stringify(out ?? {}, null, 2) }], details: {} };
|
||||
} catch (err) {
|
||||
const msg = err instanceof Error ? err.message : String(err);
|
||||
return {
|
||||
content: [{ type: "text", text: `jira error: ${msg}` }],
|
||||
isError: true,
|
||||
details: {},
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
for (const t of tools) registerTool(pi, t);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user