@planu/cli 1.4.0 → 1.6.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 (237) 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/hooks-reconciler.d.ts +7 -1
  63. package/dist/engine/hooks-reconciler.d.ts.map +1 -1
  64. package/dist/engine/hooks-reconciler.js +127 -2
  65. package/dist/engine/hooks-reconciler.js.map +1 -1
  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/skills-reconciler.d.ts +10 -1
  95. package/dist/engine/skills-reconciler.d.ts.map +1 -1
  96. package/dist/engine/skills-reconciler.js +128 -2
  97. package/dist/engine/skills-reconciler.js.map +1 -1
  98. package/dist/index.js +15 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/storage/audit-trail-store.d.ts +20 -0
  101. package/dist/storage/audit-trail-store.d.ts.map +1 -0
  102. package/dist/storage/audit-trail-store.js +98 -0
  103. package/dist/storage/audit-trail-store.js.map +1 -0
  104. package/dist/storage/auto-promoter-config-store.d.ts +11 -0
  105. package/dist/storage/auto-promoter-config-store.d.ts.map +1 -0
  106. package/dist/storage/auto-promoter-config-store.js +23 -0
  107. package/dist/storage/auto-promoter-config-store.js.map +1 -0
  108. package/dist/storage/budget-store.d.ts +19 -0
  109. package/dist/storage/budget-store.d.ts.map +1 -0
  110. package/dist/storage/budget-store.js +64 -0
  111. package/dist/storage/budget-store.js.map +1 -0
  112. package/dist/storage/gateway-store.d.ts +23 -0
  113. package/dist/storage/gateway-store.d.ts.map +1 -0
  114. package/dist/storage/gateway-store.js +52 -0
  115. package/dist/storage/gateway-store.js.map +1 -0
  116. package/dist/storage/refactor-registry-store.d.ts +21 -0
  117. package/dist/storage/refactor-registry-store.d.ts.map +1 -0
  118. package/dist/storage/refactor-registry-store.js +77 -0
  119. package/dist/storage/refactor-registry-store.js.map +1 -0
  120. package/dist/tools/auto-promoter-handler.d.ts +13 -0
  121. package/dist/tools/auto-promoter-handler.d.ts.map +1 -0
  122. package/dist/tools/auto-promoter-handler.js +50 -0
  123. package/dist/tools/auto-promoter-handler.js.map +1 -0
  124. package/dist/tools/compliance-test-handler.d.ts +5 -0
  125. package/dist/tools/compliance-test-handler.d.ts.map +1 -0
  126. package/dist/tools/compliance-test-handler.js +66 -0
  127. package/dist/tools/compliance-test-handler.js.map +1 -0
  128. package/dist/tools/cost-guardrails-handler.d.ts +15 -0
  129. package/dist/tools/cost-guardrails-handler.d.ts.map +1 -0
  130. package/dist/tools/cost-guardrails-handler.js +72 -0
  131. package/dist/tools/cost-guardrails-handler.js.map +1 -0
  132. package/dist/tools/dogfood-status-handler.d.ts +3 -0
  133. package/dist/tools/dogfood-status-handler.d.ts.map +1 -0
  134. package/dist/tools/dogfood-status-handler.js +28 -0
  135. package/dist/tools/dogfood-status-handler.js.map +1 -0
  136. package/dist/tools/drift-watcher-handler.d.ts +7 -0
  137. package/dist/tools/drift-watcher-handler.d.ts.map +1 -0
  138. package/dist/tools/drift-watcher-handler.js +65 -0
  139. package/dist/tools/drift-watcher-handler.js.map +1 -0
  140. package/dist/tools/export-audit-trail-handler.d.ts +9 -0
  141. package/dist/tools/export-audit-trail-handler.d.ts.map +1 -0
  142. package/dist/tools/export-audit-trail-handler.js +103 -0
  143. package/dist/tools/export-audit-trail-handler.js.map +1 -0
  144. package/dist/tools/mcp-gateway-handler.d.ts +13 -0
  145. package/dist/tools/mcp-gateway-handler.d.ts.map +1 -0
  146. package/dist/tools/mcp-gateway-handler.js +60 -0
  147. package/dist/tools/mcp-gateway-handler.js.map +1 -0
  148. package/dist/tools/multi-repo-handler.d.ts +15 -0
  149. package/dist/tools/multi-repo-handler.d.ts.map +1 -0
  150. package/dist/tools/multi-repo-handler.js +86 -0
  151. package/dist/tools/multi-repo-handler.js.map +1 -0
  152. package/dist/tools/reconcile-hooks.d.ts +5 -0
  153. package/dist/tools/reconcile-hooks.d.ts.map +1 -1
  154. package/dist/tools/reconcile-hooks.js +61 -4
  155. package/dist/tools/reconcile-hooks.js.map +1 -1
  156. package/dist/tools/reconcile-skills.d.ts +1 -0
  157. package/dist/tools/reconcile-skills.d.ts.map +1 -1
  158. package/dist/tools/reconcile-skills.js +57 -9
  159. package/dist/tools/reconcile-skills.js.map +1 -1
  160. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -1
  161. package/dist/tools/register-audit-trail-tools.js +38 -0
  162. package/dist/tools/register-audit-trail-tools.js.map +1 -1
  163. package/dist/tools/register-auto-promoter-tools.d.ts +3 -0
  164. package/dist/tools/register-auto-promoter-tools.d.ts.map +1 -0
  165. package/dist/tools/register-auto-promoter-tools.js +43 -0
  166. package/dist/tools/register-auto-promoter-tools.js.map +1 -0
  167. package/dist/tools/register-compliance-test-tools.d.ts +3 -0
  168. package/dist/tools/register-compliance-test-tools.d.ts.map +1 -0
  169. package/dist/tools/register-compliance-test-tools.js +55 -0
  170. package/dist/tools/register-compliance-test-tools.js.map +1 -0
  171. package/dist/tools/register-cost-guardrails-tools.d.ts +3 -0
  172. package/dist/tools/register-cost-guardrails-tools.d.ts.map +1 -0
  173. package/dist/tools/register-cost-guardrails-tools.js +61 -0
  174. package/dist/tools/register-cost-guardrails-tools.js.map +1 -0
  175. package/dist/tools/register-dogfood-tools.d.ts +3 -0
  176. package/dist/tools/register-dogfood-tools.d.ts.map +1 -0
  177. package/dist/tools/register-dogfood-tools.js +21 -0
  178. package/dist/tools/register-dogfood-tools.js.map +1 -0
  179. package/dist/tools/register-drift-watcher-tools.d.ts +3 -0
  180. package/dist/tools/register-drift-watcher-tools.d.ts.map +1 -0
  181. package/dist/tools/register-drift-watcher-tools.js +28 -0
  182. package/dist/tools/register-drift-watcher-tools.js.map +1 -0
  183. package/dist/tools/register-mcp-gateway-tools.d.ts +3 -0
  184. package/dist/tools/register-mcp-gateway-tools.d.ts.map +1 -0
  185. package/dist/tools/register-mcp-gateway-tools.js +35 -0
  186. package/dist/tools/register-mcp-gateway-tools.js.map +1 -0
  187. package/dist/tools/register-multi-repo-tools.d.ts +8 -0
  188. package/dist/tools/register-multi-repo-tools.d.ts.map +1 -0
  189. package/dist/tools/register-multi-repo-tools.js +52 -0
  190. package/dist/tools/register-multi-repo-tools.js.map +1 -0
  191. package/dist/tools/safe-handler.d.ts.map +1 -1
  192. package/dist/tools/safe-handler.js +50 -1
  193. package/dist/tools/safe-handler.js.map +1 -1
  194. package/dist/tools/schemas/reconcile-skills-schemas.d.ts +1 -0
  195. package/dist/tools/schemas/reconcile-skills-schemas.d.ts.map +1 -1
  196. package/dist/tools/schemas/reconcile-skills-schemas.js +5 -0
  197. package/dist/tools/schemas/reconcile-skills-schemas.js.map +1 -1
  198. package/dist/types/audit.d.ts +64 -0
  199. package/dist/types/audit.d.ts.map +1 -0
  200. package/dist/types/audit.js +3 -0
  201. package/dist/types/audit.js.map +1 -0
  202. package/dist/types/auto-promoter.d.ts +26 -0
  203. package/dist/types/auto-promoter.d.ts.map +1 -0
  204. package/dist/types/auto-promoter.js +3 -0
  205. package/dist/types/auto-promoter.js.map +1 -0
  206. package/dist/types/compliance-tests.d.ts +41 -0
  207. package/dist/types/compliance-tests.d.ts.map +1 -0
  208. package/dist/types/compliance-tests.js +3 -0
  209. package/dist/types/compliance-tests.js.map +1 -0
  210. package/dist/types/conventions.d.ts +29 -0
  211. package/dist/types/conventions.d.ts.map +1 -1
  212. package/dist/types/cost-guardrails.d.ts +41 -0
  213. package/dist/types/cost-guardrails.d.ts.map +1 -0
  214. package/dist/types/cost-guardrails.js +3 -0
  215. package/dist/types/cost-guardrails.js.map +1 -0
  216. package/dist/types/dogfood.d.ts +22 -0
  217. package/dist/types/dogfood.d.ts.map +1 -0
  218. package/dist/types/dogfood.js +3 -0
  219. package/dist/types/dogfood.js.map +1 -0
  220. package/dist/types/drift-watcher.d.ts +35 -0
  221. package/dist/types/drift-watcher.d.ts.map +1 -0
  222. package/dist/types/drift-watcher.js +3 -0
  223. package/dist/types/drift-watcher.js.map +1 -0
  224. package/dist/types/index.d.ts +8 -0
  225. package/dist/types/index.d.ts.map +1 -1
  226. package/dist/types/index.js +8 -0
  227. package/dist/types/index.js.map +1 -1
  228. package/dist/types/mcp-gateway.d.ts +34 -0
  229. package/dist/types/mcp-gateway.d.ts.map +1 -0
  230. package/dist/types/mcp-gateway.js +3 -0
  231. package/dist/types/mcp-gateway.js.map +1 -0
  232. package/dist/types/multi-repo.d.ts +39 -0
  233. package/dist/types/multi-repo.d.ts.map +1 -0
  234. package/dist/types/multi-repo.js +5 -0
  235. package/dist/types/multi-repo.js.map +1 -0
  236. package/package.json +1 -1
  237. package/src/config/license-plans.json +15 -1
