@planu/cli 1.3.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 (282) hide show
  1. package/dist/config/license-plans.json +18 -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/doc-compliance-checker.d.ts +23 -0
  47. package/dist/engine/doc-compliance-checker.d.ts.map +1 -0
  48. package/dist/engine/doc-compliance-checker.js +168 -0
  49. package/dist/engine/doc-compliance-checker.js.map +1 -0
  50. package/dist/engine/dogfood-analyzer.d.ts +6 -0
  51. package/dist/engine/dogfood-analyzer.d.ts.map +1 -0
  52. package/dist/engine/dogfood-analyzer.js +59 -0
  53. package/dist/engine/dogfood-analyzer.js.map +1 -0
  54. package/dist/engine/drift-watcher/criteria-checker.d.ts +16 -0
  55. package/dist/engine/drift-watcher/criteria-checker.d.ts.map +1 -0
  56. package/dist/engine/drift-watcher/criteria-checker.js +81 -0
  57. package/dist/engine/drift-watcher/criteria-checker.js.map +1 -0
  58. package/dist/engine/drift-watcher/file-watcher.d.ts +8 -0
  59. package/dist/engine/drift-watcher/file-watcher.d.ts.map +1 -0
  60. package/dist/engine/drift-watcher/file-watcher.js +24 -0
  61. package/dist/engine/drift-watcher/file-watcher.js.map +1 -0
  62. package/dist/engine/drift-watcher/index.d.ts +19 -0
  63. package/dist/engine/drift-watcher/index.d.ts.map +1 -0
  64. package/dist/engine/drift-watcher/index.js +70 -0
  65. package/dist/engine/drift-watcher/index.js.map +1 -0
  66. package/dist/engine/mcp-gateway/gateway-registry.d.ts +19 -0
  67. package/dist/engine/mcp-gateway/gateway-registry.d.ts.map +1 -0
  68. package/dist/engine/mcp-gateway/gateway-registry.js +33 -0
  69. package/dist/engine/mcp-gateway/gateway-registry.js.map +1 -0
  70. package/dist/engine/mcp-gateway/gateway-scanner.d.ts +17 -0
  71. package/dist/engine/mcp-gateway/gateway-scanner.d.ts.map +1 -0
  72. package/dist/engine/mcp-gateway/gateway-scanner.js +62 -0
  73. package/dist/engine/mcp-gateway/gateway-scanner.js.map +1 -0
  74. package/dist/engine/mcp-gateway/index.d.ts +3 -0
  75. package/dist/engine/mcp-gateway/index.d.ts.map +1 -0
  76. package/dist/engine/mcp-gateway/index.js +4 -0
  77. package/dist/engine/mcp-gateway/index.js.map +1 -0
  78. package/dist/engine/multi-repo/companion-spec-builder.d.ts +9 -0
  79. package/dist/engine/multi-repo/companion-spec-builder.d.ts.map +1 -0
  80. package/dist/engine/multi-repo/companion-spec-builder.js +22 -0
  81. package/dist/engine/multi-repo/companion-spec-builder.js.map +1 -0
  82. package/dist/engine/multi-repo/consumer-scanner.d.ts +12 -0
  83. package/dist/engine/multi-repo/consumer-scanner.d.ts.map +1 -0
  84. package/dist/engine/multi-repo/consumer-scanner.js +48 -0
  85. package/dist/engine/multi-repo/consumer-scanner.js.map +1 -0
  86. package/dist/engine/multi-repo/index.d.ts +4 -0
  87. package/dist/engine/multi-repo/index.d.ts.map +1 -0
  88. package/dist/engine/multi-repo/index.js +5 -0
  89. package/dist/engine/multi-repo/index.js.map +1 -0
  90. package/dist/engine/multi-repo/refactor-tracker.d.ts +7 -0
  91. package/dist/engine/multi-repo/refactor-tracker.d.ts.map +1 -0
  92. package/dist/engine/multi-repo/refactor-tracker.js +22 -0
  93. package/dist/engine/multi-repo/refactor-tracker.js.map +1 -0
  94. package/dist/engine/skill-generator/sections-docs.d.ts +13 -0
  95. package/dist/engine/skill-generator/sections-docs.d.ts.map +1 -0
  96. package/dist/engine/skill-generator/sections-docs.js +59 -0
  97. package/dist/engine/skill-generator/sections-docs.js.map +1 -0
  98. package/dist/engine/skill-generator/skills-content.d.ts +1 -1
  99. package/dist/engine/skill-generator/skills-content.d.ts.map +1 -1
  100. package/dist/engine/skill-generator/skills-content.js +3 -2
  101. package/dist/engine/skill-generator/skills-content.js.map +1 -1
  102. package/dist/engine/skill-generator/skills.d.ts +1 -0
  103. package/dist/engine/skill-generator/skills.d.ts.map +1 -1
  104. package/dist/engine/skill-generator/skills.js +1 -0
  105. package/dist/engine/skill-generator/skills.js.map +1 -1
  106. package/dist/engine/skill-generator.d.ts.map +1 -1
  107. package/dist/engine/skill-generator.js +21 -2
  108. package/dist/engine/skill-generator.js.map +1 -1
  109. package/dist/engine/web-fetcher/docs-intelligence.d.ts +8 -0
  110. package/dist/engine/web-fetcher/docs-intelligence.d.ts.map +1 -0
  111. package/dist/engine/web-fetcher/docs-intelligence.js +154 -0
  112. package/dist/engine/web-fetcher/docs-intelligence.js.map +1 -0
  113. package/dist/engine/web-fetcher/registry-auto-discovery.d.ts +20 -0
  114. package/dist/engine/web-fetcher/registry-auto-discovery.d.ts.map +1 -0
  115. package/dist/engine/web-fetcher/registry-auto-discovery.js +184 -0
  116. package/dist/engine/web-fetcher/registry-auto-discovery.js.map +1 -0
  117. package/dist/engine/web-fetcher/stack-detector.d.ts +4 -0
  118. package/dist/engine/web-fetcher/stack-detector.d.ts.map +1 -0
  119. package/dist/engine/web-fetcher/stack-detector.js +155 -0
  120. package/dist/engine/web-fetcher/stack-detector.js.map +1 -0
  121. package/dist/index.js +19 -0
  122. package/dist/index.js.map +1 -1
  123. package/dist/storage/audit-trail-store.d.ts +20 -0
  124. package/dist/storage/audit-trail-store.d.ts.map +1 -0
  125. package/dist/storage/audit-trail-store.js +98 -0
  126. package/dist/storage/audit-trail-store.js.map +1 -0
  127. package/dist/storage/auto-promoter-config-store.d.ts +11 -0
  128. package/dist/storage/auto-promoter-config-store.d.ts.map +1 -0
  129. package/dist/storage/auto-promoter-config-store.js +23 -0
  130. package/dist/storage/auto-promoter-config-store.js.map +1 -0
  131. package/dist/storage/budget-store.d.ts +19 -0
  132. package/dist/storage/budget-store.d.ts.map +1 -0
  133. package/dist/storage/budget-store.js +64 -0
  134. package/dist/storage/budget-store.js.map +1 -0
  135. package/dist/storage/gateway-store.d.ts +23 -0
  136. package/dist/storage/gateway-store.d.ts.map +1 -0
  137. package/dist/storage/gateway-store.js +52 -0
  138. package/dist/storage/gateway-store.js.map +1 -0
  139. package/dist/storage/refactor-registry-store.d.ts +21 -0
  140. package/dist/storage/refactor-registry-store.d.ts.map +1 -0
  141. package/dist/storage/refactor-registry-store.js +77 -0
  142. package/dist/storage/refactor-registry-store.js.map +1 -0
  143. package/dist/tools/auto-promoter-handler.d.ts +13 -0
  144. package/dist/tools/auto-promoter-handler.d.ts.map +1 -0
  145. package/dist/tools/auto-promoter-handler.js +50 -0
  146. package/dist/tools/auto-promoter-handler.js.map +1 -0
  147. package/dist/tools/compliance-test-handler.d.ts +5 -0
  148. package/dist/tools/compliance-test-handler.d.ts.map +1 -0
  149. package/dist/tools/compliance-test-handler.js +66 -0
  150. package/dist/tools/compliance-test-handler.js.map +1 -0
  151. package/dist/tools/cost-guardrails-handler.d.ts +15 -0
  152. package/dist/tools/cost-guardrails-handler.d.ts.map +1 -0
  153. package/dist/tools/cost-guardrails-handler.js +72 -0
  154. package/dist/tools/cost-guardrails-handler.js.map +1 -0
  155. package/dist/tools/create-spec/spec-builder.d.ts.map +1 -1
  156. package/dist/tools/create-spec/spec-builder.js +20 -0
  157. package/dist/tools/create-spec/spec-builder.js.map +1 -1
  158. package/dist/tools/create-spec-hu/docs-criteria-adapter.d.ts +14 -0
  159. package/dist/tools/create-spec-hu/docs-criteria-adapter.d.ts.map +1 -0
  160. package/dist/tools/create-spec-hu/docs-criteria-adapter.js +50 -0
  161. package/dist/tools/create-spec-hu/docs-criteria-adapter.js.map +1 -0
  162. package/dist/tools/create-spec-hu.d.ts +1 -1
  163. package/dist/tools/create-spec-hu.d.ts.map +1 -1
  164. package/dist/tools/create-spec-hu.js +5 -1
  165. package/dist/tools/create-spec-hu.js.map +1 -1
  166. package/dist/tools/create-spec.d.ts.map +1 -1
  167. package/dist/tools/create-spec.js +2 -2
  168. package/dist/tools/create-spec.js.map +1 -1
  169. package/dist/tools/doc-compliance-handler.d.ts +3 -0
  170. package/dist/tools/doc-compliance-handler.d.ts.map +1 -0
  171. package/dist/tools/doc-compliance-handler.js +48 -0
  172. package/dist/tools/doc-compliance-handler.js.map +1 -0
  173. package/dist/tools/docs-registry-handler.d.ts +6 -0
  174. package/dist/tools/docs-registry-handler.d.ts.map +1 -0
  175. package/dist/tools/docs-registry-handler.js +73 -0
  176. package/dist/tools/docs-registry-handler.js.map +1 -0
  177. package/dist/tools/dogfood-status-handler.d.ts +3 -0
  178. package/dist/tools/dogfood-status-handler.d.ts.map +1 -0
  179. package/dist/tools/dogfood-status-handler.js +28 -0
  180. package/dist/tools/dogfood-status-handler.js.map +1 -0
  181. package/dist/tools/drift-watcher-handler.d.ts +7 -0
  182. package/dist/tools/drift-watcher-handler.d.ts.map +1 -0
  183. package/dist/tools/drift-watcher-handler.js +65 -0
  184. package/dist/tools/drift-watcher-handler.js.map +1 -0
  185. package/dist/tools/export-audit-trail-handler.d.ts +9 -0
  186. package/dist/tools/export-audit-trail-handler.d.ts.map +1 -0
  187. package/dist/tools/export-audit-trail-handler.js +103 -0
  188. package/dist/tools/export-audit-trail-handler.js.map +1 -0
  189. package/dist/tools/mcp-gateway-handler.d.ts +13 -0
  190. package/dist/tools/mcp-gateway-handler.d.ts.map +1 -0
  191. package/dist/tools/mcp-gateway-handler.js +60 -0
  192. package/dist/tools/mcp-gateway-handler.js.map +1 -0
  193. package/dist/tools/multi-repo-handler.d.ts +15 -0
  194. package/dist/tools/multi-repo-handler.d.ts.map +1 -0
  195. package/dist/tools/multi-repo-handler.js +86 -0
  196. package/dist/tools/multi-repo-handler.js.map +1 -0
  197. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -1
  198. package/dist/tools/register-audit-trail-tools.js +38 -0
  199. package/dist/tools/register-audit-trail-tools.js.map +1 -1
  200. package/dist/tools/register-auto-promoter-tools.d.ts +3 -0
  201. package/dist/tools/register-auto-promoter-tools.d.ts.map +1 -0
  202. package/dist/tools/register-auto-promoter-tools.js +43 -0
  203. package/dist/tools/register-auto-promoter-tools.js.map +1 -0
  204. package/dist/tools/register-compliance-test-tools.d.ts +3 -0
  205. package/dist/tools/register-compliance-test-tools.d.ts.map +1 -0
  206. package/dist/tools/register-compliance-test-tools.js +55 -0
  207. package/dist/tools/register-compliance-test-tools.js.map +1 -0
  208. package/dist/tools/register-cost-guardrails-tools.d.ts +3 -0
  209. package/dist/tools/register-cost-guardrails-tools.d.ts.map +1 -0
  210. package/dist/tools/register-cost-guardrails-tools.js +61 -0
  211. package/dist/tools/register-cost-guardrails-tools.js.map +1 -0
  212. package/dist/tools/register-doc-compliance-tools.d.ts +3 -0
  213. package/dist/tools/register-doc-compliance-tools.d.ts.map +1 -0
  214. package/dist/tools/register-doc-compliance-tools.js +18 -0
  215. package/dist/tools/register-doc-compliance-tools.js.map +1 -0
  216. package/dist/tools/register-docs-registry-tools.d.ts +3 -0
  217. package/dist/tools/register-docs-registry-tools.d.ts.map +1 -0
  218. package/dist/tools/register-docs-registry-tools.js +35 -0
  219. package/dist/tools/register-docs-registry-tools.js.map +1 -0
  220. package/dist/tools/register-dogfood-tools.d.ts +3 -0
  221. package/dist/tools/register-dogfood-tools.d.ts.map +1 -0
  222. package/dist/tools/register-dogfood-tools.js +21 -0
  223. package/dist/tools/register-dogfood-tools.js.map +1 -0
  224. package/dist/tools/register-drift-watcher-tools.d.ts +3 -0
  225. package/dist/tools/register-drift-watcher-tools.d.ts.map +1 -0
  226. package/dist/tools/register-drift-watcher-tools.js +28 -0
  227. package/dist/tools/register-drift-watcher-tools.js.map +1 -0
  228. package/dist/tools/register-mcp-gateway-tools.d.ts +3 -0
  229. package/dist/tools/register-mcp-gateway-tools.d.ts.map +1 -0
  230. package/dist/tools/register-mcp-gateway-tools.js +35 -0
  231. package/dist/tools/register-mcp-gateway-tools.js.map +1 -0
  232. package/dist/tools/register-multi-repo-tools.d.ts +8 -0
  233. package/dist/tools/register-multi-repo-tools.d.ts.map +1 -0
  234. package/dist/tools/register-multi-repo-tools.js +52 -0
  235. package/dist/tools/register-multi-repo-tools.js.map +1 -0
  236. package/dist/tools/safe-handler.d.ts.map +1 -1
  237. package/dist/tools/safe-handler.js +50 -1
  238. package/dist/tools/safe-handler.js.map +1 -1
  239. package/dist/types/audit.d.ts +64 -0
  240. package/dist/types/audit.d.ts.map +1 -0
  241. package/dist/types/audit.js +3 -0
  242. package/dist/types/audit.js.map +1 -0
  243. package/dist/types/auto-promoter.d.ts +26 -0
  244. package/dist/types/auto-promoter.d.ts.map +1 -0
  245. package/dist/types/auto-promoter.js +3 -0
  246. package/dist/types/auto-promoter.js.map +1 -0
  247. package/dist/types/compliance-tests.d.ts +41 -0
  248. package/dist/types/compliance-tests.d.ts.map +1 -0
  249. package/dist/types/compliance-tests.js +3 -0
  250. package/dist/types/compliance-tests.js.map +1 -0
  251. package/dist/types/cost-guardrails.d.ts +41 -0
  252. package/dist/types/cost-guardrails.d.ts.map +1 -0
  253. package/dist/types/cost-guardrails.js +3 -0
  254. package/dist/types/cost-guardrails.js.map +1 -0
  255. package/dist/types/docs.d.ts +70 -0
  256. package/dist/types/docs.d.ts.map +1 -1
  257. package/dist/types/dogfood.d.ts +22 -0
  258. package/dist/types/dogfood.d.ts.map +1 -0
  259. package/dist/types/dogfood.js +3 -0
  260. package/dist/types/dogfood.js.map +1 -0
  261. package/dist/types/drift-watcher.d.ts +35 -0
  262. package/dist/types/drift-watcher.d.ts.map +1 -0
  263. package/dist/types/drift-watcher.js +3 -0
  264. package/dist/types/drift-watcher.js.map +1 -0
  265. package/dist/types/index.d.ts +8 -0
  266. package/dist/types/index.d.ts.map +1 -1
  267. package/dist/types/index.js +8 -0
  268. package/dist/types/index.js.map +1 -1
  269. package/dist/types/mcp-gateway.d.ts +34 -0
  270. package/dist/types/mcp-gateway.d.ts.map +1 -0
  271. package/dist/types/mcp-gateway.js +3 -0
  272. package/dist/types/mcp-gateway.js.map +1 -0
  273. package/dist/types/mcp.d.ts +17 -0
  274. package/dist/types/mcp.d.ts.map +1 -1
  275. package/dist/types/multi-repo.d.ts +39 -0
  276. package/dist/types/multi-repo.d.ts.map +1 -0
  277. package/dist/types/multi-repo.js +5 -0
  278. package/dist/types/multi-repo.js.map +1 -0
  279. package/dist/types/spec/core.d.ts +2 -0
  280. package/dist/types/spec/core.d.ts.map +1 -1
  281. package/package.json +1 -1
  282. package/src/config/license-plans.json +18 -1
