@zentao-hub/mcp 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.env.example +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +231 -0
  4. package/README.zh-CN.md +225 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +61 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/tools/bugs.d.ts +2 -0
  9. package/dist/tools/bugs.js +387 -0
  10. package/dist/tools/bugs.js.map +1 -0
  11. package/dist/tools/builds.d.ts +2 -0
  12. package/dist/tools/builds.js +54 -0
  13. package/dist/tools/builds.js.map +1 -0
  14. package/dist/tools/cases.d.ts +2 -0
  15. package/dist/tools/cases.js +121 -0
  16. package/dist/tools/cases.js.map +1 -0
  17. package/dist/tools/docs.d.ts +2 -0
  18. package/dist/tools/docs.js +75 -0
  19. package/dist/tools/docs.js.map +1 -0
  20. package/dist/tools/efforts.d.ts +2 -0
  21. package/dist/tools/efforts.js +65 -0
  22. package/dist/tools/efforts.js.map +1 -0
  23. package/dist/tools/executions.d.ts +2 -0
  24. package/dist/tools/executions.js +118 -0
  25. package/dist/tools/executions.js.map +1 -0
  26. package/dist/tools/helpers.d.ts +36 -0
  27. package/dist/tools/helpers.js +255 -0
  28. package/dist/tools/helpers.js.map +1 -0
  29. package/dist/tools/index.d.ts +4 -0
  30. package/dist/tools/index.js +44 -0
  31. package/dist/tools/index.js.map +1 -0
  32. package/dist/tools/issues.d.ts +2 -0
  33. package/dist/tools/issues.js +89 -0
  34. package/dist/tools/issues.js.map +1 -0
  35. package/dist/tools/products.d.ts +2 -0
  36. package/dist/tools/products.js +110 -0
  37. package/dist/tools/products.js.map +1 -0
  38. package/dist/tools/programs.d.ts +2 -0
  39. package/dist/tools/programs.js +46 -0
  40. package/dist/tools/programs.js.map +1 -0
  41. package/dist/tools/projects.d.ts +2 -0
  42. package/dist/tools/projects.js +80 -0
  43. package/dist/tools/projects.js.map +1 -0
  44. package/dist/tools/releases.d.ts +2 -0
  45. package/dist/tools/releases.js +46 -0
  46. package/dist/tools/releases.js.map +1 -0
  47. package/dist/tools/repos.d.ts +2 -0
  48. package/dist/tools/repos.js +42 -0
  49. package/dist/tools/repos.js.map +1 -0
  50. package/dist/tools/request.d.ts +2 -0
  51. package/dist/tools/request.js +41 -0
  52. package/dist/tools/request.js.map +1 -0
  53. package/dist/tools/risks.d.ts +2 -0
  54. package/dist/tools/risks.js +69 -0
  55. package/dist/tools/risks.js.map +1 -0
  56. package/dist/tools/stories.d.ts +2 -0
  57. package/dist/tools/stories.js +153 -0
  58. package/dist/tools/stories.js.map +1 -0
  59. package/dist/tools/tasks.d.ts +2 -0
  60. package/dist/tools/tasks.js +205 -0
  61. package/dist/tools/tasks.js.map +1 -0
  62. package/dist/tools/testreports.d.ts +2 -0
  63. package/dist/tools/testreports.js +47 -0
  64. package/dist/tools/testreports.js.map +1 -0
  65. package/dist/tools/todos.d.ts +2 -0
  66. package/dist/tools/todos.js +70 -0
  67. package/dist/tools/todos.js.map +1 -0
  68. package/dist/tools/users.d.ts +2 -0
  69. package/dist/tools/users.js +59 -0
  70. package/dist/tools/users.js.map +1 -0
  71. package/package.json +59 -0
