@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,100 @@
1
+ /**
2
+ * Managed-marker normalization for hash equivalence.
3
+ *
4
+ * The deployer injects a managed-marker comment into every deployed
5
+ * markdown artifact (see `tools/agents/providers/base.mjs:addManagedMarker`).
6
+ * Two forms exist:
7
+ *
8
+ * 1. YAML-frontmatter inline (current — non-breaking for parsers):
9
+ *
10
+ * ---
11
+ * # aiwg:managed v<VERSION> <SOURCE>
12
+ * name: ...
13
+ * ...
14
+ * ---
15
+ *
16
+ * 2. HTML-comment-on-line-1 (legacy — files with no frontmatter):
17
+ *
18
+ * <!-- aiwg:managed v<VERSION> <SOURCE> -->
19
+ * # Some heading
20
+ *
21
+ * Source files in the repo do NOT carry the marker; it's a deploy-time
22
+ * artifact only. That means a naive `sha256(source) == sha256(deployed)`
23
+ * comparison will always fail by exactly one line, producing the spurious
24
+ * drift detected in #1086 and the same false-positive surface in
25
+ * `aiwg remove`'s pristine/mutated classifier (per #1048's design).
26
+ *
27
+ * This module makes the marker invisible to the equivalence relation:
28
+ * both deploy-time hash recording and post-deploy comparison hash the
29
+ * marker-stripped form. The marker therefore never participates in the
30
+ * "is this the same file?" check.
31
+ *
32
+ * Trade-off: an operator who removes the marker from a deployed file
33
+ * but leaves the rest unchanged is NOT flagged as drift (stripped both
34
+ * sides → same content → same hash). This is a conscious choice — the
35
+ * marker exists for `aiwg remove`'s ownership labelling, not as a
36
+ * tamper-evident seal. Real content edits remain detected normally.
37
+ *
38
+ * @implements #1086
39
+ */
40
+ import { readFile } from 'fs/promises';
41
+ import { createHash } from 'crypto';
42
+ /**
43
+ * Match either marker form:
44
+ * - HTML comment at line 1: `<!-- aiwg:managed v... ... -->\n`
45
+ * - YAML comment inside frontmatter (line 2): `# aiwg:managed v... ...\n`
46
+ *
47
+ * Multiline mode anchors `^` to start of any line, so the YAML form is
48
+ * matched whether it appears as the first or second line of the file.
49
+ *
50
+ * The pattern intentionally does NOT consume any other line; it strips
51
+ * only the single marker line and its trailing newline.
52
+ */
53
+ const MANAGED_MARKER_LINE_RE = /^(?:<!-- aiwg:managed [^\n]*-->|# aiwg:managed [^\n]*)\n/m;
54
+ /**
55
+ * Return the content with the managed-marker line removed if present.
56
+ * Idempotent — calling twice on the same input is the same as calling once.
57
+ *
58
+ * If no marker is present, returns the input unchanged (referentially —
59
+ * same string instance).
60
+ */
61
+ export function stripManagedMarker(content) {
62
+ return content.replace(MANAGED_MARKER_LINE_RE, '');
63
+ }
64
+ /**
65
+ * Read a file from disk, strip any managed-marker line, and return the
66
+ * SHA-256 hex digest of the result.
67
+ *
68
+ * Throws on read errors (caller should catch and treat as missing).
69
+ *
70
+ * Used in two places:
71
+ * - `hashBundleArtifacts()` records this hash for source files at
72
+ * deploy time. Source files have no marker, so this is identical
73
+ * to the previous unnormalized hash — backwards-compatible with
74
+ * existing registry entries.
75
+ * - Drift detection (`aiwg doctor`) and pristine classification
76
+ * (`aiwg remove`) hash the deployed file using this function. The
77
+ * marker line is stripped before hashing so the two sides match.
78
+ */
79
+ export async function sha256OfFileNormalized(absPath) {
80
+ const buf = await readFile(absPath, 'utf8');
81
+ const stripped = stripManagedMarker(buf);
82
+ return createHash('sha256').update(stripped, 'utf8').digest('hex');
83
+ }
84
+ /**
85
+ * Read a file and return both raw and managed-marker-normalized hashes.
86
+ *
87
+ * This is used by drift detectors that must remain compatible with
88
+ * registries populated before #1086 normalization shipped. In that narrow
89
+ * case the registry may contain the raw deployed hash, while newer deploys
90
+ * contain the normalized source hash.
91
+ */
92
+ export async function sha256OfFileRawAndNormalized(absPath) {
93
+ const buf = await readFile(absPath, 'utf8');
94
+ const stripped = stripManagedMarker(buf);
95
+ return {
96
+ raw: createHash('sha256').update(buf, 'utf8').digest('hex'),
97
+ normalized: createHash('sha256').update(stripped, 'utf8').digest('hex'),
98
+ };
99
+ }
100
+ //# sourceMappingURL=managed-marker.js.map
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Bundle Manifest Schema (Zod)
3
+ *
4
+ * Validates `.aiwg/{extensions,addons,frameworks,plugins,providers}/<name>/manifest.json`
5
+ * for project-local artifact bundles. Implements the design in
6
+ * `.aiwg/architecture/design-manifest-schema.md` (#1044).
7
+ *
8
+ * Layered above the per-artifact Extension type validation in `validation.ts`:
9
+ * the bundle manifest declares the bundle (a directory containing artifacts);
10
+ * the existing schemas validate individual artifact bodies inside the bundle.
11
+ *
12
+ * @implements #1044
13
+ * @architecture .aiwg/architecture/design-manifest-schema.md
14
+ */
15
+ import { z } from 'zod';
16
+ import { PlatformCompatibilitySchema, DeploymentConfigSchema, MemoryFootprintSchema, DeprecationSchema, } from './validation.js';
17
+ // ============================================
18
+ // Limits (from #1042 threat model + #1044 design)
19
+ // ============================================
20
+ export const MANIFEST_MAX_BYTES = 64 * 1024; // 64 KB
21
+ export const MAX_BUNDLES_PER_PROJECT = 200;
22
+ export const MAX_KEYWORDS_PER_MANIFEST = 50;
23
+ export const MAX_OVERRIDES_PER_MANIFEST = 20;
24
+ // ============================================
25
+ // Project-local bundle types (#1040)
26
+ // ============================================
27
+ export const ProjectLocalTypeSchema = z.enum([
28
+ 'extension',
29
+ 'addon',
30
+ 'framework',
31
+ 'plugin',
32
+ 'provider',
33
+ ]);
34
+ // ============================================
35
+ // Path safety helpers
36
+ // ============================================
37
+ /**
38
+ * Relative paths within a bundle. No `..`, no leading `/`, alphanumeric +
39
+ * underscore + hyphen, optional trailing slash.
40
+ */
41
+ const safeRelativePath = z.string().regex(/^[a-zA-Z0-9_-]+(?:\/[a-zA-Z0-9_-]+)*\/?$/, 'must be a relative path (alphanumeric + _-, no leading slash, no ..)');
42
+ // Single-char ids are allowed; multi-char ids must end with alphanumeric
43
+ // (no trailing hyphen). This pattern: `[a-z0-9]([a-z0-9-]*[a-z0-9])?`
44
+ const bundleNamePattern = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/;
45
+ // ============================================
46
+ // Per-type config blocks
47
+ // ============================================
48
+ const ArtifactListsSchema = z.object({
49
+ agents: z.array(z.string()).max(200).optional(),
50
+ skills: z.array(z.string()).max(500).optional(),
51
+ rules: z.array(z.string()).max(200).optional(),
52
+ templates: z.array(z.string()).max(200).optional(),
53
+ prompts: z.array(z.string()).max(200).optional(),
54
+ hooks: z.array(z.string()).max(50).optional(),
55
+ commands: z.array(z.string()).max(200).optional(),
56
+ behaviors: z.array(z.string()).max(50).optional(),
57
+ });
58
+ const EntryPathsSchema = z.object({
59
+ agents: safeRelativePath.optional(),
60
+ skills: safeRelativePath.optional(),
61
+ rules: safeRelativePath.optional(),
62
+ templates: safeRelativePath.optional(),
63
+ prompts: safeRelativePath.optional(),
64
+ hooks: safeRelativePath.optional(),
65
+ commands: safeRelativePath.optional(),
66
+ behaviors: safeRelativePath.optional(),
67
+ }).strict();
68
+ export const AddonConfigSchema = z.object({
69
+ entry: EntryPathsSchema.optional(),
70
+ ...ArtifactListsSchema.shape,
71
+ core: z.boolean().optional(),
72
+ autoInstall: z.boolean().optional(),
73
+ }).strict();
74
+ export const FrameworkConfigSchema = z.object({
75
+ path: safeRelativePath.optional(),
76
+ files: z.array(safeRelativePath).max(100).optional(),
77
+ ignore: z.array(safeRelativePath).max(100).optional(),
78
+ contextContributions: z.object({
79
+ hookFragment: safeRelativePath.optional(),
80
+ sectionsDir: safeRelativePath.optional(),
81
+ sectionsManifest: safeRelativePath.optional(),
82
+ priority: z.number().int().min(0).max(100).optional(),
83
+ description: z.string().max(512).optional(),
84
+ }).strict().optional(),
85
+ }).strict();
86
+ export const ExtensionConfigSchema = z.object({
87
+ entry: EntryPathsSchema.optional(),
88
+ ...ArtifactListsSchema.shape,
89
+ }).strict();
90
+ export const PluginConfigSchema = z.object({
91
+ payloadType: z.enum(['addon', 'framework', 'extension']),
92
+ payloadPath: safeRelativePath,
93
+ }).strict();
94
+ const ProviderCapabilityFeatureSchema = z.enum([
95
+ 'cron',
96
+ 'agent_teams',
97
+ 'tasks',
98
+ 'mcp',
99
+ 'behaviors',
100
+ 'mission_control',
101
+ 'daemon',
102
+ ]);
103
+ const ProviderCapabilityEmulationSchema = z.enum([
104
+ 'native',
105
+ 'hooks',
106
+ 'aiwg-mc',
107
+ 'aiwg-schedule',
108
+ 'aiwg-daemon',
109
+ ]).nullable();
110
+ const ProviderCapabilityOverridesSchema = z.object({
111
+ nativeFeatures: z.record(ProviderCapabilityFeatureSchema, z.boolean()).optional(),
112
+ emulation: z.record(ProviderCapabilityFeatureSchema, ProviderCapabilityEmulationSchema).optional(),
113
+ }).strict();
114
+ export const ProviderConfigSchema = z.object({
115
+ extends: z.enum([
116
+ 'claude',
117
+ 'codex',
118
+ 'copilot',
119
+ 'cursor',
120
+ 'factory',
121
+ 'hermes',
122
+ 'opencode',
123
+ 'openclaw',
124
+ 'openhuman',
125
+ 'warp',
126
+ 'windsurf',
127
+ ]),
128
+ displayName: z.string().min(1).max(128).optional(),
129
+ aliases: z.array(z.string().min(1).max(64)).max(20).optional(),
130
+ capabilities: ProviderCapabilityOverridesSchema.optional(),
131
+ }).strict();
132
+ // ============================================
133
+ // Top-level BundleManifestSchema
134
+ // ============================================
135
+ export const BundleManifestSchema = z.object({
136
+ // Required core fields
137
+ id: z.string()
138
+ .min(1)
139
+ .max(64)
140
+ .regex(bundleNamePattern, 'kebab-case alphanumeric, no leading/trailing hyphen'),
141
+ type: ProjectLocalTypeSchema,
142
+ name: z.string().min(1).max(128),
143
+ version: z.string().regex(/^\d+\.\d+\.\d+/, 'CalVer or SemVer (X.Y.Z[...])'),
144
+ description: z.string().min(1).max(1024),
145
+ manifestVersion: z.literal('1'),
146
+ platforms: PlatformCompatibilitySchema,
147
+ keywords: z.array(z.string().max(64)).min(1).max(MAX_KEYWORDS_PER_MANIFEST),
148
+ deployment: DeploymentConfigSchema,
149
+ // Optional standard metadata
150
+ author: z.string().max(128).optional(),
151
+ license: z.string().max(64).optional(),
152
+ repository: z.string().url().max(512).optional(),
153
+ // Type-discriminated nested config (exactly one matches `type`)
154
+ addonConfig: AddonConfigSchema.optional(),
155
+ frameworkConfig: FrameworkConfigSchema.optional(),
156
+ extensionConfig: ExtensionConfigSchema.optional(),
157
+ pluginConfig: PluginConfigSchema.optional(),
158
+ providerConfig: ProviderConfigSchema.optional(),
159
+ // Override / safety-critical declarations (#1041)
160
+ 'safety-critical': z.boolean().optional(),
161
+ overrides: z.array(z.string().max(64)).max(MAX_OVERRIDES_PER_MANIFEST).optional(),
162
+ // Optional patterns shared with existing extension validation
163
+ deprecation: DeprecationSchema.optional(),
164
+ memory: MemoryFootprintSchema.optional(),
165
+ })
166
+ .strict()
167
+ .refine((m) => {
168
+ // Discriminator alignment: type must match the present *Config block(s)
169
+ const present = {
170
+ addon: m.addonConfig !== undefined,
171
+ framework: m.frameworkConfig !== undefined,
172
+ extension: m.extensionConfig !== undefined,
173
+ plugin: m.pluginConfig !== undefined,
174
+ provider: m.providerConfig !== undefined,
175
+ };
176
+ const presentCount = Object.values(present).filter(Boolean).length;
177
+ // Extension is the only type that may omit its config block; others require it
178
+ if (m.type === 'extension') {
179
+ return presentCount === 0 || (presentCount === 1 && present.extension);
180
+ }
181
+ return presentCount === 1 && present[m.type];
182
+ }, { message: 'type must match its corresponding *Config block (addon→addonConfig, framework→frameworkConfig, plugin→pluginConfig, provider→providerConfig; extension may omit extensionConfig)' });
183
+ /**
184
+ * Convert a Zod error into the structured ManifestValidationError shape used
185
+ * by discovery and `aiwg validate-metadata`.
186
+ */
187
+ export function zodErrorToValidationErrors(err, manifestPath) {
188
+ return err.errors.map((issue) => ({
189
+ path: manifestPath,
190
+ field: issue.path.join('.') || '(root)',
191
+ expected: issue.message,
192
+ actual: 'received' in issue ? String(issue.received) : 'invalid',
193
+ severity: 'error',
194
+ }));
195
+ }
196
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Project-Local Activity Log Helper
3
+ *
4
+ * Inline activity-log emission for project-local artifact lifecycle events.
5
+ * Wraps the storage adapter from `resolveStorage('activity_log')` and emits
6
+ * single-line entries per the format frozen by the activity-log rule.
7
+ *
8
+ * The generic post-command hook in `cli/hooks/builtin/activity-log-hook.ts`
9
+ * emits one entry per CLI invocation (`aiwg use sdlc`). This helper emits
10
+ * per-event entries (per-bundle, per-provider) at finer granularity, as
11
+ * specified by the design doc.
12
+ *
13
+ * @design @.aiwg/architecture/design-doctor-log-promote.md
14
+ * @implements #1037
15
+ * @issue #1049
16
+ */
17
+ import { formatEntry } from '../activity-log/types.js';
18
+ import { resolveStorage } from '../storage/index.js';
19
+ const LOG_PATH = 'activity.log';
20
+ /** Map design-event → frozen wire-format op token. */
21
+ const EVENT_TO_OP = {
22
+ discover: 'query',
23
+ deploy: 'deploy',
24
+ 'deploy-failed': 'deploy',
25
+ conflict: 'deploy',
26
+ 'shadow-acknowledged': 'deploy',
27
+ 'shadow-refused': 'deploy',
28
+ remove: 'delete',
29
+ 'remove-mutated': 'delete',
30
+ 'remove-conflict': 'delete',
31
+ 'remove-force': 'delete',
32
+ promote: 'promote',
33
+ 'promote-failed': 'promote',
34
+ };
35
+ /**
36
+ * Append an activity-log entry for a project-local lifecycle event.
37
+ *
38
+ * Non-blocking: write failures are swallowed with a stderr warning. The
39
+ * caller's primary operation must not depend on log success.
40
+ *
41
+ * Wire format: `## [TS] <op> | <event>: <name>:<type> | <summary>`
42
+ */
43
+ export async function appendProjectLocalActivity(ev) {
44
+ if (process.env['AIWG_SKIP_ACTIVITY_LOG']) {
45
+ const v = process.env['AIWG_SKIP_ACTIVITY_LOG'].toLowerCase().trim();
46
+ if (v && v !== '0' && v !== 'false')
47
+ return;
48
+ }
49
+ const op = EVENT_TO_OP[ev.event];
50
+ const compactSummary = `${ev.event}: ${ev.name}:${ev.type} | ${ev.summary}`;
51
+ const line = formatEntry({
52
+ timestamp: new Date(),
53
+ operation: op,
54
+ summary: compactSummary,
55
+ }) + '\n';
56
+ try {
57
+ const adapter = await resolveStorage('activity_log');
58
+ if (typeof adapter.append === 'function') {
59
+ const existing = (await adapter.read(LOG_PATH)) ?? '';
60
+ if (existing.length > 0 && !existing.endsWith('\n')) {
61
+ await adapter.append(LOG_PATH, '\n');
62
+ }
63
+ await adapter.append(LOG_PATH, line);
64
+ }
65
+ else {
66
+ const existing = (await adapter.read(LOG_PATH)) ?? '';
67
+ const trailing = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
68
+ await adapter.write(LOG_PATH, existing + trailing + line);
69
+ }
70
+ }
71
+ catch (err) {
72
+ const msg = err instanceof Error ? err.message : String(err);
73
+ process.stderr.write(`project-local activity log append failed (non-fatal): ${msg}\n`);
74
+ }
75
+ }
76
+ /**
77
+ * Emit `discover` events for newly-seen bundles. Per #1049 design's
78
+ * "discover noise control": dedupe by reading the most recent N lines
79
+ * and skipping (name, type) pairs that already appeared.
80
+ *
81
+ * Cheap heuristic — exact log de-dup is not required. We just want to
82
+ * avoid filling the log with the same lines on every read-only command.
83
+ */
84
+ export async function emitDiscoverEventsDeduped(bundles) {
85
+ if (bundles.length === 0)
86
+ return;
87
+ if (process.env['AIWG_SKIP_ACTIVITY_LOG']) {
88
+ const v = process.env['AIWG_SKIP_ACTIVITY_LOG'].toLowerCase().trim();
89
+ if (v && v !== '0' && v !== 'false')
90
+ return;
91
+ }
92
+ let recent = '';
93
+ try {
94
+ const adapter = await resolveStorage('activity_log');
95
+ recent = (await adapter.read(LOG_PATH)) ?? '';
96
+ }
97
+ catch {
98
+ // Read failed — fall through and emit unconditionally (rather than
99
+ // suppress important events because we couldn't read history).
100
+ }
101
+ const tail = recent.split('\n').slice(-200).join('\n');
102
+ for (const b of bundles) {
103
+ const marker = `discover: ${b.id}:${b.type}`;
104
+ if (tail.includes(marker))
105
+ continue;
106
+ await appendProjectLocalActivity({
107
+ event: 'discover',
108
+ name: b.id,
109
+ type: b.type,
110
+ summary: `manifest discovered`,
111
+ });
112
+ }
113
+ }
114
+ //# sourceMappingURL=project-local-activity.js.map
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Project-Local Bundle Discovery
3
+ *
4
+ * Scans `.aiwg/{extensions,addons,frameworks,plugins,providers}/<name>/manifest.json`
5
+ * and validates each manifest against the unified schema. Read-only — no
6
+ * deployment side effects.
7
+ *
8
+ * @implements #1034
9
+ * @architecture .aiwg/architecture/adr-aiwg-directory-layout.md (#1039)
10
+ * @architecture .aiwg/architecture/design-manifest-schema.md (#1044)
11
+ */
12
+ import { readFile, readdir, lstat, stat, access } from 'fs/promises';
13
+ import { join } from 'path';
14
+ import { BundleManifestSchema, zodErrorToValidationErrors, MANIFEST_MAX_BYTES, MAX_BUNDLES_PER_PROJECT, } from './manifest.js';
15
+ import { ensureTrailingSlash, projectLocalDisplayPath, PROJECT_LOCAL_DIR_TO_TYPE, PROJECT_LOCAL_SCAN_DIRS, resolveProjectLocalSearchRoots, } from './project-local-paths.js';
16
+ /**
17
+ * Scan all project-local `.aiwg/<type>/` directories for bundles. Returns
18
+ * a structured result with bundles, errors, and counts. Missing directories
19
+ * are silently skipped (per #1039 §3 / UC-PL-6).
20
+ */
21
+ export async function discoverProjectLocalBundles(projectDir, options = {}) {
22
+ const bundles = [];
23
+ const errors = [];
24
+ const counts = {
25
+ extension: 0,
26
+ addon: 0,
27
+ framework: 0,
28
+ plugin: 0,
29
+ provider: 0,
30
+ };
31
+ let totalScanned = 0;
32
+ const searchRoots = resolveProjectLocalSearchRoots(projectDir);
33
+ for (const searchRoot of searchRoots) {
34
+ for (const dirName of PROJECT_LOCAL_SCAN_DIRS) {
35
+ const type = PROJECT_LOCAL_DIR_TO_TYPE[dirName];
36
+ const dirPath = join(searchRoot.rootPath, dirName);
37
+ let bundleNames;
38
+ try {
39
+ bundleNames = await readdir(dirPath);
40
+ }
41
+ catch {
42
+ // Directory absent — silently skip (no-op when absent per UC-PL-6)
43
+ continue;
44
+ }
45
+ for (const bundleName of bundleNames) {
46
+ const bundlePath = join(dirPath, bundleName);
47
+ // Skip non-directory entries (e.g., the legacy registry.json file)
48
+ let isDir;
49
+ try {
50
+ const st = await lstat(bundlePath);
51
+ if (st.isSymbolicLink()) {
52
+ if (!options.allowSymlinks) {
53
+ errors.push({
54
+ path: bundlePath,
55
+ field: '(bundle directory)',
56
+ expected: 'regular directory',
57
+ actual: 'symlink',
58
+ hint: 'Pass --allow-symlinks to opt in (per #1042 threat model T3)',
59
+ severity: 'error',
60
+ });
61
+ continue;
62
+ }
63
+ // Resolve the symlink and check the target is a directory
64
+ const target = await stat(bundlePath);
65
+ isDir = target.isDirectory();
66
+ }
67
+ else {
68
+ isDir = st.isDirectory();
69
+ }
70
+ }
71
+ catch {
72
+ continue;
73
+ }
74
+ if (!isDir)
75
+ continue;
76
+ const manifestPath = join(bundlePath, 'manifest.json');
77
+ // Silently skip directories without manifest.json — these are not
78
+ // project-local bundles. Most commonly, .aiwg/frameworks/<id>/ holds
79
+ // workspace state from initializeFrameworkWorkspace() (archive/,
80
+ // projects/, repo/, working/), not a bundle. Issue #1058.
81
+ try {
82
+ await access(manifestPath);
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ totalScanned++;
88
+ // Enforce per-project bundle count cap (#1042 D2 / NFR-PL-12)
89
+ if (totalScanned > MAX_BUNDLES_PER_PROJECT) {
90
+ errors.push({
91
+ path: dirPath,
92
+ field: '(bundle count)',
93
+ expected: `<= ${MAX_BUNDLES_PER_PROJECT} bundles per project`,
94
+ actual: `>${MAX_BUNDLES_PER_PROJECT}`,
95
+ hint: 'Refusing to scan further bundles. Reduce project-local artifact count.',
96
+ severity: 'error',
97
+ });
98
+ const isEmpty = bundles.length === 0;
99
+ return { bundles, errors, isEmpty, counts };
100
+ }
101
+ const result = await loadAndValidateManifest(manifestPath, type, projectDir, searchRoot);
102
+ if (result.bundle) {
103
+ bundles.push(result.bundle);
104
+ counts[result.bundle.type]++;
105
+ }
106
+ errors.push(...result.errors);
107
+ }
108
+ }
109
+ }
110
+ // Cross-bundle: check for case-insensitive id collisions within a single type
111
+ // (NFR-PL-6) and duplicate ids (per #1041 §4 case 6)
112
+ for (const type of ['extension', 'addon', 'framework', 'plugin', 'provider']) {
113
+ const bundlesOfType = bundles.filter((b) => b.type === type);
114
+ const idsLower = new Map();
115
+ for (const b of bundlesOfType) {
116
+ const key = b.id.toLowerCase();
117
+ const existing = idsLower.get(key) ?? [];
118
+ existing.push(b);
119
+ idsLower.set(key, existing);
120
+ }
121
+ for (const [, group] of idsLower) {
122
+ if (group.length > 1) {
123
+ for (const b of group) {
124
+ errors.push({
125
+ path: b.manifestPath,
126
+ field: 'id',
127
+ expected: 'unique id (case-insensitive) within type',
128
+ actual: `${b.id} (collides with ${group.filter((g) => g !== b).map((g) => g.id).join(', ')})`,
129
+ hint: 'Two bundles within the same type may not share an id, even differing only in case',
130
+ severity: 'error',
131
+ });
132
+ }
133
+ // Drop colliding bundles from the result so they don't get treated as
134
+ // valid downstream
135
+ for (const b of group) {
136
+ const idx = bundles.indexOf(b);
137
+ if (idx >= 0) {
138
+ bundles.splice(idx, 1);
139
+ counts[b.type]--;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+ const isEmpty = bundles.length === 0 && errors.length === 0;
146
+ return { bundles, errors, isEmpty, counts };
147
+ }
148
+ /**
149
+ * Read a single manifest.json, validate it, and return either a bundle or
150
+ * structured errors. Used by the scanner; exported for tests.
151
+ */
152
+ export async function loadAndValidateManifest(manifestPath, expectedType, projectDir, searchRoot) {
153
+ // Size cap (#1042 D1 / NFR-PL-11): refuse before parse
154
+ let st;
155
+ try {
156
+ st = await stat(manifestPath);
157
+ }
158
+ catch {
159
+ return {
160
+ errors: [{
161
+ path: manifestPath,
162
+ field: '(file)',
163
+ expected: 'manifest.json present',
164
+ actual: 'absent',
165
+ hint: 'Project-local bundle directory missing manifest.json',
166
+ severity: 'error',
167
+ }],
168
+ };
169
+ }
170
+ if (st.size > MANIFEST_MAX_BYTES) {
171
+ return {
172
+ errors: [{
173
+ path: manifestPath,
174
+ field: '(file size)',
175
+ expected: `<= ${MANIFEST_MAX_BYTES} bytes`,
176
+ actual: `${st.size} bytes`,
177
+ hint: 'Manifest exceeds size limit; refusing to parse',
178
+ severity: 'error',
179
+ }],
180
+ };
181
+ }
182
+ let raw;
183
+ try {
184
+ raw = await readFile(manifestPath, 'utf-8');
185
+ }
186
+ catch (err) {
187
+ return {
188
+ errors: [{
189
+ path: manifestPath,
190
+ field: '(read)',
191
+ expected: 'readable manifest.json',
192
+ actual: err.message,
193
+ severity: 'error',
194
+ }],
195
+ };
196
+ }
197
+ // Encoding check (NFR-PL-5): UTF-8 BOM is allowed; we'll normalize. Other
198
+ // BOMs (UTF-16 LE/BE, Latin-1) are rejected.
199
+ if (raw.charCodeAt(0) === 0xFEFF) {
200
+ raw = raw.slice(1);
201
+ }
202
+ else if (raw.charCodeAt(0) === 0xFFFE || raw.charCodeAt(0) === 0xFEFF) {
203
+ return {
204
+ errors: [{
205
+ path: manifestPath,
206
+ field: '(encoding)',
207
+ expected: 'UTF-8',
208
+ actual: 'non-UTF-8 BOM detected',
209
+ hint: 'Manifest must be UTF-8 encoded',
210
+ severity: 'error',
211
+ }],
212
+ };
213
+ }
214
+ let parsed;
215
+ try {
216
+ parsed = JSON.parse(raw);
217
+ }
218
+ catch (err) {
219
+ return {
220
+ errors: [{
221
+ path: manifestPath,
222
+ field: '(JSON parse)',
223
+ expected: 'valid JSON',
224
+ actual: err.message,
225
+ severity: 'error',
226
+ }],
227
+ };
228
+ }
229
+ const result = BundleManifestSchema.safeParse(parsed);
230
+ if (!result.success) {
231
+ return { errors: zodErrorToValidationErrors(result.error, manifestPath) };
232
+ }
233
+ const manifest = result.data;
234
+ // Cross-check: manifest declared type must match the directory it lives in.
235
+ if (manifest.type !== expectedType) {
236
+ return {
237
+ errors: [{
238
+ path: manifestPath,
239
+ field: 'type',
240
+ expected: `"${expectedType}" (matching directory .aiwg/${expectedType}s/)`,
241
+ actual: `"${manifest.type}"`,
242
+ hint: `Bundle in .aiwg/${expectedType}s/ must declare type: "${expectedType}"`,
243
+ severity: 'error',
244
+ }],
245
+ };
246
+ }
247
+ const bundlePath = manifestPath.slice(0, -'/manifest.json'.length);
248
+ const localPath = ensureTrailingSlash(projectLocalDisplayPath(projectDir, bundlePath, searchRoot));
249
+ return {
250
+ bundle: {
251
+ id: manifest.id,
252
+ type: manifest.type,
253
+ manifest,
254
+ bundlePath,
255
+ localPath,
256
+ manifestPath: projectLocalDisplayPath(projectDir, manifestPath, searchRoot),
257
+ },
258
+ errors: [],
259
+ };
260
+ }
261
+ //# sourceMappingURL=project-local-discovery.js.map