@@ -0,0 +1,73 @@
1
+ import { checkRegistryHealth, discoverDocsUrl, } from '../engine/web-fetcher/registry-auto-discovery.js';
2
+ import { loadDocsRegistry } from '../engine/web-fetcher/registry-loader.js';
3
+ /** Flatten all docs-registry categories into a single { key: base-url } map. */
4
+ async function flattenRegistryUrls() {
5
+ const registry = await loadDocsRegistry();
6
+ const result = new Map();
7
+ for (const [key, entry] of Object.entries(registry.frameworks)) {
8
+ result.set(key, entry.base);
9
+ }
10
+ for (const [key, entry] of Object.entries(registry.languages)) {
11
+ result.set(key, entry.base);
12
+ }
13
+ for (const [key, entry] of Object.entries(registry.services)) {
14
+ result.set(key, entry.base);
15
+ }
16
+ return result;
17
+ }
18
+ /** Handle validate_docs_registry tool call. */
19
+ export async function handleValidateDocsRegistry(_input) {
20
+ const urlMap = await flattenRegistryUrls();
21
+ const entries = {};
22
+ for (const [key, base] of urlMap.entries()) {
23
+ entries[key] = { base };
24
+ }
25
+ const total = urlMap.size;
26
+ const health = await checkRegistryHealth(entries);
27
+ const lines = [
28
+ `Docs registry health check complete.`,
29
+ `Total entries: ${total}`,
30
+ `Healthy: ${health.healthy.length}`,
31
+ `Slow (>2s): ${health.slow.length}`,
32
+ `Broken: ${health.broken.length}`,
33
+ ];
34
+ if (health.broken.length > 0) {
35
+ lines.push(`\nBroken entries:\n${health.broken.map((b) => ` - ${b}`).join('\n')}`);
36
+ }
37
+ if (health.slow.length > 0) {
38
+ lines.push(`\nSlow entries:\n${health.slow.map((s) => ` - ${s}`).join('\n')}`);
39
+ }
40
+ return {
41
+ content: [{ type: 'text', text: lines.join('\n') }],
42
+ total,
43
+ healthy: health.healthy.length,
44
+ broken: health.broken.map((key) => ({ key, url: urlMap.get(key) ?? '' })),
45
+ slowMs: health.slow.map((key) => ({ key, url: urlMap.get(key) ?? '' })),
46
+ };
47
+ }
48
+ /** Handle discover_docs_url tool call. */
49
+ export async function handleDiscoverDocsUrl(input) {
50
+ const { tech } = input;
51
+ const entry = await discoverDocsUrl(tech);
52
+ if (!entry) {
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: `No docs URL found for "${tech}" in npm, PyPI, or crates.io registries.`,
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ const verifiedLabel = entry.verified ? 'verified alive' : 'unverified';
63
+ const text = [
64
+ `Found docs for "${tech}" via ${entry.source} (${verifiedLabel}):`,
65
+ ` URL: ${entry.docsUrl}`,
66
+ ` Discovered at: ${entry.discoveredAt}`,
67
+ ].join('\n');
68
+ return {
69
+ content: [{ type: 'text', text }],
70
+ entry,
71
+ };
72
+ }
73
+ //# sourceMappingURL=docs-registry-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-registry-handler.js","sourceRoot":"","sources":["../../src/tools/docs-registry-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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"}
@@ -0,0 +1,13 @@
1
+ import type { ToolResult } from '../types/index.js';
2
+ import type { DiscoverMcpGatewaysInput, FederationDiscoveryStatusInput } from '../types/mcp-gateway.js';
3
+ /**
4
+ * Handle discover_mcp_gateways tool call.
5
+ * Runs a discovery pass and returns a summary of found gateways.
6
+ */
7
+ export declare function handleDiscoverMcpGateways(input: DiscoverMcpGatewaysInput): Promise<ToolResult>;
8
+ /**
9
+ * Handle federation_discovery_status tool call.
10
+ * Returns all known gateways from the registry with their current status.
11
+ */
12
+ export declare function handleFederationDiscoveryStatus(input: FederationDiscoveryStatusInput): Promise<ToolResult>;
13
+ //# sourceMappingURL=mcp-gateway-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-gateway-handler.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-gateway-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,wBAAwB,EACxB,8BAA8B,EAC/B,MAAM,yBAAyB,CAAC;AAGjC;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,8BAA8B,GACpC,OAAO,CAAC,UAAU,CAAC,CAiCrB"}
@@ -0,0 +1,60 @@
1
+ import { discoverGateways, getGatewayStatus } from '../engine/mcp-gateway/index.js';
2
+ /**
3
+ * Handle discover_mcp_gateways tool call.
4
+ * Runs a discovery pass and returns a summary of found gateways.
5
+ */
6
+ export async function handleDiscoverMcpGateways(input) {
7
+ const { urls = [], includeLocalhost = true } = input;
8
+ const found = await discoverGateways(urls, includeLocalhost);
9
+ if (found.length === 0) {
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: 'No MCP gateways discovered. Make sure target servers expose /.well-known/mcp.',
15
+ },
16
+ ],
17
+ };
18
+ }
19
+ const lines = [`Discovered ${found.length} MCP gateway(s):`, ''];
20
+ for (const gw of found) {
21
+ const compat = gw.planuCompatible ? ' [Planu-compatible]' : '';
22
+ lines.push(` ${gw.name} (${gw.url})${compat}`);
23
+ if (gw.tools.length > 0) {
24
+ lines.push(` Tools: ${gw.tools.join(', ')}`);
25
+ }
26
+ }
27
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
28
+ }
29
+ /**
30
+ * Handle federation_discovery_status tool call.
31
+ * Returns all known gateways from the registry with their current status.
32
+ */
33
+ export async function handleFederationDiscoveryStatus(input) {
34
+ // projectPath is required by the tool schema but the registry is global
35
+ void input.projectPath;
36
+ const { registry, active } = await getGatewayStatus();
37
+ const all = registry.gateways;
38
+ if (all.length === 0) {
39
+ return {
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: 'No gateways in registry. Run discover_mcp_gateways to start discovery.',
44
+ },
45
+ ],
46
+ };
47
+ }
48
+ const lines = [`Gateway registry: ${all.length} known, ${active.length} active`];
49
+ if (registry.lastDiscoveryAt) {
50
+ lines.push(`Last discovery: ${registry.lastDiscoveryAt}`);
51
+ }
52
+ lines.push('');
53
+ for (const gw of all) {
54
+ const compat = gw.planuCompatible ? ' [Planu]' : '';
55
+ lines.push(` [${gw.status}] ${gw.name} (${gw.url})${compat}`);
56
+ lines.push(` Last seen: ${gw.lastSeenAt}`);
57
+ }
58
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
59
+ }
60
+ //# sourceMappingURL=mcp-gateway-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-gateway-handler.js","sourceRoot":"","sources":["../../src/tools/mcp-gateway-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolResult } from '../types/index.js';
2
+ import type { CoordinateRefactorInput, SyncRefactorStatusInput } from '../types/multi-repo.js';
3
+ /**
4
+ * Initiate a multi-repo refactor session.
5
+ * 1. Loads the source spec to verify it exists.
6
+ * 2. Discovers all registered projects (excluding source).
7
+ * 3. Scans each project for symbol usage.
8
+ * 4. Persists a RefactorSession and returns summary.
9
+ */
10
+ export declare function handleCoordinateRefactor(input: CoordinateRefactorInput): Promise<ToolResult>;
11
+ /**
12
+ * Returns the current progress report for a refactor session.
13
+ */
14
+ export declare function handleSyncRefactorStatus(input: SyncRefactorStatusInput): Promise<ToolResult>;
15
+ //# sourceMappingURL=multi-repo-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-handler.d.ts","sourceRoot":"","sources":["../../src/tools/multi-repo-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EAGxB,MAAM,wBAAwB,CAAC;AAehC;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAoDrB;AAMD;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
@@ -0,0 +1,86 @@
1
+ // tools/multi-repo-handler.ts — SPEC-389: Handlers for multi-repo refactoring coordination
2
+ import { randomUUID } from 'node:crypto';
3
+ import { hashProjectPath } from '../storage/base-store.js';
4
+ import { getSpec } from '../storage/spec-store.js';
5
+ import { createSession, getSession } from '../storage/refactor-registry-store.js';
6
+ import { scanProjectForSymbols, getRegisteredProjectPaths, buildStatusReport, } from '../engine/multi-repo/index.js';
7
+ import { textResult, errText } from './response-helpers.js';
8
+ // ---------------------------------------------------------------------------
9
+ // coordinate_refactor
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Initiate a multi-repo refactor session.
13
+ * 1. Loads the source spec to verify it exists.
14
+ * 2. Discovers all registered projects (excluding source).
15
+ * 3. Scans each project for symbol usage.
16
+ * 4. Persists a RefactorSession and returns summary.
17
+ */
18
+ export async function handleCoordinateRefactor(input) {
19
+ const { projectPath, specId, affectedSymbols } = input;
20
+ if (affectedSymbols.length === 0) {
21
+ return errText('affectedSymbols must contain at least one symbol name.');
22
+ }
23
+ const projectId = hashProjectPath(projectPath);
24
+ const spec = await getSpec(projectId, specId);
25
+ if (!spec) {
26
+ return errText(`Spec "${specId}" not found in project "${projectPath}".`);
27
+ }
28
+ const consumerPaths = await getRegisteredProjectPaths(projectPath);
29
+ const consumerProjects = [];
30
+ for (const consumerPath of consumerPaths) {
31
+ const usageLocations = await scanProjectForSymbols(consumerPath, affectedSymbols);
32
+ if (usageLocations.length > 0) {
33
+ consumerProjects.push({
34
+ projectPath: consumerPath,
35
+ projectId: hashProjectPath(consumerPath),
36
+ usageLocations,
37
+ status: 'pending',
38
+ });
39
+ }
40
+ }
41
+ const session = {
42
+ id: randomUUID(),
43
+ sourceSpecId: specId,
44
+ sourceProjectPath: projectPath,
45
+ affectedSymbols,
46
+ consumerProjects,
47
+ startedAt: new Date().toISOString(),
48
+ status: 'scanning',
49
+ };
50
+ await createSession(session);
51
+ const lines = [
52
+ `Refactor session created: ${session.id}`,
53
+ `Source spec: ${specId}`,
54
+ `Affected symbols: ${affectedSymbols.join(', ')}`,
55
+ `Consumer projects with usages: ${consumerProjects.length}`,
56
+ ];
57
+ for (const cp of consumerProjects) {
58
+ lines.push(` - ${cp.projectPath}: ${cp.usageLocations.length} file(s)`);
59
+ }
60
+ return textResult(lines.join('\n'));
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // sync_refactor_status
64
+ // ---------------------------------------------------------------------------
65
+ /**
66
+ * Returns the current progress report for a refactor session.
67
+ */
68
+ export async function handleSyncRefactorStatus(input) {
69
+ const { refactorId } = input;
70
+ const session = await getSession(refactorId);
71
+ if (!session) {
72
+ return errText(`Refactor session "${refactorId}" not found.`);
73
+ }
74
+ const report = buildStatusReport(session);
75
+ const lines = [
76
+ `Refactor: ${report.refactorId}`,
77
+ `Source spec: ${report.sourceSpec}`,
78
+ `Total consumers: ${report.totalConsumers}`,
79
+ `Completed: ${report.completed}`,
80
+ `In progress: ${report.inProgress}`,
81
+ `Pending: ${report.pending}`,
82
+ `Overall progress: ${report.overallProgress}%`,
83
+ ];
84
+ return textResult(lines.join('\n'));
85
+ }
86
+ //# sourceMappingURL=multi-repo-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-repo-handler.js","sourceRoot":"","sources":["../../src/tools/multi-repo-handler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"register-audit-trail-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-audit-trail-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqF/D"}
1
+ {"version":3,"file":"register-audit-trail-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-audit-trail-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoI/D"}
@@ -2,6 +2,7 @@
2
2
  import { z } from 'zod';
3
3
  import { safeLicensed } from './safe-handler.js';
4
4
  import { handleAuditTrail, handleGenerateAttestation } from './audit-trail-handler.js';
5
+ import { handleExportAuditTrail } from './export-audit-trail-handler.js';
5
6
  import { resolveProjectId, missingProjectIdError } from './resolve-project-id.js';
6
7
  const AUDIT_EVENT_TYPES = [
7
8
  'spec.created',
@@ -81,5 +82,42 @@ export function registerAuditTrailTools(server) {
81
82
  }
82
83
  return handleGenerateAttestation({ ...args, projectId: pid });
83
84
  }));
