@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,69 +0,0 @@
1
- /**
2
- * atoms_delete_item — Soft-delete an item (sets deleted_at, preserves for audit).
3
- * Requires editor or admin role.
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 deleteItemHandler(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
- // Soft delete (set deleted_at, never remove the row)
29
- const { error: deleteErr } = await client
30
- .from("items")
31
- .update({ deleted_at: new Date().toISOString() })
32
- .eq("id", params.item_id)
33
- .eq("project_id", params.project_id);
34
- if (deleteErr)
35
- throw new Error(deleteErr.message);
36
- // Audit: log deletion to change_history
37
- await client
38
- .from("change_history")
39
- .insert({
40
- item_id: params.item_id,
41
- project_id: params.project_id,
42
- changed_by: userId,
43
- event_type: "deleted",
44
- old_data: existing.data,
45
- new_data: null,
46
- actor: "mcp_claude",
47
- session_id: getMcpSessionId(),
48
- })
49
- .then(({ error }) => {
50
- if (error) {
51
- process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
52
- }
53
- });
54
- return formatToolResult(success({
55
- id: params.item_id,
56
- title: existing.title,
57
- type: existing.type,
58
- deleted: true,
59
- message: `Item ${params.item_id} soft-deleted. It can still be found in audit logs.`,
60
- }));
61
- }
62
- catch (err) {
63
- if (err instanceof Error && err.message.includes("Not authenticated")) {
64
- return formatErrorResult(authError());
65
- }
66
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
67
- }
68
- }
69
- //# sourceMappingURL=delete-item.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delete-item.js","sourceRoot":"","sources":["../../src/tools/delete-item.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * atoms_export_mermaid — Generate Mermaid diagram of requirement/test hierarchy.
3
- * Output is paste-ready for markdown documentation.
4
- */
5
- export declare function exportMermaidHandler(params: {
6
- project_id: string;
7
- root_item_id?: string;
8
- depth: number;
9
- include_tests: boolean;
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<{
33
- mermaid: string;
34
- }>;
35
- }>;
36
- //# sourceMappingURL=export-mermaid.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export-mermaid.d.ts","sourceRoot":"","sources":["../../src/tools/export-mermaid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB;;;;;;;;;;;;;;;;;;;;;;;;;GAgIA"}
@@ -1,125 +0,0 @@
1
- /**
2
- * atoms_export_mermaid — Generate Mermaid diagram of requirement/test hierarchy.
3
- * Output is paste-ready for markdown documentation.
4
- */
5
- import { getClient } from "../db/client.js";
6
- import { formatToolResult, formatErrorResult, success, dbError, authError, } from "./_base.js";
7
- export async function exportMermaidHandler(params) {
8
- try {
9
- const client = await getClient();
10
- // Get all items in the project
11
- const { data: items, error: itemsErr } = await client
12
- .from("items")
13
- .select("id, title, type, data")
14
- .eq("project_id", params.project_id)
15
- .is("deleted_at", null);
16
- if (itemsErr)
17
- throw new Error(itemsErr.message);
18
- if (!items || items.length === 0) {
19
- return formatToolResult(success({ mermaid: "graph TD\n empty[No items in project]" }));
20
- }
21
- // Get all relationships
22
- const { data: rels, error: relsErr } = await client
23
- .from("item_relationships")
24
- .select("from_id, to_id, type")
25
- .eq("project_id", params.project_id);
26
- if (relsErr)
27
- throw new Error(relsErr.message);
28
- const itemMap = new Map();
29
- for (const item of items) {
30
- itemMap.set(item.id, item);
31
- }
32
- // Build Mermaid graph
33
- const lines = ["graph TD"];
34
- const visited = new Set();
35
- const edges = new Set();
36
- // Find root nodes (items with no parents)
37
- const childIds = new Set((rels ?? []).filter((r) => r.type === "child").map((r) => r.to_id));
38
- const parentIds = new Set((rels ?? []).filter((r) => r.type === "parent").map((r) => r.from_id));
39
- let roots;
40
- if (params.root_item_id) {
41
- roots = [params.root_item_id];
42
- }
43
- else {
44
- // Items that are not children of anything
45
- roots = items
46
- .filter((item) => !parentIds.has(item.id))
47
- .filter((item) => {
48
- if (!params.include_tests && item.type === "test-case")
49
- return false;
50
- return true;
51
- })
52
- .map((item) => item.id);
53
- }
54
- // BFS to build graph up to depth
55
- const queue = roots.map((id) => ({
56
- id,
57
- depth: 0,
58
- }));
59
- while (queue.length > 0) {
60
- const { id, depth } = queue.shift();
61
- if (visited.has(id) || depth > params.depth)
62
- continue;
63
- visited.add(id);
64
- const item = itemMap.get(id);
65
- if (!item)
66
- continue;
67
- // Skip test cases if not included
68
- if (!params.include_tests && item.type === "test-case")
69
- continue;
70
- // Add node
71
- const label = sanitizeLabel(item.title);
72
- const shape = item.type === "requirement"
73
- ? `["${label}"]`
74
- : item.type === "test-case"
75
- ? `(["${label}"])`
76
- : `("${label}")`;
77
- lines.push(` ${id}${shape}`);
78
- // Add edges from relationships
79
- for (const rel of rels ?? []) {
80
- if (rel.from_id !== id)
81
- continue;
82
- const targetItem = itemMap.get(rel.to_id);
83
- if (!targetItem)
84
- continue;
85
- if (!params.include_tests && targetItem.type === "test-case")
86
- continue;
87
- const edgeKey = `${rel.from_id}-${rel.type}-${rel.to_id}`;
88
- if (edges.has(edgeKey))
89
- continue;
90
- edges.add(edgeKey);
91
- if (rel.type === "child") {
92
- lines.push(` ${id} --> ${rel.to_id}`);
93
- }
94
- else if (rel.type === "verified_by") {
95
- lines.push(` ${id} -.->|verified_by| ${rel.to_id}`);
96
- }
97
- else if (rel.type === "related") {
98
- lines.push(` ${id} -.- ${rel.to_id}`);
99
- }
100
- if (!visited.has(rel.to_id) && depth + 1 <= params.depth) {
101
- queue.push({ id: rel.to_id, depth: depth + 1 });
102
- }
103
- }
104
- }
105
- const mermaid = lines.join("\n");
106
- return formatToolResult(success({
107
- mermaid,
108
- node_count: visited.size,
109
- edge_count: edges.size,
110
- }));
111
- }
112
- catch (err) {
113
- if (err instanceof Error && err.message.includes("Not authenticated")) {
114
- return formatErrorResult(authError());
115
- }
116
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
117
- }
118
- }
119
- function sanitizeLabel(title) {
120
- return title
121
- .replace(/"/g, "'")
122
- .replace(/[[\]{}()]/g, "")
123
- .substring(0, 50);
124
- }
125
- //# sourceMappingURL=export-mermaid.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export-mermaid.js","sourceRoot":"","sources":["../../src/tools/export-mermaid.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * atoms_get_coverage — Find requirements without linked test cases.
3
- * Essential for compliance reporting in safety-critical industries.
4
- */
5
- import type { CoverageReport } from "../types/responses.js";
6
- export declare function getCoverageHandler(params: {
7
- project_id: string;
8
- domain?: string;
9
- level?: string;
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<CoverageReport>;
33
- }>;
34
- //# sourceMappingURL=get-coverage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-coverage.d.ts","sourceRoot":"","sources":["../../src/tools/get-coverage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEzE,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;;;;;;;;;;;;GAoCA"}
@@ -1,36 +0,0 @@
1
- /**
2
- * atoms_get_coverage — Find requirements without linked test cases.
3
- * Essential for compliance reporting in safety-critical industries.
4
- */
5
- import { getClient } from "../db/client.js";
6
- import { getCoverageReport } from "../db/queries.js";
7
- import { formatToolResult, formatErrorResult, success, dbError, authError, } from "./_base.js";
8
- export async function getCoverageHandler(params) {
9
- try {
10
- const client = await getClient();
11
- const { covered, uncovered, total } = await getCoverageReport(client, params.project_id, { domain: params.domain, level: params.level });
12
- const uncoveredItems = uncovered.map((item) => ({
13
- id: item.id,
14
- title: item.title,
15
- type: item.type,
16
- status: item.data?.status,
17
- domains: item.data?.tags?.domains ?? [],
18
- level: item.data?.tags?.level,
19
- }));
20
- const report = {
21
- covered: covered.length,
22
- uncovered: uncovered.length,
23
- total,
24
- coverage_percent: total > 0 ? Math.round((covered.length / total) * 1000) / 10 : 100,
25
- uncovered_items: uncoveredItems,
26
- };
27
- return formatToolResult(success(report));
28
- }
29
- catch (err) {
30
- if (err instanceof Error && err.message.includes("Not authenticated")) {
31
- return formatErrorResult(authError());
32
- }
33
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
34
- }
35
- }
36
- //# sourceMappingURL=get-coverage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-coverage.js","sourceRoot":"","sources":["../../src/tools/get-coverage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAIxC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAC3D,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAC/C,CAAC;QAEF,MAAM,cAAc,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7D,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,MAAM,MAAM,GAAmB;YAC7B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,KAAK;YACL,gBAAgB,EACd,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG;YACpE,eAAe,EAAE,cAAc;SAChC,CAAC;QAEF,OAAO,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,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_get_history — Audit trail for an item.
3
- * Shows who changed what, when, and whether it was human or AI.
4
- */
5
- import type { HistoryEntry } from "../types/responses.js";
6
- export declare function getHistoryHandler(params: {
7
- project_id: string;
8
- item_id: 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<HistoryEntry[]>;
33
- }>;
34
- //# sourceMappingURL=get-history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;GAsDA"}
@@ -1,53 +0,0 @@
1
- /**
2
- * atoms_get_history — Audit trail for an item.
3
- * Shows who changed what, when, and whether it was human or AI.
4
- */
5
- import { getClient } from "../db/client.js";
6
- import { getChangeHistory } from "../db/queries.js";
7
- import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
8
- export async function getHistoryHandler(params) {
9
- try {
10
- const client = await getClient();
11
- const history = await getChangeHistory(client, params.project_id, params.item_id, params.limit);
12
- const entries = history.map((entry) => {
13
- // Compute which fields changed by comparing old_data and new_data
14
- const fieldsChanged = [];
15
- const oldData = entry.old_data;
16
- const newData = entry.new_data;
17
- if (oldData && newData) {
18
- const allKeys = new Set([
19
- ...Object.keys(oldData),
20
- ...Object.keys(newData),
21
- ]);
22
- for (const key of allKeys) {
23
- if (JSON.stringify(oldData[key]) !== JSON.stringify(newData[key])) {
24
- fieldsChanged.push(key);
25
- }
26
- }
27
- }
28
- else if (newData) {
29
- fieldsChanged.push("(created)");
30
- }
31
- else if (oldData) {
32
- fieldsChanged.push("(deleted)");
33
- }
34
- return {
35
- id: entry.id,
36
- event_type: entry.event_type,
37
- changed_by: entry.changed_by ?? null,
38
- changed_at: entry.changed_at,
39
- actor: entry.actor ?? "user",
40
- session_id: entry.session_id ?? null,
41
- fields_changed: fieldsChanged,
42
- };
43
- });
44
- return formatToolResult(success(entries, paginationMeta(entries.length, params.limit, 0)));
45
- }
46
- catch (err) {
47
- if (err instanceof Error && err.message.includes("Not authenticated")) {
48
- return formatErrorResult(authError());
49
- }
50
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
51
- }
52
- }
53
- //# sourceMappingURL=get-history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-history.js","sourceRoot":"","sources":["../../src/tools/get-history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAIvC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,MAAM,EACN,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,KAAK,CACb,CAAC;QAEF,MAAM,OAAO,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,kEAAkE;YAClE,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAA0C,CAAC;YACjE,MAAM,OAAO,GAAG,KAAK,CAAC,QAA0C,CAAC;YAEjE,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;oBACtB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;oBACvB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;iBACxB,CAAC,CAAC;gBACH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;wBAClE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK,CAAC,EAAY;gBACtB,UAAU,EAAE,KAAK,CAAC,UAAoB;gBACtC,UAAU,EAAG,KAAK,CAAC,UAAqB,IAAI,IAAI;gBAChD,UAAU,EAAE,KAAK,CAAC,UAAoB;gBACtC,KAAK,EAAG,KAAK,CAAC,KAAgB,IAAI,MAAM;gBACxC,UAAU,EAAG,KAAK,CAAC,UAAqB,IAAI,IAAI;gBAChD,cAAc,EAAE,aAAa;aAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,gBAAgB,CACrB,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAClE,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,62 +0,0 @@
1
- /**
2
- * atoms_get_item — Get full item details including relationships and test history.
3
- */
4
- export declare function getItemHandler(params: {
5
- project_id: string;
6
- item_id: string;
7
- }): Promise<{
8
- content: {
9
- type: "text";
10
- text: string;
11
- }[];
12
- structuredContent: {
13
- data: any[];
14
- meta: {
15
- truncated: boolean;
16
- truncation_message: string;
17
- total_count?: number | undefined;
18
- limit?: number | undefined;
19
- offset?: number | undefined;
20
- has_more?: boolean | undefined;
21
- };
22
- status: "success";
23
- };
24
- } | {
25
- content: {
26
- type: "text";
27
- text: string;
28
- }[];
29
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
30
- metadata: {
31
- created_at: string;
32
- created_by: string | null;
33
- updated_at: string;
34
- updated_by: string | null;
35
- source_id: string | undefined;
36
- };
37
- latest_result?: string | undefined;
38
- test_results?: {
39
- result: string;
40
- run_by: string | null;
41
- run_at: string;
42
- note: string | null;
43
- }[] | undefined;
44
- id: string;
45
- type: string;
46
- title: string;
47
- summary: string | undefined;
48
- body: string | undefined;
49
- tags: import("../types/work-item.js").WorkItemTags;
50
- ownership: import("../types/work-item.js").WorkItemOwnership;
51
- relationships: {
52
- parents: string[];
53
- children: string[];
54
- related: string[];
55
- verified_by: string[];
56
- verifies: string[];
57
- };
58
- links: import("../types/work-item.js").WorkItemLink[];
59
- status: "passed" | "failed" | "blocked" | "not-run" | undefined;
60
- }>;
61
- }>;
62
- //# sourceMappingURL=get-item.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-item.d.ts","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAiDa,MAAM;oBACN,MAAM,GAAG,IAAI;oBACb,MAAM;kBACR,MAAM,GAAG,IAAI;;;;;;;;;;qBAlCJ,MAAM,EAAE;sBACP,MAAM,EAAE;qBACT,MAAM,EAAE;yBACJ,MAAM,EAAE;sBACX,MAAM,EAAE;;;;;GAiF7B"}
@@ -1,93 +0,0 @@
1
- /**
2
- * atoms_get_item — Get full item details including relationships and test history.
3
- */
4
- import { getClient } from "../db/client.js";
5
- import { getItemById, getItemRelationships } from "../db/queries.js";
6
- import { formatToolResult, formatErrorResult, success, notFoundError, dbError, authError, } from "./_base.js";
7
- export async function getItemHandler(params) {
8
- try {
9
- const client = await getClient();
10
- const item = await getItemById(client, params.project_id, params.item_id);
11
- if (!item) {
12
- return formatErrorResult(notFoundError("Item", params.item_id));
13
- }
14
- // Enrich with relationship data from shadow table
15
- const relationships = await getItemRelationships(client, params.project_id, params.item_id);
16
- // Build structured relationship map
17
- const relMap = {
18
- parents: [],
19
- children: [],
20
- related: [],
21
- verified_by: [],
22
- verifies: [],
23
- };
24
- for (const rel of relationships) {
25
- if (rel.from_id === params.item_id) {
26
- // Outgoing relationship
27
- if (rel.type in relMap) {
28
- relMap[rel.type].push(rel.to_id);
29
- }
30
- }
31
- else {
32
- // Incoming relationship — invert the type
33
- const inverse = {
34
- parent: "children",
35
- child: "parents",
36
- verified_by: "verifies",
37
- verifies: "verified_by",
38
- related: "related",
39
- };
40
- const key = inverse[rel.type] ?? rel.type;
41
- if (key in relMap) {
42
- relMap[key].push(rel.from_id);
43
- }
44
- }
45
- }
46
- // For test cases, fetch test results from shadow table
47
- let testResults = [];
48
- if (item.type === "test-case") {
49
- const { data: results, error: resultsErr } = await client
50
- .from("test_results")
51
- .select("result, run_by, run_at, note")
52
- .eq("item_id", params.item_id)
53
- .eq("project_id", params.project_id)
54
- .order("run_at", { ascending: false })
55
- .limit(20);
56
- if (!resultsErr && results) {
57
- testResults = results;
58
- }
59
- }
60
- const data = {
61
- id: item.id,
62
- type: item.type,
63
- title: item.title,
64
- summary: item.data?.summary,
65
- body: item.data?.body,
66
- tags: item.data?.tags ?? { domains: [] },
67
- ownership: item.data?.ownership ?? { primary: null, additional: [] },
68
- relationships: relMap,
69
- links: item.data?.links ?? [],
70
- status: item.data?.status,
71
- // Test results from shadow table (for test cases)
72
- ...(item.type === "test-case" ? {
73
- latest_result: testResults[0]?.result ?? "not-run",
74
- test_results: testResults,
75
- } : {}),
76
- metadata: {
77
- created_at: item.created_at,
78
- created_by: item.created_by,
79
- updated_at: item.updated_at,
80
- updated_by: item.updated_by,
81
- source_id: item.data?.metadata?.source_id,
82
- },
83
- };
84
- return formatToolResult(success(data));
85
- }
86
- catch (err) {
87
- if (err instanceof Error && err.message.includes("Not authenticated")) {
88
- return formatErrorResult(authError());
89
- }
90
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
91
- }
92
- }
93
- //# sourceMappingURL=get-item.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-item.js","sourceRoot":"","sources":["../../src/tools/get-item.ts"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- /**
2
- * atoms_link_items — Add or remove relationships between items.
3
- * Updates both items' JSONB data and the shadow table.
4
- */
5
- export declare function linkItemsHandler(params: {
6
- project_id: string;
7
- from_id: string;
8
- to_id: string;
9
- type: "parent" | "child" | "related" | "verifies" | "verified_by";
10
- action: "add" | "remove";
11
- }): Promise<{
12
- content: {
13
- type: "text";
14
- text: string;
15
- }[];
16
- structuredContent: {
17
- data: any[];
18
- meta: {
19
- truncated: boolean;
20
- truncation_message: string;
21
- total_count?: number | undefined;
22
- limit?: number | undefined;
23
- offset?: number | undefined;
24
- has_more?: boolean | undefined;
25
- };
26
- status: "success";
27
- };
28
- } | {
29
- content: {
30
- type: "text";
31
- text: string;
32
- }[];
33
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
34
- action: "add" | "remove";
35
- type: "verified_by" | "parent" | "child" | "verifies" | "related";
36
- from_id: string;
37
- to_id: string;
38
- message: string;
39
- }>;
40
- }>;
41
- //# sourceMappingURL=link-items.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-items.d.ts","sourceRoot":"","sources":["../../src/tools/link-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC;IAClE,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8JA"}