@atoms-tech/atoms-mcp 0.1.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 (110) hide show
  1. package/bin/atoms-mcp.js +2 -0
  2. package/dist/auth/login.d.ts +23 -0
  3. package/dist/auth/login.d.ts.map +1 -0
  4. package/dist/auth/login.js +246 -0
  5. package/dist/auth/login.js.map +1 -0
  6. package/dist/auth/refresh.d.ts +17 -0
  7. package/dist/auth/refresh.d.ts.map +1 -0
  8. package/dist/auth/refresh.js +82 -0
  9. package/dist/auth/refresh.js.map +1 -0
  10. package/dist/auth/token-store.d.ts +34 -0
  11. package/dist/auth/token-store.d.ts.map +1 -0
  12. package/dist/auth/token-store.js +61 -0
  13. package/dist/auth/token-store.js.map +1 -0
  14. package/dist/config.d.ts +17 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +17 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/db/client.d.ts +30 -0
  19. package/dist/db/client.d.ts.map +1 -0
  20. package/dist/db/client.js +110 -0
  21. package/dist/db/client.js.map +1 -0
  22. package/dist/db/graph.d.ts +8 -0
  23. package/dist/db/graph.d.ts.map +1 -0
  24. package/dist/db/graph.js +8 -0
  25. package/dist/db/graph.js.map +1 -0
  26. package/dist/db/queries.d.ts +77 -0
  27. package/dist/db/queries.d.ts.map +1 -0
  28. package/dist/db/queries.js +210 -0
  29. package/dist/db/queries.js.map +1 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +92 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/middleware/audit.d.ts +26 -0
  35. package/dist/middleware/audit.d.ts.map +1 -0
  36. package/dist/middleware/audit.js +44 -0
  37. package/dist/middleware/audit.js.map +1 -0
  38. package/dist/middleware/rate-limiter.d.ts +21 -0
  39. package/dist/middleware/rate-limiter.d.ts.map +1 -0
  40. package/dist/middleware/rate-limiter.js +43 -0
  41. package/dist/middleware/rate-limiter.js.map +1 -0
  42. package/dist/middleware/validator.d.ts +22 -0
  43. package/dist/middleware/validator.d.ts.map +1 -0
  44. package/dist/middleware/validator.js +91 -0
  45. package/dist/middleware/validator.js.map +1 -0
  46. package/dist/server.d.ts +14 -0
  47. package/dist/server.d.ts.map +1 -0
  48. package/dist/server.js +511 -0
  49. package/dist/server.js.map +1 -0
  50. package/dist/tools/_base.d.ts +58 -0
  51. package/dist/tools/_base.d.ts.map +1 -0
  52. package/dist/tools/_base.js +109 -0
  53. package/dist/tools/_base.js.map +1 -0
  54. package/dist/tools/create-item.d.ts +43 -0
  55. package/dist/tools/create-item.d.ts.map +1 -0
  56. package/dist/tools/create-item.js +118 -0
  57. package/dist/tools/create-item.js.map +1 -0
  58. package/dist/tools/delete-item.d.ts +38 -0
  59. package/dist/tools/delete-item.d.ts.map +1 -0
  60. package/dist/tools/delete-item.js +69 -0
  61. package/dist/tools/delete-item.js.map +1 -0
  62. package/dist/tools/export-mermaid.d.ts +36 -0
  63. package/dist/tools/export-mermaid.d.ts.map +1 -0
  64. package/dist/tools/export-mermaid.js +125 -0
  65. package/dist/tools/export-mermaid.js.map +1 -0
  66. package/dist/tools/get-coverage.d.ts +34 -0
  67. package/dist/tools/get-coverage.d.ts.map +1 -0
  68. package/dist/tools/get-coverage.js +36 -0
  69. package/dist/tools/get-coverage.js.map +1 -0
  70. package/dist/tools/get-history.d.ts +34 -0
  71. package/dist/tools/get-history.d.ts.map +1 -0
  72. package/dist/tools/get-history.js +53 -0
  73. package/dist/tools/get-history.js.map +1 -0
  74. package/dist/tools/get-item.d.ts +62 -0
  75. package/dist/tools/get-item.d.ts.map +1 -0
  76. package/dist/tools/get-item.js +93 -0
  77. package/dist/tools/get-item.js.map +1 -0
  78. package/dist/tools/link-items.d.ts +41 -0
  79. package/dist/tools/link-items.d.ts.map +1 -0
  80. package/dist/tools/link-items.js +150 -0
  81. package/dist/tools/link-items.js.map +1 -0
  82. package/dist/tools/list-items.d.ts +37 -0
  83. package/dist/tools/list-items.d.ts.map +1 -0
  84. package/dist/tools/list-items.js +36 -0
  85. package/dist/tools/list-items.js.map +1 -0
  86. package/dist/tools/list-projects.d.ts +38 -0
  87. package/dist/tools/list-projects.d.ts.map +1 -0
  88. package/dist/tools/list-projects.js +28 -0
  89. package/dist/tools/list-projects.js.map +1 -0
  90. package/dist/tools/record-test-result.d.ts +41 -0
  91. package/dist/tools/record-test-result.d.ts.map +1 -0
  92. package/dist/tools/record-test-result.js +80 -0
  93. package/dist/tools/record-test-result.js.map +1 -0
  94. package/dist/tools/search.d.ts +34 -0
  95. package/dist/tools/search.d.ts.map +1 -0
  96. package/dist/tools/search.js +28 -0
  97. package/dist/tools/search.js.map +1 -0
  98. package/dist/tools/update-item.d.ts +43 -0
  99. package/dist/tools/update-item.d.ts.map +1 -0
  100. package/dist/tools/update-item.js +98 -0
  101. package/dist/tools/update-item.js.map +1 -0
  102. package/dist/types/responses.d.ts +58 -0
  103. package/dist/types/responses.d.ts.map +1 -0
  104. package/dist/types/responses.js +6 -0
  105. package/dist/types/responses.js.map +1 -0
  106. package/dist/types/work-item.d.ts +69 -0
  107. package/dist/types/work-item.d.ts.map +1 -0
  108. package/dist/types/work-item.js +8 -0
  109. package/dist/types/work-item.js.map +1 -0
  110. package/package.json +50 -0
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Shared error handling and response formatting for all MCP tools.
3
+ *
4
+ * Every error MUST include `next_steps` — actionable guidance for the LLM.
5
+ * This is the #1 pattern from the Polarion MCP that improves agent reliability.
6
+ */
7
+ /** Maximum response size in characters. Truncate with clear message if exceeded. */
8
+ export const CHARACTER_LIMIT = 25_000;
9
+ // ---------------------------------------------------------------------------
10
+ // Success helpers
11
+ // ---------------------------------------------------------------------------
12
+ export function success(data, meta) {
13
+ return { status: "success", data, ...(meta ? { meta } : {}) };
14
+ }
15
+ export function paginationMeta(totalCount, limit, offset) {
16
+ return {
17
+ total_count: totalCount,
18
+ limit,
19
+ offset,
20
+ has_more: offset + limit < totalCount,
21
+ };
22
+ }
23
+ // ---------------------------------------------------------------------------
24
+ // Error helpers
25
+ // ---------------------------------------------------------------------------
26
+ export function errorResponse(message, nextSteps) {
27
+ return { status: "error", message, next_steps: nextSteps };
28
+ }
29
+ export function notFoundError(resource, id) {
30
+ return errorResponse(`${resource} '${id}' not found`, [
31
+ `Verify the ${resource.toLowerCase()} ID is correct`,
32
+ `Use atoms_list_items or atoms_search to find valid IDs`,
33
+ ]);
34
+ }
35
+ export function accessDeniedError(role) {
36
+ return errorResponse(`${role} role cannot modify project data`, [
37
+ "Contact your org admin to upgrade your role to editor",
38
+ "Use read-only tools (atoms_list_items, atoms_get_item, atoms_search) instead",
39
+ ]);
40
+ }
41
+ export function validationError(message) {
42
+ return errorResponse(`Validation error: ${message}`, [
43
+ "Check the parameter types and constraints in the tool description",
44
+ "Ensure all required parameters are provided",
45
+ ]);
46
+ }
47
+ export function authError() {
48
+ return errorResponse("Not authenticated. Run 'npx @atoms-tech/atoms-mcp login' first.", [
49
+ "Run: npx @atoms-tech/atoms-mcp login",
50
+ "Or set ATOMS_ACCESS_TOKEN environment variable",
51
+ ]);
52
+ }
53
+ export function rateLimitError(retryAfterSeconds) {
54
+ return errorResponse("Rate limit exceeded", [
55
+ `Wait ${retryAfterSeconds} seconds before making more requests`,
56
+ "Reduce the frequency of tool calls",
57
+ ]);
58
+ }
59
+ export function dbError(message) {
60
+ return errorResponse(`Database error: ${message}`, [
61
+ "This may be a temporary issue — try again",
62
+ "If the error persists, check that the project_id is valid",
63
+ ]);
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Response formatting
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Format a tool result as JSON string + structuredContent for the MCP SDK.
70
+ * Applies CHARACTER_LIMIT truncation if needed.
71
+ */
72
+ export function formatToolResult(result) {
73
+ const json = JSON.stringify(result, null, 2);
74
+ if (json.length > CHARACTER_LIMIT) {
75
+ // If it's a success with array data, truncate the data
76
+ if (result.status === "success" && Array.isArray(result.data)) {
77
+ const halfLength = Math.max(1, Math.floor(result.data.length / 2));
78
+ const truncated = {
79
+ ...result,
80
+ data: result.data.slice(0, halfLength),
81
+ meta: {
82
+ ...result.meta,
83
+ truncated: true,
84
+ truncation_message: `Response truncated from ${result.data.length} to ${halfLength} items. ` +
85
+ `Use 'offset' parameter or add filters to see more results.`,
86
+ },
87
+ };
88
+ return {
89
+ content: [{ type: "text", text: JSON.stringify(truncated, null, 2) }],
90
+ structuredContent: truncated,
91
+ };
92
+ }
93
+ }
94
+ return {
95
+ content: [{ type: "text", text: json }],
96
+ structuredContent: result,
97
+ };
98
+ }
99
+ /**
100
+ * Format an error result for the MCP SDK.
101
+ */
102
+ export function formatErrorResult(error) {
103
+ return {
104
+ content: [{ type: "text", text: JSON.stringify(error, null, 2) }],
105
+ structuredContent: error,
106
+ isError: true,
107
+ };
108
+ }
109
+ //# sourceMappingURL=_base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_base.js","sourceRoot":"","sources":["../../src/tools/_base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * atoms_create_item — Create a new requirement, test case, or note.
3
+ * Requires editor or admin role. Logs with AI actor attribution.
4
+ */
5
+ export declare function createItemHandler(params: {
6
+ project_id: string;
7
+ type: "requirement" | "test-case" | "note";
8
+ title: string;
9
+ body?: string;
10
+ summary?: string;
11
+ domains?: string[];
12
+ level?: string;
13
+ parent_ids?: string[];
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
+ type: "requirement" | "test-case" | "note";
39
+ title: string;
40
+ project_id: string;
41
+ }>;
42
+ }>;
43
+ //# sourceMappingURL=create-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-item.d.ts","sourceRoot":"","sources":["../../src/tools/create-item.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,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,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0HA"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * atoms_create_item — Create a new requirement, test case, or note.
3
+ * Requires editor or admin role. Logs with AI actor attribution.
4
+ */
5
+ import { getClient, getUserId, requireWriteAccess } from "../db/client.js";
6
+ import { generateItemId } from "../db/queries.js";
7
+ import { getMcpSessionId } from "../server.js";
8
+ import { formatToolResult, formatErrorResult, success, accessDeniedError, dbError, authError, } from "./_base.js";
9
+ export async function createItemHandler(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
+ // Generate next ID (uses SECURITY DEFINER function to avoid collisions)
24
+ const itemId = await generateItemId(client, params.project_id, params.type);
25
+ // Build WorkItem data blob
26
+ const workItem = {
27
+ id: itemId,
28
+ type: params.type,
29
+ title: params.title,
30
+ summary: params.summary,
31
+ body: params.body,
32
+ tags: {
33
+ domains: params.domains ?? [],
34
+ level: params.level,
35
+ },
36
+ ownership: {
37
+ primary: null,
38
+ additional: [],
39
+ },
40
+ relationships: {
41
+ parents: params.parent_ids ?? [],
42
+ children: [],
43
+ related: [],
44
+ },
45
+ links: [],
46
+ metadata: {
47
+ created_at: new Date().toISOString(),
48
+ created_by: userId,
49
+ updated_at: new Date().toISOString(),
50
+ updated_by: userId,
51
+ },
52
+ };
53
+ // Insert to items table
54
+ const { error: insertErr } = await client
55
+ .from("items")
56
+ .insert({
57
+ id: itemId,
58
+ project_id: params.project_id,
59
+ type: params.type,
60
+ title: params.title,
61
+ data: workItem,
62
+ created_by: userId,
63
+ updated_by: userId,
64
+ })
65
+ .select()
66
+ .single();
67
+ if (insertErr)
68
+ throw new Error(insertErr.message);
69
+ // Dual-write: sync relationships to shadow table
70
+ if (params.parent_ids && params.parent_ids.length > 0) {
71
+ const relRows = params.parent_ids.map((parentId) => ({
72
+ from_id: itemId,
73
+ to_id: parentId,
74
+ type: "parent",
75
+ project_id: params.project_id,
76
+ }));
77
+ await client
78
+ .from("item_relationships")
79
+ .insert(relRows)
80
+ .then(({ error }) => {
81
+ if (error) {
82
+ process.stderr.write(`[atoms-mcp] Warning: relationship sync failed: ${error.message}\n`);
83
+ }
84
+ });
85
+ }
86
+ // Audit: log to change_history with MCP actor
87
+ await client
88
+ .from("change_history")
89
+ .insert({
90
+ item_id: itemId,
91
+ project_id: params.project_id,
92
+ changed_by: userId,
93
+ event_type: "created",
94
+ old_data: null,
95
+ new_data: workItem,
96
+ actor: "mcp_claude",
97
+ session_id: getMcpSessionId(),
98
+ })
99
+ .then(({ error }) => {
100
+ if (error) {
101
+ process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
102
+ }
103
+ });
104
+ return formatToolResult(success({
105
+ id: itemId,
106
+ type: params.type,
107
+ title: params.title,
108
+ project_id: params.project_id,
109
+ }));
110
+ }
111
+ catch (err) {
112
+ if (err instanceof Error && err.message.includes("Not authenticated")) {
113
+ return formatErrorResult(authError());
114
+ }
115
+ return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
116
+ }
117
+ }
118
+ //# sourceMappingURL=create-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-item.js","sourceRoot":"","sources":["../../src/tools/create-item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * atoms_delete_item — Soft-delete an item (sets deleted_at, preserves for audit).
3
+ * Requires editor or admin role.
4
+ */
5
+ export declare function deleteItemHandler(params: {
6
+ project_id: string;
7
+ item_id: string;
8
+ }): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ structuredContent: {
14
+ data: any[];
15
+ meta: {
16
+ truncated: boolean;
17
+ truncation_message: string;
18
+ total_count?: number | undefined;
19
+ limit?: number | undefined;
20
+ offset?: number | undefined;
21
+ has_more?: boolean | undefined;
22
+ };
23
+ status: "success";
24
+ };
25
+ } | {
26
+ content: {
27
+ type: "text";
28
+ text: string;
29
+ }[];
30
+ structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<{
31
+ id: string;
32
+ title: string;
33
+ type: string;
34
+ deleted: boolean;
35
+ message: string;
36
+ }>;
37
+ }>;
38
+ //# sourceMappingURL=delete-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-item.d.ts","sourceRoot":"","sources":["../../src/tools/delete-item.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEA"}
@@ -0,0 +1,69 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-item.js","sourceRoot":"","sources":["../../src/tools/delete-item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,125 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-mermaid.js","sourceRoot":"","sources":["../../src/tools/export-mermaid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,36 @@
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