@atoms-tech/atoms-mcp 0.2.1 → 0.3.1

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 (129) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +31 -19
  3. package/dist/apps/src/apps/coverage/coverage-app.html +237 -0
  4. package/dist/apps/src/apps/import/import-app.html +239 -0
  5. package/dist/apps/src/apps/mermaid/mermaid-app.html +112 -0
  6. package/dist/apps/src/apps/summary/summary-app.html +279 -0
  7. package/dist/apps/src/apps/trace/trace-app.html +171 -0
  8. package/dist/index.cjs +2 -0
  9. package/dist/index.js +1 -91
  10. package/package.json +21 -5
  11. package/dist/auth/login.d.ts +0 -25
  12. package/dist/auth/login.d.ts.map +0 -1
  13. package/dist/auth/login.js +0 -414
  14. package/dist/auth/login.js.map +0 -1
  15. package/dist/auth/refresh.d.ts +0 -17
  16. package/dist/auth/refresh.d.ts.map +0 -1
  17. package/dist/auth/refresh.js +0 -82
  18. package/dist/auth/refresh.js.map +0 -1
  19. package/dist/auth/token-store.d.ts +0 -34
  20. package/dist/auth/token-store.d.ts.map +0 -1
  21. package/dist/auth/token-store.js +0 -61
  22. package/dist/auth/token-store.js.map +0 -1
  23. package/dist/config.d.ts +0 -19
  24. package/dist/config.d.ts.map +0 -1
  25. package/dist/config.js +0 -19
  26. package/dist/config.js.map +0 -1
  27. package/dist/db/client.d.ts +0 -30
  28. package/dist/db/client.d.ts.map +0 -1
  29. package/dist/db/client.js +0 -110
  30. package/dist/db/client.js.map +0 -1
  31. package/dist/db/graph.d.ts +0 -8
  32. package/dist/db/graph.d.ts.map +0 -1
  33. package/dist/db/graph.js +0 -8
  34. package/dist/db/graph.js.map +0 -1
  35. package/dist/db/queries.d.ts +0 -77
  36. package/dist/db/queries.d.ts.map +0 -1
  37. package/dist/db/queries.js +0 -210
  38. package/dist/db/queries.js.map +0 -1
  39. package/dist/index.d.ts +0 -12
  40. package/dist/index.d.ts.map +0 -1
  41. package/dist/index.js.map +0 -1
  42. package/dist/middleware/audit.d.ts +0 -26
  43. package/dist/middleware/audit.d.ts.map +0 -1
  44. package/dist/middleware/audit.js +0 -44
  45. package/dist/middleware/audit.js.map +0 -1
  46. package/dist/middleware/rate-limiter.d.ts +0 -21
  47. package/dist/middleware/rate-limiter.d.ts.map +0 -1
  48. package/dist/middleware/rate-limiter.js +0 -43
  49. package/dist/middleware/rate-limiter.js.map +0 -1
  50. package/dist/middleware/validator.d.ts +0 -22
  51. package/dist/middleware/validator.d.ts.map +0 -1
  52. package/dist/middleware/validator.js +0 -91
  53. package/dist/middleware/validator.js.map +0 -1
  54. package/dist/server.d.ts +0 -14
  55. package/dist/server.d.ts.map +0 -1
  56. package/dist/server.js +0 -637
  57. package/dist/server.js.map +0 -1
  58. package/dist/tools/_base.d.ts +0 -58
  59. package/dist/tools/_base.d.ts.map +0 -1
  60. package/dist/tools/_base.js +0 -109
  61. package/dist/tools/_base.js.map +0 -1
  62. package/dist/tools/bulk-import.d.ts +0 -70
  63. package/dist/tools/bulk-import.d.ts.map +0 -1
  64. package/dist/tools/bulk-import.js +0 -188
  65. package/dist/tools/bulk-import.js.map +0 -1
  66. package/dist/tools/create-item.d.ts +0 -43
  67. package/dist/tools/create-item.d.ts.map +0 -1
  68. package/dist/tools/create-item.js +0 -118
  69. package/dist/tools/create-item.js.map +0 -1
  70. package/dist/tools/delete-item.d.ts +0 -38
  71. package/dist/tools/delete-item.d.ts.map +0 -1
  72. package/dist/tools/delete-item.js +0 -69
  73. package/dist/tools/delete-item.js.map +0 -1
  74. package/dist/tools/export-mermaid.d.ts +0 -36
  75. package/dist/tools/export-mermaid.d.ts.map +0 -1
  76. package/dist/tools/export-mermaid.js +0 -125
  77. package/dist/tools/export-mermaid.js.map +0 -1
  78. package/dist/tools/get-coverage.d.ts +0 -34
  79. package/dist/tools/get-coverage.d.ts.map +0 -1
  80. package/dist/tools/get-coverage.js +0 -36
  81. package/dist/tools/get-coverage.js.map +0 -1
  82. package/dist/tools/get-history.d.ts +0 -34
  83. package/dist/tools/get-history.d.ts.map +0 -1
  84. package/dist/tools/get-history.js +0 -53
  85. package/dist/tools/get-history.js.map +0 -1
  86. package/dist/tools/get-item.d.ts +0 -62
  87. package/dist/tools/get-item.d.ts.map +0 -1
  88. package/dist/tools/get-item.js +0 -93
  89. package/dist/tools/get-item.js.map +0 -1
  90. package/dist/tools/link-items.d.ts +0 -41
  91. package/dist/tools/link-items.d.ts.map +0 -1
  92. package/dist/tools/link-items.js +0 -150
  93. package/dist/tools/link-items.js.map +0 -1
  94. package/dist/tools/list-items.d.ts +0 -37
  95. package/dist/tools/list-items.d.ts.map +0 -1
  96. package/dist/tools/list-items.js +0 -36
  97. package/dist/tools/list-items.js.map +0 -1
  98. package/dist/tools/list-projects.d.ts +0 -38
  99. package/dist/tools/list-projects.d.ts.map +0 -1
  100. package/dist/tools/list-projects.js +0 -28
  101. package/dist/tools/list-projects.js.map +0 -1
  102. package/dist/tools/project-summary.d.ts +0 -64
  103. package/dist/tools/project-summary.d.ts.map +0 -1
  104. package/dist/tools/project-summary.js +0 -170
  105. package/dist/tools/project-summary.js.map +0 -1
  106. package/dist/tools/record-test-result.d.ts +0 -41
  107. package/dist/tools/record-test-result.d.ts.map +0 -1
  108. package/dist/tools/record-test-result.js +0 -80
  109. package/dist/tools/record-test-result.js.map +0 -1
  110. package/dist/tools/search.d.ts +0 -34
  111. package/dist/tools/search.d.ts.map +0 -1
  112. package/dist/tools/search.js +0 -28
  113. package/dist/tools/search.js.map +0 -1
  114. package/dist/tools/trace.d.ts +0 -53
  115. package/dist/tools/trace.d.ts.map +0 -1
  116. package/dist/tools/trace.js +0 -166
  117. package/dist/tools/trace.js.map +0 -1
  118. package/dist/tools/update-item.d.ts +0 -43
  119. package/dist/tools/update-item.d.ts.map +0 -1
  120. package/dist/tools/update-item.js +0 -98
  121. package/dist/tools/update-item.js.map +0 -1
  122. package/dist/types/responses.d.ts +0 -58
  123. package/dist/types/responses.d.ts.map +0 -1
  124. package/dist/types/responses.js +0 -6
  125. package/dist/types/responses.js.map +0 -1
  126. package/dist/types/work-item.d.ts +0 -69
  127. package/dist/types/work-item.d.ts.map +0 -1
  128. package/dist/types/work-item.js +0 -8
  129. package/dist/types/work-item.js.map +0 -1