@@ -0,0 +1,89 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
3
+ const ISSUE_TYPES = ["design", "quality", "schedule", "cost", "scope", "resource", "comm", "other"];
4
+ export function buildIssueTools(ctx) {
5
+ const { client } = ctx;
6
+ return {
7
+ list_project_issues: defineTool({
8
+ description: "List issues raised inside a project (waterfall/IPD models track issues separately from bugs).",
9
+ schema: z.object({
10
+ projectId: z.number().int().positive(),
11
+ status: z.enum(["active", "resolved", "closed", "all"]).optional(),
12
+ ...paginationShape,
13
+ }),
14
+ handler: async (args) => {
15
+ const payload = await client.issues.listByProject(args.projectId, {
16
+ status: args.status,
17
+ limit: args.limit ?? 20,
18
+ page: args.page,
19
+ });
20
+ return { total: extractTotal(payload) ?? extractList(payload).length, issues: extractList(payload) };
21
+ },
22
+ }),
23
+ get_issue: defineTool({
24
+ description: "Fetch an issue's full details.",
25
+ schema: z.object({ issueId: z.number().int().positive() }),
26
+ handler: async (args) => client.issues.get(args.issueId),
27
+ }),
28
+ create_issue: defineTool({
29
+ description: "Raise a new issue under a project.",
30
+ schema: z.object({
31
+ projectId: z.number().int().positive(),
32
+ title: z.string().min(1),
33
+ type: z.enum(ISSUE_TYPES).optional(),
34
+ severity: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
35
+ pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
36
+ desc: z.string().optional(),
37
+ assignedTo: z.string().optional(),
38
+ deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
39
+ keywords: z.string().optional(),
40
+ }),
41
+ handler: async (args) => {
42
+ const { projectId, ...rest } = args;
43
+ return client.issues.create(projectId, pickDefined(rest));
44
+ },
45
+ }),
46
+ update_issue: defineTool({
47
+ description: "Update an issue's editable fields.",
48
+ schema: z.object({
49
+ issueId: z.number().int().positive(),
50
+ title: z.string().optional(),
51
+ type: z.enum(ISSUE_TYPES).optional(),
52
+ severity: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
53
+ pri: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),
54
+ desc: z.string().optional(),
55
+ deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
56
+ }),
57
+ handler: async (args) => {
58
+ const { issueId, ...rest } = args;
59
+ return client.issues.update(issueId, pickDefined(rest));
60
+ },
61
+ }),
62
+ resolve_issue: defineTool({
63
+ description: "Mark an issue as resolved.",
64
+ schema: z.object({
65
+ issueId: z.number().int().positive(),
66
+ resolution: z.string().optional(),
67
+ comment: z.string().optional(),
68
+ }),
69
+ handler: async (args) => {
70
+ const { issueId, ...rest } = args;
71
+ return client.issues.resolve(issueId, pickDefined(rest));
72
+ },
73
+ }),
74
+ close_issue: defineTool({
75
+ description: "Close an issue.",
76
+ schema: z.object({
77
+ issueId: z.number().int().positive(),
78
+ comment: z.string().optional(),
79
+ }),
80
+ handler: async (args) => client.issues.close(args.issueId, pickDefined({ comment: args.comment })),
81
+ }),
82
+ delete_issue: defineTool({
83
+ description: "Delete an issue. Irreversible.",
84
+ schema: z.object({ issueId: z.number().int().positive() }),
85
+ handler: async (args) => client.issues.delete(args.issueId),
86
+ }),
87
+ };
88
+ }
89
+ //# sourceMappingURL=issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/tools/issues.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildProductTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,110 @@
1
+ import { z } from "zod";
2
+ import { PRODUCT_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
3
+ const PRODUCT_TYPES = ["normal", "branch", "platform"];
4
+ export function buildProductTools(ctx) {
5
+ const { client } = ctx;
6
+ return {
7
+ list_products: defineTool({
8
+ description: "List products visible to the authenticated user. Use this first to discover product IDs — most ZenTao bug / story / build / release queries are product-scoped.",
9
+ schema: z.object({
10
+ status: z.enum(["normal", "closed", "all"]).optional().describe("Default 'normal'."),
11
+ ...paginationShape,
12
+ }),
13
+ handler: async (args) => {
14
+ const payload = await client.products.list({
15
+ status: args.status,
16
+ limit: args.limit ?? 20,
17
+ page: args.page,
18
+ });
19
+ const products = extractList(payload).map((p) => summarize(p, PRODUCT_SUMMARY_KEYS));
20
+ return { total: extractTotal(payload) ?? products.length, products };
21
+ },
22
+ }),
23
+ get_product: defineTool({
24
+ description: "Fetch full details for a product (line, program, owners, branches, …).",
25
+ schema: z.object({ productId: z.number().int().positive() }),
26
+ handler: async (args) => client.products.get(args.productId),
27
+ }),
28
+ create_product: defineTool({
29
+ description: "Create a new product. Requires name + code; PO/QD/RD are owner accounts.",
30
+ schema: z.object({
31
+ name: z.string().min(1),
32
+ code: z.string().min(1).describe("Short code, often used as path slug."),
33
+ program: z.number().int().optional(),
34
+ line: z.number().int().optional(),
35
+ type: z.enum(PRODUCT_TYPES).optional(),
36
+ desc: z.string().optional(),
37
+ PO: z.string().optional().describe("Product owner account."),
38
+ QD: z.string().optional().describe("QA owner account."),
39
+ RD: z.string().optional().describe("Dev owner account."),
40
+ acl: z.enum(["open", "private", "custom"]).optional(),
41
+ }),
42
+ handler: async (args) => client.products.create(pickDefined(args)),
43
+ }),
44
+ update_product: defineTool({
45
+ description: "Update product fields. Pass only the fields you want to change.",
46
+ schema: z.object({
47
+ productId: z.number().int().positive(),
48
+ name: z.string().optional(),
49
+ code: z.string().optional(),
50
+ program: z.number().int().optional(),
51
+ line: z.number().int().optional(),
52
+ desc: z.string().optional(),
53
+ PO: z.string().optional(),
54
+ QD: z.string().optional(),
55
+ RD: z.string().optional(),
56
+ status: z.enum(["normal", "closed"]).optional(),
57
+ acl: z.enum(["open", "private", "custom"]).optional(),
58
+ }),
59
+ handler: async (args) => {
60
+ const { productId, ...rest } = args;
61
+ return client.products.update(productId, pickDefined(rest));
62
+ },
63
+ }),
64
+ delete_product: defineTool({
65
+ description: "Delete a product. Irreversible.",
66
+ schema: z.object({ productId: z.number().int().positive() }),
67
+ handler: async (args) => client.products.delete(args.productId),
68
+ }),
69
+ list_product_branches: defineTool({
70
+ description: "List branches of a multi-branch (or platform) product.",
71
+ schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
72
+ handler: async (args) => {
73
+ const payload = await client.products.listBranches(args.productId, {
74
+ limit: args.limit ?? 20,
75
+ page: args.page,
76
+ });
77
+ return { total: extractTotal(payload) ?? extractList(payload).length, branches: extractList(payload) };
78
+ },
79
+ }),
80
+ list_product_modules: defineTool({
81
+ description: "List the module tree of a product. type defaults to 'story'; can be 'bug', 'case', 'doc', etc.",
82
+ schema: z.object({
83
+ productId: z.number().int().positive(),
84
+ type: z.enum(["story", "bug", "case", "doc", "task"]).optional(),
85
+ branch: z.number().int().optional(),
86
+ }),
87
+ handler: async (args) => client.products.listModules(args.productId, {
88
+ type: args.type,
89
+ branch: args.branch,
90
+ }),
91
+ }),
92
+ list_product_plans: defineTool({
93
+ description: "List release plans of a product. Plans group stories / cases / builds into a planned release.",
94
+ schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
95
+ handler: async (args) => client.products.listPlans(args.productId, {
96
+ limit: args.limit ?? 20,
97
+ page: args.page,
98
+ }),
99
+ }),
100
+ list_product_executions: defineTool({
101
+ description: "List executions (sprints / iterations) attached to a product.",
102
+ schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
103
+ handler: async (args) => client.products.listExecutions(args.productId, {
104
+ limit: args.limit ?? 20,
105
+ page: args.page,
106
+ }),
107
+ }),
108
+ };
109
+ }
110
+ //# sourceMappingURL=products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../src/tools/products.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildProgramTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
3
+ export function buildProgramTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ list_programs: defineTool({
7
+ description: "List programs (top-of-hierarchy container; a program holds projects, which hold executions).",
8
+ schema: z.object({
9
+ status: z.enum(["wait", "doing", "suspended", "closed", "all"]).optional(),
10
+ ...paginationShape,
11
+ }),
12
+ handler: async (args) => {
13
+ const payload = await client.programs.list({
14
+ status: args.status,
15
+ limit: args.limit ?? 20,
16
+ page: args.page,
17
+ });
18
+ return { total: extractTotal(payload) ?? extractList(payload).length, programs: extractList(payload) };
19
+ },
20
+ }),
21
+ get_program: defineTool({
22
+ description: "Fetch a program's full details.",
23
+ schema: z.object({ programId: z.number().int().positive() }),
24
+ handler: async (args) => client.programs.get(args.programId),
25
+ }),
26
+ create_program: defineTool({
27
+ description: "Create a program.",
28
+ schema: z.object({
29
+ name: z.string().min(1),
30
+ begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
31
+ end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
32
+ PM: z.string().optional(),
33
+ parent: z.number().int().optional(),
34
+ desc: z.string().optional(),
35
+ acl: z.enum(["open", "private", "custom"]).optional(),
36
+ }),
37
+ handler: async (args) => client.programs.create(pickDefined(args)),
38
+ }),
39
+ delete_program: defineTool({
40
+ description: "Delete a program. Irreversible.",
41
+ schema: z.object({ programId: z.number().int().positive() }),
42
+ handler: async (args) => client.programs.delete(args.programId),
43
+ }),
44
+ };
45
+ }
46
+ //# sourceMappingURL=programs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs.js","sourceRoot":"","sources":["../../src/tools/programs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildProjectTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,80 @@
1
+ import { z } from "zod";
2
+ import { PROJECT_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
3
+ const PROJECT_MODELS = ["scrum", "waterfall", "kanban", "agileplus", "waterfallplus", "ipd"];
4
+ export function buildProjectTools(ctx) {
5
+ const { client } = ctx;
6
+ return {
7
+ list_projects: defineTool({
8
+ description: "List projects (top-level deliverable container, may hold multiple executions).",
9
+ schema: z.object({
10
+ status: z.enum(["wait", "doing", "suspended", "closed", "all"]).optional(),
11
+ ...paginationShape,
12
+ }),
13
+ handler: async (args) => {
14
+ const payload = await client.projects.list({
15
+ status: args.status,
16
+ limit: args.limit ?? 20,
17
+ page: args.page,
18
+ });
19
+ const projects = extractList(payload).map((p) => summarize(p, PROJECT_SUMMARY_KEYS));
20
+ return { total: extractTotal(payload) ?? projects.length, projects };
21
+ },
22
+ }),
23
+ get_project: defineTool({
24
+ description: "Fetch a project's full details (dates, PM, model, ACL, …).",
25
+ schema: z.object({ projectId: z.number().int().positive() }),
26
+ handler: async (args) => client.projects.get(args.projectId),
27
+ }),
28
+ create_project: defineTool({
29
+ description: "Create a new project. model picks methodology (scrum / waterfall / kanban / …).",
30
+ schema: z.object({
31
+ name: z.string().min(1),
32
+ code: z.string().optional(),
33
+ model: z.enum(PROJECT_MODELS).optional(),
34
+ begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
35
+ end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
36
+ PM: z.string().optional().describe("Project manager account."),
37
+ desc: z.string().optional(),
38
+ acl: z.enum(["open", "private", "custom"]).optional(),
39
+ parent: z.number().int().optional().describe("Parent program ID."),
40
+ products: z.array(z.number().int().positive()).optional().describe("Linked product IDs."),
41
+ }),
42
+ handler: async (args) => client.projects.create(pickDefined(args)),
43
+ }),
44
+ update_project: defineTool({
45
+ description: "Update project fields.",
46
+ schema: z.object({
47
+ projectId: z.number().int().positive(),
48
+ name: z.string().optional(),
49
+ begin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
50
+ end: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
51
+ PM: z.string().optional(),
52
+ desc: z.string().optional(),
53
+ status: z.enum(["wait", "doing", "suspended", "closed"]).optional(),
54
+ }),
55
+ handler: async (args) => {
56
+ const { projectId, ...rest } = args;
57
+ return client.projects.update(projectId, pickDefined(rest));
58
+ },
59
+ }),
60
+ delete_project: defineTool({
61
+ description: "Delete a project. Irreversible.",
62
+ schema: z.object({ projectId: z.number().int().positive() }),
63
+ handler: async (args) => client.projects.delete(args.projectId),
64
+ }),
65
+ list_project_executions: defineTool({
66
+ description: "List the executions (sprints / iterations / phases) inside one project.",
67
+ schema: z.object({ projectId: z.number().int().positive(), ...paginationShape }),
68
+ handler: async (args) => client.projects.listExecutions(args.projectId, {
69
+ limit: args.limit ?? 20,
70
+ page: args.page,
71
+ }),
72
+ }),
73
+ list_project_products: defineTool({
74
+ description: "List the products linked to a project (a project can span multiple products).",
75
+ schema: z.object({ projectId: z.number().int().positive() }),
76
+ handler: async (args) => client.projects.listProducts(args.projectId),
77
+ }),
78
+ };
79
+ }
80
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildReleaseTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ import { RELEASE_SUMMARY_KEYS, defineTool, extractList, extractTotal, paginationShape, pickDefined, summarize, } from "./helpers.js";
3
+ export function buildReleaseTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ list_product_releases: defineTool({
7
+ description: "List releases of a product.",
8
+ schema: z.object({ productId: z.number().int().positive(), ...paginationShape }),
9
+ handler: async (args) => {
10
+ const payload = await client.releases.listByProduct(args.productId, {
11
+ limit: args.limit ?? 20,
12
+ page: args.page,
13
+ });
14
+ const releases = extractList(payload).map((r) => summarize(r, RELEASE_SUMMARY_KEYS));
15
+ return { total: extractTotal(payload) ?? releases.length, releases };
16
+ },
17
+ }),
18
+ get_release: defineTool({
19
+ description: "Fetch a release.",
20
+ schema: z.object({ releaseId: z.number().int().positive() }),
21
+ handler: async (args) => client.releases.get(args.releaseId),
22
+ }),
23
+ create_release: defineTool({
24
+ description: "Create a release tied to a build.",
25
+ schema: z.object({
26
+ productId: z.number().int().positive(),
27
+ build: z.number().int().positive().describe("Build ID this release marks."),
28
+ name: z.string().min(1),
29
+ marker: z.string().optional().describe("Marker text (e.g. tag)."),
30
+ date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
31
+ desc: z.string().optional(),
32
+ status: z.enum(["normal", "terminate"]).optional(),
33
+ }),
34
+ handler: async (args) => {
35
+ const { productId, ...rest } = args;
36
+ return client.releases.create(productId, pickDefined(rest));
37
+ },
38
+ }),
39
+ delete_release: defineTool({
40
+ description: "Delete a release. Irreversible.",
41
+ schema: z.object({ releaseId: z.number().int().positive() }),
42
+ handler: async (args) => client.releases.delete(args.releaseId),
43
+ }),
44
+ };
45
+ }
46
+ //# sourceMappingURL=releases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"releases.js","sourceRoot":"","sources":["../../src/tools/releases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildRepoTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, } from "./helpers.js";
3
+ export function buildRepoTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ list_repos: defineTool({
7
+ description: "List code repositories (ZenTao's Devops > Repo) registered in the instance. Useful for linking bugs/stories to commits.",
8
+ schema: z.object({ ...paginationShape }),
9
+ handler: async (args) => client.repos.list({ limit: args.limit ?? 20, page: args.page }),
10
+ }),
11
+ get_repo: defineTool({
12
+ description: "Fetch a repo's configuration.",
13
+ schema: z.object({ repoId: z.number().int().positive() }),
14
+ handler: async (args) => client.repos.get(args.repoId),
15
+ }),
16
+ list_repo_branches: defineTool({
17
+ description: "List branches of a code repo.",
18
+ schema: z.object({ repoId: z.number().int().positive(), ...paginationShape }),
19
+ handler: async (args) => {
20
+ const payload = await client.repos.listBranches(args.repoId, {
21
+ limit: args.limit ?? 20,
22
+ page: args.page,
23
+ });
24
+ return { total: extractTotal(payload) ?? extractList(payload).length, branches: extractList(payload) };
25
+ },
26
+ }),
27
+ list_repo_commits: defineTool({
28
+ description: "List recent commits in a repo.",
29
+ schema: z.object({
30
+ repoId: z.number().int().positive(),
31
+ branch: z.string().optional(),
32
+ ...paginationShape,
33
+ }),
34
+ handler: async (args) => client.repos.listCommits(args.repoId, {
35
+ branch: args.branch,
36
+ limit: args.limit ?? 20,
37
+ page: args.page,
38
+ }),
39
+ }),
40
+ };
41
+ }
42
+ //# sourceMappingURL=repos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/tools/repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,OAAO;QACL,UAAU,EAAE,UAAU,CAAC;YACrB,WAAW,EACT,yHAAyH;YAC3H,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;SAClE,CAAC;QAEF,QAAQ,EAAE,UAAU,CAAC;YACnB,WAAW,EAAE,+BAA+B;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACzD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;SACvD,CAAC;QAEF,kBAAkB,EAAE,UAAU,CAAC;YAC7B,WAAW,EAAE,+BAA+B;YAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;YAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;oBAC3D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;gBACH,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzG,CAAC;SACF,CAAC;QAEF,iBAAiB,EAAE,UAAU,CAAC;YAC5B,WAAW,EAAE,gCAAgC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC7B,GAAG,eAAe;aACnB,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpC,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;SACL,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildRequestTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ import { defineTool } from "./helpers.js";
3
+ export function buildRequestTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ zentao_request: defineTool({
7
+ description: "Escape hatch: call any ZenTao v1 REST endpoint that isn't covered by a typed tool. The path is appended after /api.php/v1 — pass it without that prefix, e.g. '/products/27/builds' or 'modules?type=story'. Use this for read-only exploration of unfamiliar endpoints, or for writes when you know the exact payload shape (consult ZenTao's API docs). Returns the raw parsed JSON response. Token / auth headers are added automatically. Avoid using this when a typed tool exists — typed tools have better schemas and summarization.",
8
+ schema: z.object({
9
+ method: z
10
+ .enum(["GET", "POST", "PUT", "DELETE"])
11
+ .describe("HTTP method. Most reads are GET; ZenTao state transitions are typically POST /{entity}/{id}/{action}."),
12
+ path: z
13
+ .string()
14
+ .min(1)
15
+ .describe("Path relative to /api.php/v1 (with or without leading slash). Example: '/products' or 'bugs/123/resolve'."),
16
+ body: z
17
+ .record(z.unknown())
18
+ .optional()
19
+ .describe("JSON body. Omit for GET. ZenTao expects flat objects — values are typed (string / number / bool)."),
20
+ query: z
21
+ .record(z.union([z.string(), z.number(), z.boolean()]))
22
+ .optional()
23
+ .describe("Query string params. Useful for pagination (limit, page) or filters."),
24
+ }),
25
+ handler: async (args) => {
26
+ const opts = { query: args.query };
27
+ switch (args.method) {
28
+ case "GET":
29
+ return client.get(args.path, opts.query);
30
+ case "POST":
31
+ return client.post(args.path, args.body, opts.query);
32
+ case "PUT":
33
+ return client.put(args.path, args.body, opts.query);
34
+ case "DELETE":
35
+ return client.delete(args.path, opts.query);
36
+ }
37
+ },
38
+ }),
39
+ };
40
+ }
41
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/tools/request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAgD,UAAU,EAAE,MAAM,cAAc,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,GAAmB;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,OAAO;QACL,cAAc,EAAE,UAAU,CAAC;YACzB,WAAW,EACT,8gBAA8gB;YAChhB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;gBACf,MAAM,EAAE,CAAC;qBACN,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;qBACtC,QAAQ,CAAC,uGAAuG,CAAC;gBACpH,IAAI,EAAE,CAAC;qBACJ,MAAM,EAAE;qBACR,GAAG,CAAC,CAAC,CAAC;qBACN,QAAQ,CACP,2GAA2G,CAC5G;gBACH,IAAI,EAAE,CAAC;qBACJ,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;qBACnB,QAAQ,EAAE;qBACV,QAAQ,CAAC,mGAAmG,CAAC;gBAChH,KAAK,EAAE,CAAC;qBACL,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;qBACtD,QAAQ,EAAE;qBACV,QAAQ,CAAC,sEAAsE,CAAC;aACpF,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAA8D,EAAE,CAAC;gBAC5F,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,KAAK,KAAK;wBACR,OAAO,MAAM,CAAC,GAAG,CAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACjD,KAAK,MAAM;wBACT,OAAO,MAAM,CAAC,IAAI,CAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC7D,KAAK,KAAK;wBACR,OAAO,MAAM,CAAC,GAAG,CAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC5D,KAAK,QAAQ;wBACX,OAAO,MAAM,CAAC,MAAM,CAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildRiskTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;
@@ -0,0 +1,69 @@
1
+ import { z } from "zod";
2
+ import { defineTool, extractList, extractTotal, paginationShape, pickDefined, } from "./helpers.js";
3
+ export function buildRiskTools(ctx) {
4
+ const { client } = ctx;
5
+ return {
6
+ list_project_risks: defineTool({
7
+ description: "List risks tracked under a project.",
8
+ schema: z.object({
9
+ projectId: z.number().int().positive(),
10
+ status: z.enum(["active", "cancel", "hold", "closed", "all"]).optional(),
11
+ ...paginationShape,
12
+ }),
13
+ handler: async (args) => {
14
+ const payload = await client.risks.listByProject(args.projectId, {
15
+ status: args.status,
16
+ limit: args.limit ?? 20,
17
+ page: args.page,
18
+ });
19
+ return { total: extractTotal(payload) ?? extractList(payload).length, risks: extractList(payload) };
20
+ },
21
+ }),
22
+ get_risk: defineTool({
23
+ description: "Fetch a risk's full details.",
24
+ schema: z.object({ riskId: z.number().int().positive() }),
25
+ handler: async (args) => client.risks.get(args.riskId),
26
+ }),
27
+ create_risk: defineTool({
28
+ description: "Create a risk entry under a project.",
29
+ schema: z.object({
30
+ projectId: z.number().int().positive(),
31
+ name: z.string().min(1),
32
+ category: z.string().optional(),
33
+ prob: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional().describe("Probability: 1 low / 2 mid / 3 high."),
34
+ impact: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
35
+ strategy: z.enum(["accept", "transfer", "mitigate", "avoid"]).optional(),
36
+ desc: z.string().optional(),
37
+ plan: z.string().optional().describe("Mitigation plan."),
38
+ assignedTo: z.string().optional(),
39
+ deadline: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
40
+ }),
41
+ handler: async (args) => {
42
+ const { projectId, ...rest } = args;
43
+ return client.risks.create(projectId, pickDefined(rest));
44
+ },
45
+ }),
46
+ update_risk: defineTool({
47
+ description: "Update a risk.",
48
+ schema: z.object({
49
+ riskId: z.number().int().positive(),
50
+ name: z.string().optional(),
51
+ prob: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
52
+ impact: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
53
+ strategy: z.enum(["accept", "transfer", "mitigate", "avoid"]).optional(),
54
+ plan: z.string().optional(),
55
+ status: z.enum(["active", "cancel", "hold", "closed"]).optional(),
56
+ }),
57
+ handler: async (args) => {
58
+ const { riskId, ...rest } = args;
59
+ return client.risks.update(riskId, pickDefined(rest));
60
+ },
61
+ }),
62
+ delete_risk: defineTool({
63
+ description: "Delete a risk. Irreversible.",
64
+ schema: z.object({ riskId: z.number().int().positive() }),
65
+ handler: async (args) => client.risks.delete(args.riskId),
66
+ }),
67
+ };
68
+ }
69
+ //# sourceMappingURL=risks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risks.js","sourceRoot":"","sources":["../../src/tools/risks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type ToolDef, type ToolFactoryCtx } from "./helpers.js";
2
+ export declare function buildStoryTools(ctx: ToolFactoryCtx): Record<string, ToolDef>;