@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18

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 (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -1
  3. package/bin/aiwg.mjs +349 -0
  4. package/dist/src/a2a/agent-card.js +145 -0
  5. package/dist/src/a2a/client.js +411 -0
  6. package/dist/src/a2a/hitl-cli.js +171 -0
  7. package/dist/src/a2a/hitl-driver.js +370 -0
  8. package/dist/src/a2a/hitl.js +181 -0
  9. package/dist/src/a2a/http.js +193 -0
  10. package/dist/src/a2a/jcs.js +128 -0
  11. package/dist/src/a2a/jws.js +187 -0
  12. package/dist/src/a2a/types.js +24 -0
  13. package/dist/src/a2a/webhook.js +240 -0
  14. package/dist/src/activity-log/cli.js +348 -0
  15. package/dist/src/activity-log/parser.js +81 -0
  16. package/dist/src/activity-log/types.js +50 -0
  17. package/dist/src/agents/agent-deployer.js +367 -0
  18. package/dist/src/agents/agent-packager.js +271 -0
  19. package/dist/src/agents/agent-validator.js +271 -0
  20. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  21. package/dist/src/agents/grounding/types.js +12 -0
  22. package/dist/src/agents/index.js +10 -0
  23. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  24. package/dist/src/agents/types.js +7 -0
  25. package/dist/src/api/index.d.ts +10 -0
  26. package/dist/src/api/index.js +10 -0
  27. package/dist/src/artifacts/address-parser.js +73 -0
  28. package/dist/src/artifacts/audit/cli.js +183 -0
  29. package/dist/src/artifacts/audit/drift.js +122 -0
  30. package/dist/src/artifacts/audit/types.js +12 -0
  31. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  32. package/dist/src/artifacts/backends/json-backend.js +129 -0
  33. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  34. package/dist/src/artifacts/browser-export.js +622 -0
  35. package/dist/src/artifacts/capability-resolver.js +94 -0
  36. package/dist/src/artifacts/checksum-manifest.js +91 -0
  37. package/dist/src/artifacts/citation-parser.js +162 -0
  38. package/dist/src/artifacts/cli.js +1486 -0
  39. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  40. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  41. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  42. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  43. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  44. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  45. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  46. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  47. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  48. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  49. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  51. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  52. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  53. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  54. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  55. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  56. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  57. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  58. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  60. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  61. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  62. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  63. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  64. package/dist/src/artifacts/corpus-views/build.js +126 -0
  65. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  66. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  67. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  68. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  69. package/dist/src/artifacts/dep-graph.js +173 -0
  70. package/dist/src/artifacts/discover-facets.js +375 -0
  71. package/dist/src/artifacts/embedding-index.js +354 -0
  72. package/dist/src/artifacts/enrichment/cli.js +240 -0
  73. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  74. package/dist/src/artifacts/enrichment/store.js +90 -0
  75. package/dist/src/artifacts/enrichment/types.js +12 -0
  76. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  77. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  78. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  79. package/dist/src/artifacts/fulltext.js +108 -0
  80. package/dist/src/artifacts/graph-backend.js +51 -0
  81. package/dist/src/artifacts/graph-query.js +247 -0
  82. package/dist/src/artifacts/hybrid-query.js +225 -0
  83. package/dist/src/artifacts/index-builder.js +1089 -0
  84. package/dist/src/artifacts/index-reader.js +112 -0
  85. package/dist/src/artifacts/index-status.js +193 -0
  86. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  87. package/dist/src/artifacts/move.js +154 -0
  88. package/dist/src/artifacts/operational-state.js +239 -0
  89. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  90. package/dist/src/artifacts/query-engine.js +1955 -0
  91. package/dist/src/artifacts/source-graph.js +529 -0
  92. package/dist/src/artifacts/stats.js +169 -0
  93. package/dist/src/artifacts/types.js +606 -0
  94. package/dist/src/artifacts/views/cli.js +293 -0
  95. package/dist/src/artifacts/views/definition.js +170 -0
  96. package/dist/src/artifacts/views/store.js +149 -0
  97. package/dist/src/artifacts/views/types.js +8 -0
  98. package/dist/src/artifacts/watcher.js +255 -0
  99. package/dist/src/catalog/builtin-models.json +636 -0
  100. package/dist/src/catalog/cli.js +228 -0
  101. package/dist/src/catalog/cli.mjs +289 -0
  102. package/dist/src/catalog/index.js +15 -0
  103. package/dist/src/catalog/loader.js +217 -0
  104. package/dist/src/catalog/loader.mjs +251 -0
  105. package/dist/src/catalog/sources.json +41 -0
  106. package/dist/src/catalog/types.js +8 -0
  107. package/dist/src/channel/manager.mjs +504 -0
  108. package/dist/src/cli/agent-spawn.js +178 -0
  109. package/dist/src/cli/cli-extension-loader.js +245 -0
  110. package/dist/src/cli/command-log.js +275 -0
  111. package/dist/src/cli/config-loader.js +232 -0
  112. package/dist/src/cli/env.js +82 -0
  113. package/dist/src/cli/errors.js +150 -0
  114. package/dist/src/cli/find-package-root.js +40 -0
  115. package/dist/src/cli/git-hooks.js +250 -0
  116. package/dist/src/cli/handlers/agentcard.js +206 -0
  117. package/dist/src/cli/handlers/artifacts.js +76 -0
  118. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  119. package/dist/src/cli/handlers/cockpit.js +137 -0
  120. package/dist/src/cli/handlers/command-log.js +37 -0
  121. package/dist/src/cli/handlers/daemon.js +59 -0
  122. package/dist/src/cli/handlers/diagnose.js +300 -0
  123. package/dist/src/cli/handlers/execution-mode.js +105 -0
  124. package/dist/src/cli/handlers/feedback.js +341 -0
  125. package/dist/src/cli/handlers/help.js +147 -0
  126. package/dist/src/cli/handlers/index.js +302 -0
  127. package/dist/src/cli/handlers/init.js +179 -0
  128. package/dist/src/cli/handlers/install.js +129 -0
  129. package/dist/src/cli/handlers/issues.js +46 -0
  130. package/dist/src/cli/handlers/lint.js +42 -0
  131. package/dist/src/cli/handlers/local-executor.js +315 -0
  132. package/dist/src/cli/handlers/marketplace.js +168 -0
  133. package/dist/src/cli/handlers/mc.js +1010 -0
  134. package/dist/src/cli/handlers/models.js +352 -0
  135. package/dist/src/cli/handlers/packages.js +155 -0
  136. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  137. package/dist/src/cli/handlers/ralph.js +575 -0
  138. package/dist/src/cli/handlers/refresh.js +432 -0
  139. package/dist/src/cli/handlers/regenerate.js +336 -0
  140. package/dist/src/cli/handlers/repo-access.js +109 -0
  141. package/dist/src/cli/handlers/run.js +165 -0
  142. package/dist/src/cli/handlers/runtime-info.js +301 -0
  143. package/dist/src/cli/handlers/sandbox.js +197 -0
  144. package/dist/src/cli/handlers/scaffolding.js +149 -0
  145. package/dist/src/cli/handlers/script-runner.js +121 -0
  146. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  147. package/dist/src/cli/handlers/serve.js +1835 -0
  148. package/dist/src/cli/handlers/session.js +348 -0
  149. package/dist/src/cli/handlers/setup.js +440 -0
  150. package/dist/src/cli/handlers/skill-lint.js +367 -0
  151. package/dist/src/cli/handlers/skill-usage.js +74 -0
  152. package/dist/src/cli/handlers/steward.js +567 -0
  153. package/dist/src/cli/handlers/subcommands.js +1702 -0
  154. package/dist/src/cli/handlers/team.js +337 -0
  155. package/dist/src/cli/handlers/types.js +11 -0
  156. package/dist/src/cli/handlers/use.js +2772 -0
  157. package/dist/src/cli/handlers/utilities.js +703 -0
  158. package/dist/src/cli/handlers/version.js +134 -0
  159. package/dist/src/cli/handlers/workspace-context.js +93 -0
  160. package/dist/src/cli/handlers/workspace.js +126 -0
  161. package/dist/src/cli/help-generator.js +178 -0
  162. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  163. package/dist/src/cli/hooks/executor.js +96 -0
  164. package/dist/src/cli/hooks/index.js +15 -0
  165. package/dist/src/cli/hooks/registry.js +143 -0
  166. package/dist/src/cli/hooks/types.js +13 -0
  167. package/dist/src/cli/log.js +492 -0
  168. package/dist/src/cli/project-isolation/detect.js +70 -0
  169. package/dist/src/cli/project-isolation/index.js +7 -0
  170. package/dist/src/cli/project-isolation/signals.js +17 -0
  171. package/dist/src/cli/project-isolation/warning.js +102 -0
  172. package/dist/src/cli/prompt-utils.js +155 -0
  173. package/dist/src/cli/provider-deployment-plan.js +126 -0
  174. package/dist/src/cli/provider-resolution.js +119 -0
  175. package/dist/src/cli/router.js +305 -0
  176. package/dist/src/cli/scope-resolver.js +392 -0
  177. package/dist/src/cli/skill-usage.js +616 -0
  178. package/dist/src/cli/ui.js +224 -0
  179. package/dist/src/cli/watch-service.js +203 -0
  180. package/dist/src/cli/workflow-orchestrator.js +478 -0
  181. package/dist/src/cli/workspace-signals.js +321 -0
  182. package/dist/src/community/footer.js +14 -0
  183. package/dist/src/community/links.js +123 -0
  184. package/dist/src/community/milestones.js +46 -0
  185. package/dist/src/community/nudge-policy.js +93 -0
  186. package/dist/src/config/aiwg-config.js +883 -0
  187. package/dist/src/config/cli.js +703 -0
  188. package/dist/src/config/gitignore.js +156 -0
  189. package/dist/src/config/project-artifacts.js +76 -0
  190. package/dist/src/config/user-config.js +428 -0
  191. package/dist/src/config/user-registry.js +127 -0
  192. package/dist/src/config/workspace.js +276 -0
  193. package/dist/src/contributors/detect.js +39 -0
  194. package/dist/src/contributors/discover.js +172 -0
  195. package/dist/src/contributors/heuristic.js +186 -0
  196. package/dist/src/contributors/index.js +11 -0
  197. package/dist/src/contributors/types.js +13 -0
  198. package/dist/src/contributors/validation.js +116 -0
  199. package/dist/src/data/community.schema.json +43 -0
  200. package/dist/src/data/community.yaml +16 -0
  201. package/dist/src/extensions/capability-index.js +270 -0
  202. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  203. package/dist/src/extensions/commands/definitions.js +3485 -0
  204. package/dist/src/extensions/deployment-registration.js +463 -0
  205. package/dist/src/extensions/index.js +22 -0
  206. package/dist/src/extensions/loader.js +132 -0
  207. package/dist/src/extensions/managed-marker.js +100 -0
  208. package/dist/src/extensions/manifest.js +196 -0
  209. package/dist/src/extensions/project-local-activity.js +114 -0
  210. package/dist/src/extensions/project-local-discovery.js +261 -0
  211. package/dist/src/extensions/project-local-doctor.js +281 -0
  212. package/dist/src/extensions/project-local-gitignore.js +176 -0
  213. package/dist/src/extensions/project-local-paths.js +121 -0
  214. package/dist/src/extensions/project-local-promote.js +218 -0
  215. package/dist/src/extensions/project-local-remove.js +373 -0
  216. package/dist/src/extensions/project-local-scaffold.js +252 -0
  217. package/dist/src/extensions/project-quickref.js +291 -0
  218. package/dist/src/extensions/registry.js +368 -0
  219. package/dist/src/extensions/shadow-resolver.js +271 -0
  220. package/dist/src/extensions/types.js +86 -0
  221. package/dist/src/extensions/upstream-registry.js +195 -0
  222. package/dist/src/extensions/validation.js +631 -0
  223. package/dist/src/features/catalog.js +88 -0
  224. package/dist/src/features/cli.js +197 -0
  225. package/dist/src/features/installer.js +57 -0
  226. package/dist/src/features/paths.js +14 -0
  227. package/dist/src/features/runtime.js +21 -0
  228. package/dist/src/features/status.js +134 -0
  229. package/dist/src/hooks/laziness-detection.js +532 -0
  230. package/dist/src/intake/git-history-analyzer.js +486 -0
  231. package/dist/src/intake/index.js +9 -0
  232. package/dist/src/issues/cli.js +327 -0
  233. package/dist/src/issues/index.js +5 -0
  234. package/dist/src/issues/live.js +154 -0
  235. package/dist/src/issues/local.js +666 -0
  236. package/dist/src/issues/sync.js +143 -0
  237. package/dist/src/issues/types.js +2 -0
  238. package/dist/src/issues/workflows.js +164 -0
  239. package/dist/src/kb/cli.js +173 -0
  240. package/dist/src/lint/cli.js +171 -0
  241. package/dist/src/lint/loader.js +225 -0
  242. package/dist/src/lint/reporters.js +141 -0
  243. package/dist/src/lint/runner.js +364 -0
  244. package/dist/src/lint/types.js +10 -0
  245. package/dist/src/marketplace/cache.js +110 -0
  246. package/dist/src/marketplace/identifier.js +63 -0
  247. package/dist/src/marketplace/registry.js +36 -0
  248. package/dist/src/marketplace/sources/clawhub.js +53 -0
  249. package/dist/src/marketplace/sources/git.js +45 -0
  250. package/dist/src/marketplace/types.js +9 -0
  251. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  252. package/dist/src/mcp/cli.mjs +1197 -0
  253. package/dist/src/mcp/elicitation.mjs +149 -0
  254. package/dist/src/mcp/helpers.mjs +287 -0
  255. package/dist/src/mcp/index.mjs +11 -0
  256. package/dist/src/mcp/profiles.js +263 -0
  257. package/dist/src/mcp/profiles.mjs +360 -0
  258. package/dist/src/mcp/registry.js +376 -0
  259. package/dist/src/mcp/registry.mjs +387 -0
  260. package/dist/src/mcp/server.mjs +633 -0
  261. package/dist/src/mcp/test-simple.mjs +271 -0
  262. package/dist/src/mcp/tools/command-run.mjs +101 -0
  263. package/dist/src/mcp/tools/discovery.mjs +291 -0
  264. package/dist/src/mcp/tools/interaction.mjs +87 -0
  265. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  266. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  267. package/dist/src/memory/cli.js +166 -0
  268. package/dist/src/memory/project-registry.js +282 -0
  269. package/dist/src/metrics/artifact-metrics.js +184 -0
  270. package/dist/src/metrics/context-budget.js +174 -0
  271. package/dist/src/metrics/token-counter.js +133 -0
  272. package/dist/src/models/config-loader.js +228 -0
  273. package/dist/src/models/index.js +22 -0
  274. package/dist/src/models/model-capabilities.v1.json +120 -0
  275. package/dist/src/models/model-catalog.v1.json +96 -0
  276. package/dist/src/models/model-discovery.js +521 -0
  277. package/dist/src/models/provider-models.js +73 -0
  278. package/dist/src/models/provider-policy.js +273 -0
  279. package/dist/src/models/resolver.js +245 -0
  280. package/dist/src/models/router.js +70 -0
  281. package/dist/src/models/types.js +8 -0
  282. package/dist/src/models/wrapper-deployment.js +178 -0
  283. package/dist/src/models/wrapper-route.js +54 -0
  284. package/dist/src/ops/cli.js +268 -0
  285. package/dist/src/ops/registry.js +623 -0
  286. package/dist/src/packages/adapters/clawhub.js +113 -0
  287. package/dist/src/packages/adapters/git.js +153 -0
  288. package/dist/src/packages/adapters/gitea.js +93 -0
  289. package/dist/src/packages/adapters/github.js +69 -0
  290. package/dist/src/packages/adapters/local-cache.js +89 -0
  291. package/dist/src/packages/package-registry.js +143 -0
  292. package/dist/src/packages/registry.js +238 -0
  293. package/dist/src/packages/types.js +11 -0
  294. package/dist/src/plugin/cross-framework-ops.js +475 -0
  295. package/dist/src/plugin/framework-config-loader.js +235 -0
  296. package/dist/src/plugin/framework-detector.js +186 -0
  297. package/dist/src/plugin/framework-isolator.js +341 -0
  298. package/dist/src/plugin/framework-migration.js +371 -0
  299. package/dist/src/plugin/metadata-validator.js +906 -0
  300. package/dist/src/plugin/plugin-installer.js +436 -0
  301. package/dist/src/plugin/plugin-status.js +369 -0
  302. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  303. package/dist/src/plugin/registry-validator.js +344 -0
  304. package/dist/src/plugin/skill-command-translator.js +415 -0
  305. package/dist/src/plugin/workspace-creator.js +189 -0
  306. package/dist/src/plugin/workspace-migrator.js +821 -0
  307. package/dist/src/policy/authorization.js +390 -0
  308. package/dist/src/policy/repo-access.js +215 -0
  309. package/dist/src/provenance/cli.js +16 -0
  310. package/dist/src/providers/capability-matrix.js +300 -0
  311. package/dist/src/providers/capability-matrix.yaml +514 -0
  312. package/dist/src/providers/provider-definitions.js +977 -0
  313. package/dist/src/providers/provider-definitions.mjs +159 -0
  314. package/dist/src/providers/provider-inventory.js +169 -0
  315. package/dist/src/quality/feedback-ab.js +174 -0
  316. package/dist/src/quality/feedback-collector.js +176 -0
  317. package/dist/src/quality/feedback-tracker.js +123 -0
  318. package/dist/src/quality/patterns/adr.json +24 -0
  319. package/dist/src/quality/patterns/sad.json +24 -0
  320. package/dist/src/quality/patterns/test-plan.json +24 -0
  321. package/dist/src/quality/patterns/use-case.json +24 -0
  322. package/dist/src/quality/scoring.js +157 -0
  323. package/dist/src/reflections/cli.js +15 -0
  324. package/dist/src/release/plan.js +139 -0
  325. package/dist/src/research/cache/manager.js +227 -0
  326. package/dist/src/research/clients/arxiv.js +156 -0
  327. package/dist/src/research/clients/base.js +197 -0
  328. package/dist/src/research/clients/crossref.js +112 -0
  329. package/dist/src/research/clients/semantic-scholar.js +126 -0
  330. package/dist/src/research/clients/unpaywall.js +87 -0
  331. package/dist/src/research/index.js +14 -0
  332. package/dist/src/research/query-cli.js +336 -0
  333. package/dist/src/research/services/acquisition.js +313 -0
  334. package/dist/src/research/services/archival.js +225 -0
  335. package/dist/src/research/services/citation.js +279 -0
  336. package/dist/src/research/services/discovery.js +243 -0
  337. package/dist/src/research/services/documentation.js +269 -0
  338. package/dist/src/research/services/index.js +14 -0
  339. package/dist/src/research/services/provenance.js +279 -0
  340. package/dist/src/research/services/quality.js +370 -0
  341. package/dist/src/research/services/types.js +7 -0
  342. package/dist/src/research/storage-cli.js +20 -0
  343. package/dist/src/research/types.js +47 -0
  344. package/dist/src/resources/index.d.ts +2 -0
  345. package/dist/src/resources/index.js +2 -0
  346. package/dist/src/resources/web-release.d.ts +89 -0
  347. package/dist/src/resources/web-release.js +886 -0
  348. package/dist/src/rlm/cache/cli.js +162 -0
  349. package/dist/src/rlm/cache/hash.js +35 -0
  350. package/dist/src/rlm/cache/store.js +170 -0
  351. package/dist/src/rlm/cache/types.js +8 -0
  352. package/dist/src/rlm/cli.js +650 -0
  353. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  354. package/dist/src/serve/agent-router.js +205 -0
  355. package/dist/src/serve/dispatch-router.js +171 -0
  356. package/dist/src/serve/executor-registry.js +715 -0
  357. package/dist/src/serve/mission-conductor.js +177 -0
  358. package/dist/src/serve/orchestrator-adapter.js +113 -0
  359. package/dist/src/serve/orchestrator-override.js +94 -0
  360. package/dist/src/serve/orchestrator-pty.js +133 -0
  361. package/dist/src/serve/pty-bridge.js +799 -0
  362. package/dist/src/serve/sandbox-registry.js +832 -0
  363. package/dist/src/serve/screen-reader.js +228 -0
  364. package/dist/src/serve/stack-adapters.js +68 -0
  365. package/dist/src/serve/telemetry.js +143 -0
  366. package/dist/src/skills/adapters/clawhub.js +250 -0
  367. package/dist/src/skills/adapters/local.js +335 -0
  368. package/dist/src/skills/adapters/openclaw.js +316 -0
  369. package/dist/src/skills/cli.js +334 -0
  370. package/dist/src/skills/registry.js +117 -0
  371. package/dist/src/skills/run.js +259 -0
  372. package/dist/src/skills/runtime.js +94 -0
  373. package/dist/src/skills/types.js +10 -0
  374. package/dist/src/smiths/agentsmith/demo.js +116 -0
  375. package/dist/src/smiths/agentsmith/examples.js +300 -0
  376. package/dist/src/smiths/agentsmith/generator.js +503 -0
  377. package/dist/src/smiths/agentsmith/index.js +11 -0
  378. package/dist/src/smiths/agentsmith/types.js +8 -0
  379. package/dist/src/smiths/commandsmith/example.js +220 -0
  380. package/dist/src/smiths/commandsmith/generator.js +288 -0
  381. package/dist/src/smiths/commandsmith/index.js +41 -0
  382. package/dist/src/smiths/commandsmith/templates.js +296 -0
  383. package/dist/src/smiths/commandsmith/types.js +7 -0
  384. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  385. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  386. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  387. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  388. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  389. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  390. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  391. package/dist/src/smiths/context-pipeline/index.js +30 -0
  392. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  393. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  394. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  395. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  396. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  397. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  398. package/dist/src/smiths/context-pipeline/types.js +23 -0
  399. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  400. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  401. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  402. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  403. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  404. package/dist/src/smiths/hook-bridge/index.js +79 -0
  405. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  406. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  407. package/dist/src/smiths/hook-bridge/types.js +31 -0
  408. package/dist/src/smiths/index.js +39 -0
  409. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  410. package/dist/src/smiths/mcpsmith/example.js +119 -0
  411. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  412. package/dist/src/smiths/mcpsmith/index.js +17 -0
  413. package/dist/src/smiths/mcpsmith/types.js +10 -0
  414. package/dist/src/smiths/platform-paths.js +101 -0
  415. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  416. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  417. package/dist/src/smiths/skillsmith/demo.js +83 -0
  418. package/dist/src/smiths/skillsmith/examples.js +161 -0
  419. package/dist/src/smiths/skillsmith/generator.js +316 -0
  420. package/dist/src/smiths/skillsmith/index.js +12 -0
  421. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  422. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  423. package/dist/src/smiths/skillsmith/types.js +9 -0
  424. package/dist/src/smiths/toolsmith/index.js +10 -0
  425. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  426. package/dist/src/smiths/toolsmith/types.js +8 -0
  427. package/dist/src/storage/backends/fortemi.js +227 -0
  428. package/dist/src/storage/backends/fs.js +134 -0
  429. package/dist/src/storage/backends/logseq.js +309 -0
  430. package/dist/src/storage/backends/obsidian.js +233 -0
  431. package/dist/src/storage/cli.js +468 -0
  432. package/dist/src/storage/config.js +272 -0
  433. package/dist/src/storage/index.js +108 -0
  434. package/dist/src/storage/subsystem-cli.js +201 -0
  435. package/dist/src/storage/types.js +33 -0
  436. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  437. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  438. package/dist/src/testing/corpus/index.js +10 -0
  439. package/dist/src/testing/fixtures/index.js +9 -0
  440. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  441. package/dist/src/testing/generators/index.js +11 -0
  442. package/dist/src/testing/generators/test-case-generator.js +393 -0
  443. package/dist/src/testing/generators/test-code-generator.js +384 -0
  444. package/dist/src/testing/generators/use-case-parser.js +325 -0
  445. package/dist/src/testing/index.js +11 -0
  446. package/dist/src/tracker/capability-protocol.js +118 -0
  447. package/dist/src/update/checker.mjs +396 -0
  448. package/dist/src/update/notifier.mjs +235 -0
  449. package/dist/src/writing/content-diversifier.js +804 -0
  450. package/dist/src/writing/example-generator.js +959 -0
  451. package/dist/src/writing/example-templates.js +99 -0
  452. package/dist/src/writing/pattern-library.js +486 -0
  453. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  454. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  455. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  456. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  457. package/dist/src/writing/patterns/transition-words.json +1285 -0
  458. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  459. package/dist/src/writing/prompt-optimizer.js +660 -0
  460. package/dist/src/writing/prompt-templates.js +583 -0
  461. package/dist/src/writing/scoring-config-loader.js +168 -0
  462. package/dist/src/writing/validation-engine.js +595 -0
  463. package/dist/src/writing/validation-rules.js +380 -0
  464. package/dist/src/writing/voice-analyzer.js +439 -0
  465. package/dist/src/writing/voice-calibration.js +661 -0
  466. package/dist/src/writing/voice-profiles.json +588 -0
  467. package/package.json +65 -9
@@ -0,0 +1,821 @@
1
+ /**
2
+ * WorkspaceMigrator - Migrate legacy .aiwg/ workspaces to framework-scoped structure
3
+ *
4
+ * Migrates legacy workspace structure (.aiwg/intake/, .aiwg/requirements/, etc.)
5
+ * to framework-scoped structure (.aiwg/frameworks/{framework-id}/projects/{project-id}/).
6
+ *
7
+ * Features:
8
+ * - Detection of legacy workspace structure
9
+ * - Framework detection from artifact patterns
10
+ * - Validation of migration safety (conflict detection)
11
+ * - Atomic migration with rollback capability
12
+ * - Backup creation before migration
13
+ * - Dry-run mode for simulation
14
+ * - Detailed migration reports
15
+ *
16
+ * @module src/plugin/workspace-migrator
17
+ * @version 1.0.0
18
+ * @since 2025-10-23
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const migrator = new WorkspaceMigrator('/path/to/project');
23
+ * await migrator.initialize();
24
+ *
25
+ * // Detect legacy workspace
26
+ * const legacy = await migrator.detectLegacyWorkspace();
27
+ * if (legacy) {
28
+ * console.log(`Found legacy workspace with ${legacy.artifactCount} artifacts`);
29
+ *
30
+ * // Detect frameworks
31
+ * const frameworks = await migrator.detectFrameworks();
32
+ * console.log(`Detected frameworks: ${frameworks.map(f => f.name).join(', ')}`);
33
+ *
34
+ * // Validate migration
35
+ * const validation = await migrator.validateMigration({
36
+ * sourcePath: legacy.path,
37
+ * targetPath: `.aiwg/frameworks/${frameworks[0].name}/projects/default`,
38
+ * framework: frameworks[0].name
39
+ * });
40
+ *
41
+ * if (validation.safe) {
42
+ * // Perform migration
43
+ * const result = await migrator.migrate({
44
+ * source: legacy.path,
45
+ * target: `.aiwg/frameworks/${frameworks[0].name}/projects/default`,
46
+ * framework: frameworks[0].name,
47
+ * backup: true,
48
+ * dryRun: false,
49
+ * overwrite: false
50
+ * });
51
+ *
52
+ * console.log(migrator.generateReport(result));
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ import * as fs from 'fs/promises';
58
+ import * as path from 'path';
59
+ import * as crypto from 'crypto';
60
+ // ===========================
61
+ // WorkspaceMigrator Class
62
+ // ===========================
63
+ export class WorkspaceMigrator {
64
+ projectRoot;
65
+ sandboxPath;
66
+ // Legacy workspace directories
67
+ LEGACY_DIRS = [
68
+ 'intake',
69
+ 'requirements',
70
+ 'architecture',
71
+ 'planning',
72
+ 'risks',
73
+ 'testing',
74
+ 'security',
75
+ 'quality',
76
+ 'deployment',
77
+ 'handoffs',
78
+ 'gates',
79
+ 'decisions',
80
+ 'team',
81
+ 'working',
82
+ 'reports'
83
+ ];
84
+ // Framework detection patterns
85
+ FRAMEWORK_PATTERNS = {
86
+ 'sdlc-complete': [
87
+ 'architecture/software-architecture-doc.md',
88
+ 'requirements/use-cases/',
89
+ 'testing/master-test-plan.md',
90
+ 'deployment/deployment-plan.md'
91
+ ],
92
+ 'marketing-flow': [
93
+ 'campaigns/',
94
+ 'content/',
95
+ 'analytics/'
96
+ ],
97
+ 'agile-complete': [
98
+ 'backlog/',
99
+ 'sprints/',
100
+ 'retrospectives/'
101
+ ]
102
+ };
103
+ constructor(projectRoot) {
104
+ this.projectRoot = path.resolve(projectRoot);
105
+ this.sandboxPath = path.join(this.projectRoot, '.aiwg');
106
+ }
107
+ /**
108
+ * Initialize the migrator
109
+ */
110
+ async initialize() {
111
+ // Verify project root exists
112
+ try {
113
+ await fs.access(this.projectRoot);
114
+ }
115
+ catch {
116
+ throw new Error(`Project root does not exist: ${this.projectRoot}`);
117
+ }
118
+ }
119
+ // ===========================
120
+ // Detection Methods
121
+ // ===========================
122
+ /**
123
+ * Detect legacy workspace structure
124
+ *
125
+ * Returns information about legacy workspace if found, null otherwise.
126
+ *
127
+ * @returns Legacy workspace info or null if not found
128
+ */
129
+ async detectLegacyWorkspace() {
130
+ const legacyPath = this.sandboxPath;
131
+ try {
132
+ await fs.access(legacyPath);
133
+ }
134
+ catch {
135
+ return null; // No .aiwg directory exists
136
+ }
137
+ // Check for legacy directory structure (intake, requirements, etc.)
138
+ const foundDirs = [];
139
+ let artifactCount = 0;
140
+ let totalSize = 0;
141
+ for (const dir of this.LEGACY_DIRS) {
142
+ const dirPath = path.join(legacyPath, dir);
143
+ try {
144
+ const stat = await fs.stat(dirPath);
145
+ if (stat.isDirectory()) {
146
+ foundDirs.push(dir);
147
+ const dirInfo = await this.getDirectoryInfo(dirPath);
148
+ artifactCount += dirInfo.fileCount;
149
+ totalSize += dirInfo.size;
150
+ }
151
+ }
152
+ catch {
153
+ // Directory doesn't exist, skip
154
+ }
155
+ }
156
+ // If no legacy directories found, not a legacy workspace
157
+ if (foundDirs.length === 0) {
158
+ return null;
159
+ }
160
+ // Check for git repository
161
+ const hasGit = await this.hasGitRepo(legacyPath);
162
+ // Detect frameworks
163
+ const frameworks = await this.detectFrameworksFromArtifacts(legacyPath);
164
+ return {
165
+ path: legacyPath,
166
+ artifactCount,
167
+ frameworks,
168
+ size: totalSize,
169
+ hasGit
170
+ };
171
+ }
172
+ /**
173
+ * Detect frameworks from artifact structure
174
+ *
175
+ * Analyzes artifact patterns to identify which frameworks are in use.
176
+ *
177
+ * @returns Array of detected frameworks
178
+ */
179
+ async detectFrameworks() {
180
+ const legacyPath = this.sandboxPath;
181
+ const frameworks = [];
182
+ for (const [frameworkName, patterns] of Object.entries(this.FRAMEWORK_PATTERNS)) {
183
+ let matchCount = 0;
184
+ let artifactCount = 0;
185
+ for (const pattern of patterns) {
186
+ const fullPath = path.join(legacyPath, pattern);
187
+ try {
188
+ const stat = await fs.stat(fullPath);
189
+ if (stat.isFile() || stat.isDirectory()) {
190
+ matchCount++;
191
+ if (stat.isDirectory()) {
192
+ const dirInfo = await this.getDirectoryInfo(fullPath);
193
+ artifactCount += dirInfo.fileCount;
194
+ }
195
+ else {
196
+ artifactCount++;
197
+ }
198
+ }
199
+ }
200
+ catch {
201
+ // Pattern doesn't match, continue
202
+ }
203
+ }
204
+ // If at least 50% of patterns match, framework is detected
205
+ if (matchCount >= patterns.length * 0.5) {
206
+ frameworks.push({
207
+ name: frameworkName,
208
+ path: path.join(this.sandboxPath, 'frameworks', frameworkName, 'projects', 'default'),
209
+ artifactCount
210
+ });
211
+ }
212
+ }
213
+ // If no frameworks detected, default to sdlc-complete
214
+ if (frameworks.length === 0) {
215
+ const dirInfo = await this.getDirectoryInfo(legacyPath);
216
+ frameworks.push({
217
+ name: 'sdlc-complete',
218
+ path: path.join(this.sandboxPath, 'frameworks', 'sdlc-complete', 'projects', 'default'),
219
+ artifactCount: dirInfo.fileCount
220
+ });
221
+ }
222
+ return frameworks;
223
+ }
224
+ /**
225
+ * Detect frameworks from artifacts (internal helper)
226
+ *
227
+ * @param basePath - Base path to search
228
+ * @returns Array of framework names
229
+ */
230
+ async detectFrameworksFromArtifacts(basePath) {
231
+ const frameworks = [];
232
+ for (const [frameworkName, patterns] of Object.entries(this.FRAMEWORK_PATTERNS)) {
233
+ let matchCount = 0;
234
+ for (const pattern of patterns) {
235
+ const fullPath = path.join(basePath, pattern);
236
+ try {
237
+ await fs.access(fullPath);
238
+ matchCount++;
239
+ }
240
+ catch {
241
+ // Pattern doesn't match
242
+ }
243
+ }
244
+ // If at least 50% of patterns match, framework is detected
245
+ if (matchCount >= patterns.length * 0.5) {
246
+ frameworks.push(frameworkName);
247
+ }
248
+ }
249
+ // Default to sdlc-complete if nothing detected
250
+ if (frameworks.length === 0) {
251
+ frameworks.push('sdlc-complete');
252
+ }
253
+ return frameworks;
254
+ }
255
+ // ===========================
256
+ // Validation Methods
257
+ // ===========================
258
+ /**
259
+ * Validate migration safety
260
+ *
261
+ * Checks for conflicts, permission issues, and estimates duration.
262
+ *
263
+ * @param target - Migration target configuration
264
+ * @returns Validation result
265
+ */
266
+ async validateMigration(target) {
267
+ const warnings = [];
268
+ const conflicts = [];
269
+ // Check source exists
270
+ try {
271
+ await fs.access(target.sourcePath);
272
+ }
273
+ catch {
274
+ return {
275
+ safe: false,
276
+ warnings: [`Source path does not exist: ${target.sourcePath}`],
277
+ conflicts: [],
278
+ estimatedDuration: 0
279
+ };
280
+ }
281
+ // Check target doesn't already exist (unless overwrite is allowed)
282
+ try {
283
+ await fs.access(target.targetPath);
284
+ warnings.push(`Target path already exists: ${target.targetPath}`);
285
+ // Check for file conflicts
286
+ const sourceFiles = await this.listFilesRecursive(target.sourcePath);
287
+ for (const relPath of sourceFiles) {
288
+ const targetFile = path.join(target.targetPath, relPath);
289
+ try {
290
+ await fs.access(targetFile);
291
+ conflicts.push({
292
+ type: 'file',
293
+ path: relPath,
294
+ description: 'File exists in target directory',
295
+ resolution: 'overwrite'
296
+ });
297
+ }
298
+ catch {
299
+ // No conflict
300
+ }
301
+ }
302
+ }
303
+ catch {
304
+ // Target doesn't exist, good
305
+ }
306
+ // Check permissions
307
+ const permissionIssues = await this.checkPermissions(target.sourcePath);
308
+ for (const issue of permissionIssues) {
309
+ conflicts.push({
310
+ type: 'permission',
311
+ path: issue,
312
+ description: 'Permission denied',
313
+ resolution: 'manual'
314
+ });
315
+ }
316
+ // Estimate duration (1ms per file + 100ms overhead)
317
+ const sourceFiles = await this.listFilesRecursive(target.sourcePath);
318
+ const estimatedDuration = Math.ceil((sourceFiles.length + 100) / 1000);
319
+ const safe = conflicts.filter(c => c.resolution === 'manual').length === 0;
320
+ return {
321
+ safe,
322
+ warnings,
323
+ conflicts,
324
+ estimatedDuration
325
+ };
326
+ }
327
+ /**
328
+ * Check for conflicts between source and target
329
+ *
330
+ * @param source - Source directory path
331
+ * @param target - Target directory path
332
+ * @returns Array of conflicts
333
+ */
334
+ async checkConflicts(source, target) {
335
+ const conflicts = [];
336
+ try {
337
+ await fs.access(target);
338
+ }
339
+ catch {
340
+ // Target doesn't exist, no conflicts
341
+ return conflicts;
342
+ }
343
+ const sourceFiles = await this.listFilesRecursive(source);
344
+ for (const relPath of sourceFiles) {
345
+ const targetFile = path.join(target, relPath);
346
+ try {
347
+ await fs.access(targetFile);
348
+ conflicts.push({
349
+ type: 'file',
350
+ path: relPath,
351
+ description: 'File exists in target directory',
352
+ resolution: 'overwrite'
353
+ });
354
+ }
355
+ catch {
356
+ // No conflict
357
+ }
358
+ }
359
+ return conflicts;
360
+ }
361
+ // ===========================
362
+ // Migration Methods
363
+ // ===========================
364
+ /**
365
+ * Perform workspace migration
366
+ *
367
+ * Migrates legacy workspace to framework-scoped structure.
368
+ * Supports dry-run mode, backup creation, and atomic operations.
369
+ *
370
+ * @param options - Migration options
371
+ * @returns Migration result
372
+ */
373
+ async migrate(options) {
374
+ const startTime = Date.now();
375
+ const migrationId = this.generateMigrationId();
376
+ const errors = [];
377
+ let filesMovedCount = 0;
378
+ let filesCopiedCount = 0;
379
+ let filesSkippedCount = 0;
380
+ let backupPath;
381
+ try {
382
+ // Validate source exists
383
+ try {
384
+ await fs.access(options.source);
385
+ }
386
+ catch {
387
+ throw new Error(`Source path does not exist: ${options.source}`);
388
+ }
389
+ // Create backup if requested
390
+ if (options.backup && !options.dryRun) {
391
+ backupPath = await this.createBackup(options.source, migrationId);
392
+ }
393
+ // Get list of files to migrate
394
+ const sourceFiles = await this.listFilesRecursive(options.source);
395
+ // Filter out framework and registry directories (shouldn't be in legacy workspace)
396
+ const filesToMigrate = sourceFiles.filter((filePath) => {
397
+ const normalizedPath = filePath.replace(/\\/g, '/');
398
+ return !normalizedPath.startsWith('frameworks/') &&
399
+ normalizedPath !== 'frameworks' &&
400
+ !normalizedPath.startsWith('backups/') &&
401
+ normalizedPath !== 'backups';
402
+ });
403
+ // Dry-run mode: simulate without actual changes
404
+ if (options.dryRun) {
405
+ for (const relPath of filesToMigrate) {
406
+ const targetPath = path.join(options.target, relPath);
407
+ try {
408
+ await fs.access(targetPath);
409
+ if (options.overwrite) {
410
+ filesCopiedCount++;
411
+ }
412
+ else {
413
+ filesSkippedCount++;
414
+ }
415
+ }
416
+ catch {
417
+ filesCopiedCount++;
418
+ }
419
+ }
420
+ }
421
+ else {
422
+ // Actual migration
423
+ // Create target directory
424
+ await fs.mkdir(options.target, { recursive: true });
425
+ // Migrate each file
426
+ for (const relPath of filesToMigrate) {
427
+ const sourcePath = path.join(options.source, relPath);
428
+ const targetPath = path.join(options.target, relPath);
429
+ try {
430
+ // Check if target exists
431
+ let targetExists = false;
432
+ try {
433
+ await fs.access(targetPath);
434
+ targetExists = true;
435
+ }
436
+ catch {
437
+ // Target doesn't exist
438
+ }
439
+ if (targetExists && !options.overwrite) {
440
+ filesSkippedCount++;
441
+ errors.push({
442
+ path: relPath,
443
+ error: 'Target file exists, skipped (overwrite=false)',
444
+ severity: 'warning'
445
+ });
446
+ continue;
447
+ }
448
+ // Create target directory
449
+ const targetDir = path.dirname(targetPath);
450
+ await fs.mkdir(targetDir, { recursive: true });
451
+ // Copy file
452
+ await fs.copyFile(sourcePath, targetPath);
453
+ filesCopiedCount++;
454
+ }
455
+ catch (error) {
456
+ errors.push({
457
+ path: relPath,
458
+ error: error.message,
459
+ severity: 'error'
460
+ });
461
+ }
462
+ }
463
+ const copyErrors = errors.filter(error => error.severity === 'error');
464
+ if (copyErrors.length > 0) {
465
+ throw new Error(`Failed to copy ${copyErrors.length} migration file(s)`);
466
+ }
467
+ // Update registry. A registry failure is fatal because a copied
468
+ // workspace without matching registry state is only partially migrated.
469
+ await this.updateRegistry(options.framework, migrationId);
470
+ }
471
+ const duration = Date.now() - startTime;
472
+ return {
473
+ id: migrationId,
474
+ success: !errors.some(e => e.severity === 'error' || e.severity === 'critical'),
475
+ filesMovedCount,
476
+ filesCopiedCount,
477
+ filesSkippedCount,
478
+ errors,
479
+ duration,
480
+ backupPath
481
+ };
482
+ }
483
+ catch (error) {
484
+ const duration = Date.now() - startTime;
485
+ if (backupPath) {
486
+ try {
487
+ await this.restoreBackup(backupPath);
488
+ }
489
+ catch (rollbackError) {
490
+ errors.push({
491
+ path: backupPath,
492
+ error: `Automatic rollback failed: ${rollbackError.message}`,
493
+ severity: 'critical'
494
+ });
495
+ }
496
+ }
497
+ return {
498
+ id: migrationId,
499
+ success: false,
500
+ filesMovedCount,
501
+ filesCopiedCount,
502
+ filesSkippedCount,
503
+ errors: [
504
+ ...errors,
505
+ {
506
+ path: options.source,
507
+ error: error.message,
508
+ severity: 'critical'
509
+ }
510
+ ],
511
+ duration,
512
+ backupPath
513
+ };
514
+ }
515
+ }
516
+ /**
517
+ * Rollback migration
518
+ *
519
+ * Restores workspace from backup created during migration.
520
+ *
521
+ * @param migrationId - Migration ID to rollback
522
+ */
523
+ async rollback(migrationId) {
524
+ const externalBackupPath = `${this.sandboxPath}.backup.${migrationId}`;
525
+ const legacyInternalBackupPath = path.join(this.sandboxPath, 'backups', migrationId);
526
+ let backupPath = externalBackupPath;
527
+ try {
528
+ await fs.access(backupPath);
529
+ }
530
+ catch {
531
+ try {
532
+ await fs.access(legacyInternalBackupPath);
533
+ // Preserve legacy internal backups outside .aiwg before replacing the
534
+ // workspace that currently contains them.
535
+ await fs.rm(externalBackupPath, { recursive: true, force: true });
536
+ await fs.cp(legacyInternalBackupPath, externalBackupPath, { recursive: true });
537
+ backupPath = externalBackupPath;
538
+ }
539
+ catch {
540
+ throw new Error(`Backup not found for migration ID: ${migrationId}`);
541
+ }
542
+ }
543
+ await this.restoreBackup(backupPath);
544
+ }
545
+ // ===========================
546
+ // Reporting Methods
547
+ // ===========================
548
+ /**
549
+ * Generate migration report
550
+ *
551
+ * Creates human-readable migration report with statistics and errors.
552
+ *
553
+ * @param result - Migration result
554
+ * @returns Formatted report string
555
+ */
556
+ generateReport(result) {
557
+ const lines = [];
558
+ lines.push('Migration Report');
559
+ lines.push('='.repeat(80));
560
+ lines.push('');
561
+ lines.push(`Migration ID: ${result.id}`);
562
+ lines.push(`Status: ${result.success ? '✓ SUCCESS' : '❌ FAILED'}`);
563
+ lines.push(`Duration: ${result.duration}ms`);
564
+ lines.push('');
565
+ lines.push('Statistics:');
566
+ lines.push(` Files Moved: ${result.filesMovedCount}`);
567
+ lines.push(` Files Copied: ${result.filesCopiedCount}`);
568
+ lines.push(` Files Skipped: ${result.filesSkippedCount}`);
569
+ lines.push('');
570
+ if (result.backupPath) {
571
+ lines.push(`Backup Created: ${result.backupPath}`);
572
+ lines.push('');
573
+ }
574
+ if (result.errors.length > 0) {
575
+ lines.push('Errors:');
576
+ result.errors.forEach((error, index) => {
577
+ const icon = error.severity === 'critical' ? '❌' :
578
+ error.severity === 'error' ? '⚠️' : 'ℹ️';
579
+ lines.push(` ${index + 1}. ${icon} [${error.severity.toUpperCase()}] ${error.path}`);
580
+ lines.push(` ${error.error}`);
581
+ });
582
+ }
583
+ else {
584
+ lines.push('No errors encountered.');
585
+ }
586
+ return lines.join('\n');
587
+ }
588
+ // ===========================
589
+ // Helper Methods
590
+ // ===========================
591
+ /**
592
+ * Get directory information (file count and size)
593
+ */
594
+ async getDirectoryInfo(dirPath) {
595
+ let fileCount = 0;
596
+ let size = 0;
597
+ try {
598
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
599
+ for (const entry of entries) {
600
+ const fullPath = path.join(dirPath, entry.name);
601
+ if (entry.isDirectory()) {
602
+ const subInfo = await this.getDirectoryInfo(fullPath);
603
+ fileCount += subInfo.fileCount;
604
+ size += subInfo.size;
605
+ }
606
+ else {
607
+ fileCount++;
608
+ const stat = await fs.stat(fullPath);
609
+ size += stat.size;
610
+ }
611
+ }
612
+ }
613
+ catch {
614
+ // Permission denied or doesn't exist
615
+ }
616
+ return { fileCount, size };
617
+ }
618
+ /**
619
+ * Check if directory has git repository
620
+ */
621
+ async hasGitRepo(dirPath) {
622
+ const gitPath = path.join(dirPath, '.git');
623
+ try {
624
+ await fs.access(gitPath);
625
+ return true;
626
+ }
627
+ catch {
628
+ return false;
629
+ }
630
+ }
631
+ /**
632
+ * List all files recursively
633
+ */
634
+ async listFilesRecursive(dirPath) {
635
+ const files = [];
636
+ const walk = async (currentPath, relativePath = '') => {
637
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
638
+ for (const entry of entries) {
639
+ const fullPath = path.join(currentPath, entry.name);
640
+ const relPath = path.join(relativePath, entry.name);
641
+ if (entry.isDirectory()) {
642
+ await walk(fullPath, relPath);
643
+ }
644
+ else {
645
+ files.push(relPath);
646
+ }
647
+ }
648
+ };
649
+ await walk(dirPath);
650
+ return files;
651
+ }
652
+ /**
653
+ * Check permissions for all files in directory
654
+ */
655
+ async checkPermissions(dirPath) {
656
+ const issues = [];
657
+ const walk = async (currentPath, relativePath = '') => {
658
+ try {
659
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
660
+ for (const entry of entries) {
661
+ const fullPath = path.join(currentPath, entry.name);
662
+ const relPath = path.join(relativePath, entry.name);
663
+ try {
664
+ await fs.access(fullPath, fs.constants.R_OK);
665
+ }
666
+ catch {
667
+ issues.push(relPath);
668
+ }
669
+ if (entry.isDirectory()) {
670
+ await walk(fullPath, relPath);
671
+ }
672
+ }
673
+ }
674
+ catch {
675
+ issues.push(relativePath);
676
+ }
677
+ };
678
+ await walk(dirPath);
679
+ return issues;
680
+ }
681
+ /**
682
+ * Create backup of workspace
683
+ */
684
+ async createBackup(sourcePath, migrationId) {
685
+ const backupPath = `${sourcePath}.backup.${migrationId}`;
686
+ const files = await this.listFilesRecursive(sourcePath);
687
+ await fs.mkdir(backupPath, { recursive: true });
688
+ for (const relPath of files) {
689
+ const source = path.join(sourcePath, relPath);
690
+ const target = path.join(backupPath, relPath);
691
+ // Create target directory
692
+ const targetDir = path.dirname(target);
693
+ await fs.mkdir(targetDir, { recursive: true });
694
+ // Copy file
695
+ await fs.copyFile(source, target);
696
+ }
697
+ const sourceInfo = await this.getDirectoryInfo(sourcePath);
698
+ const manifest = {
699
+ timestamp: new Date().toISOString(),
700
+ sourcePath,
701
+ backupPath,
702
+ checksum: await this.computeDirectoryChecksum(backupPath),
703
+ fileCount: files.length,
704
+ totalSize: sourceInfo.size,
705
+ migrationId
706
+ };
707
+ await fs.writeFile(path.join(backupPath, 'migration-manifest.json'), JSON.stringify(manifest, null, 2));
708
+ return backupPath;
709
+ }
710
+ /**
711
+ * Replace the current workspace with a preserved backup.
712
+ */
713
+ async restoreBackup(backupPath) {
714
+ const files = (await this.listFilesRecursive(backupPath))
715
+ .filter(relPath => relPath.replace(/\\/g, '/') !== 'migration-manifest.json');
716
+ await fs.rm(this.sandboxPath, { recursive: true, force: true });
717
+ await fs.mkdir(this.sandboxPath, { recursive: true });
718
+ for (const relPath of files) {
719
+ const sourcePath = path.join(backupPath, relPath);
720
+ const targetPath = path.join(this.sandboxPath, relPath);
721
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
722
+ await fs.copyFile(sourcePath, targetPath);
723
+ }
724
+ }
725
+ /**
726
+ * Compute a stable content checksum, excluding backup metadata.
727
+ */
728
+ async computeDirectoryChecksum(directory) {
729
+ const files = (await this.listFilesRecursive(directory))
730
+ .filter(relPath => relPath.replace(/\\/g, '/') !== 'migration-manifest.json')
731
+ .sort();
732
+ const hash = crypto.createHash('sha256');
733
+ for (const relPath of files) {
734
+ hash.update(await fs.readFile(path.join(directory, relPath)));
735
+ }
736
+ return hash.digest('hex');
737
+ }
738
+ /**
739
+ * Update framework registry after migration
740
+ */
741
+ async updateRegistry(frameworkId, migrationId) {
742
+ const registryPath = path.join(this.sandboxPath, 'frameworks', 'registry.json');
743
+ // Load or create registry. Malformed existing state must fail the
744
+ // migration so the caller can restore the backup atomically.
745
+ let registry;
746
+ try {
747
+ const content = await fs.readFile(registryPath, 'utf-8');
748
+ const parsed = JSON.parse(content);
749
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
750
+ throw new Error('registry root must be an object');
751
+ }
752
+ registry = parsed;
753
+ if (registry.plugins === undefined) {
754
+ registry.plugins = [];
755
+ }
756
+ else if (!Array.isArray(registry.plugins)) {
757
+ throw new Error('registry.plugins must be an array');
758
+ }
759
+ registry.version = typeof registry.version === 'string' ? registry.version : '1.0.0';
760
+ registry.lastModified = typeof registry.lastModified === 'string'
761
+ ? registry.lastModified
762
+ : new Date().toISOString();
763
+ }
764
+ catch (error) {
765
+ if (error?.code !== 'ENOENT') {
766
+ throw new Error(`Failed to load registry: ${error.message}`);
767
+ }
768
+ registry = {
769
+ version: '1.0.0',
770
+ lastModified: new Date().toISOString(),
771
+ plugins: []
772
+ };
773
+ }
774
+ // Check if framework already exists
775
+ const existingIndex = registry.plugins.findIndex(p => p.id === frameworkId);
776
+ const pluginEntry = {
777
+ id: frameworkId,
778
+ type: 'framework',
779
+ name: frameworkId.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
780
+ version: '1.0.0',
781
+ path: `frameworks/${frameworkId}`,
782
+ installedAt: new Date().toISOString(),
783
+ projects: ['default'],
784
+ health: {
785
+ status: 'healthy',
786
+ lastCheck: new Date().toISOString()
787
+ },
788
+ metadata: {
789
+ migrationId,
790
+ migratedAt: new Date().toISOString()
791
+ }
792
+ };
793
+ if (existingIndex >= 0) {
794
+ // Update existing entry
795
+ registry.plugins[existingIndex] = {
796
+ ...registry.plugins[existingIndex],
797
+ ...pluginEntry,
798
+ installedAt: registry.plugins[existingIndex].installedAt // Preserve original install date
799
+ };
800
+ }
801
+ else {
802
+ // Add new entry
803
+ registry.plugins.push(pluginEntry);
804
+ }
805
+ registry.lastModified = new Date().toISOString();
806
+ // Ensure directory exists
807
+ await fs.mkdir(path.dirname(registryPath), { recursive: true });
808
+ // Write registry
809
+ await fs.writeFile(registryPath, JSON.stringify(registry, null, 2));
810
+ console.debug(`[WorkspaceMigrator] Registry updated for framework: ${frameworkId}, migration: ${migrationId}`);
811
+ }
812
+ /**
813
+ * Generate unique migration ID
814
+ */
815
+ generateMigrationId() {
816
+ const timestamp = Date.now();
817
+ const random = crypto.randomBytes(4).toString('hex');
818
+ return `migration-${timestamp}-${random}`;
819
+ }
820
+ }
821
+ //# sourceMappingURL=workspace-migrator.js.map