@planu/cli 1.4.0 → 1.5.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 (215) hide show
  1. package/dist/config/license-plans.json +15 -1
  2. package/dist/engine/audit-trail/formatter.d.ts +13 -0
  3. package/dist/engine/audit-trail/formatter.d.ts.map +1 -0
  4. package/dist/engine/audit-trail/formatter.js +43 -0
  5. package/dist/engine/audit-trail/formatter.js.map +1 -0
  6. package/dist/engine/audit-trail/hasher.d.ts +18 -0
  7. package/dist/engine/audit-trail/hasher.d.ts.map +1 -0
  8. package/dist/engine/audit-trail/hasher.js +46 -0
  9. package/dist/engine/audit-trail/hasher.js.map +1 -0
  10. package/dist/engine/audit-trail/index.d.ts +2 -0
  11. package/dist/engine/audit-trail/index.d.ts.map +1 -1
  12. package/dist/engine/audit-trail/index.js +4 -1
  13. package/dist/engine/audit-trail/index.js.map +1 -1
  14. package/dist/engine/auto-promoter.d.ts +14 -0
  15. package/dist/engine/auto-promoter.d.ts.map +1 -0
  16. package/dist/engine/auto-promoter.js +40 -0
  17. package/dist/engine/auto-promoter.js.map +1 -0
  18. package/dist/engine/compliance-test-generator/control-mapper.d.ts +4 -0
  19. package/dist/engine/compliance-test-generator/control-mapper.d.ts.map +1 -0
  20. package/dist/engine/compliance-test-generator/control-mapper.js +41 -0
  21. package/dist/engine/compliance-test-generator/control-mapper.js.map +1 -0
  22. package/dist/engine/compliance-test-generator/frameworks/iso42001.d.ts +3 -0
  23. package/dist/engine/compliance-test-generator/frameworks/iso42001.d.ts.map +1 -0
  24. package/dist/engine/compliance-test-generator/frameworks/iso42001.js +55 -0
  25. package/dist/engine/compliance-test-generator/frameworks/iso42001.js.map +1 -0
  26. package/dist/engine/compliance-test-generator/frameworks/pci-dss.d.ts +3 -0
  27. package/dist/engine/compliance-test-generator/frameworks/pci-dss.d.ts.map +1 -0
  28. package/dist/engine/compliance-test-generator/frameworks/pci-dss.js +55 -0
  29. package/dist/engine/compliance-test-generator/frameworks/pci-dss.js.map +1 -0
  30. package/dist/engine/compliance-test-generator/frameworks/soc2.d.ts +3 -0
  31. package/dist/engine/compliance-test-generator/frameworks/soc2.d.ts.map +1 -0
  32. package/dist/engine/compliance-test-generator/frameworks/soc2.js +47 -0
  33. package/dist/engine/compliance-test-generator/frameworks/soc2.js.map +1 -0
  34. package/dist/engine/compliance-test-generator/index.d.ts +3 -0
  35. package/dist/engine/compliance-test-generator/index.d.ts.map +1 -0
  36. package/dist/engine/compliance-test-generator/index.js +64 -0
  37. package/dist/engine/compliance-test-generator/index.js.map +1 -0
  38. package/dist/engine/compliance-test-generator/test-formatter.d.ts +6 -0
  39. package/dist/engine/compliance-test-generator/test-formatter.d.ts.map +1 -0
  40. package/dist/engine/compliance-test-generator/test-formatter.js +33 -0
  41. package/dist/engine/compliance-test-generator/test-formatter.js.map +1 -0
  42. package/dist/engine/cost-guardrails.d.ts +11 -0
  43. package/dist/engine/cost-guardrails.d.ts.map +1 -0
  44. package/dist/engine/cost-guardrails.js +39 -0
  45. package/dist/engine/cost-guardrails.js.map +1 -0
  46. package/dist/engine/dogfood-analyzer.d.ts +6 -0
  47. package/dist/engine/dogfood-analyzer.d.ts.map +1 -0
  48. package/dist/engine/dogfood-analyzer.js +59 -0
  49. package/dist/engine/dogfood-analyzer.js.map +1 -0
  50. package/dist/engine/drift-watcher/criteria-checker.d.ts +16 -0
  51. package/dist/engine/drift-watcher/criteria-checker.d.ts.map +1 -0
  52. package/dist/engine/drift-watcher/criteria-checker.js +81 -0
  53. package/dist/engine/drift-watcher/criteria-checker.js.map +1 -0
  54. package/dist/engine/drift-watcher/file-watcher.d.ts +8 -0
  55. package/dist/engine/drift-watcher/file-watcher.d.ts.map +1 -0
  56. package/dist/engine/drift-watcher/file-watcher.js +24 -0
  57. package/dist/engine/drift-watcher/file-watcher.js.map +1 -0
  58. package/dist/engine/drift-watcher/index.d.ts +19 -0
  59. package/dist/engine/drift-watcher/index.d.ts.map +1 -0
  60. package/dist/engine/drift-watcher/index.js +70 -0
  61. package/dist/engine/drift-watcher/index.js.map +1 -0
  62. package/dist/engine/mcp-gateway/gateway-registry.d.ts +19 -0
  63. package/dist/engine/mcp-gateway/gateway-registry.d.ts.map +1 -0
  64. package/dist/engine/mcp-gateway/gateway-registry.js +33 -0
  65. package/dist/engine/mcp-gateway/gateway-registry.js.map +1 -0
  66. package/dist/engine/mcp-gateway/gateway-scanner.d.ts +17 -0
  67. package/dist/engine/mcp-gateway/gateway-scanner.d.ts.map +1 -0
  68. package/dist/engine/mcp-gateway/gateway-scanner.js +62 -0
  69. package/dist/engine/mcp-gateway/gateway-scanner.js.map +1 -0
  70. package/dist/engine/mcp-gateway/index.d.ts +3 -0
  71. package/dist/engine/mcp-gateway/index.d.ts.map +1 -0
  72. package/dist/engine/mcp-gateway/index.js +4 -0
  73. package/dist/engine/mcp-gateway/index.js.map +1 -0
  74. package/dist/engine/multi-repo/companion-spec-builder.d.ts +9 -0
  75. package/dist/engine/multi-repo/companion-spec-builder.d.ts.map +1 -0
  76. package/dist/engine/multi-repo/companion-spec-builder.js +22 -0
  77. package/dist/engine/multi-repo/companion-spec-builder.js.map +1 -0
  78. package/dist/engine/multi-repo/consumer-scanner.d.ts +12 -0
  79. package/dist/engine/multi-repo/consumer-scanner.d.ts.map +1 -0
  80. package/dist/engine/multi-repo/consumer-scanner.js +48 -0
  81. package/dist/engine/multi-repo/consumer-scanner.js.map +1 -0
  82. package/dist/engine/multi-repo/index.d.ts +4 -0
  83. package/dist/engine/multi-repo/index.d.ts.map +1 -0
  84. package/dist/engine/multi-repo/index.js +5 -0
  85. package/dist/engine/multi-repo/index.js.map +1 -0
  86. package/dist/engine/multi-repo/refactor-tracker.d.ts +7 -0
  87. package/dist/engine/multi-repo/refactor-tracker.d.ts.map +1 -0
  88. package/dist/engine/multi-repo/refactor-tracker.js +22 -0
  89. package/dist/engine/multi-repo/refactor-tracker.js.map +1 -0
  90. package/dist/index.js +15 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/storage/audit-trail-store.d.ts +20 -0
  93. package/dist/storage/audit-trail-store.d.ts.map +1 -0
  94. package/dist/storage/audit-trail-store.js +98 -0
  95. package/dist/storage/audit-trail-store.js.map +1 -0
  96. package/dist/storage/auto-promoter-config-store.d.ts +11 -0
  97. package/dist/storage/auto-promoter-config-store.d.ts.map +1 -0
  98. package/dist/storage/auto-promoter-config-store.js +23 -0
  99. package/dist/storage/auto-promoter-config-store.js.map +1 -0
  100. package/dist/storage/budget-store.d.ts +19 -0
  101. package/dist/storage/budget-store.d.ts.map +1 -0
  102. package/dist/storage/budget-store.js +64 -0
  103. package/dist/storage/budget-store.js.map +1 -0
  104. package/dist/storage/gateway-store.d.ts +23 -0
  105. package/dist/storage/gateway-store.d.ts.map +1 -0
  106. package/dist/storage/gateway-store.js +52 -0
  107. package/dist/storage/gateway-store.js.map +1 -0
  108. package/dist/storage/refactor-registry-store.d.ts +21 -0
  109. package/dist/storage/refactor-registry-store.d.ts.map +1 -0
  110. package/dist/storage/refactor-registry-store.js +77 -0
  111. package/dist/storage/refactor-registry-store.js.map +1 -0
  112. package/dist/tools/auto-promoter-handler.d.ts +13 -0
  113. package/dist/tools/auto-promoter-handler.d.ts.map +1 -0
  114. package/dist/tools/auto-promoter-handler.js +50 -0
  115. package/dist/tools/auto-promoter-handler.js.map +1 -0
  116. package/dist/tools/compliance-test-handler.d.ts +5 -0
  117. package/dist/tools/compliance-test-handler.d.ts.map +1 -0
  118. package/dist/tools/compliance-test-handler.js +66 -0
  119. package/dist/tools/compliance-test-handler.js.map +1 -0
  120. package/dist/tools/cost-guardrails-handler.d.ts +15 -0
  121. package/dist/tools/cost-guardrails-handler.d.ts.map +1 -0
  122. package/dist/tools/cost-guardrails-handler.js +72 -0
  123. package/dist/tools/cost-guardrails-handler.js.map +1 -0
  124. package/dist/tools/dogfood-status-handler.d.ts +3 -0
  125. package/dist/tools/dogfood-status-handler.d.ts.map +1 -0
  126. package/dist/tools/dogfood-status-handler.js +28 -0
  127. package/dist/tools/dogfood-status-handler.js.map +1 -0
  128. package/dist/tools/drift-watcher-handler.d.ts +7 -0
  129. package/dist/tools/drift-watcher-handler.d.ts.map +1 -0
  130. package/dist/tools/drift-watcher-handler.js +65 -0
  131. package/dist/tools/drift-watcher-handler.js.map +1 -0
  132. package/dist/tools/export-audit-trail-handler.d.ts +9 -0
  133. package/dist/tools/export-audit-trail-handler.d.ts.map +1 -0
  134. package/dist/tools/export-audit-trail-handler.js +103 -0
  135. package/dist/tools/export-audit-trail-handler.js.map +1 -0
  136. package/dist/tools/mcp-gateway-handler.d.ts +13 -0
  137. package/dist/tools/mcp-gateway-handler.d.ts.map +1 -0
  138. package/dist/tools/mcp-gateway-handler.js +60 -0
  139. package/dist/tools/mcp-gateway-handler.js.map +1 -0
  140. package/dist/tools/multi-repo-handler.d.ts +15 -0
  141. package/dist/tools/multi-repo-handler.d.ts.map +1 -0
  142. package/dist/tools/multi-repo-handler.js +86 -0
  143. package/dist/tools/multi-repo-handler.js.map +1 -0
  144. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -1
  145. package/dist/tools/register-audit-trail-tools.js +38 -0
  146. package/dist/tools/register-audit-trail-tools.js.map +1 -1
  147. package/dist/tools/register-auto-promoter-tools.d.ts +3 -0
  148. package/dist/tools/register-auto-promoter-tools.d.ts.map +1 -0
  149. package/dist/tools/register-auto-promoter-tools.js +43 -0
  150. package/dist/tools/register-auto-promoter-tools.js.map +1 -0
  151. package/dist/tools/register-compliance-test-tools.d.ts +3 -0
  152. package/dist/tools/register-compliance-test-tools.d.ts.map +1 -0
  153. package/dist/tools/register-compliance-test-tools.js +55 -0
  154. package/dist/tools/register-compliance-test-tools.js.map +1 -0
  155. package/dist/tools/register-cost-guardrails-tools.d.ts +3 -0
  156. package/dist/tools/register-cost-guardrails-tools.d.ts.map +1 -0
  157. package/dist/tools/register-cost-guardrails-tools.js +61 -0
  158. package/dist/tools/register-cost-guardrails-tools.js.map +1 -0
  159. package/dist/tools/register-dogfood-tools.d.ts +3 -0
  160. package/dist/tools/register-dogfood-tools.d.ts.map +1 -0
  161. package/dist/tools/register-dogfood-tools.js +21 -0
  162. package/dist/tools/register-dogfood-tools.js.map +1 -0
  163. package/dist/tools/register-drift-watcher-tools.d.ts +3 -0
  164. package/dist/tools/register-drift-watcher-tools.d.ts.map +1 -0
  165. package/dist/tools/register-drift-watcher-tools.js +28 -0
  166. package/dist/tools/register-drift-watcher-tools.js.map +1 -0
  167. package/dist/tools/register-mcp-gateway-tools.d.ts +3 -0
  168. package/dist/tools/register-mcp-gateway-tools.d.ts.map +1 -0
  169. package/dist/tools/register-mcp-gateway-tools.js +35 -0
  170. package/dist/tools/register-mcp-gateway-tools.js.map +1 -0
  171. package/dist/tools/register-multi-repo-tools.d.ts +8 -0
  172. package/dist/tools/register-multi-repo-tools.d.ts.map +1 -0
  173. package/dist/tools/register-multi-repo-tools.js +52 -0
  174. package/dist/tools/register-multi-repo-tools.js.map +1 -0
  175. package/dist/tools/safe-handler.d.ts.map +1 -1
  176. package/dist/tools/safe-handler.js +50 -1
  177. package/dist/tools/safe-handler.js.map +1 -1
  178. package/dist/types/audit.d.ts +64 -0
  179. package/dist/types/audit.d.ts.map +1 -0
  180. package/dist/types/audit.js +3 -0
  181. package/dist/types/audit.js.map +1 -0
  182. package/dist/types/auto-promoter.d.ts +26 -0
  183. package/dist/types/auto-promoter.d.ts.map +1 -0
  184. package/dist/types/auto-promoter.js +3 -0
  185. package/dist/types/auto-promoter.js.map +1 -0
  186. package/dist/types/compliance-tests.d.ts +41 -0
  187. package/dist/types/compliance-tests.d.ts.map +1 -0
  188. package/dist/types/compliance-tests.js +3 -0
  189. package/dist/types/compliance-tests.js.map +1 -0
  190. package/dist/types/cost-guardrails.d.ts +41 -0
  191. package/dist/types/cost-guardrails.d.ts.map +1 -0
  192. package/dist/types/cost-guardrails.js +3 -0
  193. package/dist/types/cost-guardrails.js.map +1 -0
  194. package/dist/types/dogfood.d.ts +22 -0
  195. package/dist/types/dogfood.d.ts.map +1 -0
  196. package/dist/types/dogfood.js +3 -0
  197. package/dist/types/dogfood.js.map +1 -0
  198. package/dist/types/drift-watcher.d.ts +35 -0
  199. package/dist/types/drift-watcher.d.ts.map +1 -0
  200. package/dist/types/drift-watcher.js +3 -0
  201. package/dist/types/drift-watcher.js.map +1 -0
  202. package/dist/types/index.d.ts +8 -0
  203. package/dist/types/index.d.ts.map +1 -1
  204. package/dist/types/index.js +8 -0
  205. package/dist/types/index.js.map +1 -1
  206. package/dist/types/mcp-gateway.d.ts +34 -0
  207. package/dist/types/mcp-gateway.d.ts.map +1 -0
  208. package/dist/types/mcp-gateway.js +3 -0
  209. package/dist/types/mcp-gateway.js.map +1 -0
  210. package/dist/types/multi-repo.d.ts +39 -0
  211. package/dist/types/multi-repo.d.ts.map +1 -0
  212. package/dist/types/multi-repo.js +5 -0
  213. package/dist/types/multi-repo.js.map +1 -0
  214. package/package.json +1 -1
  215. package/src/config/license-plans.json +15 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-store.js","sourceRoot":"","sources":["../../src/storage/gateway-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,aAAa,GAAG,sCAAsC,CAAC;AAE7D,MAAM,gBAAgB,GAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,OAAO,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,MAAM,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA0B;IAC3D,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG;gBACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAyB;IAClD,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { RefactorSession } from '../types/multi-repo.js';
