@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17

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 (466) hide show
  1. package/README.md +21 -1
  2. package/bin/aiwg.mjs +349 -0
  3. package/dist/src/a2a/agent-card.js +145 -0
  4. package/dist/src/a2a/client.js +411 -0
  5. package/dist/src/a2a/hitl-cli.js +171 -0
  6. package/dist/src/a2a/hitl-driver.js +370 -0
  7. package/dist/src/a2a/hitl.js +181 -0
  8. package/dist/src/a2a/http.js +193 -0
  9. package/dist/src/a2a/jcs.js +128 -0
  10. package/dist/src/a2a/jws.js +187 -0
  11. package/dist/src/a2a/types.js +24 -0
  12. package/dist/src/a2a/webhook.js +240 -0
  13. package/dist/src/activity-log/cli.js +348 -0
  14. package/dist/src/activity-log/parser.js +81 -0
  15. package/dist/src/activity-log/types.js +50 -0
  16. package/dist/src/agents/agent-deployer.js +367 -0
  17. package/dist/src/agents/agent-packager.js +271 -0
  18. package/dist/src/agents/agent-validator.js +271 -0
  19. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  20. package/dist/src/agents/grounding/types.js +12 -0
  21. package/dist/src/agents/index.js +10 -0
  22. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  23. package/dist/src/agents/types.js +7 -0
  24. package/dist/src/api/index.d.ts +10 -0
  25. package/dist/src/api/index.js +10 -0
  26. package/dist/src/artifacts/address-parser.js +73 -0
  27. package/dist/src/artifacts/audit/cli.js +183 -0
  28. package/dist/src/artifacts/audit/drift.js +122 -0
  29. package/dist/src/artifacts/audit/types.js +12 -0
  30. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  31. package/dist/src/artifacts/backends/json-backend.js +129 -0
  32. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  33. package/dist/src/artifacts/browser-export.js +622 -0
  34. package/dist/src/artifacts/capability-resolver.js +94 -0
  35. package/dist/src/artifacts/checksum-manifest.js +91 -0
  36. package/dist/src/artifacts/citation-parser.js +162 -0
  37. package/dist/src/artifacts/cli.js +1462 -0
  38. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  39. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  40. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  41. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  42. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  43. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  44. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  45. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  46. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  47. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  48. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  49. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  51. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  52. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  53. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  54. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  55. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  56. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  57. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  58. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  60. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  61. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  62. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  63. package/dist/src/artifacts/corpus-views/build.js +126 -0
  64. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  65. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  66. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  67. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  68. package/dist/src/artifacts/dep-graph.js +173 -0
  69. package/dist/src/artifacts/discover-facets.js +375 -0
  70. package/dist/src/artifacts/embedding-index.js +354 -0
  71. package/dist/src/artifacts/enrichment/cli.js +240 -0
  72. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  73. package/dist/src/artifacts/enrichment/store.js +90 -0
  74. package/dist/src/artifacts/enrichment/types.js +12 -0
  75. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  76. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  77. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  78. package/dist/src/artifacts/fulltext.js +108 -0
  79. package/dist/src/artifacts/graph-backend.js +51 -0
  80. package/dist/src/artifacts/graph-query.js +247 -0
  81. package/dist/src/artifacts/hybrid-query.js +225 -0
  82. package/dist/src/artifacts/index-builder.js +1089 -0
  83. package/dist/src/artifacts/index-reader.js +112 -0
  84. package/dist/src/artifacts/index-status.js +193 -0
  85. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  86. package/dist/src/artifacts/move.js +154 -0
  87. package/dist/src/artifacts/operational-state.js +239 -0
  88. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  89. package/dist/src/artifacts/query-engine.js +1955 -0
  90. package/dist/src/artifacts/source-graph.js +529 -0
  91. package/dist/src/artifacts/stats.js +169 -0
  92. package/dist/src/artifacts/types.js +606 -0
  93. package/dist/src/artifacts/views/cli.js +293 -0
  94. package/dist/src/artifacts/views/definition.js +170 -0
  95. package/dist/src/artifacts/views/store.js +149 -0
  96. package/dist/src/artifacts/views/types.js +8 -0
  97. package/dist/src/artifacts/watcher.js +255 -0
  98. package/dist/src/catalog/builtin-models.json +636 -0
  99. package/dist/src/catalog/cli.js +228 -0
  100. package/dist/src/catalog/cli.mjs +289 -0
  101. package/dist/src/catalog/index.js +15 -0
  102. package/dist/src/catalog/loader.js +217 -0
  103. package/dist/src/catalog/loader.mjs +251 -0
  104. package/dist/src/catalog/sources.json +41 -0
  105. package/dist/src/catalog/types.js +8 -0
  106. package/dist/src/channel/manager.mjs +504 -0
  107. package/dist/src/cli/agent-spawn.js +178 -0
  108. package/dist/src/cli/cli-extension-loader.js +245 -0
  109. package/dist/src/cli/command-log.js +275 -0
  110. package/dist/src/cli/config-loader.js +232 -0
  111. package/dist/src/cli/env.js +82 -0
  112. package/dist/src/cli/errors.js +150 -0
  113. package/dist/src/cli/find-package-root.js +40 -0
  114. package/dist/src/cli/git-hooks.js +250 -0
  115. package/dist/src/cli/handlers/agentcard.js +206 -0
  116. package/dist/src/cli/handlers/artifacts.js +76 -0
  117. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  118. package/dist/src/cli/handlers/cockpit.js +137 -0
  119. package/dist/src/cli/handlers/command-log.js +37 -0
  120. package/dist/src/cli/handlers/daemon.js +59 -0
  121. package/dist/src/cli/handlers/diagnose.js +300 -0
  122. package/dist/src/cli/handlers/execution-mode.js +105 -0
  123. package/dist/src/cli/handlers/feedback.js +341 -0
  124. package/dist/src/cli/handlers/help.js +147 -0
  125. package/dist/src/cli/handlers/index.js +302 -0
  126. package/dist/src/cli/handlers/init.js +179 -0
  127. package/dist/src/cli/handlers/install.js +129 -0
  128. package/dist/src/cli/handlers/issues.js +46 -0
  129. package/dist/src/cli/handlers/lint.js +42 -0
  130. package/dist/src/cli/handlers/local-executor.js +315 -0
  131. package/dist/src/cli/handlers/marketplace.js +168 -0
  132. package/dist/src/cli/handlers/mc.js +1010 -0
  133. package/dist/src/cli/handlers/models.js +352 -0
  134. package/dist/src/cli/handlers/packages.js +155 -0
  135. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  136. package/dist/src/cli/handlers/ralph.js +575 -0
  137. package/dist/src/cli/handlers/refresh.js +432 -0
  138. package/dist/src/cli/handlers/regenerate.js +336 -0
  139. package/dist/src/cli/handlers/repo-access.js +109 -0
  140. package/dist/src/cli/handlers/run.js +165 -0
  141. package/dist/src/cli/handlers/runtime-info.js +301 -0
  142. package/dist/src/cli/handlers/sandbox.js +197 -0
  143. package/dist/src/cli/handlers/scaffolding.js +149 -0
  144. package/dist/src/cli/handlers/script-runner.js +121 -0
  145. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  146. package/dist/src/cli/handlers/serve.js +1835 -0
  147. package/dist/src/cli/handlers/session.js +348 -0
  148. package/dist/src/cli/handlers/setup.js +440 -0
  149. package/dist/src/cli/handlers/skill-lint.js +367 -0
  150. package/dist/src/cli/handlers/skill-usage.js +74 -0
  151. package/dist/src/cli/handlers/steward.js +567 -0
  152. package/dist/src/cli/handlers/subcommands.js +1702 -0
  153. package/dist/src/cli/handlers/team.js +337 -0
  154. package/dist/src/cli/handlers/types.js +11 -0
  155. package/dist/src/cli/handlers/use.js +2772 -0
  156. package/dist/src/cli/handlers/utilities.js +703 -0
  157. package/dist/src/cli/handlers/version.js +134 -0
  158. package/dist/src/cli/handlers/workspace-context.js +93 -0
  159. package/dist/src/cli/handlers/workspace.js +126 -0
  160. package/dist/src/cli/help-generator.js +178 -0
  161. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  162. package/dist/src/cli/hooks/executor.js +96 -0
  163. package/dist/src/cli/hooks/index.js +15 -0
  164. package/dist/src/cli/hooks/registry.js +143 -0
  165. package/dist/src/cli/hooks/types.js +13 -0
  166. package/dist/src/cli/log.js +492 -0
  167. package/dist/src/cli/project-isolation/detect.js +70 -0
  168. package/dist/src/cli/project-isolation/index.js +7 -0
  169. package/dist/src/cli/project-isolation/signals.js +17 -0
  170. package/dist/src/cli/project-isolation/warning.js +102 -0
  171. package/dist/src/cli/prompt-utils.js +155 -0
  172. package/dist/src/cli/provider-deployment-plan.js +126 -0
  173. package/dist/src/cli/provider-resolution.js +119 -0
  174. package/dist/src/cli/router.js +305 -0
  175. package/dist/src/cli/scope-resolver.js +392 -0
  176. package/dist/src/cli/skill-usage.js +616 -0
  177. package/dist/src/cli/ui.js +224 -0
  178. package/dist/src/cli/watch-service.js +203 -0
  179. package/dist/src/cli/workflow-orchestrator.js +478 -0
  180. package/dist/src/cli/workspace-signals.js +321 -0
  181. package/dist/src/community/footer.js +14 -0
  182. package/dist/src/community/links.js +123 -0
  183. package/dist/src/community/milestones.js +46 -0
  184. package/dist/src/community/nudge-policy.js +93 -0
  185. package/dist/src/config/aiwg-config.js +883 -0
  186. package/dist/src/config/cli.js +703 -0
  187. package/dist/src/config/gitignore.js +156 -0
  188. package/dist/src/config/project-artifacts.js +76 -0
  189. package/dist/src/config/user-config.js +428 -0
  190. package/dist/src/config/user-registry.js +127 -0
  191. package/dist/src/config/workspace.js +276 -0
  192. package/dist/src/contributors/detect.js +39 -0
  193. package/dist/src/contributors/discover.js +172 -0
  194. package/dist/src/contributors/heuristic.js +186 -0
  195. package/dist/src/contributors/index.js +11 -0
  196. package/dist/src/contributors/types.js +13 -0
  197. package/dist/src/contributors/validation.js +116 -0
  198. package/dist/src/data/community.schema.json +43 -0
  199. package/dist/src/data/community.yaml +16 -0
  200. package/dist/src/extensions/capability-index.js +270 -0
  201. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  202. package/dist/src/extensions/commands/definitions.js +3485 -0
  203. package/dist/src/extensions/deployment-registration.js +463 -0
  204. package/dist/src/extensions/index.js +22 -0
  205. package/dist/src/extensions/loader.js +132 -0
  206. package/dist/src/extensions/managed-marker.js +100 -0
  207. package/dist/src/extensions/manifest.js +196 -0
  208. package/dist/src/extensions/project-local-activity.js +114 -0
  209. package/dist/src/extensions/project-local-discovery.js +261 -0
  210. package/dist/src/extensions/project-local-doctor.js +281 -0
  211. package/dist/src/extensions/project-local-gitignore.js +176 -0
  212. package/dist/src/extensions/project-local-paths.js +121 -0
  213. package/dist/src/extensions/project-local-promote.js +218 -0
  214. package/dist/src/extensions/project-local-remove.js +373 -0
  215. package/dist/src/extensions/project-local-scaffold.js +252 -0
  216. package/dist/src/extensions/project-quickref.js +291 -0
  217. package/dist/src/extensions/registry.js +368 -0
  218. package/dist/src/extensions/shadow-resolver.js +271 -0
  219. package/dist/src/extensions/types.js +86 -0
  220. package/dist/src/extensions/upstream-registry.js +195 -0
  221. package/dist/src/extensions/validation.js +631 -0
  222. package/dist/src/features/catalog.js +88 -0
  223. package/dist/src/features/cli.js +197 -0
  224. package/dist/src/features/installer.js +57 -0
  225. package/dist/src/features/paths.js +14 -0
  226. package/dist/src/features/runtime.js +21 -0
  227. package/dist/src/features/status.js +134 -0
  228. package/dist/src/hooks/laziness-detection.js +532 -0
  229. package/dist/src/intake/git-history-analyzer.js +486 -0
  230. package/dist/src/intake/index.js +9 -0
  231. package/dist/src/issues/cli.js +327 -0
  232. package/dist/src/issues/index.js +5 -0
  233. package/dist/src/issues/live.js +154 -0
  234. package/dist/src/issues/local.js +666 -0
  235. package/dist/src/issues/sync.js +143 -0
  236. package/dist/src/issues/types.js +2 -0
  237. package/dist/src/issues/workflows.js +164 -0
  238. package/dist/src/kb/cli.js +173 -0
  239. package/dist/src/lint/cli.js +171 -0
  240. package/dist/src/lint/loader.js +225 -0
  241. package/dist/src/lint/reporters.js +141 -0
  242. package/dist/src/lint/runner.js +364 -0
  243. package/dist/src/lint/types.js +10 -0
  244. package/dist/src/marketplace/cache.js +110 -0
  245. package/dist/src/marketplace/identifier.js +63 -0
  246. package/dist/src/marketplace/registry.js +36 -0
  247. package/dist/src/marketplace/sources/clawhub.js +53 -0
  248. package/dist/src/marketplace/sources/git.js +45 -0
  249. package/dist/src/marketplace/types.js +9 -0
  250. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  251. package/dist/src/mcp/cli.mjs +1197 -0
  252. package/dist/src/mcp/elicitation.mjs +149 -0
  253. package/dist/src/mcp/helpers.mjs +287 -0
  254. package/dist/src/mcp/index.mjs +11 -0
  255. package/dist/src/mcp/profiles.js +263 -0
  256. package/dist/src/mcp/profiles.mjs +360 -0
  257. package/dist/src/mcp/registry.js +376 -0
  258. package/dist/src/mcp/registry.mjs +387 -0
  259. package/dist/src/mcp/server.mjs +633 -0
  260. package/dist/src/mcp/test-simple.mjs +271 -0
  261. package/dist/src/mcp/tools/command-run.mjs +101 -0
  262. package/dist/src/mcp/tools/discovery.mjs +291 -0
  263. package/dist/src/mcp/tools/interaction.mjs +87 -0
  264. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  265. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  266. package/dist/src/memory/cli.js +166 -0
  267. package/dist/src/memory/project-registry.js +282 -0
  268. package/dist/src/metrics/artifact-metrics.js +184 -0
  269. package/dist/src/metrics/context-budget.js +174 -0
  270. package/dist/src/metrics/token-counter.js +133 -0
  271. package/dist/src/models/config-loader.js +228 -0
  272. package/dist/src/models/index.js +22 -0
  273. package/dist/src/models/model-capabilities.v1.json +120 -0
  274. package/dist/src/models/model-catalog.v1.json +96 -0
  275. package/dist/src/models/model-discovery.js +521 -0
  276. package/dist/src/models/provider-models.js +73 -0
  277. package/dist/src/models/provider-policy.js +273 -0
  278. package/dist/src/models/resolver.js +245 -0
  279. package/dist/src/models/router.js +70 -0
  280. package/dist/src/models/types.js +8 -0
  281. package/dist/src/models/wrapper-deployment.js +178 -0
  282. package/dist/src/models/wrapper-route.js +54 -0
  283. package/dist/src/ops/cli.js +268 -0
  284. package/dist/src/ops/registry.js +623 -0
  285. package/dist/src/packages/adapters/clawhub.js +113 -0
  286. package/dist/src/packages/adapters/git.js +153 -0
  287. package/dist/src/packages/adapters/gitea.js +93 -0
  288. package/dist/src/packages/adapters/github.js +69 -0
  289. package/dist/src/packages/adapters/local-cache.js +89 -0
  290. package/dist/src/packages/package-registry.js +143 -0
  291. package/dist/src/packages/registry.js +238 -0
  292. package/dist/src/packages/types.js +11 -0
  293. package/dist/src/plugin/cross-framework-ops.js +475 -0
  294. package/dist/src/plugin/framework-config-loader.js +235 -0
  295. package/dist/src/plugin/framework-detector.js +186 -0
  296. package/dist/src/plugin/framework-isolator.js +341 -0
  297. package/dist/src/plugin/framework-migration.js +371 -0
  298. package/dist/src/plugin/metadata-validator.js +906 -0
  299. package/dist/src/plugin/plugin-installer.js +436 -0
  300. package/dist/src/plugin/plugin-status.js +369 -0
  301. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  302. package/dist/src/plugin/registry-validator.js +344 -0
  303. package/dist/src/plugin/skill-command-translator.js +415 -0
  304. package/dist/src/plugin/workspace-creator.js +189 -0
  305. package/dist/src/plugin/workspace-migrator.js +821 -0
  306. package/dist/src/policy/authorization.js +390 -0
  307. package/dist/src/policy/repo-access.js +215 -0
  308. package/dist/src/provenance/cli.js +16 -0
  309. package/dist/src/providers/capability-matrix.js +300 -0
  310. package/dist/src/providers/capability-matrix.yaml +514 -0
  311. package/dist/src/providers/provider-definitions.js +977 -0
  312. package/dist/src/providers/provider-definitions.mjs +159 -0
  313. package/dist/src/providers/provider-inventory.js +169 -0
  314. package/dist/src/quality/feedback-ab.js +174 -0
  315. package/dist/src/quality/feedback-collector.js +176 -0
  316. package/dist/src/quality/feedback-tracker.js +123 -0
  317. package/dist/src/quality/patterns/adr.json +24 -0
  318. package/dist/src/quality/patterns/sad.json +24 -0
  319. package/dist/src/quality/patterns/test-plan.json +24 -0
  320. package/dist/src/quality/patterns/use-case.json +24 -0
  321. package/dist/src/quality/scoring.js +157 -0
  322. package/dist/src/reflections/cli.js +15 -0
  323. package/dist/src/release/plan.js +139 -0
  324. package/dist/src/research/cache/manager.js +227 -0
  325. package/dist/src/research/clients/arxiv.js +156 -0
  326. package/dist/src/research/clients/base.js +197 -0
  327. package/dist/src/research/clients/crossref.js +112 -0
  328. package/dist/src/research/clients/semantic-scholar.js +126 -0
  329. package/dist/src/research/clients/unpaywall.js +87 -0
  330. package/dist/src/research/index.js +14 -0
  331. package/dist/src/research/query-cli.js +336 -0
  332. package/dist/src/research/services/acquisition.js +313 -0
  333. package/dist/src/research/services/archival.js +225 -0
  334. package/dist/src/research/services/citation.js +279 -0
  335. package/dist/src/research/services/discovery.js +243 -0
  336. package/dist/src/research/services/documentation.js +269 -0
  337. package/dist/src/research/services/index.js +14 -0
  338. package/dist/src/research/services/provenance.js +279 -0
  339. package/dist/src/research/services/quality.js +370 -0
  340. package/dist/src/research/services/types.js +7 -0
  341. package/dist/src/research/storage-cli.js +20 -0
  342. package/dist/src/research/types.js +47 -0
  343. package/dist/src/resources/index.d.ts +2 -0
  344. package/dist/src/resources/index.js +2 -0
  345. package/dist/src/resources/web-release.d.ts +89 -0
  346. package/dist/src/resources/web-release.js +882 -0
  347. package/dist/src/rlm/cache/cli.js +162 -0
  348. package/dist/src/rlm/cache/hash.js +35 -0
  349. package/dist/src/rlm/cache/store.js +170 -0
  350. package/dist/src/rlm/cache/types.js +8 -0
  351. package/dist/src/rlm/cli.js +650 -0
  352. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  353. package/dist/src/serve/agent-router.js +205 -0
  354. package/dist/src/serve/dispatch-router.js +171 -0
  355. package/dist/src/serve/executor-registry.js +715 -0
  356. package/dist/src/serve/mission-conductor.js +177 -0
  357. package/dist/src/serve/orchestrator-adapter.js +113 -0
  358. package/dist/src/serve/orchestrator-override.js +94 -0
  359. package/dist/src/serve/orchestrator-pty.js +133 -0
  360. package/dist/src/serve/pty-bridge.js +799 -0
  361. package/dist/src/serve/sandbox-registry.js +832 -0
  362. package/dist/src/serve/screen-reader.js +228 -0
  363. package/dist/src/serve/stack-adapters.js +68 -0
  364. package/dist/src/serve/telemetry.js +143 -0
  365. package/dist/src/skills/adapters/clawhub.js +250 -0
  366. package/dist/src/skills/adapters/local.js +335 -0
  367. package/dist/src/skills/adapters/openclaw.js +316 -0
  368. package/dist/src/skills/cli.js +334 -0
  369. package/dist/src/skills/registry.js +117 -0
  370. package/dist/src/skills/run.js +259 -0
  371. package/dist/src/skills/runtime.js +94 -0
  372. package/dist/src/skills/types.js +10 -0
  373. package/dist/src/smiths/agentsmith/demo.js +116 -0
  374. package/dist/src/smiths/agentsmith/examples.js +300 -0
  375. package/dist/src/smiths/agentsmith/generator.js +503 -0
  376. package/dist/src/smiths/agentsmith/index.js +11 -0
  377. package/dist/src/smiths/agentsmith/types.js +8 -0
  378. package/dist/src/smiths/commandsmith/example.js +220 -0
  379. package/dist/src/smiths/commandsmith/generator.js +288 -0
  380. package/dist/src/smiths/commandsmith/index.js +41 -0
  381. package/dist/src/smiths/commandsmith/templates.js +296 -0
  382. package/dist/src/smiths/commandsmith/types.js +7 -0
  383. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  384. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  385. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  386. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  387. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  388. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  389. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  390. package/dist/src/smiths/context-pipeline/index.js +30 -0
  391. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  392. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  393. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  394. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  395. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  396. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  397. package/dist/src/smiths/context-pipeline/types.js +23 -0
  398. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  399. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  400. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  401. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  402. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  403. package/dist/src/smiths/hook-bridge/index.js +79 -0
  404. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  405. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  406. package/dist/src/smiths/hook-bridge/types.js +31 -0
  407. package/dist/src/smiths/index.js +39 -0
  408. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  409. package/dist/src/smiths/mcpsmith/example.js +119 -0
  410. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  411. package/dist/src/smiths/mcpsmith/index.js +17 -0
  412. package/dist/src/smiths/mcpsmith/types.js +10 -0
  413. package/dist/src/smiths/platform-paths.js +101 -0
  414. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  415. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  416. package/dist/src/smiths/skillsmith/demo.js +83 -0
  417. package/dist/src/smiths/skillsmith/examples.js +161 -0
  418. package/dist/src/smiths/skillsmith/generator.js +316 -0
  419. package/dist/src/smiths/skillsmith/index.js +12 -0
  420. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  421. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  422. package/dist/src/smiths/skillsmith/types.js +9 -0
  423. package/dist/src/smiths/toolsmith/index.js +10 -0
  424. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  425. package/dist/src/smiths/toolsmith/types.js +8 -0
  426. package/dist/src/storage/backends/fortemi.js +227 -0
  427. package/dist/src/storage/backends/fs.js +134 -0
  428. package/dist/src/storage/backends/logseq.js +309 -0
  429. package/dist/src/storage/backends/obsidian.js +233 -0
  430. package/dist/src/storage/cli.js +468 -0
  431. package/dist/src/storage/config.js +272 -0
  432. package/dist/src/storage/index.js +108 -0
  433. package/dist/src/storage/subsystem-cli.js +201 -0
  434. package/dist/src/storage/types.js +33 -0
  435. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  436. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  437. package/dist/src/testing/corpus/index.js +10 -0
  438. package/dist/src/testing/fixtures/index.js +9 -0
  439. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  440. package/dist/src/testing/generators/index.js +11 -0
  441. package/dist/src/testing/generators/test-case-generator.js +393 -0
  442. package/dist/src/testing/generators/test-code-generator.js +384 -0
  443. package/dist/src/testing/generators/use-case-parser.js +325 -0
  444. package/dist/src/testing/index.js +11 -0
  445. package/dist/src/tracker/capability-protocol.js +118 -0
  446. package/dist/src/update/checker.mjs +396 -0
  447. package/dist/src/update/notifier.mjs +235 -0
  448. package/dist/src/writing/content-diversifier.js +804 -0
  449. package/dist/src/writing/example-generator.js +959 -0
  450. package/dist/src/writing/example-templates.js +99 -0
  451. package/dist/src/writing/pattern-library.js +486 -0
  452. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  453. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  454. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  455. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  456. package/dist/src/writing/patterns/transition-words.json +1285 -0
  457. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  458. package/dist/src/writing/prompt-optimizer.js +660 -0
  459. package/dist/src/writing/prompt-templates.js +583 -0
  460. package/dist/src/writing/scoring-config-loader.js +168 -0
  461. package/dist/src/writing/validation-engine.js +595 -0
  462. package/dist/src/writing/validation-rules.js +380 -0
  463. package/dist/src/writing/voice-analyzer.js +439 -0
  464. package/dist/src/writing/voice-calibration.js +661 -0
  465. package/dist/src/writing/voice-profiles.json +588 -0
  466. package/package.json +64 -9
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Feedback Tracker — record before/after quality scores and accuracy
3
+ *
4
+ * Tracks quality score deltas from feedback iterations, calculates
5
+ * accuracy (% positive deltas), and false positive rate.
6
+ * Persists to `.aiwg/metrics/feedback/`.
7
+ *
8
+ * @module quality/feedback-tracker
9
+ * @issue #148
10
+ */
11
+ import { promises as fs } from 'fs';
12
+ import path from 'path';
13
+ // ============================================================================
14
+ // Constants
15
+ // ============================================================================
16
+ const FEEDBACK_DIR = '.aiwg/metrics/feedback';
17
+ const RECORDS_FILE = 'records.json';
18
+ // ============================================================================
19
+ // FeedbackTracker
20
+ // ============================================================================
21
+ export class FeedbackTracker {
22
+ feedbackDir;
23
+ records;
24
+ nextId;
25
+ constructor(projectPath) {
26
+ this.feedbackDir = path.join(projectPath, FEEDBACK_DIR);
27
+ this.records = [];
28
+ this.nextId = 1;
29
+ }
30
+ async recordFeedback(artifactPath, agent, scoreBefore, scoreAfter, category) {
31
+ const delta = scoreAfter - scoreBefore;
32
+ const record = {
33
+ id: `fb-${String(this.nextId++).padStart(4, '0')}`,
34
+ artifactPath,
35
+ agent,
36
+ scoreBefore,
37
+ scoreAfter,
38
+ delta,
39
+ improved: delta > 0,
40
+ timestamp: new Date().toISOString(),
41
+ category,
42
+ };
43
+ this.records.push(record);
44
+ await this.persist();
45
+ return record;
46
+ }
47
+ calculateAccuracy(options) {
48
+ let filtered = [...this.records];
49
+ if (options?.agent) {
50
+ const agentLower = options.agent.toLowerCase();
51
+ filtered = filtered.filter((r) => r.agent.toLowerCase() === agentLower);
52
+ }
53
+ if (options?.category) {
54
+ filtered = filtered.filter((r) => r.category === options.category);
55
+ }
56
+ if (filtered.length === 0) {
57
+ return {
58
+ totalRecords: 0,
59
+ positiveDeltas: 0,
60
+ negativeDeltas: 0,
61
+ zeroDeltas: 0,
62
+ accuracy: 0,
63
+ falsePositiveRate: 0,
64
+ averageDelta: 0,
65
+ medianDelta: 0,
66
+ };
67
+ }
68
+ const positiveDeltas = filtered.filter((r) => r.delta > 0).length;
69
+ const negativeDeltas = filtered.filter((r) => r.delta < 0).length;
70
+ const zeroDeltas = filtered.filter((r) => r.delta === 0).length;
71
+ const deltas = filtered.map((r) => r.delta);
72
+ const averageDelta = deltas.reduce((sum, d) => sum + d, 0) / deltas.length;
73
+ const sortedDeltas = [...deltas].sort((a, b) => a - b);
74
+ const medianDelta = sortedDeltas.length % 2 === 0
75
+ ? (sortedDeltas[sortedDeltas.length / 2 - 1] + sortedDeltas[sortedDeltas.length / 2]) / 2
76
+ : sortedDeltas[Math.floor(sortedDeltas.length / 2)];
77
+ return {
78
+ totalRecords: filtered.length,
79
+ positiveDeltas,
80
+ negativeDeltas,
81
+ zeroDeltas,
82
+ accuracy: Math.round((positiveDeltas / filtered.length) * 10000) / 100,
83
+ falsePositiveRate: Math.round((negativeDeltas / filtered.length) * 10000) / 100,
84
+ averageDelta: Math.round(averageDelta * 100) / 100,
85
+ medianDelta: Math.round(medianDelta * 100) / 100,
86
+ };
87
+ }
88
+ getAgentAccuracy() {
89
+ const agents = new Set(this.records.map((r) => r.agent));
90
+ const result = new Map();
91
+ for (const agent of agents) {
92
+ result.set(agent, this.calculateAccuracy({ agent }));
93
+ }
94
+ return result;
95
+ }
96
+ async load() {
97
+ try {
98
+ const filePath = path.join(this.feedbackDir, RECORDS_FILE);
99
+ const content = await fs.readFile(filePath, 'utf-8');
100
+ const data = JSON.parse(content);
101
+ this.records = data.records || [];
102
+ this.nextId = data.nextId || this.records.length + 1;
103
+ }
104
+ catch {
105
+ this.records = [];
106
+ this.nextId = 1;
107
+ }
108
+ }
109
+ async persist() {
110
+ try {
111
+ await fs.mkdir(this.feedbackDir, { recursive: true });
112
+ const filePath = path.join(this.feedbackDir, RECORDS_FILE);
113
+ await fs.writeFile(filePath, JSON.stringify({ records: this.records, nextId: this.nextId }, null, 2), 'utf-8');
114
+ }
115
+ catch {
116
+ // Non-critical
117
+ }
118
+ }
119
+ getAllRecords() {
120
+ return [...this.records];
121
+ }
122
+ }
123
+ //# sourceMappingURL=feedback-tracker.js.map
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "adr",
3
+ "name": "Architecture Decision Record",
4
+ "description": "Quality patterns for ADR artifacts",
5
+ "required": [
6
+ { "id": "adr-title", "pattern": "^#\\s+ADR-\\d+", "description": "ADR ID and title heading" },
7
+ { "id": "adr-status", "pattern": "(?i)status\\s*:", "description": "Decision status" },
8
+ { "id": "adr-context", "pattern": "(?i)context\\s*:", "description": "Context/problem statement" },
9
+ { "id": "adr-decision", "pattern": "(?i)decision\\s*:", "description": "Decision statement" },
10
+ { "id": "adr-consequences", "pattern": "(?i)consequences?\\s*:", "description": "Consequences of the decision" }
11
+ ],
12
+ "recommended": [
13
+ { "id": "adr-alternatives", "pattern": "(?i)(alternatives?|options?)\\s*(considered)?\\s*:", "description": "Alternatives considered" },
14
+ { "id": "adr-rationale", "pattern": "(?i)rationale\\s*:", "description": "Decision rationale" },
15
+ { "id": "adr-date", "pattern": "(?i)date\\s*:", "description": "Decision date" },
16
+ { "id": "adr-refs", "pattern": "@[\\w./\\-]+", "description": "@-mention traceability links" },
17
+ { "id": "adr-supersedes", "pattern": "(?i)supersed(es|ed by)", "description": "Supersession chain" }
18
+ ],
19
+ "antipatterns": [
20
+ { "id": "adr-no-context", "pattern": "(?i)\\bwe decided\\b(?!.*\\bbecause\\b)", "weight": 0.1, "description": "Decision without justification" },
21
+ { "id": "adr-todo", "pattern": "(?i)\\bTODO\\b|\\bTBD\\b|\\bFIXME\\b", "weight": 0.05, "description": "Unresolved TODOs" },
22
+ { "id": "adr-vague", "pattern": "(?i)\\bsomehow\\b|\\bprobably\\b|\\bmaybe\\b", "weight": 0.05, "description": "Vague language in decisions" }
23
+ ]
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "sad",
3
+ "name": "Software Architecture Document",
4
+ "description": "Quality patterns for SAD artifacts",
5
+ "required": [
6
+ { "id": "sad-overview", "pattern": "(?i)(overview|introduction|purpose)\\s*:", "description": "Architecture overview" },
7
+ { "id": "sad-constraints", "pattern": "(?i)constraints?\\s*:", "description": "Architecture constraints" },
8
+ { "id": "sad-components", "pattern": "(?i)(component|module|service)s?\\s*(diagram|overview|architecture)", "description": "Component/module descriptions" },
9
+ { "id": "sad-decisions", "pattern": "(?i)(decision|ADR|rationale)s?", "description": "Key architectural decisions" },
10
+ { "id": "sad-quality", "pattern": "(?i)(quality|non-?functional|NFR)\\s*(attribute|requirement)s?", "description": "Quality attributes/NFRs" }
11
+ ],
12
+ "recommended": [
13
+ { "id": "sad-views", "pattern": "(?i)(logical|physical|deployment|process)\\s*view", "description": "Multiple architecture views (4+1)" },
14
+ { "id": "sad-interfaces", "pattern": "(?i)(interface|API|contract)s?\\s*(definition|spec)?", "description": "Interface definitions" },
15
+ { "id": "sad-security", "pattern": "(?i)security\\s*(architecture|model|considerations?)", "description": "Security architecture" },
16
+ { "id": "sad-deployment", "pattern": "(?i)deployment\\s*(model|topology|diagram)", "description": "Deployment model" },
17
+ { "id": "sad-trace", "pattern": "@[\\w./\\-]+", "description": "@-mention traceability links" }
18
+ ],
19
+ "antipatterns": [
20
+ { "id": "sad-no-rationale", "pattern": "(?i)\\bwe use\\b(?!.*\\bbecause\\b)", "weight": 0.1, "description": "Technology choice without rationale" },
21
+ { "id": "sad-todo", "pattern": "(?i)\\bTODO\\b|\\bTBD\\b|\\bFIXME\\b", "weight": 0.05, "description": "Unresolved TODOs" },
22
+ { "id": "sad-monolith", "pattern": "(?i)\\bsingle\\s*point\\s*of\\s*failure\\b", "weight": 0.1, "description": "Acknowledged SPOF without mitigation" }
23
+ ]
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "test-plan",
3
+ "name": "Test Plan",
4
+ "description": "Quality patterns for test plan artifacts",
5
+ "required": [
6
+ { "id": "tp-scope", "pattern": "(?i)(scope|objective)s?\\s*:", "description": "Test scope/objectives" },
7
+ { "id": "tp-strategy", "pattern": "(?i)(strategy|approach)\\s*:", "description": "Test strategy/approach" },
8
+ { "id": "tp-cases", "pattern": "(?i)test\\s*(case|scenario)s?", "description": "Test cases or scenarios" },
9
+ { "id": "tp-criteria", "pattern": "(?i)(pass|exit|completion)\\s*criteria", "description": "Pass/exit criteria" },
10
+ { "id": "tp-env", "pattern": "(?i)(environment|infrastructure|setup)\\s*:", "description": "Test environment description" }
11
+ ],
12
+ "recommended": [
13
+ { "id": "tp-coverage", "pattern": "(?i)coverage\\s*(target|goal|matrix)?\\s*:", "description": "Coverage targets" },
14
+ { "id": "tp-risk", "pattern": "(?i)(risk|priority)\\s*(based)?\\s*(testing)?", "description": "Risk-based testing approach" },
15
+ { "id": "tp-schedule", "pattern": "(?i)(schedule|timeline|milestone)s?\\s*:", "description": "Test schedule" },
16
+ { "id": "tp-data", "pattern": "(?i)test\\s*data\\s*:", "description": "Test data requirements" },
17
+ { "id": "tp-trace", "pattern": "@[\\w./\\-]+", "description": "@-mention traceability links" }
18
+ ],
19
+ "antipatterns": [
20
+ { "id": "tp-no-negative", "pattern": "(?i)\\b(only|just)\\s*(happy|positive)\\s*path", "weight": 0.1, "description": "Only happy path testing" },
21
+ { "id": "tp-todo", "pattern": "(?i)\\bTODO\\b|\\bTBD\\b|\\bFIXME\\b", "weight": 0.05, "description": "Unresolved TODOs" },
22
+ { "id": "tp-manual-only", "pattern": "(?i)\\bmanual\\s*only\\b|\\bno\\s*automation\\b", "weight": 0.05, "description": "No automation consideration" }
23
+ ]
24
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "use-case",
3
+ "name": "Use Case",
4
+ "description": "Quality patterns for SDLC use case artifacts",
5
+ "required": [
6
+ { "id": "uc-title", "pattern": "^#\\s+UC-\\d+", "description": "Use case ID and title heading" },
7
+ { "id": "uc-actors", "pattern": "(?i)(actor|stakeholder)s?\\s*:", "description": "Actors/stakeholders section" },
8
+ { "id": "uc-preconditions", "pattern": "(?i)pre-?conditions?\\s*:", "description": "Preconditions section" },
9
+ { "id": "uc-flow", "pattern": "(?i)(main|basic|normal)\\s*(flow|scenario|path)", "description": "Main flow/scenario" },
10
+ { "id": "uc-postconditions", "pattern": "(?i)post-?conditions?\\s*:", "description": "Postconditions section" }
11
+ ],
12
+ "recommended": [
13
+ { "id": "uc-alt-flows", "pattern": "(?i)(alternative|alternate|exception)\\s*(flow|scenario|path)", "description": "Alternative flows" },
14
+ { "id": "uc-priority", "pattern": "(?i)priority\\s*:", "description": "Priority assignment" },
15
+ { "id": "uc-nfr-refs", "pattern": "(?i)(NFR|non-functional)", "description": "NFR cross-references" },
16
+ { "id": "uc-acceptance", "pattern": "(?i)acceptance\\s*criteria", "description": "Acceptance criteria" },
17
+ { "id": "uc-trace", "pattern": "@[\\w./\\-]+", "description": "@-mention traceability links" }
18
+ ],
19
+ "antipatterns": [
20
+ { "id": "uc-no-impl", "pattern": "(?i)(implementation|code|function|class|method)\\s+details?", "weight": 0.1, "description": "Implementation details in use case" },
21
+ { "id": "uc-vague-actor", "pattern": "(?i)\\bsomeone\\b|\\bthe user\\b", "weight": 0.05, "description": "Vague actor references" },
22
+ { "id": "uc-todo", "pattern": "(?i)\\bTODO\\b|\\bTBD\\b|\\bFIXME\\b", "weight": 0.05, "description": "Unresolved TODOs" }
23
+ ]
24
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Pattern-based Quality Scoring Engine
3
+ *
4
+ * Scores SDLC artifacts against pattern definitions (required/recommended/antipattern).
5
+ * Scoring: required (60%) + recommended (40%) - antipattern penalty.
6
+ * Thresholds: excellent (90+), good (75+), acceptable (60+), needs-work (<60).
7
+ *
8
+ * @module quality/scoring
9
+ * @issue #192
10
+ */
11
+ import { promises as fs } from 'fs';
12
+ import path from 'path';
13
+ import { fileURLToPath } from 'url';
14
+ // ============================================================================
15
+ // Constants
16
+ // ============================================================================
17
+ export const REQUIRED_WEIGHT = 0.60;
18
+ export const RECOMMENDED_WEIGHT = 0.40;
19
+ export const THRESHOLDS = {
20
+ excellent: 90,
21
+ good: 75,
22
+ acceptable: 60,
23
+ };
24
+ // ============================================================================
25
+ // Scoring Engine
26
+ // ============================================================================
27
+ export function scoreContent(content, patterns, artifactPath = '') {
28
+ const requiredMatches = patterns.required.map((rule) => matchPattern(content, rule));
29
+ const requiredFound = requiredMatches.filter((m) => m.found).length;
30
+ const requiredScore = patterns.required.length > 0
31
+ ? (requiredFound / patterns.required.length) * 100
32
+ : 100;
33
+ const recommendedMatches = patterns.recommended.map((rule) => matchPattern(content, rule));
34
+ const recommendedFound = recommendedMatches.filter((m) => m.found).length;
35
+ const recommendedScore = patterns.recommended.length > 0
36
+ ? (recommendedFound / patterns.recommended.length) * 100
37
+ : 100;
38
+ const antipatternMatches = patterns.antipatterns.map((rule) => matchPattern(content, rule));
39
+ const antipatternPenalty = antipatternMatches.reduce((penalty, match) => {
40
+ if (match.found) {
41
+ const weight = match.rule.weight || 0.05;
42
+ return penalty + weight * 100;
43
+ }
44
+ return penalty;
45
+ }, 0);
46
+ const rawScore = requiredScore * REQUIRED_WEIGHT +
47
+ recommendedScore * RECOMMENDED_WEIGHT -
48
+ antipatternPenalty;
49
+ const score = Math.max(0, Math.min(100, Math.round(rawScore * 100) / 100));
50
+ const grade = getGrade(score);
51
+ return {
52
+ score,
53
+ grade,
54
+ breakdown: {
55
+ required: Math.round(requiredScore * 100) / 100,
56
+ recommended: Math.round(recommendedScore * 100) / 100,
57
+ antipatternPenalty: Math.round(antipatternPenalty * 100) / 100,
58
+ },
59
+ matches: {
60
+ required: requiredMatches,
61
+ recommended: recommendedMatches,
62
+ antipatterns: antipatternMatches,
63
+ },
64
+ patternId: patterns.id,
65
+ artifactPath,
66
+ };
67
+ }
68
+ export function matchPattern(content, rule) {
69
+ try {
70
+ let pattern = rule.pattern;
71
+ let flags = 'gm';
72
+ // Handle PCRE inline flag (?i) — strip it and add 'i' to RegExp flags
73
+ if (pattern.startsWith('(?i)')) {
74
+ pattern = pattern.slice(4);
75
+ flags = 'gmi';
76
+ }
77
+ const regex = new RegExp(pattern, flags);
78
+ const matches = content.match(regex);
79
+ return {
80
+ rule,
81
+ found: matches !== null && matches.length > 0,
82
+ matchCount: matches ? matches.length : 0,
83
+ };
84
+ }
85
+ catch {
86
+ return {
87
+ rule,
88
+ found: false,
89
+ matchCount: 0,
90
+ };
91
+ }
92
+ }
93
+ export function getGrade(score) {
94
+ if (score >= THRESHOLDS.excellent)
95
+ return 'excellent';
96
+ if (score >= THRESHOLDS.good)
97
+ return 'good';
98
+ if (score >= THRESHOLDS.acceptable)
99
+ return 'acceptable';
100
+ return 'needs-work';
101
+ }
102
+ // ============================================================================
103
+ // Pattern Loading
104
+ // ============================================================================
105
+ export async function loadBuiltinPattern(artifactType) {
106
+ try {
107
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
108
+ const patternPath = path.join(currentDir, 'patterns', `${artifactType}.json`);
109
+ const content = await fs.readFile(patternPath, 'utf-8');
110
+ return JSON.parse(content);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ }
116
+ export async function loadPatternFromFile(filePath) {
117
+ try {
118
+ const content = await fs.readFile(filePath, 'utf-8');
119
+ return JSON.parse(content);
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ export function getAvailablePatternTypes() {
126
+ return ['use-case', 'adr', 'test-plan', 'sad'];
127
+ }
128
+ export function detectArtifactType(content, filePath) {
129
+ const lower = content.toLowerCase();
130
+ const basename = path.basename(filePath).toLowerCase();
131
+ if (basename.startsWith('uc-') || /^#\s+UC-\d+/m.test(content)) {
132
+ return 'use-case';
133
+ }
134
+ if (basename.startsWith('adr-') || /^#\s+ADR-\d+/m.test(content)) {
135
+ return 'adr';
136
+ }
137
+ if (lower.includes('test plan') || lower.includes('test strategy')) {
138
+ return 'test-plan';
139
+ }
140
+ if (lower.includes('software architecture') ||
141
+ lower.includes('system architecture') ||
142
+ basename.includes('sad')) {
143
+ return 'sad';
144
+ }
145
+ return null;
146
+ }
147
+ export async function scoreArtifact(filePath, patternType) {
148
+ const content = await fs.readFile(filePath, 'utf-8');
149
+ const type = patternType || detectArtifactType(content, filePath);
150
+ if (!type)
151
+ return null;
152
+ const patterns = await loadBuiltinPattern(type);
153
+ if (!patterns)
154
+ return null;
155
+ return scoreContent(content, patterns, filePath);
156
+ }
157
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Reflections CLI — `aiwg reflections <subcommand>`
3
+ *
4
+ * Thin subsystem wrapper around `runSubsystemCli('reflections', ...)`.
5
+ * Used by the ralph-reflect / reflection-injection skills (#967) so
6
+ * agent-loop reflections honor `.aiwg/storage.config` redirection.
7
+ *
8
+ * @issue #934
9
+ * @issue #967
10
+ */
11
+ import { runSubsystemCli } from '../storage/subsystem-cli.js';
12
+ export async function main(args) {
13
+ await runSubsystemCli('reflections', args);
14
+ }
15
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,139 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import { parse as parseYaml } from 'yaml';
4
+ import { projectAiwgPath } from '../config/project-artifacts.js';
5
+ export const RELEASE_PLAN_DIR = path.join('.aiwg', 'releases');
6
+ export const RELEASE_PLAN_EXTENSIONS = new Set(['.json', '.yaml', '.yml']);
7
+ export class ReleasePlanError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = 'ReleasePlanError';
11
+ }
12
+ }
13
+ export async function discoverReleasePlans(projectRoot) {
14
+ const releaseDir = projectAiwgPath(projectRoot, 'releases');
15
+ let entries;
16
+ try {
17
+ entries = await fs.readdir(releaseDir, { withFileTypes: true });
18
+ }
19
+ catch (error) {
20
+ if (error?.code === 'ENOENT')
21
+ return [];
22
+ throw error;
23
+ }
24
+ const candidates = entries
25
+ .filter((entry) => entry.isFile() && RELEASE_PLAN_EXTENSIONS.has(path.extname(entry.name)))
26
+ .map((entry) => path.join(releaseDir, entry.name))
27
+ .sort();
28
+ const plans = [];
29
+ for (const candidate of candidates) {
30
+ const plan = parseReleasePlan(await fs.readFile(candidate, 'utf8'), candidate);
31
+ plans.push({ path: candidate, plan });
32
+ }
33
+ const byId = new Map();
34
+ for (const { path: planPath, plan } of plans) {
35
+ byId.set(plan.id, [...(byId.get(plan.id) ?? []), planPath]);
36
+ }
37
+ const duplicates = [...byId.entries()].filter(([, paths]) => paths.length > 1);
38
+ if (duplicates.length > 0) {
39
+ const details = duplicates
40
+ .map(([id, paths]) => `${id}: ${paths.map((p) => path.relative(projectRoot, p)).join(', ')}`)
41
+ .join('; ');
42
+ throw new ReleasePlanError(`Conflicting release plans: duplicate plan id(s) found (${details}). Give each sidecar a unique id.`);
43
+ }
44
+ return plans;
45
+ }
46
+ export async function selectReleasePlan(projectRoot, options = {}) {
47
+ const plans = await discoverReleasePlans(projectRoot);
48
+ if (plans.length === 0) {
49
+ throw new ReleasePlanError(`No release plans found. Create ${RELEASE_PLAN_DIR}/<plan-id>.yaml or pass a project without release-plan sidecars.`);
50
+ }
51
+ let selected;
52
+ if (options.planId) {
53
+ selected = plans.find(({ plan }) => plan.id === options.planId);
54
+ if (!selected) {
55
+ throw new ReleasePlanError(`Release plan '${options.planId}' was not found. Available plans: ${plans.map(({ plan }) => plan.id).join(', ')}.`);
56
+ }
57
+ }
58
+ else if (plans.length === 1) {
59
+ selected = plans[0];
60
+ }
61
+ else {
62
+ throw new ReleasePlanError(`Multiple release plans are available (${plans.map(({ plan }) => plan.id).join(', ')}). Select one explicitly with --plan <id>.`);
63
+ }
64
+ return {
65
+ activePlan: selected.plan,
66
+ activePlanPath: selected.path,
67
+ effectiveDeliveryMode: selected.plan.delivery.mode,
68
+ projectDeliveryMode: options.projectDeliveryMode,
69
+ report: renderReleasePlanActivation(selected.plan, selected.path, projectRoot, options.projectDeliveryMode),
70
+ };
71
+ }
72
+ export function parseReleasePlan(content, sourcePath = '<memory>') {
73
+ let parsed;
74
+ if (sourcePath.endsWith('.json')) {
75
+ parsed = JSON.parse(content);
76
+ }
77
+ else {
78
+ parsed = parseYaml(content);
79
+ }
80
+ return validateReleasePlan(parsed, sourcePath);
81
+ }
82
+ export function validateReleasePlan(value, sourcePath = '<memory>') {
83
+ if (!isRecord(value)) {
84
+ throw new ReleasePlanError(`${sourcePath}: release plan must be an object.`);
85
+ }
86
+ if (value.version !== 1) {
87
+ throw new ReleasePlanError(`${sourcePath}: release plan version must be 1.`);
88
+ }
89
+ if (typeof value.id !== 'string' || !/^[a-z0-9][a-z0-9._-]*$/.test(value.id)) {
90
+ throw new ReleasePlanError(`${sourcePath}: release plan id must be a stable lowercase id.`);
91
+ }
92
+ if (!isRecord(value.target) || typeof value.target.name !== 'string' || value.target.name.trim() === '') {
93
+ throw new ReleasePlanError(`${sourcePath}: release plan target.name is required.`);
94
+ }
95
+ if (!isRecord(value.delivery) || typeof value.delivery.mode !== 'string') {
96
+ throw new ReleasePlanError(`${sourcePath}: release plan delivery.mode is required.`);
97
+ }
98
+ const allowedModes = ['direct', 'pr', 'pr-required', 'tag-only', 'dispatch-only', 'manual', 'custom'];
99
+ if (!allowedModes.includes(value.delivery.mode)) {
100
+ throw new ReleasePlanError(`${sourcePath}: release plan delivery.mode must be one of ${allowedModes.join(', ')}.`);
101
+ }
102
+ validateCommandList(value.build && isRecord(value.build) ? value.build.commands : undefined, `${sourcePath}: build.commands`);
103
+ validateCommandList(value.validation_gates, `${sourcePath}: validation_gates`);
104
+ validateCommandList(value.post_release_verification, `${sourcePath}: post_release_verification`);
105
+ return value;
106
+ }
107
+ export function buildReleasePlanExecutionFlow(plan) {
108
+ return [
109
+ ...(plan.build?.commands ?? []),
110
+ ...(plan.validation_gates ?? []),
111
+ ...(plan.post_release_verification ?? []),
112
+ ];
113
+ }
114
+ export function renderReleasePlanActivation(plan, planPath, projectRoot, projectDeliveryMode) {
115
+ const relativePath = path.relative(projectRoot, planPath) || planPath;
116
+ const projectMode = projectDeliveryMode ? ` (project default: ${projectDeliveryMode})` : '';
117
+ return [
118
+ `Active release plan: ${plan.id}${plan.name ? ` (${plan.name})` : ''}`,
119
+ `Plan file: ${relativePath}`,
120
+ `Target: ${plan.target.name}`,
121
+ `Delivery mode: ${plan.delivery.mode}${projectMode}`,
122
+ ].join('\n');
123
+ }
124
+ function validateCommandList(value, where) {
125
+ if (value === undefined)
126
+ return;
127
+ if (!Array.isArray(value)) {
128
+ throw new ReleasePlanError(`${where} must be an array.`);
129
+ }
130
+ for (const [index, command] of value.entries()) {
131
+ if (!isRecord(command) || typeof command.run !== 'string' || command.run.trim() === '') {
132
+ throw new ReleasePlanError(`${where}[${index}].run is required.`);
133
+ }
134
+ }
135
+ }
136
+ function isRecord(value) {
137
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
138
+ }
139
+ //# sourceMappingURL=plan.js.map