@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,112 @@
1
+ /**
2
+ * Artifact Index Reader
3
+ *
4
+ * Shared utility to load .aiwg/.index/ JSON files.
5
+ * Used by query, deps, and stats commands.
6
+ *
7
+ * @implements #420
8
+ * @source @src/artifacts/types.ts
9
+ * @tests @test/unit/artifacts/index-reader.test.ts
10
+ */
11
+ import fs from 'fs';
12
+ import path from 'path';
13
+ import { getGraphIndexDir, getProjectIndexRoot } from './types.js';
14
+ /**
15
+ * Load a JSON file from the index directory
16
+ *
17
+ * @param cwd - Project root directory
18
+ * @param filename - JSON file to load (e.g. 'metadata.json')
19
+ * @returns Parsed JSON or null if file doesn't exist or is corrupt
20
+ */
21
+ export function loadIndexFile(cwd, filename) {
22
+ const filePath = path.join(getProjectIndexRoot(cwd), filename);
23
+ if (!fs.existsSync(filePath)) {
24
+ return null;
25
+ }
26
+ try {
27
+ const content = fs.readFileSync(filePath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /**
35
+ * Load the master metadata index
36
+ */
37
+ export function loadMetadataIndex(cwd) {
38
+ return loadIndexFile(cwd, 'metadata.json');
39
+ }
40
+ /**
41
+ * Load the tag reverse index
42
+ */
43
+ export function loadTagIndex(cwd) {
44
+ return loadIndexFile(cwd, 'tags.json');
45
+ }
46
+ /**
47
+ * Load the dependency graph
48
+ */
49
+ export function loadDependencyGraph(cwd) {
50
+ return loadIndexFile(cwd, 'dependencies.json');
51
+ }
52
+ /**
53
+ * Load the index statistics
54
+ */
55
+ export function loadIndexStats(cwd) {
56
+ return loadIndexFile(cwd, 'stats.json');
57
+ }
58
+ /**
59
+ * Check if an index exists
60
+ */
61
+ export function indexExists(cwd) {
62
+ const metadataPath = path.join(getProjectIndexRoot(cwd), 'metadata.json');
63
+ return fs.existsSync(metadataPath);
64
+ }
65
+ /**
66
+ * Write a JSON file to the index directory atomically
67
+ *
68
+ * Uses write-to-temp + rename for POSIX-safe atomic writes.
69
+ *
70
+ * @param cwd - Project root directory
71
+ * @param filename - JSON file to write
72
+ * @param data - Data to serialize
73
+ * @param indexDir - Override index directory (for multi-graph support)
74
+ */
75
+ export function writeIndexFile(cwd, filename, data, indexDir) {
76
+ const dirPath = indexDir ?? getProjectIndexRoot(cwd);
77
+ const filePath = path.join(dirPath, filename);
78
+ const tmpPath = `${filePath}.tmp`;
79
+ // Ensure directory exists
80
+ fs.mkdirSync(dirPath, { recursive: true });
81
+ // Write to temp, then rename (atomic on POSIX)
82
+ fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');
83
+ fs.renameSync(tmpPath, filePath);
84
+ }
85
+ /**
86
+ * Resolve the index directory for a graph type
87
+ *
88
+ * @param cwd - Project root directory
89
+ * @param graph - Graph type (undefined = default .aiwg/.index/)
90
+ * @returns Absolute path to the index directory
91
+ */
92
+ export function resolveIndexDir(cwd, graph) {
93
+ if (graph)
94
+ return getGraphIndexDir(cwd, graph);
95
+ return getProjectIndexRoot(cwd);
96
+ }
97
+ /**
98
+ * Load a JSON file from a graph-specific index directory
99
+ */
100
+ export function loadGraphIndexFile(cwd, filename, graph) {
101
+ const dir = resolveIndexDir(cwd, graph);
102
+ const filePath = path.join(dir, filename);
103
+ if (!fs.existsSync(filePath))
104
+ return null;
105
+ try {
106
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ //# sourceMappingURL=index-reader.js.map
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Index-graph registry status + drift surface (#1624).
3
+ *
4
+ * The durable index-graph registry already exists — built-in graphs, module-
5
+ * declared graphs (framework/addon `manifest.json` → `index.graphs`), and
6
+ * operator graphs (`.aiwg/aiwg.config` → `index.graphs`) all compose into
7
+ * `GRAPH_CONFIGS`. But there was no reliable way to answer "which durable
8
+ * indices exist, are they built, are they fresh, and is anything drifting?"
9
+ * `aiwg index stats` is per-graph; nothing enumerated the whole registry.
10
+ *
11
+ * This module is that surface. `collectIndexStatus` is a pure-ish reader (no
12
+ * mutation beyond the unavoidable `loadUserGraphConfigs` registry population)
13
+ * that both `aiwg index status` and the `aiwg doctor` durable-index check
14
+ * consume. `showIndexStatus` renders it (human table or JSON).
15
+ *
16
+ * @implements #1624
17
+ * @source @src/cli/handlers/subcommands.ts
18
+ */
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import { GRAPH_CONFIGS, BUILTIN_GRAPH_CONFIGS, getGraphIndexDir, getProjectIndexRoot, loadGlobalGraphConfigs, loadUserGraphConfigs, } from './types.js';
22
+ import { getFortemiCoreSyncStatus, } from './fortemi-core-sync.js';
23
+ function readBuiltMeta(indexDir) {
24
+ try {
25
+ const metaPath = path.join(indexDir, 'metadata.json');
26
+ if (!fs.existsSync(metaPath))
27
+ return { builtAt: null, entries: null };
28
+ const idx = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
29
+ return {
30
+ builtAt: typeof idx.builtAt === 'string' ? idx.builtAt : null,
31
+ entries: idx.entries ? Object.keys(idx.entries).length : 0,
32
+ };
33
+ }
34
+ catch {
35
+ return { builtAt: null, entries: null };
36
+ }
37
+ }
38
+ /**
39
+ * Enumerate every registered graph (built-in + module + operator) with its
40
+ * build state, freshness, and drift, plus on-disk orphan index dirs and any
41
+ * non-silent config-load warnings.
42
+ *
43
+ * @param nowMs - injectable clock for deterministic tests (defaults to Date.now()).
44
+ */
45
+ export function collectIndexStatus(cwd, nowMs) {
46
+ // Populate the registry from module + operator config, collecting warnings
47
+ // instead of letting malformed defs vanish (#1624).
48
+ const warnings = [];
49
+ loadUserGraphConfigs(cwd, warnings);
50
+ loadGlobalGraphConfigs(warnings);
51
+ const now = nowMs ?? Date.now();
52
+ const graphs = [];
53
+ for (const [name, config] of Object.entries(GRAPH_CONFIGS)) {
54
+ const location = getGraphIndexDir(cwd, name);
55
+ const { builtAt, entries } = readBuiltMeta(location);
56
+ const built = builtAt !== null || entries !== null;
57
+ let ageHours = null;
58
+ if (builtAt) {
59
+ const t = Date.parse(builtAt);
60
+ if (!Number.isNaN(t))
61
+ ageHours = Math.round((now - t) / 3_600_000);
62
+ }
63
+ graphs.push({
64
+ name,
65
+ origin: name in BUILTIN_GRAPH_CONFIGS ? 'builtin' : 'registered',
66
+ shared: config.shared,
67
+ defaultBuild: config.defaultBuild,
68
+ location,
69
+ built,
70
+ builtAt,
71
+ ageHours,
72
+ entries,
73
+ // A graph that opts into default builds but has no index on disk is a
74
+ // missing durable index the operator probably expects to exist.
75
+ missing: config.defaultBuild && !built,
76
+ });
77
+ }
78
+ // On-disk drift: project-local index dirs (`.aiwg/.index/<name>`) that no
79
+ // registered graph claims. The framework graph lives in XDG, not here, so
80
+ // this scan is project-local by construction.
81
+ const reservedIndexDirs = new Set(['fortemi-core']);
82
+ const registeredNames = new Set(Object.keys(GRAPH_CONFIGS));
83
+ const orphanIndexDirs = [];
84
+ const projectIndexRoot = getProjectIndexRoot(cwd);
85
+ try {
86
+ for (const d of fs.readdirSync(projectIndexRoot, { withFileTypes: true })) {
87
+ if (d.isDirectory() &&
88
+ !registeredNames.has(d.name) &&
89
+ !reservedIndexDirs.has(d.name)) {
90
+ orphanIndexDirs.push(path.join(projectIndexRoot, d.name));
91
+ }
92
+ }
93
+ }
94
+ catch {
95
+ // No project index root yet — not drift.
96
+ }
97
+ const missing = graphs.filter((g) => g.missing).length;
98
+ const built = graphs.filter((g) => g.built).length;
99
+ return {
100
+ graphs,
101
+ orphanIndexDirs,
102
+ warnings,
103
+ fortemiCore: getFortemiCoreSyncStatus(cwd),
104
+ summary: {
105
+ total: graphs.length,
106
+ built,
107
+ missing,
108
+ orphans: orphanIndexDirs.length,
109
+ warnings: warnings.length,
110
+ },
111
+ };
112
+ }
113
+ /** Render `aiwg index status` (human table or JSON). */
114
+ export async function showIndexStatus(cwd, opts = {}) {
115
+ const report = collectIndexStatus(cwd);
116
+ if (opts.json) {
117
+ console.log(JSON.stringify(report, null, 2));
118
+ return;
119
+ }
120
+ console.log('Index-graph registry status');
121
+ console.log('');
122
+ const rows = report.graphs
123
+ .slice()
124
+ .sort((a, b) => a.origin === b.origin
125
+ ? a.name.localeCompare(b.name)
126
+ : a.origin === 'builtin'
127
+ ? -1
128
+ : 1);
129
+ // Column header.
130
+ console.log(' ' +
131
+ 'GRAPH'.padEnd(22) +
132
+ 'ORIGIN'.padEnd(12) +
133
+ 'STATE'.padEnd(10) +
134
+ 'ENTRIES'.padEnd(9) +
135
+ 'AGE'.padEnd(10) +
136
+ 'LOCATION');
137
+ for (const g of rows) {
138
+ const state = g.built ? 'built' : g.missing ? 'MISSING' : 'unbuilt';
139
+ const age = g.ageHours === null
140
+ ? '—'
141
+ : g.ageHours < 48
142
+ ? `${g.ageHours}h`
143
+ : `${Math.round(g.ageHours / 24)}d`;
144
+ console.log(' ' +
145
+ g.name.padEnd(22) +
146
+ g.origin.padEnd(12) +
147
+ state.padEnd(10) +
148
+ String(g.entries ?? '—').padEnd(9) +
149
+ age.padEnd(10) +
150
+ shortenPath(g.location, cwd));
151
+ }
152
+ if (report.orphanIndexDirs.length > 0) {
153
+ console.log('');
154
+ console.log(`⚠ Drift — ${report.orphanIndexDirs.length} on-disk index dir(s) match no registered graph:`);
155
+ for (const d of report.orphanIndexDirs)
156
+ console.log(` ${shortenPath(d, cwd)}`);
157
+ console.log(' (remove the dir, or register the graph under index.graphs in .aiwg/aiwg.config)');
158
+ }
159
+ if (report.warnings.length > 0) {
160
+ console.log('');
161
+ console.log(`⚠ ${report.warnings.length} graph-config warning(s) — these were previously dropped silently (#1624):`);
162
+ for (const w of report.warnings)
163
+ console.log(` [${w.source}] ${w.graph}: ${w.reason}`);
164
+ }
165
+ if (report.fortemiCore.optedIn) {
166
+ console.log('');
167
+ const state = report.fortemiCore.built
168
+ ? report.fortemiCore.stale
169
+ ? 'STALE'
170
+ : 'built'
171
+ : 'MISSING';
172
+ console.log(`Fortemi Core static index: ${state} (${report.fortemiCore.itemCount ?? 0} item(s)) → ${shortenPath(report.fortemiCore.location, cwd)}`);
173
+ if (report.fortemiCore.reason)
174
+ console.log(` ${report.fortemiCore.reason}`);
175
+ }
176
+ const { missing } = report.summary;
177
+ if (missing > 0) {
178
+ console.log('');
179
+ console.log(`⚠ ${missing} registered durable index(es) are not built. Run \`aiwg index build --all\`.`);
180
+ }
181
+ console.log('');
182
+ console.log(`${report.summary.total} graph(s): ${report.summary.built} built, ${missing} missing, ` +
183
+ `${report.summary.orphans} orphan(s), ${report.summary.warnings} warning(s).`);
184
+ }
185
+ function shortenPath(p, cwd) {
186
+ if (p.startsWith(cwd + path.sep))
187
+ return '.' + p.slice(cwd.length);
188
+ const home = process.env.HOME;
189
+ if (home && p.startsWith(home + path.sep))
190
+ return '~' + p.slice(home.length);
191
+ return p;
192
+ }
193
+ //# sourceMappingURL=index-status.js.map
@@ -0,0 +1,169 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { createHash } from 'node:crypto';
5
+ import { INDEX_VERSION, getGraphIndexDir, getProjectIndexRoot } from './types.js';
6
+ import { syncFortemiCoreIndex } from './fortemi-core-sync.js';
7
+ const INDEX_FILES = ['metadata.json', 'tags.json', 'dependencies.json', 'stats.json'];
8
+ function sha256File(filePath) {
9
+ if (!fs.existsSync(filePath))
10
+ return null;
11
+ return createHash('sha256').update(fs.readFileSync(filePath)).digest('hex');
12
+ }
13
+ function readJson(filePath) {
14
+ try {
15
+ return { value: JSON.parse(fs.readFileSync(filePath, 'utf-8')), reason: null };
16
+ }
17
+ catch (err) {
18
+ return {
19
+ value: null,
20
+ reason: err instanceof Error ? err.message : String(err),
21
+ };
22
+ }
23
+ }
24
+ function resolveHome(options) {
25
+ return options.homeDir ?? process.env.AIWG_HOME ?? os.homedir();
26
+ }
27
+ function resolveXdgData(options) {
28
+ return options.xdgDataHome ?? process.env.XDG_DATA_HOME ?? path.join(resolveHome(options), '.local', 'share');
29
+ }
30
+ function scopePaths(cwd, scope, options) {
31
+ switch (scope) {
32
+ case 'project':
33
+ return {
34
+ sourceDir: getProjectIndexRoot(cwd),
35
+ destinationDir: getGraphIndexDir(cwd, 'project'),
36
+ syncRoot: cwd,
37
+ graph: 'project',
38
+ };
39
+ case 'user': {
40
+ const home = resolveHome(options);
41
+ return {
42
+ sourceDir: path.join(home, '.aiwg', '.index'),
43
+ destinationDir: path.join(home, '.aiwg', '.index', 'user'),
44
+ syncRoot: null,
45
+ graph: 'user',
46
+ };
47
+ }
48
+ case 'global': {
49
+ const xdg = resolveXdgData(options);
50
+ return {
51
+ sourceDir: path.join(xdg, 'aiwg', 'index'),
52
+ destinationDir: path.join(xdg, 'aiwg', 'index', 'global'),
53
+ syncRoot: null,
54
+ graph: 'global',
55
+ };
56
+ }
57
+ }
58
+ }
59
+ function validateLegacyMetadata(sourceDir) {
60
+ const metadataPath = path.join(sourceDir, 'metadata.json');
61
+ if (!fs.existsSync(metadataPath)) {
62
+ return { index: null, reason: 'metadata.json not found' };
63
+ }
64
+ const parsed = readJson(metadataPath);
65
+ if (!parsed.value) {
66
+ return { index: null, reason: `metadata.json is unreadable: ${parsed.reason}` };
67
+ }
68
+ if (parsed.value.version !== INDEX_VERSION) {
69
+ return {
70
+ index: null,
71
+ reason: `metadata.json schema version ${String(parsed.value.version ?? 'missing')} is not compatible with ${INDEX_VERSION}`,
72
+ };
73
+ }
74
+ if (!parsed.value.entries || typeof parsed.value.entries !== 'object' || Array.isArray(parsed.value.entries)) {
75
+ return { index: null, reason: 'metadata.json entries must be an object' };
76
+ }
77
+ return { index: parsed.value, reason: null };
78
+ }
79
+ function migrateOneScope(cwd, scope, options) {
80
+ const { sourceDir, destinationDir, syncRoot, graph } = scopePaths(cwd, scope, options);
81
+ const baseResult = {
82
+ scope,
83
+ sourceDir,
84
+ destinationDir,
85
+ status: 'skipped',
86
+ files: [],
87
+ entries: null,
88
+ reason: null,
89
+ fortemiCore: null,
90
+ };
91
+ if (!fs.existsSync(sourceDir)) {
92
+ return { ...baseResult, reason: 'legacy index directory not found' };
93
+ }
94
+ if (path.resolve(sourceDir) === path.resolve(destinationDir)) {
95
+ return {
96
+ ...baseResult,
97
+ reason: 'source and destination are the same directory; no migration needed',
98
+ };
99
+ }
100
+ const validation = validateLegacyMetadata(sourceDir);
101
+ if (!validation.index) {
102
+ return {
103
+ ...baseResult,
104
+ status: 'needs-rebuild',
105
+ reason: validation.reason,
106
+ };
107
+ }
108
+ let changed = false;
109
+ let anyCreated = false;
110
+ for (const name of INDEX_FILES) {
111
+ const sourcePath = path.join(sourceDir, name);
112
+ const destinationPath = path.join(destinationDir, name);
113
+ if (!fs.existsSync(sourcePath)) {
114
+ baseResult.files.push({ name, status: 'skipped' });
115
+ continue;
116
+ }
117
+ const sourceHash = sha256File(sourcePath);
118
+ const destinationHash = sha256File(destinationPath);
119
+ const exists = destinationHash !== null;
120
+ const same = sourceHash !== null && sourceHash === destinationHash;
121
+ const status = same ? 'unchanged' : exists ? 'updated' : 'created';
122
+ baseResult.files.push({ name, status });
123
+ if (!same) {
124
+ changed = true;
125
+ if (!exists)
126
+ anyCreated = true;
127
+ if (!options.dryRun) {
128
+ fs.mkdirSync(destinationDir, { recursive: true });
129
+ fs.copyFileSync(sourcePath, destinationPath);
130
+ }
131
+ }
132
+ }
133
+ baseResult.entries = Object.keys(validation.index.entries).length;
134
+ baseResult.status = changed ? (anyCreated ? 'created' : 'updated') : 'unchanged';
135
+ if (!options.dryRun && options.syncFortemi !== false && syncRoot) {
136
+ const manifest = syncFortemiCoreIndex(syncRoot, {
137
+ graph,
138
+ generatedAt: options.generatedAt,
139
+ });
140
+ baseResult.fortemiCore = {
141
+ status: manifest.status,
142
+ exportPath: manifest.export_path,
143
+ itemCount: manifest.item_count,
144
+ };
145
+ }
146
+ return baseResult;
147
+ }
148
+ function defaultReportPath(cwd) {
149
+ return path.join(getProjectIndexRoot(cwd), 'migrations', 'legacy-index-migration.json');
150
+ }
151
+ export function migrateLegacyIndex(cwd, options = {}) {
152
+ const generatedAt = options.generatedAt ?? new Date().toISOString();
153
+ const scopes = options.scopes?.length ? options.scopes : ['project'];
154
+ const results = scopes.map((scope) => migrateOneScope(cwd, scope, { ...options, generatedAt }));
155
+ const report = {
156
+ schemaVersion: 'aiwg.legacy-index-migration.v1',
157
+ dryRun: options.dryRun === true,
158
+ generatedAt,
159
+ results,
160
+ reportPath: options.dryRun ? null : defaultReportPath(cwd),
161
+ };
162
+ if (!options.dryRun) {
163
+ const reportPath = defaultReportPath(cwd);
164
+ fs.mkdirSync(path.dirname(reportPath), { recursive: true });
165
+ fs.writeFileSync(reportPath, JSON.stringify(report, null, 2) + '\n', 'utf-8');
166
+ }
167
+ return report;
168
+ }
169
+ //# sourceMappingURL=legacy-index-migration.js.map
@@ -0,0 +1,154 @@
1
+ import { access, cp, mkdir, readFile, readdir, rename, rm, rmdir, stat, writeFile } from 'node:fs/promises';
2
+ import { existsSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { buildIndex } from './index-builder.js';
5
+ import { syncFortemiCoreIndex } from './fortemi-core-sync.js';
6
+ import { PROJECT_AIWG_LOCATION_FILE, expandProjectArtifactPath, resolveProjectAiwgDir, } from '../config/project-artifacts.js';
7
+ const GITIGNORE_BLOCK = [
8
+ '',
9
+ '# AIWG artifact root pointer (local/private path)',
10
+ PROJECT_AIWG_LOCATION_FILE,
11
+ '',
12
+ ].join('\n');
13
+ async function exists(filePath) {
14
+ try {
15
+ await access(filePath);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ function samePath(left, right) {
23
+ return path.resolve(left) === path.resolve(right);
24
+ }
25
+ async function isEmptyDirectory(dir) {
26
+ try {
27
+ const info = await stat(dir);
28
+ if (!info.isDirectory())
29
+ return false;
30
+ const entries = await readdir(dir);
31
+ return entries.length === 0;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ function pointerValueFor(projectDir, destination) {
38
+ const relative = path.relative(projectDir, destination).split(path.sep).join('/');
39
+ return relative.length > 0 ? relative : '.';
40
+ }
41
+ async function ensureGitignorePointer(projectDir, dryRun) {
42
+ const gitignorePath = path.join(projectDir, '.gitignore');
43
+ let current = '';
44
+ try {
45
+ current = await readFile(gitignorePath, 'utf-8');
46
+ }
47
+ catch (error) {
48
+ if (error.code !== 'ENOENT')
49
+ throw error;
50
+ }
51
+ const lines = current.split(/\r?\n/).map(line => line.trim());
52
+ if (lines.includes(PROJECT_AIWG_LOCATION_FILE))
53
+ return false;
54
+ if (!dryRun) {
55
+ const separator = current.length === 0 || current.endsWith('\n') ? '' : '\n';
56
+ await writeFile(gitignorePath, `${current}${separator}${GITIGNORE_BLOCK}`, 'utf-8');
57
+ }
58
+ return true;
59
+ }
60
+ async function writePointer(projectDir, pointerValue, dryRun) {
61
+ const pointerPath = path.join(projectDir, PROJECT_AIWG_LOCATION_FILE);
62
+ if (!dryRun) {
63
+ await writeFile(pointerPath, [
64
+ '# AIWG artifact root.',
65
+ '# Generated by `aiwg artifacts move`; AIWG_ARTIFACTS_PATH overrides this file.',
66
+ pointerValue,
67
+ '',
68
+ ].join('\n'), 'utf-8');
69
+ }
70
+ return pointerPath;
71
+ }
72
+ async function moveDirectory(source, destination) {
73
+ const destinationExists = await exists(destination);
74
+ if (destinationExists) {
75
+ if (!(await isEmptyDirectory(destination))) {
76
+ throw new Error(`Destination already exists and is not empty: ${destination}`);
77
+ }
78
+ await rmdir(destination);
79
+ }
80
+ await mkdir(path.dirname(destination), { recursive: true });
81
+ try {
82
+ await rename(source, destination);
83
+ }
84
+ catch (error) {
85
+ if (error.code !== 'EXDEV')
86
+ throw error;
87
+ await cp(source, destination, { recursive: true, errorOnExist: true, force: false });
88
+ await rm(source, { recursive: true, force: false });
89
+ }
90
+ }
91
+ async function withTemporaryArtifactEnv(artifactDir, callback) {
92
+ const previous = process.env.AIWG_ARTIFACTS_PATH;
93
+ process.env.AIWG_ARTIFACTS_PATH = artifactDir;
94
+ try {
95
+ return await callback();
96
+ }
97
+ finally {
98
+ if (previous === undefined) {
99
+ delete process.env.AIWG_ARTIFACTS_PATH;
100
+ }
101
+ else {
102
+ process.env.AIWG_ARTIFACTS_PATH = previous;
103
+ }
104
+ }
105
+ }
106
+ export async function moveProjectArtifacts(options) {
107
+ const projectDir = path.resolve(options.projectDir);
108
+ const source = path.resolve(options.from ? expandProjectArtifactPath(options.from, projectDir) : resolveProjectAiwgDir(projectDir));
109
+ const destination = path.resolve(expandProjectArtifactPath(options.to, projectDir));
110
+ const dryRun = options.dryRun === true;
111
+ const reindex = options.reindex !== false;
112
+ const syncFortemi = options.syncFortemi !== false;
113
+ if (samePath(source, destination)) {
114
+ throw new Error(`Source and destination are the same directory: ${source}`);
115
+ }
116
+ if (!existsSync(source)) {
117
+ throw new Error(`Source AIWG artifact directory does not exist: ${source}`);
118
+ }
119
+ if (existsSync(destination) && !(await isEmptyDirectory(destination))) {
120
+ throw new Error(`Destination already exists and is not empty: ${destination}`);
121
+ }
122
+ const pointerValue = pointerValueFor(projectDir, destination);
123
+ const pointerPath = path.join(projectDir, PROJECT_AIWG_LOCATION_FILE);
124
+ const gitignoreUpdated = await ensureGitignorePointer(projectDir, dryRun);
125
+ if (!dryRun) {
126
+ await moveDirectory(source, destination);
127
+ }
128
+ await writePointer(projectDir, pointerValue, dryRun);
129
+ let reindexed = false;
130
+ let fortemiSynced = false;
131
+ if (reindex && !dryRun) {
132
+ await withTemporaryArtifactEnv(destination, async () => {
133
+ await buildIndex(projectDir, { force: true, graph: 'project' });
134
+ reindexed = true;
135
+ if (syncFortemi) {
136
+ syncFortemiCoreIndex(projectDir, { graph: 'project' });
137
+ fortemiSynced = true;
138
+ }
139
+ });
140
+ }
141
+ return {
142
+ projectDir,
143
+ from: source,
144
+ to: destination,
145
+ pointerPath,
146
+ pointerValue,
147
+ moved: !dryRun,
148
+ gitignoreUpdated,
149
+ reindexed,
150
+ fortemiSynced,
151
+ dryRun,
152
+ };
153
+ }
154
+ //# sourceMappingURL=move.js.map