85
+ // export_audit_trail — SPEC-387 (EU AI Act Article 12)
86
+ server.registerTool('export_audit_trail', {
87
+ description: 'Export the EU AI Act Article 12 immutable audit trail for every Planu tool invocation. ' +
88
+ 'Supports filtering by project, date range, or spec. Verifies SHA-256 chain integrity. ' +
89
+ 'Formats: json (default), json-ld (W3C PROV-O), csv.',
90
+ annotations: { readOnlyHint: true },
91
+ inputSchema: {
92
+ projectPath: z
93
+ .string()
94
+ .max(4096)
95
+ .describe('Absolute path to project root. Used to filter entries for this project.'),
96
+ fromDate: z
97
+ .string()
98
+ .optional()
99
+ .describe('ISO-8601 start date (inclusive). Example: 2026-01-01T00:00:00Z'),
100
+ toDate: z
101
+ .string()
102
+ .optional()
103
+ .describe('ISO-8601 end date (inclusive). Example: 2026-12-31T23:59:59Z'),
104
+ specId: z
105
+ .string()
106
+ .max(500)
107
+ .optional()
108
+ .describe('Filter entries by spec ID (e.g. SPEC-001).'),
109
+ format: z
110
+ .enum(['json', 'json-ld', 'csv'])
111
+ .optional()
112
+ .describe('Output format. Valid values: json (default), json-ld (W3C PROV-O), csv.'),
113
+ limit: z
114
+ .number()
115
+ .int()
116
+ .min(1)
117
+ .max(10000)
118
+ .optional()
119
+ .describe('Maximum number of entries to return.'),
120
+ },
121
+ }, safeLicensed('export_audit_trail', (args) => Promise.resolve(handleExportAuditTrail(args))));
84
122
  }
85
123
  //# sourceMappingURL=register-audit-trail-tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register-audit-trail-tools.js","sourceRoot":"","sources":["../../src/tools/register-audit-trail-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-audit-trail-tools.js","sourceRoot":"","sources":["../../src/tools/register-audit-trail-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAutoPromoterTools(server: McpServer): void;
3
+ //# sourceMappingURL=register-auto-promoter-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-auto-promoter-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-auto-promoter-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoDjE"}