@@ -1,80 +0,0 @@
1
- /**
2
- * atoms_record_test_result — Record a pass/fail/blocked result for a test case.
3
- * Appends to test_results shadow table. Requires editor or admin role.
4
- */
5
- import { getClient, getUserId, getUserEmail, requireWriteAccess } from "../db/client.js";
6
- import { getItemById } from "../db/queries.js";
7
- import { getMcpSessionId } from "../server.js";
8
- import { formatToolResult, formatErrorResult, success, notFoundError, accessDeniedError, validationError, dbError, authError, } from "./_base.js";
9
- export async function recordTestResultHandler(params) {
10
- try {
11
- const client = await getClient();
12
- const userId = getUserId();
13
- const email = getUserEmail();
14
- // Check write access
15
- try {
16
- await requireWriteAccess(client, params.project_id);
17
- }
18
- catch (err) {
19
- if (err instanceof Error && err.message === "VIEWER_ROLE") {
20
- return formatErrorResult(accessDeniedError("Viewer"));
21
- }
22
- throw err;
23
- }
24
- // Verify the item exists and is a test case
25
- const item = await getItemById(client, params.project_id, params.item_id);
26
- if (!item) {
27
- return formatErrorResult(notFoundError("Item", params.item_id));
28
- }
29
- if (item.type !== "test-case") {
30
- return formatErrorResult(validationError(`Item '${params.item_id}' is a ${item.type}, not a test-case`));
31
- }
32
- const runAt = new Date().toISOString();
33
- // Insert into test_results shadow table
34
- const { error: insertErr } = await client
35
- .from("test_results")
36
- .insert({
37
- item_id: params.item_id,
38
- project_id: params.project_id,
39
- result: params.result,
40
- run_by: email || userId,
41
- run_at: runAt,
42
- note: params.note ?? null,
43
- });
44
- if (insertErr)
45
- throw new Error(insertErr.message);
46
- // Audit: log to change_history
47
- await client
48
- .from("change_history")
49
- .insert({
50
- item_id: params.item_id,
51
- project_id: params.project_id,
52
- changed_by: userId,
53
- event_type: "test_result_recorded",
54
- old_data: null,
55
- new_data: { result: params.result, run_at: runAt, note: params.note },
56
- actor: "mcp_claude",
57
- session_id: getMcpSessionId(),
58
- })
59
- .then(({ error }) => {
60
- if (error) {
61
- process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
62
- }
63
- });
64
- return formatToolResult(success({
65
- item_id: params.item_id,
66
- result: params.result,
67
- run_at: runAt,
68
- run_by: email || userId,
69
- note: params.note ?? null,
70
- message: `Test result '${params.result}' recorded for ${params.item_id}`,
71
- }));
72
- }
73
- catch (err) {
74
- if (err instanceof Error && err.message.includes("Not authenticated")) {
75
- return formatErrorResult(authError());
76
- }
77
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
78
- }
79
- }
80
- //# sourceMappingURL=record-test-result.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"record-test-result.js","sourceRoot":"","sources":["../../src/tools/record-test-result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAK7C;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;QAE7B,qBAAqB;QACrB,IAAI,CAAC;YACH,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBAC1D,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,4CAA4C;QAC5C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,iBAAiB,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,OAAO,iBAAiB,CACtB,eAAe,CAAC,SAAS,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAC/E,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAEvC,wCAAwC;QACxC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM;aACtC,IAAI,CAAC,cAAc,CAAC;aACpB,MAAM,CAAC;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,KAAK,IAAI,MAAM;YACvB,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;SAC1B,CAAC,CAAC;QAEL,IAAI,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAElD,+BAA+B;QAC/B,MAAM,MAAM;aACT,IAAI,CAAC,gBAAgB,CAAC;aACtB,MAAM,CAAC;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,sBAAsB;YAClC,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;YACrE,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,eAAe,EAAE;SAC9B,CAAC;aACD,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YAClB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mDAAmD,KAAK,CAAC,OAAO,IAAI,CACrE,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,OAAO,gBAAgB,CACrB,OAAO,CAAC;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,KAAK,IAAI,MAAM;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;YACzB,OAAO,EAAE,gBAAgB,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,OAAO,EAAE;SACzE,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,OAAO,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,iBAAiB,CACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,34 +0,0 @@
1
- /**
2
- * atoms_search — Full-text search across items in a project.
3
- */
4
- import type { ItemSummary } from "../types/responses.js";
5
- export declare function searchHandler(params: {
6
- project_id: string;
7
- query: string;
8
- type?: string;
9
- limit: number;
10
- }): Promise<{
11
- content: {
12
- type: "text";
13
- text: string;
14
- }[];
15
- structuredContent: {
16
- data: any[];
17
- meta: {
18
- truncated: boolean;
19
- truncation_message: string;
20
- total_count?: number | undefined;
21
- limit?: number | undefined;
22
- offset?: number | undefined;
23
- has_more?: boolean | undefined;
24
- };
25
- status: "success";
26
- };
27
- } | {
28
- content: {
29
- type: "text";
30
- text: string;
31
- }[];
32
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
33
- }>;
34
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;GA8BA"}
@@ -1,28 +0,0 @@
1
- /**
2
- * atoms_search — Full-text search across items in a project.
3
- */
4
- import { getClient } from "../db/client.js";
5
- import { searchItems } from "../db/queries.js";
6
- import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
7
- export async function searchHandler(params) {
8
- try {
9
- const client = await getClient();
10
- const { items, totalCount } = await searchItems(client, params.project_id, params.query, { type: params.type, limit: params.limit });
11
- const data = items.map((item) => ({
12
- id: item.id,
13
- title: item.title,
14
- type: item.type,
15
- status: item.data?.status,
16
- domains: item.data?.tags?.domains ?? [],
17
- level: item.data?.tags?.level,
18
- }));
19
- return formatToolResult(success(data, paginationMeta(totalCount, params.limit, 0)));
20
- }
21
- catch (err) {
22
- if (err instanceof Error && err.message.includes("Not authenticated")) {
23
- return formatErrorResult(authError());
24
- }
25
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
26
- }
27
- }
28
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAKnC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAC7C,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,KAAK,EACZ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAC3C,CAAC;QAEF,MAAM,IAAI,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/C,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM;YACzB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;YACvC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK;SAC9B,CAAC,CAAC,CAAC;QAEJ,OAAO,gBAAgB,CACrB,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACtE,OAAO,iBAAiB,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,iBAAiB,CACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,53 +0,0 @@
1
- /**
2
- * atoms_trace — Graph traversal for traceability queries.
3
- *
4
- * Answers questions like "which requirements does TC-00003 verify?"
5
- * or "what's affected if I change REQ-00001?"
6
- */
7
- interface TraceNode {
8
- id: string;
9
- title: string;
10
- type: string;
11
- relationship: string;
12
- depth: number;
13
- }
14
- export declare function traceHandler(params: {
15
- project_id: string;
16
- item_id: string;
17
- direction: "upstream" | "downstream" | "both";
18
- depth: number;
19
- relationship_types?: string[];
20
- }): Promise<{
21
- content: {
22
- type: "text";
23
- text: string;
24
- }[];
25
- structuredContent: {
26
- data: any[];
27
- meta: {
28
- truncated: boolean;
29
- truncation_message: string;
30
- total_count?: number | undefined;
31
- limit?: number | undefined;
32
- offset?: number | undefined;
33
- has_more?: boolean | undefined;
34
- };
35
- status: "success";
36
- };
37
- } | {
38
- content: {
39
- type: "text";
40
- text: string;
41
- }[];
42
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
43
- truncated?: boolean | undefined;
44
- truncation_message?: string | undefined;
45
- root: string;
46
- direction: "upstream" | "downstream" | "both";
47
- depth_limit: number;
48
- items: TraceNode[];
49
- total_count: number;
50
- }>;
51
- }>;
52
- export {};
53
- //# sourceMappingURL=trace.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/tools/trace.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgKA"}
@@ -1,166 +0,0 @@
1
- /**
2
- * atoms_trace — Graph traversal for traceability queries.
3
- *
4
- * Answers questions like "which requirements does TC-00003 verify?"
5
- * or "what's affected if I change REQ-00001?"
6
- */
7
- import { getClient } from "../db/client.js";
8
- import { getItemById } from "../db/queries.js";
9
- import { formatToolResult, formatErrorResult, success, notFoundError, dbError, authError, } from "./_base.js";
10
- /** Maximum items returned to prevent huge responses. */
11
- const MAX_ITEMS = 200;
12
- /** Relationship types that point "upstream" (toward parents / dependencies). */
13
- const UPSTREAM_TYPES = ["parent", "verifies"];
14
- /** Relationship types that point "downstream" (toward dependents). */
15
- const DOWNSTREAM_TYPES = ["child", "verified_by"];
16
- /**
17
- * Inverse mapping: when traversing an incoming edge we need
18
- * to know what the outgoing type means for the other side.
19
- */
20
- const INVERSE_TYPE = {
21
- parent: "child",
22
- child: "parent",
23
- verifies: "verified_by",
24
- verified_by: "verifies",
25
- related: "related",
26
- };
27
- export async function traceHandler(params) {
28
- try {
29
- const maxDepth = Math.min(Math.max(params.depth ?? 5, 1), 10);
30
- const client = await getClient();
31
- // Verify root item exists
32
- const rootItem = await getItemById(client, params.project_id, params.item_id);
33
- if (!rootItem) {
34
- return formatErrorResult(notFoundError("Item", params.item_id));
35
- }
36
- // Fetch all relationships in the project once (same pattern as export-mermaid)
37
- const { data: rels, error: relsErr } = await client
38
- .from("item_relationships")
39
- .select("from_id, to_id, type")
40
- .eq("project_id", params.project_id);
41
- if (relsErr)
42
- throw new Error(relsErr.message);
43
- // Fetch all non-deleted items for title/type lookup
44
- const { data: items, error: itemsErr } = await client
45
- .from("items")
46
- .select("id, title, type")
47
- .eq("project_id", params.project_id)
48
- .is("deleted_at", null);
49
- if (itemsErr)
50
- throw new Error(itemsErr.message);
51
- const itemMap = new Map();
52
- for (const item of items ?? []) {
53
- itemMap.set(item.id, { title: item.title, type: item.type });
54
- }
55
- // Build adjacency lists based on direction
56
- // For each item, we store { neighbor, relType, direction }
57
- const adjacency = new Map();
58
- const addEdge = (from, to, relType) => {
59
- if (!adjacency.has(from))
60
- adjacency.set(from, []);
61
- adjacency.get(from).push({ neighbor: to, relType });
62
- };
63
- const allowedTypes = params.relationship_types
64
- ? new Set(params.relationship_types)
65
- : null;
66
- for (const rel of rels ?? []) {
67
- const relType = rel.type;
68
- // Upstream: follow edges where the item is the source and the rel points upstream
69
- // i.e., from_id -> to_id with type "parent" or "verifies"
70
- if (params.direction === "upstream" || params.direction === "both") {
71
- if (UPSTREAM_TYPES.includes(relType)) {
72
- if (!allowedTypes || allowedTypes.has(relType)) {
73
- addEdge(rel.from_id, rel.to_id, relType);
74
- }
75
- }
76
- // Also follow inverse: if from_id has a "child" pointing to to_id,
77
- // then to_id is upstream of from_id — but we model it as:
78
- // from_id's downstream is to_id via "child". For upstream from to_id,
79
- // we'd follow to_id -> from_id via inverse of "child" = "parent".
80
- if (DOWNSTREAM_TYPES.includes(relType)) {
81
- const inverseType = INVERSE_TYPE[relType] ?? relType;
82
- if (!allowedTypes || allowedTypes.has(inverseType)) {
83
- addEdge(rel.to_id, rel.from_id, inverseType);
84
- }
85
- }
86
- }
87
- if (params.direction === "downstream" || params.direction === "both") {
88
- if (DOWNSTREAM_TYPES.includes(relType)) {
89
- if (!allowedTypes || allowedTypes.has(relType)) {
90
- addEdge(rel.from_id, rel.to_id, relType);
91
- }
92
- }
93
- // Inverse: upstream type from the other side means downstream for us
94
- if (UPSTREAM_TYPES.includes(relType)) {
95
- const inverseType = INVERSE_TYPE[relType] ?? relType;
96
- if (!allowedTypes || allowedTypes.has(inverseType)) {
97
- addEdge(rel.to_id, rel.from_id, inverseType);
98
- }
99
- }
100
- }
101
- // "related" is bidirectional — add both directions if allowed
102
- if (relType === "related") {
103
- if (!allowedTypes || allowedTypes.has("related")) {
104
- addEdge(rel.from_id, rel.to_id, "related");
105
- addEdge(rel.to_id, rel.from_id, "related");
106
- }
107
- }
108
- }
109
- // BFS traversal from root
110
- const visited = new Set();
111
- visited.add(params.item_id);
112
- const result = [];
113
- const queue = [];
114
- // Seed queue with direct neighbors of the root
115
- const rootNeighbors = adjacency.get(params.item_id) ?? [];
116
- for (const edge of rootNeighbors) {
117
- queue.push({ id: edge.neighbor, depth: 1, relType: edge.relType });
118
- }
119
- while (queue.length > 0 && result.length < MAX_ITEMS) {
120
- const { id, depth, relType } = queue.shift();
121
- if (visited.has(id) || depth > maxDepth)
122
- continue;
123
- visited.add(id);
124
- const info = itemMap.get(id);
125
- if (!info)
126
- continue; // skip deleted items
127
- result.push({
128
- id,
129
- title: info.title,
130
- type: info.type,
131
- relationship: relType,
132
- depth,
133
- });
134
- // Enqueue neighbors at next depth
135
- if (depth < maxDepth) {
136
- const neighbors = adjacency.get(id) ?? [];
137
- for (const edge of neighbors) {
138
- if (!visited.has(edge.neighbor)) {
139
- queue.push({
140
- id: edge.neighbor,
141
- depth: depth + 1,
142
- relType: edge.relType,
143
- });
144
- }
145
- }
146
- }
147
- }
148
- return formatToolResult(success({
149
- root: params.item_id,
150
- direction: params.direction,
151
- depth_limit: maxDepth,
152
- items: result,
153
- total_count: result.length,
154
- ...(result.length >= MAX_ITEMS
155
- ? { truncated: true, truncation_message: `Results capped at ${MAX_ITEMS} items. Use a smaller depth or filter by relationship_types.` }
156
- : {}),
157
- }));
158
- }
159
- catch (err) {
160
- if (err instanceof Error && err.message.includes("Not authenticated")) {
161
- return formatErrorResult(authError());
162
- }
163
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
164
- }
165
- }
166
- //# sourceMappingURL=trace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/tools/trace.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- /**
2
- * atoms_update_item — Update an existing item's fields.
3
- * Requires editor or admin role. Logs old/new diff to change_history.
4
- */
5
- export declare function updateItemHandler(params: {
6
- project_id: string;
7
- item_id: string;
8
- title?: string;
9
- body?: string;
10
- summary?: string;
11
- domains?: string[];
12
- level?: string;
13
- status?: "passed" | "failed" | "blocked" | "not-run";
14
- }): Promise<{
15
- content: {
16
- type: "text";
17
- text: string;
18
- }[];
19
- structuredContent: {
20
- data: any[];
21
- meta: {
22
- truncated: boolean;
23
- truncation_message: string;
24
- total_count?: number | undefined;
25
- limit?: number | undefined;
26
- offset?: number | undefined;
27
- has_more?: boolean | undefined;
28
- };
29
- status: "success";
30
- };
31
- } | {
32
- content: {
33
- type: "text";
34
- text: string;
35
- }[];
36
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
37
- id: string;
38
- title: string;
39
- type: string;
40
- updated_fields: string[];
41
- }>;
42
- }>;
43
- //# sourceMappingURL=update-item.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-item.d.ts","sourceRoot":"","sources":["../../src/tools/update-item.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsGA"}
@@ -1,98 +0,0 @@
1
- /**
2
- * atoms_update_item — Update an existing item's fields.
3
- * Requires editor or admin role. Logs old/new diff to change_history.
4
- */
5
- import { getClient, getUserId, requireWriteAccess } from "../db/client.js";
6
- import { getItemById } from "../db/queries.js";
7
- import { getMcpSessionId } from "../server.js";
8
- import { formatToolResult, formatErrorResult, success, notFoundError, accessDeniedError, dbError, authError, } from "./_base.js";
9
- export async function updateItemHandler(params) {
10
- try {
11
- const client = await getClient();
12
- const userId = getUserId();
13
- // Check write access
14
- try {
15
- await requireWriteAccess(client, params.project_id);
16
- }
17
- catch (err) {
18
- if (err instanceof Error && err.message === "VIEWER_ROLE") {
19
- return formatErrorResult(accessDeniedError("Viewer"));
20
- }
21
- throw err;
22
- }
23
- // Get existing item
24
- const existing = await getItemById(client, params.project_id, params.item_id);
25
- if (!existing) {
26
- return formatErrorResult(notFoundError("Item", params.item_id));
27
- }
28
- // Build updated data blob
29
- const oldData = { ...existing.data };
30
- const updatedData = { ...existing.data };
31
- if (params.title !== undefined) {
32
- updatedData.title = params.title;
33
- }
34
- if (params.body !== undefined) {
35
- updatedData.body = params.body;
36
- }
37
- if (params.summary !== undefined) {
38
- updatedData.summary = params.summary;
39
- }
40
- if (params.domains !== undefined) {
41
- updatedData.tags = { ...updatedData.tags, domains: params.domains };
42
- }
43
- if (params.level !== undefined) {
44
- updatedData.tags = { ...updatedData.tags, level: params.level };
45
- }
46
- if (params.status !== undefined) {
47
- updatedData.status = params.status;
48
- }
49
- updatedData.metadata = {
50
- ...updatedData.metadata,
51
- updated_at: new Date().toISOString(),
52
- updated_by: userId,
53
- };
54
- // Update in database
55
- const { error: updateErr } = await client
56
- .from("items")
57
- .update({
58
- title: params.title ?? existing.title,
59
- data: updatedData,
60
- updated_by: userId,
61
- })
62
- .eq("id", params.item_id)
63
- .eq("project_id", params.project_id);
64
- if (updateErr)
65
- throw new Error(updateErr.message);
66
- // Audit: log diff to change_history
67
- await client
68
- .from("change_history")
69
- .insert({
70
- item_id: params.item_id,
71
- project_id: params.project_id,
72
- changed_by: userId,
73
- event_type: "updated",
74
- old_data: oldData,
75
- new_data: updatedData,
76
- actor: "mcp_claude",
77
- session_id: getMcpSessionId(),
78
- })
79
- .then(({ error }) => {
80
- if (error) {
81
- process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
82
- }
83
- });
84
- return formatToolResult(success({
85
- id: params.item_id,
86
- title: updatedData.title,
87
- type: existing.type,
88
- updated_fields: Object.keys(params).filter((k) => k !== "project_id" && k !== "item_id" && params[k] !== undefined),
89
- }));
90
- }
91
- catch (err) {
92
- if (err instanceof Error && err.message.includes("Not authenticated")) {
93
- return formatErrorResult(authError());
94
- }
95
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
96
- }
97
- }
98
- //# sourceMappingURL=update-item.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-item.js","sourceRoot":"","sources":["../../src/tools/update-item.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Standard response envelopes for all MCP tool responses.
3
- * Every tool returns JSON matching one of these shapes.
4
- */
5
- export interface ToolSuccess<T = unknown> {
6
- [key: string]: unknown;
7
- status: "success";
8
- data: T;
9
- meta?: PaginationMeta;
10
- }
11
- export interface ToolError {
12
- [key: string]: unknown;
13
- status: "error";
14
- message: string;
15
- next_steps: string[];
16
- }
17
- export interface PaginationMeta {
18
- [key: string]: unknown;
19
- total_count: number;
20
- limit: number;
21
- offset: number;
22
- has_more: boolean;
23
- }
24
- export type ToolResponse<T = unknown> = ToolSuccess<T> | ToolError;
25
- /**
26
- * Item summary returned by list/search tools (@basic fields).
27
- */
28
- export interface ItemSummary {
29
- id: string;
30
- title: string;
31
- type: string;
32
- status?: string;
33
- domains: string[];
34
- level?: string;
35
- }
36
- /**
37
- * Coverage report returned by atoms_get_coverage.
38
- */
39
- export interface CoverageReport {
40
- covered: number;
41
- uncovered: number;
42
- total: number;
43
- coverage_percent: number;
44
- uncovered_items: ItemSummary[];
45
- }
46
- /**
47
- * Change history entry returned by atoms_get_history.
48
- */
49
- export interface HistoryEntry {
50
- id: string;
51
- event_type: string;
52
- changed_by: string | null;
53
- changed_at: string;
54
- actor: string;
55
- session_id: string | null;
56
- fields_changed: string[];
57
- }
58
- //# sourceMappingURL=responses.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,WAAW,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Standard response envelopes for all MCP tool responses.
3
- * Every tool returns JSON matching one of these shapes.
4
- */
5
- export {};
6
- //# sourceMappingURL=responses.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA;;;GAGG"}