2
+ /**
3
+ * Persist a new refactor session. Throws if a session with the same ID
4
+ * already exists.
5
+ */
6
+ export declare function createSession(session: RefactorSession): Promise<void>;
7
+ /**
8
+ * Look up a refactor session by ID.
9
+ * Returns null when not found.
10
+ */
11
+ export declare function getSession(id: string): Promise<RefactorSession | null>;
12
+ /**
13
+ * Apply partial updates to an existing session.
14
+ * Returns false when the session is not found.
15
+ */
16
+ export declare function updateSession(id: string, updates: Partial<Omit<RefactorSession, 'id'>>): Promise<boolean>;
17
+ /**
18
+ * Return all persisted refactor sessions.
19
+ */
20
+ export declare function listSessions(): Promise<RefactorSession[]>;
21
+ //# sourceMappingURL=refactor-registry-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-registry-store.d.ts","sourceRoot":"","sources":["../../src/storage/refactor-registry-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,wBAAwB,CAAC;AA4BhF;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAG5E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAG/D"}
@@ -0,0 +1,77 @@
1
+ // storage/refactor-registry-store.ts — SPEC-389: Persist active refactor sessions
2
+ // Persistence file: data/global/refactor-registry.json
3
+ import { readJson, writeJson, globalDataDir } from './base-store.js';
4
+ import { withFileLock } from './file-mutex.js';
5
+ // ---------------------------------------------------------------------------
6
+ // File path
7
+ // ---------------------------------------------------------------------------
8
+ function registryFile() {
9
+ return `${globalDataDir()}/refactor-registry.json`;
10
+ }
11
+ function defaultRegistry() {
12
+ return { sessions: [], updatedAt: new Date(0).toISOString() };
13
+ }
14
+ async function loadData() {
15
+ return readJson(registryFile(), defaultRegistry());
16
+ }
17
+ async function saveData(data) {
18
+ await writeJson(registryFile(), data);
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Public API
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Persist a new refactor session. Throws if a session with the same ID
25
+ * already exists.
26
+ */
27
+ export async function createSession(session) {
28
+ await withFileLock(registryFile(), async () => {
29
+ const data = await loadData();
30
+ const exists = data.sessions.some((s) => s.id === session.id);
31
+ if (exists) {
32
+ throw new Error(`[Planu] RefactorSession "${session.id}" already exists`);
33
+ }
34
+ data.sessions.push(session);
35
+ data.updatedAt = new Date().toISOString();
36
+ await saveData(data);
37
+ });
38
+ }
39
+ /**
40
+ * Look up a refactor session by ID.
41
+ * Returns null when not found.
42
+ */
43
+ export async function getSession(id) {
44
+ const data = await loadData();
45
+ return data.sessions.find((s) => s.id === id) ?? null;
46
+ }
47
+ /**
48
+ * Apply partial updates to an existing session.
49
+ * Returns false when the session is not found.
50
+ */
51
+ export async function updateSession(id, updates) {
52
+ return withFileLock(registryFile(), async () => {
53
+ const data = await loadData();
54
+ const idx = data.sessions.findIndex((s) => s.id === id);
55
+ if (idx === -1) {
56
+ return false;
57
+ }
58
+ const existing = data.sessions[idx];
59
+ /* v8 ignore start */
60
+ if (!existing) {
61
+ return false;
62
+ }
63
+ /* v8 ignore stop */
64
+ data.sessions[idx] = { ...existing, ...updates };
65
+ data.updatedAt = new Date().toISOString();
66
+ await saveData(data);
67
+ return true;
68
+ });
69
+ }
70
+ /**
71
+ * Return all persisted refactor sessions.
72
+ */
73
+ export async function listSessions() {
74
+ const data = await loadData();
75
+ return data.sessions;
76
+ }
77
+ //# sourceMappingURL=refactor-registry-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-registry-store.js","sourceRoot":"","sources":["../../src/storage/refactor-registry-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ToolResult } from '../types/common/primitives.js';
2
+ import type { ConfigureAutoPromotionInput, CheckAutoPromotionInput } from '../types/auto-promoter.js';
3
+ /**
4
+ * Configure auto-promotion settings for a project.
5
+ * Merges provided fields into the existing config and persists.
6
+ */
7
+ export declare function handleConfigureAutoPromotion(input: ConfigureAutoPromotionInput): Promise<ToolResult>;
8
+ /**
9
+ * Check whether a spec is eligible for auto-promotion.
10
+ * Uses a simplified readiness score of 100 and evaluates against project config.
11
+ */
12
+ export declare function handleCheckAutoPromotion(input: CheckAutoPromotionInput): Promise<ToolResult>;
13
+ //# sourceMappingURL=auto-promoter-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-promoter-handler.d.ts","sourceRoot":"","sources":["../../src/tools/auto-promoter-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EACV,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAQnC;;;GAGG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
@@ -0,0 +1,50 @@
1
+ // tools/auto-promoter-handler.ts — Auto-Promotion Confidence Scoring handlers (SPEC-391)
2
+ import { calculateConfidence } from '../engine/auto-promoter.js';
3
+ import { getConfig, saveConfig } from '../storage/auto-promoter-config-store.js';
4
+ import { hashProjectPath } from '../storage/base-store.js';
5
+ import { getSpec } from '../storage/spec-store.js';
6
+ const SIMPLIFIED_READINESS_SCORE = 100;
7
+ /**
8
+ * Configure auto-promotion settings for a project.
9
+ * Merges provided fields into the existing config and persists.
10
+ */
11
+ export async function handleConfigureAutoPromotion(input) {
12
+ const { projectPath, enabled, threshold, maxRisk } = input;
13
+ const current = await getConfig(projectPath);
14
+ const updated = {
15
+ ...current,
16
+ ...(enabled !== undefined && { enabled }),
17
+ ...(threshold !== undefined && { readinessThreshold: threshold }),
18
+ ...(maxRisk !== undefined && { maxRisk }),
19
+ };
20
+ await saveConfig(projectPath, updated);
21
+ const statusLine = updated.enabled ? 'enabled' : 'disabled';
22
+ const text = `Auto-promotion ${statusLine}. ` +
23
+ `Threshold: ${updated.readinessThreshold}, maxRisk: ${updated.maxRisk}.`;
24
+ return { content: [{ type: 'text', text }] };
25
+ }
26
+ /**
27
+ * Check whether a spec is eligible for auto-promotion.
28
+ * Uses a simplified readiness score of 100 and evaluates against project config.
29
+ */
30
+ export async function handleCheckAutoPromotion(input) {
31
+ const { projectPath, specId } = input;
32
+ const projectId = hashProjectPath(projectPath);
33
+ const spec = await getSpec(projectId, specId);
34
+ if (spec === null) {
35
+ return {
36
+ content: [{ type: 'text', text: `Spec ${specId} not found in project.` }],
37
+ };
38
+ }
39
+ const config = await getConfig(projectPath);
40
+ const score = calculateConfidence(spec, SIMPLIFIED_READINESS_SCORE, config);
41
+ const lines = [
42
+ `Spec: ${specId}`,
43
+ `Overall score: ${score.overall}/100`,
44
+ `Readiness: ${score.readiness} | Risk penalty: ${score.riskPenalty} | Dep bonus: ${score.dependencyBonus}`,
45
+ `Eligible: ${score.eligible ? 'YES' : 'NO'}`,
46
+ score.reason,
47
+ ];
48
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
49
+ }
50
+ //# sourceMappingURL=auto-promoter-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-promoter-handler.js","sourceRoot":"","sources":["../../src/tools/auto-promoter-handler.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAOzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAAkC;IAElC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG;QACd,GAAG,OAAO;QACV,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;QACzC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;KAC1C,CAAC;IAEF,MAAM,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5D,MAAM,IAAI,GACR,kBAAkB,UAAU,IAAI;QAChC,cAAc,OAAO,CAAC,kBAAkB,cAAc,OAAO,CAAC,OAAO,GAAG,CAAC;IAE3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAA8B;IAE9B,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEtC,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE9C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,MAAM,wBAAwB,EAAE,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,0BAA0B,EAAE,MAAM,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG;QACZ,SAAS,MAAM,EAAE;QACjB,kBAAkB,KAAK,CAAC,OAAO,MAAM;QACrC,cAAc,KAAK,CAAC,SAAS,oBAAoB,KAAK,CAAC,WAAW,iBAAiB,KAAK,CAAC,eAAe,EAAE;QAC1G,aAAa,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAC5C,KAAK,CAAC,MAAM;KACb,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ToolResult } from '../types/index.js';
2
+ import type { GenerateComplianceTestsInput, ComplianceCoverageInput } from '../types/compliance-tests.js';
3
+ export declare function handleGenerateComplianceTests(input: GenerateComplianceTestsInput): Promise<ToolResult>;
4
+ export declare function handleComplianceCoverageReport(input: ComplianceCoverageInput): ToolResult;
5
+ //# sourceMappingURL=compliance-test-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-test-handler.d.ts","sourceRoot":"","sources":["../../src/tools/compliance-test-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,4BAA4B,EAC5B,uBAAuB,EACxB,MAAM,8BAA8B,CAAC;AAMtC,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,UAAU,CAAC,CAiDrB;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,GAAG,UAAU,CA+BzF"}
@@ -0,0 +1,66 @@
1
+ // tools/compliance-test-handler.ts — SPEC-390: Compliance Test Suite Generator handlers
2
+ import { generateComplianceTests } from '../engine/compliance-test-generator/index.js';
3
+ import { getControlsForFrameworks } from '../engine/compliance-test-generator/control-mapper.js';
4
+ import { specStore } from '../storage/index.js';
5
+ import { hashProjectPath } from '../storage/base-store.js';
6
+ export async function handleGenerateComplianceTests(input) {
7
+ const projectId = hashProjectPath(input.projectPath);
8
+ const spec = await specStore.getSpec(projectId, input.specId);
9
+ if (!spec) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: `Spec "${input.specId}" not found in project at "${input.projectPath}". ` +
15
+ `Run list_specs to see available specs.`,
16
+ },
17
+ ],
18
+ };
19
+ }
20
+ const outputFormat = input.outputFormat ?? 'jest';
21
+ const result = await generateComplianceTests(spec.specPath, input.specId, input.frameworks, outputFormat);
22
+ const fileLines = result.generatedFiles.map((f) => ` ${f.path} (${f.content.split('\n').length} lines)`);
23
+ const coveredCount = result.coverageReport.filter((r) => r.covered).length;
24
+ const totalCount = result.coverageReport.length;
25
+ const lines = [
26
+ result.message,
27
+ ``,
28
+ `Mapped tests: ${result.mappedTests.length}`,
29
+ `Control coverage: ${coveredCount}/${totalCount}`,
30
+ ``,
31
+ `Generated files:`,
32
+ ...fileLines,
33
+ ];
34
+ if (result.mappedTests.length > 0) {
35
+ lines.push(``, `Preview (first test):`, ``, result.mappedTests[0]?.testCode ?? '');
36
+ }
37
+ return {
38
+ content: [{ type: 'text', text: lines.join('\n') }],
39
+ };
40
+ }
41
+ export function handleComplianceCoverageReport(input) {
42
+ const controls = getControlsForFrameworks(input.frameworks);
43
+ if (controls.length === 0) {
44
+ return {
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: `No built-in controls found for frameworks: ${input.frameworks.join(', ')}. ` +
49
+ `Supported: soc2, pci-dss, iso-42001.`,
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ const controlLines = controls.map((c) => `• [${c.id}] ${c.title}\n ${c.description}\n Keywords: ${c.keywords.join(', ')}`);
55
+ const lines = [
56
+ `Compliance controls for ${input.frameworks.join(', ')} (${controls.length} total):`,
57
+ ``,
58
+ ...controlLines,
59
+ ``,
60
+ `Run generate_compliance_tests with a specId to map spec criteria to these controls.`,
61
+ ];
62
+ return {
63
+ content: [{ type: 'text', text: lines.join('\n') }],
64
+ };
65
+ }
66
+ //# sourceMappingURL=compliance-test-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-test-handler.js","sourceRoot":"","sources":["../../src/tools/compliance-test-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolResult } from '../types/common/primitives.js';
2
+ import type { SetSpecBudgetInput, BudgetStatusInput, RecordSpendInput } from '../types/cost-guardrails.js';
3
+ /**
4
+ * Set or update the budget for a spec.
5
+ */
6
+ export declare function handleSetSpecBudget(input: SetSpecBudgetInput): Promise<ToolResult>;
7
+ /**
8
+ * Return the budget status for one spec or all specs in a project.
9
+ */
10
+ export declare function handleBudgetStatus(input: BudgetStatusInput): Promise<ToolResult>;
11
+ /**
12
+ * Record spend for a spec and return updated status with warnings if triggered.
13
+ */
14
+ export declare function handleRecordSpend(input: RecordSpendInput): Promise<ToolResult>;
15
+ //# sourceMappingURL=cost-guardrails-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-guardrails-handler.d.ts","sourceRoot":"","sources":["../../src/tools/cost-guardrails-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,6BAA6B,CAAC;AAMrC;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBxF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBtF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BpF"}
@@ -0,0 +1,72 @@
1
+ // tools/cost-guardrails-handler.ts — Cost Guardrails tool handlers (SPEC-393)
2
+ import { computeBudgetStatus, formatBudgetMessage } from '../engine/cost-guardrails.js';
3
+ import { getBudget, saveBudget, listBudgets, recordSpend } from '../storage/budget-store.js';
4
+ const DEFAULT_WARNING_THRESHOLD = 80;
5
+ /**
6
+ * Set or update the budget for a spec.
7
+ */
8
+ export async function handleSetSpecBudget(input) {
9
+ const { projectPath, specId, maxUsdCents, warningThreshold = DEFAULT_WARNING_THRESHOLD } = input;
10
+ const existing = await getBudget(projectPath, specId);
11
+ const budget = {
12
+ specId,
13
+ projectPath,
14
+ maxUsdCents,
15
+ usedUsdCents: existing?.usedUsdCents ?? 0,
16
+ warningThreshold,
17
+ lastUpdated: new Date().toISOString(),
18
+ };
19
+ await saveBudget(projectPath, budget);
20
+ const dollars = (maxUsdCents / 100).toFixed(2);
21
+ const text = `Budget set for ${specId}: $${dollars} (warning at ${warningThreshold}%).`;
22
+ return { content: [{ type: 'text', text }] };
23
+ }
24
+ /**
25
+ * Return the budget status for one spec or all specs in a project.
26
+ */
27
+ export async function handleBudgetStatus(input) {
28
+ const { projectPath, specId } = input;
29
+ if (specId !== undefined) {
30
+ const budget = await getBudget(projectPath, specId);
31
+ if (budget === null) {
32
+ return { content: [{ type: 'text', text: `No budget found for ${specId}.` }] };
33
+ }
34
+ const status = computeBudgetStatus(budget);
35
+ return { content: [{ type: 'text', text: formatBudgetMessage(status) }] };
36
+ }
37
+ const budgets = await listBudgets(projectPath);
38
+ if (budgets.length === 0) {
39
+ return { content: [{ type: 'text', text: 'No budgets configured for this project.' }] };
40
+ }
41
+ const lines = budgets.map((b) => formatBudgetMessage(computeBudgetStatus(b)));
42
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
43
+ }
44
+ /**
45
+ * Record spend for a spec and return updated status with warnings if triggered.
46
+ */
47
+ export async function handleRecordSpend(input) {
48
+ const { projectPath, specId, usdCents, modelUsed, toolName } = input;
49
+ await recordSpend(projectPath, specId, usdCents);
50
+ const budget = await getBudget(projectPath, specId);
51
+ if (budget === null) {
52
+ const dollars = (usdCents / 100).toFixed(4);
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `Recorded $${dollars} via ${toolName} (${modelUsed}). No budget configured for ${specId}.`,
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ const status = computeBudgetStatus(budget);
63
+ const statusMsg = formatBudgetMessage(status);
64
+ const dollars = (usdCents / 100).toFixed(4);
65
+ const lines = [
66
+ `Recorded $${dollars} via ${toolName} (${modelUsed}).`,
67
+ statusMsg,
68
+ `Recommended model: ${status.recommendedModel}`,
69
+ ];
70
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
71
+ }
72
+ //# sourceMappingURL=cost-guardrails-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-guardrails-handler.js","sourceRoot":"","sources":["../../src/tools/cost-guardrails-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolResult, DogfoodStatusInput } from '../types/index.js';
2
+ export declare function handleDogfoodStatus(input: DogfoodStatusInput): ToolResult;
3
+ //# sourceMappingURL=dogfood-status-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dogfood-status-handler.d.ts","sourceRoot":"","sources":["../../src/tools/dogfood-status-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAOxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,CA2BzE"}
@@ -0,0 +1,28 @@
1
+ import { getRecentCommitMessages, detectToolUsageFromMessages, buildDogfoodReport, } from '../engine/dogfood-analyzer.js';
2
+ export function handleDogfoodStatus(input) {
3
+ const sinceDays = input.since
4
+ ? Math.ceil((Date.now() - new Date(input.since).getTime()) / 86400000)
5
+ : 30;
6
+ const period = `Last ${String(sinceDays)} days`;
7
+ const messages = getRecentCommitMessages(input.projectPath, sinceDays);
8
+ const usedTools = detectToolUsageFromMessages(messages);
9
+ const report = buildDogfoodReport(usedTools, period, messages);
10
+ const lines = [
11
+ `## Planu Dogfood Status — ${report.period}`,
12
+ `**Score**: ${String(report.dogfoodScore)}/100`,
13
+ `**Tools used**: ${report.usedTools.join(', ') || 'none'}`,
14
+ `**Missing**: ${report.missingTools.join(', ') || 'none'}`,
15
+ '',
16
+ `### Metrics`,
17
+ `- Specs created: ${String(report.metrics.specCreated)}`,
18
+ `- Specs validated: ${String(report.metrics.specValidated)}`,
19
+ `- Specs challenged: ${String(report.metrics.specChallenged)}`,
20
+ `- Readiness checked: ${String(report.metrics.readinessChecked)}`,
21
+ `- Status updates: ${String(report.metrics.statusUpdated)}`,
22
+ '',
23
+ `### Recommendation`,
24
+ report.recommendation,
25
+ ];
26
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
27
+ }
28
+ //# sourceMappingURL=dogfood-status-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dogfood-status-handler.js","sourceRoot":"","sources":["../../src/tools/dogfood-status-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK;QAC3B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;QACtE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IAChD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG;QACZ,6BAA6B,MAAM,CAAC,MAAM,EAAE;QAC5C,cAAc,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM;QAC/C,mBAAmB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;QAC1D,gBAAgB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;QAC1D,EAAE;QACF,aAAa;QACb,oBAAoB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACxD,sBAAsB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;QAC5D,uBAAuB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;QAC9D,wBAAwB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;QACjE,qBAAqB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;QAC3D,EAAE;QACF,oBAAoB;QACpB,MAAM,CAAC,cAAc;KACtB,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ToolResult, WatchSpecDriftInput } from '../types/index.js';
2
+ /**
3
+ * Handle the watch_spec_drift tool invocation.
4
+ * Routes to start/stop/status based on the action field.
5
+ */
6
+ export declare function handleWatchSpecDrift(input: WatchSpecDriftInput): Promise<ToolResult>;
7
+ //# sourceMappingURL=drift-watcher-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-watcher-handler.d.ts","sourceRoot":"","sources":["../../src/tools/drift-watcher-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAKzE;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+D1F"}
@@ -0,0 +1,65 @@
1
+ import { hashProjectPath } from '../storage/base-store.js';
2
+ import { listSpecs } from '../storage/spec-store.js';
3
+ import { startWatcher, stopWatcher, getWatcherState } from '../engine/drift-watcher/index.js';
4
+ /**
5
+ * Handle the watch_spec_drift tool invocation.
6
+ * Routes to start/stop/status based on the action field.
7
+ */
8
+ export async function handleWatchSpecDrift(input) {
9
+ const { projectPath, specId, action } = input;
10
+ if (action === 'status') {
11
+ const state = getWatcherState(specId);
12
+ if (!state) {
13
+ return {
14
+ content: [{ type: 'text', text: `No active watcher for spec ${specId}.` }],
15
+ };
16
+ }
17
+ return {
18
+ content: [
19
+ {
20
+ type: 'text',
21
+ text: JSON.stringify(state, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ }
26
+ if (action === 'stop') {
27
+ const stopped = stopWatcher(specId);
28
+ return {
29
+ content: [
30
+ {
31
+ type: 'text',
32
+ text: stopped
33
+ ? `Watcher stopped for spec ${specId}.`
34
+ : `No active watcher found for spec ${specId}.`,
35
+ },
36
+ ],
37
+ };
38
+ }
39
+ // action === 'start'
40
+ const projectId = hashProjectPath(projectPath);
41
+ const specs = await listSpecs(projectId);
42
+ const spec = specs.find((s) => s.id === specId);
43
+ if (!spec) {
44
+ return {
45
+ content: [{ type: 'text', text: `Spec ${specId} not found in project ${projectPath}.` }],
46
+ };
47
+ }
48
+ const specPath = spec.specPath;
49
+ const watchedPaths = [projectPath];
50
+ const state = startWatcher({
51
+ specId,
52
+ projectPath,
53
+ specPath,
54
+ watchedPaths,
55
+ });
56
+ return {
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: JSON.stringify(state, null, 2),
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ //# sourceMappingURL=drift-watcher-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-watcher-handler.js","sourceRoot":"","sources":["../../src/tools/drift-watcher-handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE9F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAA0B;IACnE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE9C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,MAAM,GAAG,EAAE,CAAC;aAC3E,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;iBACrC;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO;wBACX,CAAC,CAAC,4BAA4B,MAAM,GAAG;wBACvC,CAAC,CAAC,oCAAoC,MAAM,GAAG;iBAClD;aACF;SACF,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,MAAM,yBAAyB,WAAW,GAAG,EAAE,CAAC;SACzF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,MAAM,YAAY,GAAG,CAAC,WAAW,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,MAAM;QACN,WAAW;QACX,QAAQ;QACR,YAAY;KACb,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACrC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ToolResult } from '../types/index.js';
2
+ import type { AuditTrailExportInput } from '../types/audit.js';
3
+ /**
4
+ * Handle export_audit_trail tool invocation.
5
+ * Reads the global audit trail, applies filters, verifies chain integrity,
6
+ * and returns formatted output in the requested format.
7
+ */
8
+ export declare function handleExportAuditTrail(input: AuditTrailExportInput): ToolResult;
9
+ //# sourceMappingURL=export-audit-trail-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-audit-trail-handler.d.ts","sourceRoot":"","sources":["../../src/tools/export-audit-trail-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAEV,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AA4E3B;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,GAAG,UAAU,CAuC/E"}
@@ -0,0 +1,103 @@
1
+ // tools/export-audit-trail-handler.ts — Handler for export_audit_trail tool (SPEC-387)
2
+ import { readEntries } from '../storage/audit-trail-store.js';
3
+ import { verifyChain } from '../engine/audit-trail/hasher.js';
4
+ import { formatSuccess, toolResult } from './response-helpers.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Formatters
7
+ // ---------------------------------------------------------------------------
8
+ function formatJson(entries) {
9
+ return JSON.stringify(entries, null, 2);
10
+ }
11
+ function formatJsonLd(entries) {
12
+ const graph = entries.map((e) => ({
13
+ '@type': 'prov:Activity',
14
+ '@id': `urn:planu:audit:${e.id}`,
15
+ 'prov:startedAtTime': e.timestamp,
16
+ 'prov:endedAtTime': e.timestamp,
17
+ 'planu:toolName': e.toolName,
18
+ 'planu:inputSummary': e.inputSummary,
19
+ 'planu:outputType': e.outputType,
20
+ 'planu:durationMs': e.durationMs,
21
+ 'planu:hash': e.hash,
22
+ 'planu:prevHash': e.prevHash,
23
+ ...(e.specId !== undefined ? { 'planu:specId': e.specId } : {}),
24
+ ...(e.projectPath !== undefined ? { 'planu:projectPath': e.projectPath } : {}),
25
+ }));
26
+ const doc = {
27
+ '@context': {
28
+ prov: 'http://www.w3.org/ns/prov#',
29
+ planu: 'https://planu.dev/vocab#',
30
+ },
31
+ '@graph': graph,
32
+ };
33
+ return JSON.stringify(doc, null, 2);
34
+ }
35
+ function formatCsv(entries) {
36
+ const header = 'id,timestamp,toolName,outputType,durationMs,specId,projectPath,hash,prevHash,inputSummary';
37
+ const rows = entries.map((e) => {
38
+ const cols = [
39
+ e.id,
40
+ e.timestamp,
41
+ e.toolName,
42
+ e.outputType,
43
+ String(e.durationMs),
44
+ e.specId ?? '',
45
+ e.projectPath ?? '',
46
+ e.hash,
47
+ e.prevHash,
48
+ `"${e.inputSummary.replace(/"/g, '""')}"`,
49
+ ];
50
+ return cols.join(',');
51
+ });
52
+ return [header, ...rows].join('\n');
53
+ }
54
+ function renderFormat(format, entries) {
55
+ switch (format) {
56
+ case 'json':
57
+ return formatJson(entries);
58
+ case 'json-ld':
59
+ return formatJsonLd(entries);
60
+ case 'csv':
61
+ return formatCsv(entries);
62
+ }
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Handler
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Handle export_audit_trail tool invocation.
69
+ * Reads the global audit trail, applies filters, verifies chain integrity,
70
+ * and returns formatted output in the requested format.
71
+ */
72
+ export function handleExportAuditTrail(input) {
73
+ const format = input.format ?? 'json';
74
+ const allEntries = readEntries({
75
+ fromDate: input.fromDate,
76
+ toDate: input.toDate,
77
+ specId: input.specId,
78
+ projectPath: input.projectPath,
79
+ limit: input.limit,
80
+ });
81
+ // Verify chain on the full unfiltered set for accurate integrity reporting
82
+ const fullEntries = readEntries();
83
+ const integrityValid = verifyChain(fullEntries);
84
+ const formatted = renderFormat(format, allEntries);
85
+ const exportedAt = new Date().toISOString();
86
+ const result = {
87
+ entries: allEntries,
88
+ totalCount: allEntries.length,
89
+ format,
90
+ exportedAt,
91
+ integrityValid,
92
+ };
93
+ const summary = [
94
+ `Audit Trail Export — SPEC-387 (EU AI Act Article 12)`,
95
+ `Entries: ${String(allEntries.length)} | Format: ${format}`,
96
+ `Chain integrity: ${integrityValid ? 'VALID' : 'BROKEN'}`,
97
+ `Exported at: ${exportedAt}`,
98
+ '',
99
+ formatted,
100
+ ].join('\n');
101
+ return toolResult(formatSuccess('Audit Trail Export', summary), result);
102
+ }
103
+ //# sourceMappingURL=export-audit-trail-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-audit-trail-handler.js","sourceRoot":"","sources":["../../src/tools/export-audit-trail-handler.ts"],"names":[],"mappings":"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"}