@@ -0,0 +1,19 @@
1
+ import type { DiscoveredGateway, GatewayRegistry } from '../../types/mcp-gateway.js';
2
+ /**
3
+ * Run a full discovery pass:
4
+ * 1. Optionally scan default localhost ports.
5
+ * 2. Probe any explicitly provided URLs.
6
+ * 3. Persist every found gateway via mergeGateway (upsert).
7
+ *
8
+ * Returns all gateways found in this pass (may be empty).
9
+ */
10
+ export declare function discoverGateways(urls: string[], includeLocalhost: boolean): Promise<DiscoveredGateway[]>;
11
+ /**
12
+ * Load the full gateway registry and return it along with the active subset.
13
+ * Encapsulates storage access so tool handlers don't import storage directly.
14
+ */
15
+ export declare function getGatewayStatus(): Promise<{
16
+ registry: GatewayRegistry;
17
+ active: DiscoveredGateway[];
18
+ }>;
19
+ //# sourceMappingURL=gateway-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-registry.d.ts","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/gateway-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIrF;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgB9B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B,CAAC,CAID"}
@@ -0,0 +1,33 @@
1
+ import { scanLocalhostPorts, scanUrls } from './gateway-scanner.js';
2
+ import { mergeGateway, loadRegistry, listActive } from '../../storage/gateway-store.js';
3
+ /**
4
+ * Run a full discovery pass:
5
+ * 1. Optionally scan default localhost ports.
6
+ * 2. Probe any explicitly provided URLs.
7
+ * 3. Persist every found gateway via mergeGateway (upsert).
8
+ *
9
+ * Returns all gateways found in this pass (may be empty).
10
+ */
11
+ export async function discoverGateways(urls, includeLocalhost) {
12
+ const found = [];
13
+ if (includeLocalhost) {
14
+ found.push(...(await scanLocalhostPorts()));
15
+ }
16
+ if (urls.length > 0) {
17
+ found.push(...(await scanUrls(urls)));
18
+ }
19
+ for (const gw of found) {
20
+ await mergeGateway(gw);
21
+ }
22
+ return found;
23
+ }
24
+ /**
25
+ * Load the full gateway registry and return it along with the active subset.
26
+ * Encapsulates storage access so tool handlers don't import storage directly.
27
+ */
28
+ export async function getGatewayStatus() {
29
+ const registry = await loadRegistry();
30
+ const active = listActive(registry);
31
+ return { registry, active };
32
+ }
33
+ //# sourceMappingURL=gateway-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-registry.js","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/gateway-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAc,EACd,gBAAyB;IAEzB,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,IAAI,gBAAgB,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAIpC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { DiscoveredGateway } from '../../types/mcp-gateway.js';
2
+ /**
3
+ * Probe a single base URL for a /.well-known/mcp manifest.
4
+ * Returns null when the endpoint is absent, non-OK, or times out.
5
+ */
6
+ export declare function probeGatewayUrl(baseUrl: string): Promise<DiscoveredGateway | null>;
7
+ /**
8
+ * Scan all default localhost ports in parallel.
9
+ * Returns only the gateways that responded successfully.
10
+ */
11
+ export declare function scanLocalhostPorts(): Promise<DiscoveredGateway[]>;
12
+ /**
13
+ * Scan a list of explicit URLs in parallel.
14
+ * Returns only the gateways that responded successfully.
15
+ */
16
+ export declare function scanUrls(urls: string[]): Promise<DiscoveredGateway[]>;
17
+ //# sourceMappingURL=gateway-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-scanner.d.ts","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/gateway-scanner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,4BAA4B,CAAC;AAQxF;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAkCxF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAUvE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQ3E"}
@@ -0,0 +1,62 @@
1
+ const WELL_KNOWN_PATH = '/.well-known/mcp';
2
+ const DEFAULT_TIMEOUT_MS = 3000;
3
+ /** Default localhost ports to scan for MCP servers. */
4
+ const DEFAULT_LOCAL_PORTS = [3000, 3001, 8080, 8000, 9000];
5
+ /**
6
+ * Probe a single base URL for a /.well-known/mcp manifest.
7
+ * Returns null when the endpoint is absent, non-OK, or times out.
8
+ */
9
+ export async function probeGatewayUrl(baseUrl) {
10
+ try {
11
+ const url = `${baseUrl.replace(/\/$/, '')}${WELL_KNOWN_PATH}`;
12
+ const controller = new AbortController();
13
+ const timer = setTimeout(() => {
14
+ controller.abort();
15
+ }, DEFAULT_TIMEOUT_MS);
16
+ let res;
17
+ try {
18
+ res = await fetch(url, { signal: controller.signal });
19
+ }
20
+ finally {
21
+ clearTimeout(timer);
22
+ }
23
+ if (!res.ok) {
24
+ return null;
25
+ }
26
+ const manifest = (await res.json());
27
+ const now = new Date().toISOString();
28
+ return {
29
+ url: baseUrl,
30
+ name: manifest.name ?? baseUrl,
31
+ discoveredAt: now,
32
+ lastSeenAt: now,
33
+ planuCompatible: manifest.planuCompatible ?? manifest.tools?.includes('create_spec') ?? false,
34
+ tools: manifest.tools ?? [],
35
+ status: 'active',
36
+ };
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * Scan all default localhost ports in parallel.
44
+ * Returns only the gateways that responded successfully.
45
+ */
46
+ export async function scanLocalhostPorts() {
47
+ const results = await Promise.allSettled(DEFAULT_LOCAL_PORTS.map((port) => probeGatewayUrl(`http://localhost:${port}`)));
48
+ return results
49
+ .filter((r) => r.status === 'fulfilled' && r.value !== null)
50
+ .map((r) => r.value);
51
+ }
52
+ /**
53
+ * Scan a list of explicit URLs in parallel.
54
+ * Returns only the gateways that responded successfully.
55
+ */
56
+ export async function scanUrls(urls) {
57
+ const results = await Promise.allSettled(urls.map(probeGatewayUrl));
58
+ return results
59
+ .filter((r) => r.status === 'fulfilled' && r.value !== null)
60
+ .map((r) => r.value);
61
+ }
62
+ //# sourceMappingURL=gateway-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-scanner.js","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/gateway-scanner.ts"],"names":[],"mappings":"AAGA,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAC3C,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,OAAO;YACL,GAAG,EAAE,OAAO;YACZ,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,OAAO;YAC9B,YAAY,EAAE,GAAG;YACjB,UAAU,EAAE,GAAG;YACf,eAAe,EAAE,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK;YAC7F,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAC/E,CAAC;IACF,OAAO,OAAO;SACX,MAAM,CACL,CAAC,CAAC,EAAkD,EAAE,CACpD,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAC/C;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAc;IAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;IACpE,OAAO,OAAO;SACX,MAAM,CACL,CAAC,CAAC,EAAkD,EAAE,CACpD,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAC/C;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { probeGatewayUrl, scanLocalhostPorts, scanUrls } from './gateway-scanner.js';
2
+ export { discoverGateways, getGatewayStatus } from './gateway-registry.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // engine/mcp-gateway/index.ts — SPEC-392: Barrel export
2
+ export { probeGatewayUrl, scanLocalhostPorts, scanUrls } from './gateway-scanner.js';
3
+ export { discoverGateways, getGatewayStatus } from './gateway-registry.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/mcp-gateway/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Builds a human-readable description for a companion spec created in a consumer project.
3
+ */
4
+ export declare function buildCompanionSpecDescription(sourceSpecId: string, sourceProjectPath: string, _consumerProjectPath: string, affectedSymbols: string[], usageLocations: string[]): string;
5
+ /**
6
+ * Builds a concise title for a companion spec referencing the source spec.
7
+ */
8
+ export declare function buildCompanionSpecTitle(sourceSpecId: string, symbols: string[]): string;
9
+ //# sourceMappingURL=companion-spec-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion-spec-builder.d.ts","sourceRoot":"","sources":["../../../src/engine/multi-repo/companion-spec-builder.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,MAAM,EAAE,EACzB,cAAc,EAAE,MAAM,EAAE,GACvB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAGvF"}
@@ -0,0 +1,22 @@
1
+ // engine/multi-repo/companion-spec-builder.ts — SPEC-389: Build companion spec descriptions
2
+ const MAX_SYMBOLS_IN_TITLE = 2;
3
+ const MAX_LOCATIONS_IN_DESCRIPTION = 5;
4
+ /**
5
+ * Builds a human-readable description for a companion spec created in a consumer project.
6
+ */
7
+ export function buildCompanionSpecDescription(sourceSpecId, sourceProjectPath, _consumerProjectPath, affectedSymbols, usageLocations) {
8
+ const symbolList = affectedSymbols.join(', ');
9
+ const locationList = usageLocations.slice(0, MAX_LOCATIONS_IN_DESCRIPTION).join(', ');
10
+ return (`Companion spec for ${sourceSpecId} in ${sourceProjectPath}. ` +
11
+ `Update usages of: ${symbolList}. ` +
12
+ `Affected files: ${locationList}. ` +
13
+ `Ensure all imports and call sites are updated to match the new API surface.`);
14
+ }
15
+ /**
16
+ * Builds a concise title for a companion spec referencing the source spec.
17
+ */
18
+ export function buildCompanionSpecTitle(sourceSpecId, symbols) {
19
+ const symbolPart = symbols.slice(0, MAX_SYMBOLS_IN_TITLE).join('/');
20
+ return `[Companion] Update ${symbolPart} — from ${sourceSpecId}`;
21
+ }
22
+ //# sourceMappingURL=companion-spec-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion-spec-builder.js","sourceRoot":"","sources":["../../../src/engine/multi-repo/companion-spec-builder.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAE5F,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAC3C,YAAoB,EACpB,iBAAyB,EACzB,oBAA4B,EAC5B,eAAyB,EACzB,cAAwB;IAExB,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtF,OAAO,CACL,sBAAsB,YAAY,OAAO,iBAAiB,IAAI;QAC9D,qBAAqB,UAAU,IAAI;QACnC,mBAAmB,YAAY,IAAI;QACnC,6EAA6E,CAC9E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,YAAoB,EAAE,OAAiB;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpE,OAAO,sBAAsB,UAAU,WAAW,YAAY,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Scans a project directory for usage of given symbol names.
3
+ * Returns file paths where any symbol is found.
4
+ * Caps at 500 files to avoid excessive I/O.
5
+ */
6
+ export declare function scanProjectForSymbols(projectPath: string, symbols: string[]): Promise<string[]>;
7
+ /**
8
+ * Returns all registered project paths (excluding the source project).
9
+ * Reads from data/global/registered-projects.json.
10
+ */
11
+ export declare function getRegisteredProjectPaths(excludePath: string): Promise<string[]>;
12
+ //# sourceMappingURL=consumer-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-scanner.d.ts","sourceRoot":"","sources":["../../../src/engine/multi-repo/consumer-scanner.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWtF"}
@@ -0,0 +1,48 @@
1
+ // engine/multi-repo/consumer-scanner.ts — SPEC-389: Scan consumer repos for API usage
2
+ import { readFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { glob } from 'glob';
5
+ const MAX_FILES = 500;
6
+ const SOURCE_GLOBS = '**/*.{ts,js,tsx,jsx,py,go,java,rb}';
7
+ const IGNORE_PATTERNS = ['node_modules/**', 'dist/**', '.git/**', 'vendor/**'];
8
+ /**
9
+ * Scans a project directory for usage of given symbol names.
10
+ * Returns file paths where any symbol is found.
11
+ * Caps at 500 files to avoid excessive I/O.
12
+ */
13
+ export async function scanProjectForSymbols(projectPath, symbols) {
14
+ const files = await glob(SOURCE_GLOBS, {
15
+ cwd: projectPath,
16
+ ignore: IGNORE_PATTERNS,
17
+ absolute: true,
18
+ });
19
+ const usages = [];
20
+ for (const file of files.slice(0, MAX_FILES)) {
21
+ try {
22
+ const content = await readFile(file, 'utf-8');
23
+ const found = symbols.some((sym) => content.includes(sym));
24
+ if (found) {
25
+ usages.push(file);
26
+ }
27
+ }
28
+ catch {
29
+ /* skip unreadable files */
30
+ }
31
+ }
32
+ return usages;
33
+ }
34
+ /**
35
+ * Returns all registered project paths (excluding the source project).
36
+ * Reads from data/global/registered-projects.json.
37
+ */
38
+ export async function getRegisteredProjectPaths(excludePath) {
39
+ try {
40
+ const data = await readFile(join(process.cwd(), 'data/global/registered-projects.json'), 'utf-8');
41
+ const parsed = JSON.parse(data);
42
+ return parsed.map((p) => p.path).filter((p) => p !== excludePath);
43
+ }
44
+ catch {
45
+ return [];
46
+ }
47
+ }
48
+ //# sourceMappingURL=consumer-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-scanner.js","sourceRoot":"","sources":["../../../src/engine/multi-repo/consumer-scanner.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,YAAY,GAAG,oCAAoC,CAAC;AAC1D,MAAM,eAAe,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,OAAiB;IAEjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE;QACrC,GAAG,EAAE,WAAW;QAChB,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,WAAmB;IACjE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sCAAsC,CAAC,EAC3D,OAAO,CACR,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;QACtD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { scanProjectForSymbols, getRegisteredProjectPaths } from './consumer-scanner.js';
2
+ export { buildCompanionSpecDescription, buildCompanionSpecTitle, } from './companion-spec-builder.js';
3
+ export { buildStatusReport } from './refactor-tracker.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/multi-repo/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // engine/multi-repo/index.ts — SPEC-389: Barrel export for multi-repo engine modules
2
+ export { scanProjectForSymbols, getRegisteredProjectPaths } from './consumer-scanner.js';
3
+ export { buildCompanionSpecDescription, buildCompanionSpecTitle, } from './companion-spec-builder.js';
4
+ export { buildStatusReport } from './refactor-tracker.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/multi-repo/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACzF,OAAO,EACL,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { RefactorSession, RefactorStatusReport } from '../../types/multi-repo.js';
2
+ /**
3
+ * Calculates an aggregated progress report from a RefactorSession.
4
+ * overallProgress is 0-100, rounded to the nearest integer.
5
+ */
6
+ export declare function buildStatusReport(session: RefactorSession): RefactorStatusReport;
7
+ //# sourceMappingURL=refactor-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-tracker.d.ts","sourceRoot":"","sources":["../../../src/engine/multi-repo/refactor-tracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEvF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,oBAAoB,CAmBhF"}
@@ -0,0 +1,22 @@
1
+ // engine/multi-repo/refactor-tracker.ts — SPEC-389: Calculate refactor status across repos
2
+ /**
3
+ * Calculates an aggregated progress report from a RefactorSession.
4
+ * overallProgress is 0-100, rounded to the nearest integer.
5
+ */
6
+ export function buildStatusReport(session) {
7
+ const total = session.consumerProjects.length;
8
+ const completed = session.consumerProjects.filter((p) => p.status === 'done').length;
9
+ const inProgress = session.consumerProjects.filter((p) => p.status === 'implementing' || p.status === 'spec-created').length;
10
+ const pending = session.consumerProjects.filter((p) => p.status === 'pending').length;
11
+ const overallProgress = total === 0 ? 0 : Math.round((completed / total) * 100);
12
+ return {
13
+ refactorId: session.id,
14
+ sourceSpec: session.sourceSpecId,
15
+ totalConsumers: total,
16
+ completed,
17
+ inProgress,
18
+ pending,
19
+ overallProgress,
20
+ };
21
+ }
22
+ //# sourceMappingURL=refactor-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactor-tracker.js","sourceRoot":"","sources":["../../../src/engine/multi-repo/refactor-tracker.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAI3F;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAwB;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACrF,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,CAClE,CAAC,MAAM,CAAC;IACT,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAEtF,MAAM,eAAe,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAEhF,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,EAAE;QACtB,UAAU,EAAE,OAAO,CAAC,YAAY;QAChC,cAAc,EAAE,KAAK;QACrB,SAAS;QACT,UAAU;QACV,OAAO;QACP,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { SkillsReconciliation, ProjectKnowledge } from '../types/index.js';
1
+ import type { SkillsReconciliation, SkillsAutoFixResult, ProjectKnowledge } from '../types/index.js';
2
2
  export type { SkillsReconciliation };
3
3
  /**
4
4
  * Scan the project's installed skills against the recommended set for its current stack.
@@ -12,4 +12,13 @@ export type { SkillsReconciliation };
12
12
  * 6. Compute health score and return the reconciliation report.
13
13
  */
14
14
  export declare function reconcileSkills(projectPath: string, knowledge: ProjectKnowledge | null): Promise<SkillsReconciliation>;
15
+ /**
16
+ * Auto-fix the skills installation to match the reconciliation report:
17
+ * 1. Install each skill listed in `newSkillsDetected` (using the builtin source as fallback).
18
+ * 2. Remove each skill listed in `staleSkills` from disk and the manifest.
19
+ * 3. Detect and fix corrupt manifest entries (path does not exist on disk).
20
+ *
21
+ * Returns a summary of all actions taken plus the new health score.
22
+ */
23
+ export declare function autoFixSkills(reconciliation: SkillsReconciliation, projectPath: string): Promise<SkillsAutoFixResult>;
15
24
  //# sourceMappingURL=skills-reconciler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-reconciler.d.ts","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEhF,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,oBAAoB,CAAC,CA8B/B"}
1
+ {"version":3,"file":"skills-reconciler.d.ts","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAGjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,oBAAoB,CAAC,CA8B/B;AAsED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,cAAc,EAAE,oBAAoB,EACpC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAiB9B"}
@@ -1,9 +1,9 @@
1
1
  // engine/skills-reconciler.ts — SPEC-189: Detect stack changes and reconcile skills
2
+ // SPEC-395: autoFixSkills — install missing, remove stale, repair corrupt paths.
2
3
  // Compares recommended skills (based on current stack) with installed skills.
3
- // Read-only analysis — does NOT install or remove anything.
4
4
  import * as fs from 'node:fs/promises';
5
5
  import * as path from 'node:path';
6
- import { readSkillManifest } from './skill-registry/installer.js';
6
+ import { readSkillManifest, installSkill } from './skill-registry/installer.js';
7
7
  import { fetchRecommendedSkills } from './skills/skills-fetcher.js';
8
8
  /**
9
9
  * Scan the project's installed skills against the recommended set for its current stack.
@@ -95,4 +95,130 @@ function buildEmptyReconciliation(_reason) {
95
95
  healthScore: 0,
96
96
  };
97
97
  }
98
+ // ---------------------------------------------------------------------------
99
+ // SPEC-395: autoFixSkills — mutating reconciliation
100
+ // ---------------------------------------------------------------------------
101
+ /**
102
+ * Auto-fix the skills installation to match the reconciliation report:
103
+ * 1. Install each skill listed in `newSkillsDetected` (using the builtin source as fallback).
104
+ * 2. Remove each skill listed in `staleSkills` from disk and the manifest.
105
+ * 3. Detect and fix corrupt manifest entries (path does not exist on disk).
106
+ *
107
+ * Returns a summary of all actions taken plus the new health score.
108
+ */
109
+ export async function autoFixSkills(reconciliation, projectPath) {
110
+ const installed = await installMissingSkills(reconciliation.newSkillsDetected, projectPath);
111
+ const removed = await removeStaleSkills(reconciliation.staleSkills, projectPath);
112
+ const pathsFixed = await fixCorruptPaths(projectPath);
113
+ // Re-read the manifest after all mutations to compute the new health score.
114
+ const updatedManifest = await readSkillManifest(projectPath);
115
+ const totalInstalled = updatedManifest.skills.length;
116
+ const staleCount = 0; // All stale skills have been removed.
117
+ const healthScore = computeHealthScore(totalInstalled + reconciliation.newSkillsDetected.length - installed.length, totalInstalled, staleCount);
118
+ return { installed, removed, pathsFixed, healthScore };
119
+ }
120
+ /** Install each missing skill using the 'builtin' source as a local placeholder. */
121
+ async function installMissingSkills(skillNames, projectPath) {
122
+ const successfullyInstalled = [];
123
+ for (const skillName of skillNames) {
124
+ try {
125
+ await installSkill(skillName, 'builtin', projectPath);
126
+ successfullyInstalled.push(skillName);
127
+ }
128
+ catch {
129
+ // Non-blocking — skip skills that fail to install.
130
+ }
131
+ }
132
+ return successfullyInstalled;
133
+ }
134
+ /** Remove stale skills from disk (directory) and from the manifest. */
135
+ async function removeStaleSkills(staleNames, projectPath) {
136
+ const skillsDir = path.join(projectPath, '.claude', 'skills');
137
+ const removed = [];
138
+ for (const skillName of staleNames) {
139
+ const skillDir = path.join(skillsDir, skillName);
140
+ const skillFile = path.join(skillsDir, `${skillName}.md`);
141
+ // Remove directory-based skill.
142
+ try {
143
+ await fs.rm(skillDir, { recursive: true, force: true });
144
+ }
145
+ catch {
146
+ /* v8 ignore next 1 */
147
+ }
148
+ // Remove flat .md-based skill.
149
+ try {
150
+ await fs.rm(skillFile, { force: true });
151
+ }
152
+ catch {
153
+ /* v8 ignore next 1 */
154
+ }
155
+ removed.push(skillName);
156
+ }
157
+ if (removed.length > 0) {
158
+ await removeFromManifest(projectPath, new Set(removed));
159
+ }
160
+ return removed;
161
+ }
162
+ /** Remove entries from the manifest by name. */
163
+ async function removeFromManifest(projectPath, namesToRemove) {
164
+ const manifest = await readSkillManifest(projectPath);
165
+ const updated = {
166
+ ...manifest,
167
+ skills: manifest.skills.filter((s) => !namesToRemove.has(s.name)),
168
+ };
169
+ const manifestFile = path.join(projectPath, '.claude', 'skills', 'manifest.json');
170
+ await fs.mkdir(path.dirname(manifestFile), { recursive: true });
171
+ await fs.writeFile(manifestFile, JSON.stringify(updated, null, 2), 'utf-8');
172
+ }
173
+ /**
174
+ * Detect manifest entries whose recorded `path` does not exist on disk and attempt to
175
+ * find the skill by name inside `.claude/skills/`. Updates the manifest in place.
176
+ */
177
+ async function fixCorruptPaths(projectPath) {
178
+ const manifest = await readSkillManifest(projectPath);
179
+ const skillsDir = path.join(projectPath, '.claude', 'skills');
180
+ const fixed = [];
181
+ const updatedSkills = [];
182
+ for (const entry of manifest.skills) {
183
+ const pathExists = await checkPathExists(entry.path);
184
+ if (pathExists) {
185
+ updatedSkills.push(entry);
186
+ continue;
187
+ }
188
+ // Try to locate the skill by its name inside the skills directory.
189
+ const candidateDir = path.join(skillsDir, entry.name);
190
+ const candidateFile = path.join(skillsDir, `${entry.name}.md`);
191
+ const dirExists = await checkPathExists(candidateDir);
192
+ const fileExists = await checkPathExists(candidateFile);
193
+ if (dirExists) {
194
+ updatedSkills.push({ ...entry, path: candidateDir });
195
+ fixed.push(entry.name);
196
+ }
197
+ else if (fileExists) {
198
+ updatedSkills.push({ ...entry, path: candidateFile });
199
+ fixed.push(entry.name);
200
+ }
201
+ else {
202
+ // Cannot locate the skill — keep the entry as-is (do not silently remove).
203
+ updatedSkills.push(entry);
204
+ }
205
+ }
206
+ if (fixed.length > 0) {
207
+ const updatedManifest = { ...manifest, skills: updatedSkills };
208
+ const manifestFile = path.join(skillsDir, 'manifest.json');
209
+ await fs.mkdir(skillsDir, { recursive: true });
210
+ await fs.writeFile(manifestFile, JSON.stringify(updatedManifest, null, 2), 'utf-8');
211
+ }
212
+ return fixed;
213
+ }
214
+ /** Return true if the given path exists (file or directory). */
215
+ async function checkPathExists(targetPath) {
216
+ try {
217
+ await fs.access(targetPath);
218
+ return true;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ }
98
224
  //# sourceMappingURL=skills-reconciler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-reconciler.js","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills-reconciler.js","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // index.ts — Planu SDD MCP Server entry point.
3
3
  // Creates the MCP server, registers tools & resources, and starts stdio transport.
4
+ /* eslint-disable max-lines */
4
5
  // CLI detection — intercept known commands before MCP server setup (SPEC-124)
5
6
  const KNOWN_COMMANDS = [
6
7
  'init',
@@ -195,6 +196,13 @@ import { registerPrAgentTools } from './tools/register-pr-agent-tools.js';
195
196
  import { registerE2eTestGeneratorTools } from './tools/register-e2e-test-generator-tools.js';
196
197
  import { registerDocsRegistryTools } from './tools/register-docs-registry-tools.js';
197
198
  import { registerDocComplianceTools } from './tools/register-doc-compliance-tools.js';
199
+ import { registerDriftWatcherTools } from './tools/register-drift-watcher-tools.js';
200
+ import { registerMultiRepoTools } from './tools/register-multi-repo-tools.js';
201
+ import { registerComplianceTestTools } from './tools/register-compliance-test-tools.js';
202
+ import { registerAutoPromoterTools } from './tools/register-auto-promoter-tools.js';
203
+ import { registerCostGuardrailsTools } from './tools/register-cost-guardrails-tools.js';
204
+ import { registerMcpGatewayTools } from './tools/register-mcp-gateway-tools.js';
205
+ import { registerDogfoodTools } from './tools/register-dogfood-tools.js';
198
206
  // Server setup
199
207
  const SERVER_INSTRUCTIONS = [
200
208
  'CONTEXT — Why structured specs matter:',
@@ -463,6 +471,13 @@ function registerLatestSpecTools(s) {
463
471
  registerE2eTestGeneratorTools(s);
464
472
  registerDocsRegistryTools(s);
465
473
  registerDocComplianceTools(s);
474
+ registerDriftWatcherTools(s);
475
+ registerMultiRepoTools(s);
476
+ registerComplianceTestTools(s);
477
+ registerAutoPromoterTools(s);
478
+ registerCostGuardrailsTools(s);
479
+ registerMcpGatewayTools(s);
480
+ registerDogfoodTools(s);
466
481
  }
467
482
  function createMcpServer() {
468
483
  const s = withToolTracking(new McpServer({ name: 'planu', version: PLANU_VERSION }, { instructions: SERVER_INSTRUCTIONS }));