@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,150 +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
- 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, validationError, dbError, authError, } from "./_base.js";
9
- export async function linkItemsHandler(params) {
10
- try {
11
- const client = await getClient();
12
- const userId = getUserId();
13
- // Validate: no self-referencing
14
- if (params.from_id === params.to_id) {
15
- return formatErrorResult(validationError("Cannot create a relationship between an item and itself"));
16
- }
17
- // Check write access
18
- try {
19
- await requireWriteAccess(client, params.project_id);
20
- }
21
- catch (err) {
22
- if (err instanceof Error && err.message === "VIEWER_ROLE") {
23
- return formatErrorResult(accessDeniedError("Viewer"));
24
- }
25
- throw err;
26
- }
27
- // Verify both items exist
28
- const fromItem = await getItemById(client, params.project_id, params.from_id);
29
- if (!fromItem) {
30
- return formatErrorResult(notFoundError("Item", params.from_id));
31
- }
32
- const toItem = await getItemById(client, params.project_id, params.to_id);
33
- if (!toItem) {
34
- return formatErrorResult(notFoundError("Item", params.to_id));
35
- }
36
- if (params.action === "add") {
37
- // Check if relationship already exists
38
- const { data: existing } = await client
39
- .from("item_relationships")
40
- .select("from_id")
41
- .eq("from_id", params.from_id)
42
- .eq("to_id", params.to_id)
43
- .eq("type", params.type)
44
- .eq("project_id", params.project_id)
45
- .maybeSingle();
46
- if (!existing) {
47
- const { error: relErr } = await client
48
- .from("item_relationships")
49
- .insert({
50
- from_id: params.from_id,
51
- to_id: params.to_id,
52
- type: params.type,
53
- project_id: params.project_id,
54
- });
55
- if (relErr)
56
- throw new Error(relErr.message);
57
- }
58
- // Update JSONB data on the from item
59
- const fromData = { ...fromItem.data };
60
- const relKey = params.type === "verified_by" || params.type === "verifies"
61
- ? params.type
62
- : params.type + "s" === "parents" ? "parents"
63
- : params.type === "parent" ? "parents"
64
- : params.type === "child" ? "children"
65
- : "related";
66
- const relField = relKey;
67
- if (fromData.relationships) {
68
- const existing = fromData.relationships[relField] ?? [];
69
- if (!existing.includes(params.to_id)) {
70
- fromData.relationships[relField] = [
71
- ...existing,
72
- params.to_id,
73
- ];
74
- }
75
- }
76
- await client
77
- .from("items")
78
- .update({ data: fromData, updated_by: userId })
79
- .eq("id", params.from_id)
80
- .eq("project_id", params.project_id);
81
- }
82
- else {
83
- // Remove from shadow table
84
- const { error: delErr } = await client
85
- .from("item_relationships")
86
- .delete()
87
- .eq("from_id", params.from_id)
88
- .eq("to_id", params.to_id)
89
- .eq("type", params.type)
90
- .eq("project_id", params.project_id);
91
- if (delErr)
92
- throw new Error(delErr.message);
93
- // Update JSONB data on the from item
94
- const fromData = { ...fromItem.data };
95
- const relKey = params.type === "parent" ? "parents"
96
- : params.type === "child" ? "children"
97
- : params.type;
98
- const relField = relKey;
99
- if (fromData.relationships) {
100
- const existing = fromData.relationships[relField] ?? [];
101
- fromData.relationships[relField] =
102
- existing.filter((id) => id !== params.to_id);
103
- }
104
- await client
105
- .from("items")
106
- .update({ data: fromData, updated_by: userId })
107
- .eq("id", params.from_id)
108
- .eq("project_id", params.project_id);
109
- }
110
- // Audit log
111
- await client
112
- .from("change_history")
113
- .insert({
114
- item_id: params.from_id,
115
- project_id: params.project_id,
116
- changed_by: userId,
117
- event_type: "updated",
118
- old_data: null,
119
- new_data: {
120
- relationship_change: {
121
- action: params.action,
122
- type: params.type,
123
- from: params.from_id,
124
- to: params.to_id,
125
- },
126
- },
127
- actor: "mcp_claude",
128
- session_id: getMcpSessionId(),
129
- })
130
- .then(({ error }) => {
131
- if (error) {
132
- process.stderr.write(`[atoms-mcp] Warning: change_history log failed: ${error.message}\n`);
133
- }
134
- });
135
- return formatToolResult(success({
136
- action: params.action,
137
- type: params.type,
138
- from_id: params.from_id,
139
- to_id: params.to_id,
140
- message: `Relationship ${params.action === "add" ? "added" : "removed"}: ${params.from_id} --[${params.type}]--> ${params.to_id}`,
141
- }));
142
- }
143
- catch (err) {
144
- if (err instanceof Error && err.message.includes("Not authenticated")) {
145
- return formatErrorResult(authError());
146
- }
147
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
148
- }
149
- }
150
- //# sourceMappingURL=link-items.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-items.js","sourceRoot":"","sources":["../../src/tools/link-items.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- /**
2
- * atoms_list_items — List items in a project with optional filters.
3
- * ENTRY POINT tool for discovering project contents.
4
- */
5
- import type { ItemSummary } from "../types/responses.js";
6
- export declare function listItemsHandler(params: {
7
- project_id: string;
8
- type?: string;
9
- domain?: string;
10
- level?: string;
11
- limit: number;
12
- offset: number;
13
- }): Promise<{
14
- content: {
15
- type: "text";
16
- text: string;
17
- }[];
18
- structuredContent: {
19
- data: any[];
20
- meta: {
21
- truncated: boolean;
22
- truncation_message: string;
23
- total_count?: number | undefined;
24
- limit?: number | undefined;
25
- offset?: number | undefined;
26
- has_more?: boolean | undefined;
27
- };
28
- status: "success";
29
- };
30
- } | {
31
- content: {
32
- type: "text";
33
- text: string;
34
- }[];
35
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ItemSummary[]>;
36
- }>;
37
- //# sourceMappingURL=list-items.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-items.d.ts","sourceRoot":"","sources":["../../src/tools/list-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;;;;;;;;;;;;GAgCA"}
@@ -1,36 +0,0 @@
1
- /**
2
- * atoms_list_items — List items in a project with optional filters.
3
- * ENTRY POINT tool for discovering project contents.
4
- */
5
- import { getClient } from "../db/client.js";
6
- import { listItems } from "../db/queries.js";
7
- import { formatToolResult, formatErrorResult, success, paginationMeta, dbError, authError, } from "./_base.js";
8
- export async function listItemsHandler(params) {
9
- try {
10
- const client = await getClient();
11
- const { items, totalCount } = await listItems(client, params.project_id, {
12
- type: params.type,
13
- domain: params.domain,
14
- level: params.level,
15
- limit: params.limit,
16
- offset: params.offset,
17
- });
18
- // Map to @basic fields
19
- const data = items.map((item) => ({
20
- id: item.id,
21
- title: item.title,
22
- type: item.type,
23
- status: item.data?.status,
24
- domains: item.data?.tags?.domains ?? [],
25
- level: item.data?.tags?.level,
26
- }));
27
- return formatToolResult(success(data, paginationMeta(totalCount, params.limit, params.offset)));
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=list-items.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-items.js","sourceRoot":"","sources":["../../src/tools/list-items.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,OAAO,EACP,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAOtC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE;YACvE,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,uBAAuB;QACvB,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,MAAM,CAAC,MAAM,CAAC,CAAC,CACvE,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,38 +0,0 @@
1
- /**
2
- * atoms_list_projects — Discover accessible projects.
3
- *
4
- * ENTRY POINT tool. Must be called first to get project_id for all other tools.
5
- * RLS ensures only projects the user has org membership for are returned.
6
- */
7
- export declare function listProjectsHandler(): 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
- id: string;
31
- name: string;
32
- description: string | null;
33
- org_id: string;
34
- org_name: string;
35
- created_at: string;
36
- }[]>;
37
- }>;
38
- //# sourceMappingURL=list-projects.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wBAAsB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBxC"}
@@ -1,28 +0,0 @@
1
- /**
2
- * atoms_list_projects — Discover accessible projects.
3
- *
4
- * ENTRY POINT tool. Must be called first to get project_id for all other tools.
5
- * RLS ensures only projects the user has org membership for are returned.
6
- */
7
- import { getClient } from "../db/client.js";
8
- import { listProjects } from "../db/queries.js";
9
- import { success, formatToolResult, formatErrorResult, dbError } from "./_base.js";
10
- export async function listProjectsHandler() {
11
- try {
12
- const client = await getClient();
13
- const projects = await listProjects(client);
14
- const data = projects.map((p) => ({
15
- id: p.id,
16
- name: p.name,
17
- description: p.description,
18
- org_id: p.org_id,
19
- org_name: p.org_name,
20
- created_at: p.created_at,
21
- }));
22
- return formatToolResult(success(data));
23
- }
24
- catch (err) {
25
- return formatErrorResult(dbError(err instanceof Error ? err.message : "Unknown error"));
26
- }
27
- }
28
- //# sourceMappingURL=list-projects.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAa,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;QAEJ,OAAO,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,iBAAiB,CACtB,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,64 +0,0 @@
1
- /**
2
- * atoms_project_summary — One-call compliance/health dashboard for a project.
3
- *
4
- * Returns item counts by type, test status breakdown, coverage stats
5
- * (overall + per domain), and recent change activity.
6
- */
7
- interface DomainCoverage {
8
- domain: string;
9
- covered: number;
10
- total: number;
11
- percent: number;
12
- }
13
- interface ProjectSummaryData {
14
- project_id: string;
15
- project_name: string;
16
- counts: {
17
- requirements: number;
18
- test_cases: number;
19
- notes: number;
20
- };
21
- test_status: {
22
- passed: number;
23
- failed: number;
24
- blocked: number;
25
- not_run: number;
26
- };
27
- coverage: {
28
- covered: number;
29
- uncovered: number;
30
- total: number;
31
- percent: number;
32
- };
33
- coverage_by_domain: DomainCoverage[];
34
- recent_changes: number;
35
- last_updated: string;
36
- }
37
- export declare function projectSummaryHandler(params: {
38
- project_id: string;
39
- }): Promise<{
40
- content: {
41
- type: "text";
42
- text: string;
43
- }[];
44
- structuredContent: {
45
- data: any[];
46
- meta: {
47
- truncated: boolean;
48
- truncation_message: string;
49
- total_count?: number | undefined;
50
- limit?: number | undefined;
51
- offset?: number | undefined;
52
- has_more?: boolean | undefined;
53
- };
54
- status: "success";
55
- };
56
- } | {
57
- content: {
58
- type: "text";
59
- text: string;
60
- }[];
61
- structuredContent: import("../types/responses.js").ToolError | import("../types/responses.js").ToolSuccess<ProjectSummaryData>;
62
- }>;
63
- export {};
64
- //# sourceMappingURL=project-summary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-summary.d.ts","sourceRoot":"","sources":["../../src/tools/project-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,UAAU,EAAE,MAAM,CAAC;CACpB;;;;;;;;;;;;;;;;;;;;;;;GA6KA"}
@@ -1,170 +0,0 @@
1
- /**
2
- * atoms_project_summary — One-call compliance/health dashboard for a project.
3
- *
4
- * Returns item counts by type, test status breakdown, coverage stats
5
- * (overall + per domain), and recent change activity.
6
- */
7
- import { getClient } from "../db/client.js";
8
- import { formatToolResult, formatErrorResult, success, dbError, authError, notFoundError, } from "./_base.js";
9
- export async function projectSummaryHandler(params) {
10
- try {
11
- const client = await getClient();
12
- // 1. Verify project exists and get its name
13
- const { data: project, error: projErr } = await client
14
- .from("projects")
15
- .select("id, name")
16
- .eq("id", params.project_id)
17
- .is("deleted_at", null)
18
- .maybeSingle();
19
- if (projErr)
20
- throw new Error(projErr.message);
21
- if (!project) {
22
- return formatErrorResult(notFoundError("Project", params.project_id));
23
- }
24
- // 2. Get all items grouped by type
25
- const { data: items, error: itemsErr } = await client
26
- .from("items")
27
- .select("id, type, data")
28
- .eq("project_id", params.project_id)
29
- .is("deleted_at", null);
30
- if (itemsErr)
31
- throw new Error(itemsErr.message);
32
- const allItems = items ?? [];
33
- const counts = {
34
- requirements: 0,
35
- test_cases: 0,
36
- notes: 0,
37
- };
38
- const testCaseIds = [];
39
- const requirementItems = [];
40
- for (const item of allItems) {
41
- if (item.type === "requirement") {
42
- counts.requirements++;
43
- const domains = item.data?.tags?.domains ?? [];
44
- requirementItems.push({ id: item.id, domains });
45
- }
46
- else if (item.type === "test-case") {
47
- counts.test_cases++;
48
- testCaseIds.push(item.id);
49
- }
50
- else if (item.type === "note") {
51
- counts.notes++;
52
- }
53
- }
54
- // 3. Get latest test result per test case from test_results shadow table
55
- const testStatus = {
56
- passed: 0,
57
- failed: 0,
58
- blocked: 0,
59
- not_run: 0,
60
- };
61
- if (testCaseIds.length > 0) {
62
- // Fetch all test results for this project, ordered by run_at desc
63
- const { data: results, error: resultsErr } = await client
64
- .from("test_results")
65
- .select("item_id, result, run_at")
66
- .eq("project_id", params.project_id)
67
- .order("run_at", { ascending: false });
68
- if (resultsErr)
69
- throw new Error(resultsErr.message);
70
- // Deduplicate to latest result per test case
71
- const latestByItem = new Map();
72
- for (const r of results ?? []) {
73
- if (!latestByItem.has(r.item_id)) {
74
- latestByItem.set(r.item_id, r.result);
75
- }
76
- }
77
- // Count statuses — test cases without any result are "not_run"
78
- for (const tcId of testCaseIds) {
79
- const result = latestByItem.get(tcId);
80
- if (!result || result === "not-run") {
81
- testStatus.not_run++;
82
- }
83
- else if (result === "passed") {
84
- testStatus.passed++;
85
- }
86
- else if (result === "failed") {
87
- testStatus.failed++;
88
- }
89
- else if (result === "blocked") {
90
- testStatus.blocked++;
91
- }
92
- else {
93
- testStatus.not_run++;
94
- }
95
- }
96
- }
97
- // 4. Coverage: requirements with at least one verified_by relationship
98
- const { data: verifiedRels, error: relErr } = await client
99
- .from("item_relationships")
100
- .select("from_id")
101
- .eq("project_id", params.project_id)
102
- .eq("type", "verified_by");
103
- if (relErr)
104
- throw new Error(relErr.message);
105
- const coveredIds = new Set((verifiedRels ?? []).map((r) => r.from_id));
106
- const coveredCount = requirementItems.filter((r) => coveredIds.has(r.id)).length;
107
- const totalReqs = requirementItems.length;
108
- const coverage = {
109
- covered: coveredCount,
110
- uncovered: totalReqs - coveredCount,
111
- total: totalReqs,
112
- percent: totalReqs > 0
113
- ? Math.round((coveredCount / totalReqs) * 1000) / 10
114
- : 100,
115
- };
116
- // 5. Coverage by domain
117
- const domainMap = new Map();
118
- for (const req of requirementItems) {
119
- const domains = req.domains.length > 0 ? req.domains : ["(untagged)"];
120
- const isCovered = coveredIds.has(req.id);
121
- for (const domain of domains) {
122
- if (!domainMap.has(domain)) {
123
- domainMap.set(domain, { covered: 0, total: 0 });
124
- }
125
- const entry = domainMap.get(domain);
126
- entry.total++;
127
- if (isCovered)
128
- entry.covered++;
129
- }
130
- }
131
- const coverageByDomain = Array.from(domainMap.entries())
132
- .sort((a, b) => a[0].localeCompare(b[0]))
133
- .map(([domain, stats]) => ({
134
- domain,
135
- covered: stats.covered,
136
- total: stats.total,
137
- percent: stats.total > 0
138
- ? Math.round((stats.covered / stats.total) * 1000) / 10
139
- : 100,
140
- }));
141
- // 6. Recent changes (last 7 days)
142
- const sevenDaysAgo = new Date();
143
- sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
144
- const { count: recentChanges, error: histErr } = await client
145
- .from("change_history")
146
- .select("id", { count: "exact", head: true })
147
- .eq("project_id", params.project_id)
148
- .gte("changed_at", sevenDaysAgo.toISOString());
149
- if (histErr)
150
- throw new Error(histErr.message);
151
- const data = {
152
- project_id: params.project_id,
153
- project_name: project.name,
154
- counts,
155
- test_status: testStatus,
156
- coverage,
157
- coverage_by_domain: coverageByDomain,
158
- recent_changes: recentChanges ?? 0,
159
- last_updated: new Date().toISOString(),
160
- };
161
- return formatToolResult(success(data));
162
- }
163
- catch (err) {
164
- if (err instanceof Error && err.message.includes("Not authenticated")) {
165
- return formatErrorResult(authError());
166
- }
167
- return formatErrorResult(dbError(err instanceof Error ? err.message : String(err)));
168
- }
169
- }
170
- //# sourceMappingURL=project-summary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-summary.js","sourceRoot":"","sources":["../../src/tools/project-summary.ts"],"names":[],"mappings":"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"}
@@ -1,41 +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
- export declare function recordTestResultHandler(params: {
6
- project_id: string;
7
- item_id: string;
8
- result: "passed" | "failed" | "blocked" | "not-run";
9
- note?: 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<{
33
- item_id: string;
34
- result: "passed" | "failed" | "blocked" | "not-run";
35
- run_at: string;
36
- run_by: string;
37
- note: string | null;
38
- message: string;
39
- }>;
40
- }>;
41
- //# sourceMappingURL=record-test-result.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"record-test-result.d.ts","sourceRoot":"","sources":["../../src/tools/record-test-result.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkFA"}