@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -1
  3. package/bin/aiwg.mjs +349 -0
  4. package/dist/src/a2a/agent-card.js +145 -0
  5. package/dist/src/a2a/client.js +411 -0
  6. package/dist/src/a2a/hitl-cli.js +171 -0
  7. package/dist/src/a2a/hitl-driver.js +370 -0
  8. package/dist/src/a2a/hitl.js +181 -0
  9. package/dist/src/a2a/http.js +193 -0
  10. package/dist/src/a2a/jcs.js +128 -0
  11. package/dist/src/a2a/jws.js +187 -0
  12. package/dist/src/a2a/types.js +24 -0
  13. package/dist/src/a2a/webhook.js +240 -0
  14. package/dist/src/activity-log/cli.js +348 -0
  15. package/dist/src/activity-log/parser.js +81 -0
  16. package/dist/src/activity-log/types.js +50 -0
  17. package/dist/src/agents/agent-deployer.js +367 -0
  18. package/dist/src/agents/agent-packager.js +271 -0
  19. package/dist/src/agents/agent-validator.js +271 -0
  20. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  21. package/dist/src/agents/grounding/types.js +12 -0
  22. package/dist/src/agents/index.js +10 -0
  23. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  24. package/dist/src/agents/types.js +7 -0
  25. package/dist/src/api/index.d.ts +10 -0
  26. package/dist/src/api/index.js +10 -0
  27. package/dist/src/artifacts/address-parser.js +73 -0
  28. package/dist/src/artifacts/audit/cli.js +183 -0
  29. package/dist/src/artifacts/audit/drift.js +122 -0
  30. package/dist/src/artifacts/audit/types.js +12 -0
  31. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  32. package/dist/src/artifacts/backends/json-backend.js +129 -0
  33. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  34. package/dist/src/artifacts/browser-export.js +622 -0
  35. package/dist/src/artifacts/capability-resolver.js +94 -0
  36. package/dist/src/artifacts/checksum-manifest.js +91 -0
  37. package/dist/src/artifacts/citation-parser.js +162 -0
  38. package/dist/src/artifacts/cli.js +1486 -0
  39. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  40. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  41. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  42. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  43. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  44. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  45. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  46. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  47. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  48. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  49. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  51. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  52. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  53. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  54. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  55. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  56. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  57. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  58. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  60. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  61. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  62. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  63. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  64. package/dist/src/artifacts/corpus-views/build.js +126 -0
  65. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  66. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  67. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  68. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  69. package/dist/src/artifacts/dep-graph.js +173 -0
  70. package/dist/src/artifacts/discover-facets.js +375 -0
  71. package/dist/src/artifacts/embedding-index.js +354 -0
  72. package/dist/src/artifacts/enrichment/cli.js +240 -0
  73. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  74. package/dist/src/artifacts/enrichment/store.js +90 -0
  75. package/dist/src/artifacts/enrichment/types.js +12 -0
  76. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  77. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  78. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  79. package/dist/src/artifacts/fulltext.js +108 -0
  80. package/dist/src/artifacts/graph-backend.js +51 -0
  81. package/dist/src/artifacts/graph-query.js +247 -0
  82. package/dist/src/artifacts/hybrid-query.js +225 -0
  83. package/dist/src/artifacts/index-builder.js +1089 -0
  84. package/dist/src/artifacts/index-reader.js +112 -0
  85. package/dist/src/artifacts/index-status.js +193 -0
  86. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  87. package/dist/src/artifacts/move.js +154 -0
  88. package/dist/src/artifacts/operational-state.js +239 -0
  89. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  90. package/dist/src/artifacts/query-engine.js +1955 -0
  91. package/dist/src/artifacts/source-graph.js +529 -0
  92. package/dist/src/artifacts/stats.js +169 -0
  93. package/dist/src/artifacts/types.js +606 -0
  94. package/dist/src/artifacts/views/cli.js +293 -0
  95. package/dist/src/artifacts/views/definition.js +170 -0
  96. package/dist/src/artifacts/views/store.js +149 -0
  97. package/dist/src/artifacts/views/types.js +8 -0
  98. package/dist/src/artifacts/watcher.js +255 -0
  99. package/dist/src/catalog/builtin-models.json +636 -0
  100. package/dist/src/catalog/cli.js +228 -0
  101. package/dist/src/catalog/cli.mjs +289 -0
  102. package/dist/src/catalog/index.js +15 -0
  103. package/dist/src/catalog/loader.js +217 -0
  104. package/dist/src/catalog/loader.mjs +251 -0
  105. package/dist/src/catalog/sources.json +41 -0
  106. package/dist/src/catalog/types.js +8 -0
  107. package/dist/src/channel/manager.mjs +504 -0
  108. package/dist/src/cli/agent-spawn.js +178 -0
  109. package/dist/src/cli/cli-extension-loader.js +245 -0
  110. package/dist/src/cli/command-log.js +275 -0
  111. package/dist/src/cli/config-loader.js +232 -0
  112. package/dist/src/cli/env.js +82 -0
  113. package/dist/src/cli/errors.js +150 -0
  114. package/dist/src/cli/find-package-root.js +40 -0
  115. package/dist/src/cli/git-hooks.js +250 -0
  116. package/dist/src/cli/handlers/agentcard.js +206 -0
  117. package/dist/src/cli/handlers/artifacts.js +76 -0
  118. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  119. package/dist/src/cli/handlers/cockpit.js +137 -0
  120. package/dist/src/cli/handlers/command-log.js +37 -0
  121. package/dist/src/cli/handlers/daemon.js +59 -0
  122. package/dist/src/cli/handlers/diagnose.js +300 -0
  123. package/dist/src/cli/handlers/execution-mode.js +105 -0
  124. package/dist/src/cli/handlers/feedback.js +341 -0
  125. package/dist/src/cli/handlers/help.js +147 -0
  126. package/dist/src/cli/handlers/index.js +302 -0
  127. package/dist/src/cli/handlers/init.js +179 -0
  128. package/dist/src/cli/handlers/install.js +129 -0
  129. package/dist/src/cli/handlers/issues.js +46 -0
  130. package/dist/src/cli/handlers/lint.js +42 -0
  131. package/dist/src/cli/handlers/local-executor.js +315 -0
  132. package/dist/src/cli/handlers/marketplace.js +168 -0
  133. package/dist/src/cli/handlers/mc.js +1010 -0
  134. package/dist/src/cli/handlers/models.js +352 -0
  135. package/dist/src/cli/handlers/packages.js +155 -0
  136. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  137. package/dist/src/cli/handlers/ralph.js +575 -0
  138. package/dist/src/cli/handlers/refresh.js +432 -0
  139. package/dist/src/cli/handlers/regenerate.js +336 -0
  140. package/dist/src/cli/handlers/repo-access.js +109 -0
  141. package/dist/src/cli/handlers/run.js +165 -0
  142. package/dist/src/cli/handlers/runtime-info.js +301 -0
  143. package/dist/src/cli/handlers/sandbox.js +197 -0
  144. package/dist/src/cli/handlers/scaffolding.js +149 -0
  145. package/dist/src/cli/handlers/script-runner.js +121 -0
  146. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  147. package/dist/src/cli/handlers/serve.js +1835 -0
  148. package/dist/src/cli/handlers/session.js +348 -0
  149. package/dist/src/cli/handlers/setup.js +440 -0
  150. package/dist/src/cli/handlers/skill-lint.js +367 -0
  151. package/dist/src/cli/handlers/skill-usage.js +74 -0
  152. package/dist/src/cli/handlers/steward.js +567 -0
  153. package/dist/src/cli/handlers/subcommands.js +1702 -0
  154. package/dist/src/cli/handlers/team.js +337 -0
  155. package/dist/src/cli/handlers/types.js +11 -0
  156. package/dist/src/cli/handlers/use.js +2772 -0
  157. package/dist/src/cli/handlers/utilities.js +703 -0
  158. package/dist/src/cli/handlers/version.js +134 -0
  159. package/dist/src/cli/handlers/workspace-context.js +93 -0
  160. package/dist/src/cli/handlers/workspace.js +126 -0
  161. package/dist/src/cli/help-generator.js +178 -0
  162. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  163. package/dist/src/cli/hooks/executor.js +96 -0
  164. package/dist/src/cli/hooks/index.js +15 -0
  165. package/dist/src/cli/hooks/registry.js +143 -0
  166. package/dist/src/cli/hooks/types.js +13 -0
  167. package/dist/src/cli/log.js +492 -0
  168. package/dist/src/cli/project-isolation/detect.js +70 -0
  169. package/dist/src/cli/project-isolation/index.js +7 -0
  170. package/dist/src/cli/project-isolation/signals.js +17 -0
  171. package/dist/src/cli/project-isolation/warning.js +102 -0
  172. package/dist/src/cli/prompt-utils.js +155 -0
  173. package/dist/src/cli/provider-deployment-plan.js +126 -0
  174. package/dist/src/cli/provider-resolution.js +119 -0
  175. package/dist/src/cli/router.js +305 -0
  176. package/dist/src/cli/scope-resolver.js +392 -0
  177. package/dist/src/cli/skill-usage.js +616 -0
  178. package/dist/src/cli/ui.js +224 -0
  179. package/dist/src/cli/watch-service.js +203 -0
  180. package/dist/src/cli/workflow-orchestrator.js +478 -0
  181. package/dist/src/cli/workspace-signals.js +321 -0
  182. package/dist/src/community/footer.js +14 -0
  183. package/dist/src/community/links.js +123 -0
  184. package/dist/src/community/milestones.js +46 -0
  185. package/dist/src/community/nudge-policy.js +93 -0
  186. package/dist/src/config/aiwg-config.js +883 -0
  187. package/dist/src/config/cli.js +703 -0
  188. package/dist/src/config/gitignore.js +156 -0
  189. package/dist/src/config/project-artifacts.js +76 -0
  190. package/dist/src/config/user-config.js +428 -0
  191. package/dist/src/config/user-registry.js +127 -0
  192. package/dist/src/config/workspace.js +276 -0
  193. package/dist/src/contributors/detect.js +39 -0
  194. package/dist/src/contributors/discover.js +172 -0
  195. package/dist/src/contributors/heuristic.js +186 -0
  196. package/dist/src/contributors/index.js +11 -0
  197. package/dist/src/contributors/types.js +13 -0
  198. package/dist/src/contributors/validation.js +116 -0
  199. package/dist/src/data/community.schema.json +43 -0
  200. package/dist/src/data/community.yaml +16 -0
  201. package/dist/src/extensions/capability-index.js +270 -0
  202. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  203. package/dist/src/extensions/commands/definitions.js +3485 -0
  204. package/dist/src/extensions/deployment-registration.js +463 -0
  205. package/dist/src/extensions/index.js +22 -0
  206. package/dist/src/extensions/loader.js +132 -0
  207. package/dist/src/extensions/managed-marker.js +100 -0
  208. package/dist/src/extensions/manifest.js +196 -0
  209. package/dist/src/extensions/project-local-activity.js +114 -0
  210. package/dist/src/extensions/project-local-discovery.js +261 -0
  211. package/dist/src/extensions/project-local-doctor.js +281 -0
  212. package/dist/src/extensions/project-local-gitignore.js +176 -0
  213. package/dist/src/extensions/project-local-paths.js +121 -0
  214. package/dist/src/extensions/project-local-promote.js +218 -0
  215. package/dist/src/extensions/project-local-remove.js +373 -0
  216. package/dist/src/extensions/project-local-scaffold.js +252 -0
  217. package/dist/src/extensions/project-quickref.js +291 -0
  218. package/dist/src/extensions/registry.js +368 -0
  219. package/dist/src/extensions/shadow-resolver.js +271 -0
  220. package/dist/src/extensions/types.js +86 -0
  221. package/dist/src/extensions/upstream-registry.js +195 -0
  222. package/dist/src/extensions/validation.js +631 -0
  223. package/dist/src/features/catalog.js +88 -0
  224. package/dist/src/features/cli.js +197 -0
  225. package/dist/src/features/installer.js +57 -0
  226. package/dist/src/features/paths.js +14 -0
  227. package/dist/src/features/runtime.js +21 -0
  228. package/dist/src/features/status.js +134 -0
  229. package/dist/src/hooks/laziness-detection.js +532 -0
  230. package/dist/src/intake/git-history-analyzer.js +486 -0
  231. package/dist/src/intake/index.js +9 -0
  232. package/dist/src/issues/cli.js +327 -0
  233. package/dist/src/issues/index.js +5 -0
  234. package/dist/src/issues/live.js +154 -0
  235. package/dist/src/issues/local.js +666 -0
  236. package/dist/src/issues/sync.js +143 -0
  237. package/dist/src/issues/types.js +2 -0
  238. package/dist/src/issues/workflows.js +164 -0
  239. package/dist/src/kb/cli.js +173 -0
  240. package/dist/src/lint/cli.js +171 -0
  241. package/dist/src/lint/loader.js +225 -0
  242. package/dist/src/lint/reporters.js +141 -0
  243. package/dist/src/lint/runner.js +364 -0
  244. package/dist/src/lint/types.js +10 -0
  245. package/dist/src/marketplace/cache.js +110 -0
  246. package/dist/src/marketplace/identifier.js +63 -0
  247. package/dist/src/marketplace/registry.js +36 -0
  248. package/dist/src/marketplace/sources/clawhub.js +53 -0
  249. package/dist/src/marketplace/sources/git.js +45 -0
  250. package/dist/src/marketplace/types.js +9 -0
  251. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  252. package/dist/src/mcp/cli.mjs +1197 -0
  253. package/dist/src/mcp/elicitation.mjs +149 -0
  254. package/dist/src/mcp/helpers.mjs +287 -0
  255. package/dist/src/mcp/index.mjs +11 -0
  256. package/dist/src/mcp/profiles.js +263 -0
  257. package/dist/src/mcp/profiles.mjs +360 -0
  258. package/dist/src/mcp/registry.js +376 -0
  259. package/dist/src/mcp/registry.mjs +387 -0
  260. package/dist/src/mcp/server.mjs +633 -0
  261. package/dist/src/mcp/test-simple.mjs +271 -0
  262. package/dist/src/mcp/tools/command-run.mjs +101 -0
  263. package/dist/src/mcp/tools/discovery.mjs +291 -0
  264. package/dist/src/mcp/tools/interaction.mjs +87 -0
  265. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  266. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  267. package/dist/src/memory/cli.js +166 -0
  268. package/dist/src/memory/project-registry.js +282 -0
  269. package/dist/src/metrics/artifact-metrics.js +184 -0
  270. package/dist/src/metrics/context-budget.js +174 -0
  271. package/dist/src/metrics/token-counter.js +133 -0
  272. package/dist/src/models/config-loader.js +228 -0
  273. package/dist/src/models/index.js +22 -0
  274. package/dist/src/models/model-capabilities.v1.json +120 -0
  275. package/dist/src/models/model-catalog.v1.json +96 -0
  276. package/dist/src/models/model-discovery.js +521 -0
  277. package/dist/src/models/provider-models.js +73 -0
  278. package/dist/src/models/provider-policy.js +273 -0
  279. package/dist/src/models/resolver.js +245 -0
  280. package/dist/src/models/router.js +70 -0
  281. package/dist/src/models/types.js +8 -0
  282. package/dist/src/models/wrapper-deployment.js +178 -0
  283. package/dist/src/models/wrapper-route.js +54 -0
  284. package/dist/src/ops/cli.js +268 -0
  285. package/dist/src/ops/registry.js +623 -0
  286. package/dist/src/packages/adapters/clawhub.js +113 -0
  287. package/dist/src/packages/adapters/git.js +153 -0
  288. package/dist/src/packages/adapters/gitea.js +93 -0
  289. package/dist/src/packages/adapters/github.js +69 -0
  290. package/dist/src/packages/adapters/local-cache.js +89 -0
  291. package/dist/src/packages/package-registry.js +143 -0
  292. package/dist/src/packages/registry.js +238 -0
  293. package/dist/src/packages/types.js +11 -0
  294. package/dist/src/plugin/cross-framework-ops.js +475 -0
  295. package/dist/src/plugin/framework-config-loader.js +235 -0
  296. package/dist/src/plugin/framework-detector.js +186 -0
  297. package/dist/src/plugin/framework-isolator.js +341 -0
  298. package/dist/src/plugin/framework-migration.js +371 -0
  299. package/dist/src/plugin/metadata-validator.js +906 -0
  300. package/dist/src/plugin/plugin-installer.js +436 -0
  301. package/dist/src/plugin/plugin-status.js +369 -0
  302. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  303. package/dist/src/plugin/registry-validator.js +344 -0
  304. package/dist/src/plugin/skill-command-translator.js +415 -0
  305. package/dist/src/plugin/workspace-creator.js +189 -0
  306. package/dist/src/plugin/workspace-migrator.js +821 -0
  307. package/dist/src/policy/authorization.js +390 -0
  308. package/dist/src/policy/repo-access.js +215 -0
  309. package/dist/src/provenance/cli.js +16 -0
  310. package/dist/src/providers/capability-matrix.js +300 -0
  311. package/dist/src/providers/capability-matrix.yaml +514 -0
  312. package/dist/src/providers/provider-definitions.js +977 -0
  313. package/dist/src/providers/provider-definitions.mjs +159 -0
  314. package/dist/src/providers/provider-inventory.js +169 -0
  315. package/dist/src/quality/feedback-ab.js +174 -0
  316. package/dist/src/quality/feedback-collector.js +176 -0
  317. package/dist/src/quality/feedback-tracker.js +123 -0
  318. package/dist/src/quality/patterns/adr.json +24 -0
  319. package/dist/src/quality/patterns/sad.json +24 -0
  320. package/dist/src/quality/patterns/test-plan.json +24 -0
  321. package/dist/src/quality/patterns/use-case.json +24 -0
  322. package/dist/src/quality/scoring.js +157 -0
  323. package/dist/src/reflections/cli.js +15 -0
  324. package/dist/src/release/plan.js +139 -0
  325. package/dist/src/research/cache/manager.js +227 -0
  326. package/dist/src/research/clients/arxiv.js +156 -0
  327. package/dist/src/research/clients/base.js +197 -0
  328. package/dist/src/research/clients/crossref.js +112 -0
  329. package/dist/src/research/clients/semantic-scholar.js +126 -0
  330. package/dist/src/research/clients/unpaywall.js +87 -0
  331. package/dist/src/research/index.js +14 -0
  332. package/dist/src/research/query-cli.js +336 -0
  333. package/dist/src/research/services/acquisition.js +313 -0
  334. package/dist/src/research/services/archival.js +225 -0
  335. package/dist/src/research/services/citation.js +279 -0
  336. package/dist/src/research/services/discovery.js +243 -0
  337. package/dist/src/research/services/documentation.js +269 -0
  338. package/dist/src/research/services/index.js +14 -0
  339. package/dist/src/research/services/provenance.js +279 -0
  340. package/dist/src/research/services/quality.js +370 -0
  341. package/dist/src/research/services/types.js +7 -0
  342. package/dist/src/research/storage-cli.js +20 -0
  343. package/dist/src/research/types.js +47 -0
  344. package/dist/src/resources/index.d.ts +2 -0
  345. package/dist/src/resources/index.js +2 -0
  346. package/dist/src/resources/web-release.d.ts +89 -0
  347. package/dist/src/resources/web-release.js +886 -0
  348. package/dist/src/rlm/cache/cli.js +162 -0
  349. package/dist/src/rlm/cache/hash.js +35 -0
  350. package/dist/src/rlm/cache/store.js +170 -0
  351. package/dist/src/rlm/cache/types.js +8 -0
  352. package/dist/src/rlm/cli.js +650 -0
  353. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  354. package/dist/src/serve/agent-router.js +205 -0
  355. package/dist/src/serve/dispatch-router.js +171 -0
  356. package/dist/src/serve/executor-registry.js +715 -0
  357. package/dist/src/serve/mission-conductor.js +177 -0
  358. package/dist/src/serve/orchestrator-adapter.js +113 -0
  359. package/dist/src/serve/orchestrator-override.js +94 -0
  360. package/dist/src/serve/orchestrator-pty.js +133 -0
  361. package/dist/src/serve/pty-bridge.js +799 -0
  362. package/dist/src/serve/sandbox-registry.js +832 -0
  363. package/dist/src/serve/screen-reader.js +228 -0
  364. package/dist/src/serve/stack-adapters.js +68 -0
  365. package/dist/src/serve/telemetry.js +143 -0
  366. package/dist/src/skills/adapters/clawhub.js +250 -0
  367. package/dist/src/skills/adapters/local.js +335 -0
  368. package/dist/src/skills/adapters/openclaw.js +316 -0
  369. package/dist/src/skills/cli.js +334 -0
  370. package/dist/src/skills/registry.js +117 -0
  371. package/dist/src/skills/run.js +259 -0
  372. package/dist/src/skills/runtime.js +94 -0
  373. package/dist/src/skills/types.js +10 -0
  374. package/dist/src/smiths/agentsmith/demo.js +116 -0
  375. package/dist/src/smiths/agentsmith/examples.js +300 -0
  376. package/dist/src/smiths/agentsmith/generator.js +503 -0
  377. package/dist/src/smiths/agentsmith/index.js +11 -0
  378. package/dist/src/smiths/agentsmith/types.js +8 -0
  379. package/dist/src/smiths/commandsmith/example.js +220 -0
  380. package/dist/src/smiths/commandsmith/generator.js +288 -0
  381. package/dist/src/smiths/commandsmith/index.js +41 -0
  382. package/dist/src/smiths/commandsmith/templates.js +296 -0
  383. package/dist/src/smiths/commandsmith/types.js +7 -0
  384. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  385. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  386. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  387. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  388. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  389. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  390. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  391. package/dist/src/smiths/context-pipeline/index.js +30 -0
  392. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  393. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  394. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  395. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  396. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  397. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  398. package/dist/src/smiths/context-pipeline/types.js +23 -0
  399. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  400. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  401. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  402. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  403. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  404. package/dist/src/smiths/hook-bridge/index.js +79 -0
  405. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  406. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  407. package/dist/src/smiths/hook-bridge/types.js +31 -0
  408. package/dist/src/smiths/index.js +39 -0
  409. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  410. package/dist/src/smiths/mcpsmith/example.js +119 -0
  411. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  412. package/dist/src/smiths/mcpsmith/index.js +17 -0
  413. package/dist/src/smiths/mcpsmith/types.js +10 -0
  414. package/dist/src/smiths/platform-paths.js +101 -0
  415. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  416. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  417. package/dist/src/smiths/skillsmith/demo.js +83 -0
  418. package/dist/src/smiths/skillsmith/examples.js +161 -0
  419. package/dist/src/smiths/skillsmith/generator.js +316 -0
  420. package/dist/src/smiths/skillsmith/index.js +12 -0
  421. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  422. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  423. package/dist/src/smiths/skillsmith/types.js +9 -0
  424. package/dist/src/smiths/toolsmith/index.js +10 -0
  425. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  426. package/dist/src/smiths/toolsmith/types.js +8 -0
  427. package/dist/src/storage/backends/fortemi.js +227 -0
  428. package/dist/src/storage/backends/fs.js +134 -0
  429. package/dist/src/storage/backends/logseq.js +309 -0
  430. package/dist/src/storage/backends/obsidian.js +233 -0
  431. package/dist/src/storage/cli.js +468 -0
  432. package/dist/src/storage/config.js +272 -0
  433. package/dist/src/storage/index.js +108 -0
  434. package/dist/src/storage/subsystem-cli.js +201 -0
  435. package/dist/src/storage/types.js +33 -0
  436. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  437. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  438. package/dist/src/testing/corpus/index.js +10 -0
  439. package/dist/src/testing/fixtures/index.js +9 -0
  440. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  441. package/dist/src/testing/generators/index.js +11 -0
  442. package/dist/src/testing/generators/test-case-generator.js +393 -0
  443. package/dist/src/testing/generators/test-code-generator.js +384 -0
  444. package/dist/src/testing/generators/use-case-parser.js +325 -0
  445. package/dist/src/testing/index.js +11 -0
  446. package/dist/src/tracker/capability-protocol.js +118 -0
  447. package/dist/src/update/checker.mjs +396 -0
  448. package/dist/src/update/notifier.mjs +235 -0
  449. package/dist/src/writing/content-diversifier.js +804 -0
  450. package/dist/src/writing/example-generator.js +959 -0
  451. package/dist/src/writing/example-templates.js +99 -0
  452. package/dist/src/writing/pattern-library.js +486 -0
  453. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  454. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  455. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  456. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  457. package/dist/src/writing/patterns/transition-words.json +1285 -0
  458. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  459. package/dist/src/writing/prompt-optimizer.js +660 -0
  460. package/dist/src/writing/prompt-templates.js +583 -0
  461. package/dist/src/writing/scoring-config-loader.js +168 -0
  462. package/dist/src/writing/validation-engine.js +595 -0
  463. package/dist/src/writing/validation-rules.js +380 -0
  464. package/dist/src/writing/voice-analyzer.js +439 -0
  465. package/dist/src/writing/voice-calibration.js +661 -0
  466. package/dist/src/writing/voice-profiles.json +588 -0
  467. package/package.json +65 -9
@@ -0,0 +1,271 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Simple AIWG MCP Server Test
5
+ *
6
+ * Tests the server by spawning it and sending JSON-RPC messages via stdio.
7
+ */
8
+
9
+ import { spawn } from 'child_process';
10
+ import { fileURLToPath } from 'url';
11
+ import path from 'path';
12
+ import readline from 'readline';
13
+
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+
16
+ let messageId = 1;
17
+
18
+ function createMessage(method, params = {}) {
19
+ return JSON.stringify({
20
+ jsonrpc: '2.0',
21
+ id: messageId++,
22
+ method,
23
+ params
24
+ });
25
+ }
26
+
27
+ async function main() {
28
+ console.log('='.repeat(60));
29
+ console.log('AIWG MCP Server Simple Test');
30
+ console.log('='.repeat(60));
31
+ console.log('');
32
+
33
+ // Spawn the server
34
+ const server = spawn('node', [path.join(__dirname, 'server.mjs')], {
35
+ stdio: ['pipe', 'pipe', 'pipe']
36
+ });
37
+
38
+ let responses = [];
39
+ let rl = readline.createInterface({ input: server.stdout });
40
+
41
+ rl.on('line', (line) => {
42
+ try {
43
+ const msg = JSON.parse(line);
44
+ responses.push(msg);
45
+ } catch (e) {
46
+ // Not JSON, might be a log message
47
+ }
48
+ });
49
+
50
+ server.stderr.on('data', (data) => {
51
+ console.log('[Server]', data.toString().trim());
52
+ });
53
+
54
+ // Wait for server to start
55
+ await new Promise(resolve => setTimeout(resolve, 1000));
56
+
57
+ const tests = [];
58
+ let passed = 0;
59
+ let failed = 0;
60
+
61
+ async function sendAndWait(method, params = {}, timeout = 5000) {
62
+ const msg = createMessage(method, params);
63
+ const id = messageId - 1;
64
+
65
+ server.stdin.write(msg + '\n');
66
+
67
+ // Wait for response with matching ID
68
+ const start = Date.now();
69
+ while (Date.now() - start < timeout) {
70
+ const response = responses.find(r => r.id === id);
71
+ if (response) {
72
+ responses = responses.filter(r => r.id !== id);
73
+ return response;
74
+ }
75
+ await new Promise(resolve => setTimeout(resolve, 100));
76
+ }
77
+ throw new Error(`Timeout waiting for response to ${method}`);
78
+ }
79
+
80
+ async function test(name, fn) {
81
+ try {
82
+ await fn();
83
+ console.log(`✓ ${name}`);
84
+ passed++;
85
+ } catch (error) {
86
+ console.log(`✗ ${name}`);
87
+ console.log(` Error: ${error.message}`);
88
+ failed++;
89
+ }
90
+ }
91
+
92
+ // Initialize the connection
93
+ await test('Initialize connection', async () => {
94
+ const response = await sendAndWait('initialize', {
95
+ protocolVersion: '2024-11-05',
96
+ capabilities: {},
97
+ clientInfo: {
98
+ name: 'test-client',
99
+ version: '1.0.0'
100
+ }
101
+ });
102
+
103
+ if (response.error) {
104
+ throw new Error(response.error.message);
105
+ }
106
+ if (!response.result.serverInfo) {
107
+ throw new Error('No serverInfo in response');
108
+ }
109
+ console.log(` Server: ${response.result.serverInfo.name} v${response.result.serverInfo.version}`);
110
+ });
111
+
112
+ // Send initialized notification
113
+ server.stdin.write(JSON.stringify({
114
+ jsonrpc: '2.0',
115
+ method: 'notifications/initialized'
116
+ }) + '\n');
117
+
118
+ await new Promise(resolve => setTimeout(resolve, 500));
119
+
120
+ // List tools
121
+ await test('List tools', async () => {
122
+ const response = await sendAndWait('tools/list', {});
123
+ if (response.error) {
124
+ throw new Error(response.error.message);
125
+ }
126
+ const tools = response.result.tools;
127
+ if (!tools || tools.length === 0) {
128
+ throw new Error('No tools returned');
129
+ }
130
+ const names = tools.map(t => t.name);
131
+ if (!names.includes('command-run')) {
132
+ throw new Error('Expected command-run in core tools');
133
+ }
134
+ if (names.includes('workflow-run')) {
135
+ throw new Error('workflow-run should not be registered');
136
+ }
137
+ console.log(` Found ${tools.length} tools: ${tools.map(t => t.name).join(', ')}`);
138
+ });
139
+
140
+ // List resources
141
+ await test('List resources', async () => {
142
+ const response = await sendAndWait('resources/list', {});
143
+ if (response.error) {
144
+ throw new Error(response.error.message);
145
+ }
146
+ const resources = response.result.resources;
147
+ console.log(` Found ${resources?.length || 0} resources`);
148
+ });
149
+
150
+ // List prompts
151
+ await test('List prompts', async () => {
152
+ const response = await sendAndWait('prompts/list', {});
153
+ if (response.error) {
154
+ throw new Error(response.error.message);
155
+ }
156
+ const prompts = response.result.prompts;
157
+ if (!prompts || prompts.length === 0) {
158
+ throw new Error('No prompts returned');
159
+ }
160
+ console.log(` Found ${prompts.length} prompts: ${prompts.map(p => p.name).join(', ')}`);
161
+ });
162
+
163
+ // Call agent-list tool
164
+ await test('Call agent-list tool', async () => {
165
+ const response = await sendAndWait('tools/call', {
166
+ name: 'agent-list',
167
+ arguments: {
168
+ framework: 'all'
169
+ }
170
+ });
171
+ if (response.error) {
172
+ throw new Error(response.error.message);
173
+ }
174
+ const content = response.result.content[0].text;
175
+ const parsed = JSON.parse(content);
176
+ console.log(` Found ${parsed.count} agents`);
177
+ });
178
+
179
+ // Test artifact-write and artifact-read
180
+ await test('Write and read artifact', async () => {
181
+ const testContent = `# Test Artifact\nCreated: ${new Date().toISOString()}`;
182
+
183
+ // Write
184
+ const writeResponse = await sendAndWait('tools/call', {
185
+ name: 'artifact-write',
186
+ arguments: {
187
+ path: 'working/mcp-test-artifact.md',
188
+ content: testContent,
189
+ project_dir: '.'
190
+ }
191
+ });
192
+ if (writeResponse.error) {
193
+ throw new Error(writeResponse.error.message);
194
+ }
195
+ const writeResult = JSON.parse(writeResponse.result.content[0].text);
196
+ if (writeResult.status !== 'success') {
197
+ throw new Error('Write failed');
198
+ }
199
+
200
+ // Read back
201
+ const readResponse = await sendAndWait('tools/call', {
202
+ name: 'artifact-read',
203
+ arguments: {
204
+ path: 'working/mcp-test-artifact.md',
205
+ project_dir: '.'
206
+ }
207
+ });
208
+ if (readResponse.error) {
209
+ throw new Error(readResponse.error.message);
210
+ }
211
+ const readContent = readResponse.result.content[0].text;
212
+ if (!readContent.includes('Test Artifact')) {
213
+ throw new Error('Read content does not match');
214
+ }
215
+ console.log(' Write and read successful');
216
+ });
217
+
218
+ // Test reading from test fixture project
219
+ await test('Read artifact from test project', async () => {
220
+ const response = await sendAndWait('tools/call', {
221
+ name: 'artifact-read',
222
+ arguments: {
223
+ path: 'requirements/UC-001-create-task.md',
224
+ project_dir: 'test/fixtures/mcp-test-project'
225
+ }
226
+ });
227
+ if (response.error) {
228
+ throw new Error(response.error.message);
229
+ }
230
+ const content = response.result.content[0].text;
231
+ if (!content.includes('UC-001: Create Task')) {
232
+ throw new Error('Expected UC-001 content');
233
+ }
234
+ console.log(' Read UC-001 from test project');
235
+ });
236
+
237
+ // Get decompose-task prompt
238
+ await test('Get decompose-task prompt', async () => {
239
+ const response = await sendAndWait('prompts/get', {
240
+ name: 'decompose-task',
241
+ arguments: {
242
+ task: 'Build authentication system',
243
+ max_subtasks: '5' // MCP passes all args as strings
244
+ }
245
+ });
246
+ if (response.error) {
247
+ throw new Error(response.error.message);
248
+ }
249
+ const messages = response.result.messages;
250
+ if (!messages || messages.length === 0) {
251
+ throw new Error('No messages returned');
252
+ }
253
+ console.log(` Prompt has ${messages.length} messages`);
254
+ });
255
+
256
+ // Cleanup
257
+ server.kill();
258
+
259
+ // Summary
260
+ console.log('');
261
+ console.log('='.repeat(60));
262
+ console.log(`Results: ${passed} passed, ${failed} failed`);
263
+ console.log('='.repeat(60));
264
+
265
+ process.exit(failed > 0 ? 1 : 0);
266
+ }
267
+
268
+ main().catch(error => {
269
+ console.error('Test failed:', error);
270
+ process.exit(1);
271
+ });
@@ -0,0 +1,101 @@
1
+ /**
2
+ * AIWG MCP Tool: aiwg-command-run
3
+ *
4
+ * Single dispatch MCP tool that routes to the ~94 AIWG CLI commands.
5
+ * Replaces the `workflow-run` stub.
6
+ *
7
+ * Security model:
8
+ * - Allow-list validated against `src/extensions/commands/definitions.ts`
9
+ * (loaded lazily at first call)
10
+ * - `args` is a string array — passed as argv, never shell-interpreted
11
+ * - `shell: false` enforced in spawn
12
+ * - Destructive commands require `confirmed: true`
13
+ *
14
+ * @architecture @.aiwg/architecture/sketch-hermes-mcp-parity.md DD-4
15
+ * @issues #1312 (S1)
16
+ * @rules @token-security, @anti-laziness
17
+ */
18
+
19
+ import { z } from 'zod';
20
+ import {
21
+ runAiwgCli,
22
+ loadCommandAllowList,
23
+ isDestructive,
24
+ mcpError,
25
+ mcpJson,
26
+ } from '../helpers.mjs';
27
+
28
+ export function registerCommandRunTool(server) {
29
+ server.registerTool('command-run', {
30
+ title: 'Run AIWG CLI Command',
31
+ description: 'Dispatch to any allow-listed AIWG CLI command (`aiwg <command> [args...]`). The full surface of ~94 commands is reachable. Destructive commands require `confirmed: true`.',
32
+ inputSchema: {
33
+ command: z.string().describe('Command name from `command-list` (e.g. "use", "discover", "doctor")'),
34
+ args: z.array(z.string()).default([]).describe('Argument array (never shell-interpreted)'),
35
+ project_dir: z.string().optional().describe('Working directory for the command'),
36
+ confirmed: z.boolean().default(false).describe('Required for destructive commands (true to proceed)'),
37
+ timeout_ms: z.number().int().min(1000).max(600_000).default(120_000).describe('Timeout (1s–10min, default 2min)'),
38
+ },
39
+ annotations: {
40
+ destructiveHint: true, // conservative default; many subcommands are read-only but the surface is broad
41
+ openWorldHint: true, // touches filesystem and project state
42
+ },
43
+ }, async ({ command, args, project_dir, confirmed, timeout_ms }) => {
44
+ try {
45
+ // 1. Allow-list validation
46
+ const allowList = await loadCommandAllowList();
47
+ if (allowList.size === 0) {
48
+ return mcpError(
49
+ 'command-run: cannot load command allow-list from AIWG_ROOT. ' +
50
+ 'AIWG installation may be incomplete.',
51
+ { remediation: 'Run `aiwg doctor` to verify AIWG_ROOT is set correctly.' }
52
+ );
53
+ }
54
+ if (!allowList.has(command)) {
55
+ return mcpError(
56
+ `command-run: command "${command}" not in allow-list.`,
57
+ { remediation: 'Call `command-list` (or `discover --type command`) to see available commands.' }
58
+ );
59
+ }
60
+
61
+ // 2. Destructive-op gate
62
+ if (isDestructive(command) && !confirmed) {
63
+ return mcpError(
64
+ `command-run: "${command}" is a destructive command. Re-invoke with confirmed=true to proceed.`,
65
+ {
66
+ remediation: 'Set confirmed=true after surfacing the impact to the user.',
67
+ requiresConfirmation: true,
68
+ }
69
+ );
70
+ }
71
+
72
+ // 3. Argument sanity (no shell metacharacters smuggled via array elements
73
+ // — these are passed as argv so they're safe, but reject NUL bytes which
74
+ // would truncate argv at the OS level)
75
+ for (const a of args) {
76
+ if (typeof a !== 'string' || a.includes('\0')) {
77
+ return mcpError('command-run: invalid argument (NUL byte or non-string)');
78
+ }
79
+ }
80
+
81
+ // 4. Log path only — never log the args content (token-security)
82
+ console.error(`[AIWG MCP] command-run: aiwg ${command} (${args.length} args)`);
83
+
84
+ // 5. Spawn with shell: false (runAiwgCli enforces this)
85
+ const { stdout, stderr, code } = await runAiwgCli(
86
+ [command, ...args],
87
+ { cwd: project_dir, timeoutMs: timeout_ms }
88
+ );
89
+
90
+ return mcpJson({
91
+ command,
92
+ exit_code: code,
93
+ stdout,
94
+ stderr,
95
+ confirmed,
96
+ });
97
+ } catch (err) {
98
+ return mcpError(`command-run: ${err.message}`);
99
+ }
100
+ });
101
+ }
@@ -0,0 +1,291 @@
1
+ /**
2
+ * AIWG MCP Discovery Tools
3
+ *
4
+ * Bridges the post-#1212 discoverability surface (`aiwg discover`,
5
+ * `aiwg show`) into MCP. Adds 8 new tools:
6
+ *
7
+ * - discover (cross-type ranked search)
8
+ * - skill-list (enumerate canonical skill corpus)
9
+ * - skill-show (fetch SKILL.md body)
10
+ * - command-list (enumerate CLI commands)
11
+ * - command-show (fetch command definition)
12
+ * - rule-list (enumerate rules)
13
+ * - rule-show (fetch rule body)
14
+ * - agent-show (fetch agent definition; agent-list pre-exists)
15
+ * - template-list (enumerate templates)
16
+ * - template-show (fetch raw template body)
17
+ *
18
+ * All are global-allowed (#1311) — work without a project root.
19
+ *
20
+ * @architecture @.aiwg/architecture/sketch-hermes-mcp-parity.md
21
+ * @issues #1311 (scope split), #1313 (discover + pairs), #1320 (rule-list/show)
22
+ */
23
+
24
+ import { z } from 'zod';
25
+ import { runAiwgCli, mcpError, mcpJson, AIWG_ROOT } from '../helpers.mjs';
26
+ import fs from 'node:fs/promises';
27
+ import path from 'node:path';
28
+
29
+ /**
30
+ * Register discovery tools on the MCP server.
31
+ *
32
+ * @param {import('@modelcontextprotocol/sdk/server/mcp.js').McpServer} server
33
+ */
34
+ export function registerDiscoveryTools(server) {
35
+ // ============================================================
36
+ // discover — cross-type semantic search
37
+ // ============================================================
38
+ server.registerTool('discover', {
39
+ title: 'Discover AIWG Capabilities',
40
+ description: 'Semantic search across AIWG operational assets: skills, agents, commands, rules, flows, runbooks, templates, and behaviors. Returns ranked candidates with capability summaries. Mirrors `aiwg discover --json`.',
41
+ inputSchema: {
42
+ phrase: z.string().describe('Natural-language capability description (e.g. "create intake form")'),
43
+ type: z.enum(['skill', 'agent', 'command', 'rule', 'flow', 'runbook', 'template', 'behavior']).optional().describe('Restrict to one artifact type'),
44
+ limit: z.number().int().min(1).max(50).default(5).describe('Maximum results (default 5)'),
45
+ },
46
+ annotations: { readOnlyHint: true, openWorldHint: false },
47
+ }, async ({ phrase, type, limit }) => {
48
+ try {
49
+ const args = ['discover', phrase, '--json', '--limit', String(limit ?? 5)];
50
+ if (type) args.push('--type', type);
51
+ const { stdout, stderr, code } = await runAiwgCli(args);
52
+ if (code !== 0) {
53
+ return mcpError(`aiwg discover failed (exit ${code}): ${stderr}`);
54
+ }
55
+ return mcpJson(stdout);
56
+ } catch (err) {
57
+ return mcpError(`discover: ${err.message}`);
58
+ }
59
+ });
60
+
61
+ // ============================================================
62
+ // skill-list / skill-show
63
+ // ============================================================
64
+ server.registerTool('skill-list', {
65
+ title: 'List AIWG Skills',
66
+ description: 'Enumerate available AIWG skills from the canonical corpus. Optional filter by name pattern.',
67
+ inputSchema: {
68
+ filter: z.string().optional().describe('Substring or glob filter on skill name'),
69
+ limit: z.number().int().min(1).max(500).default(50).describe('Maximum results'),
70
+ },
71
+ annotations: { readOnlyHint: true },
72
+ }, async ({ filter, limit }) => {
73
+ try {
74
+ const args = ['discover', filter || '', '--type', 'skill', '--json', '--limit', String(limit ?? 50)];
75
+ const { stdout, code, stderr } = await runAiwgCli(args);
76
+ if (code !== 0) return mcpError(`skill-list failed: ${stderr}`);
77
+ return mcpJson(stdout);
78
+ } catch (err) {
79
+ return mcpError(`skill-list: ${err.message}`);
80
+ }
81
+ });
82
+
83
+ server.registerTool('skill-show', {
84
+ title: 'Show AIWG Skill',
85
+ description: 'Fetch the full body of an AIWG SKILL.md by name. Returns path + content envelope.',
86
+ inputSchema: {
87
+ name: z.string().describe('Skill name (slug; e.g. "intake-wizard")'),
88
+ },
89
+ annotations: { readOnlyHint: true },
90
+ }, async ({ name }) => {
91
+ try {
92
+ const { stdout, code, stderr } = await runAiwgCli(['show', 'skill', name, '--json']);
93
+ if (code !== 0) return mcpError(`skill-show failed: ${stderr}`);
94
+ return mcpJson(stdout);
95
+ } catch (err) {
96
+ return mcpError(`skill-show: ${err.message}`);
97
+ }
98
+ });
99
+
100
+ // ============================================================
101
+ // command-list / command-show
102
+ // ============================================================
103
+ server.registerTool('command-list', {
104
+ title: 'List AIWG CLI Commands',
105
+ description: 'Enumerate available `aiwg <command>` CLI commands. The allow-list for `command-run`.',
106
+ inputSchema: {
107
+ filter: z.string().optional().describe('Substring filter on command name'),
108
+ },
109
+ annotations: { readOnlyHint: true },
110
+ }, async ({ filter }) => {
111
+ try {
112
+ const args = ['discover', filter || '', '--type', 'command', '--json', '--limit', '200'];
113
+ const { stdout, code, stderr } = await runAiwgCli(args);
114
+ if (code !== 0) return mcpError(`command-list failed: ${stderr}`);
115
+ return mcpJson(stdout);
116
+ } catch (err) {
117
+ return mcpError(`command-list: ${err.message}`);
118
+ }
119
+ });
120
+
121
+ server.registerTool('command-show', {
122
+ title: 'Show AIWG CLI Command Definition',
123
+ description: 'Fetch the full spec/help text for a specific `aiwg` CLI command.',
124
+ inputSchema: {
125
+ name: z.string().describe('Command name (e.g. "use", "discover", "ralph")'),
126
+ },
127
+ annotations: { readOnlyHint: true },
128
+ }, async ({ name }) => {
129
+ try {
130
+ const { stdout, code, stderr } = await runAiwgCli(['show', 'command', name, '--json']);
131
+ if (code !== 0) return mcpError(`command-show failed: ${stderr}`);
132
+ return mcpJson(stdout);
133
+ } catch (err) {
134
+ return mcpError(`command-show: ${err.message}`);
135
+ }
136
+ });
137
+
138
+ // ============================================================
139
+ // rule-list / rule-show (#1320)
140
+ // ============================================================
141
+ server.registerTool('rule-list', {
142
+ title: 'List AIWG Rules',
143
+ description: 'Enumerate AIWG enforcement rules (e.g. skill-discovery, no-attribution, anti-laziness, citation-policy). Top-7 CRITICAL/HIGH rules are inlined into Hermes AGENTS.md priming (skill-discovery added #1347); this tool reaches the rest.',
144
+ inputSchema: {
145
+ filter: z.string().optional().describe('Substring filter on rule name'),
146
+ limit: z.number().int().min(1).max(200).default(50),
147
+ },
148
+ annotations: { readOnlyHint: true },
149
+ }, async ({ filter, limit }) => {
150
+ try {
151
+ const args = ['discover', filter || '', '--type', 'rule', '--json', '--limit', String(limit ?? 50)];
152
+ const { stdout, code, stderr } = await runAiwgCli(args);
153
+ if (code !== 0) return mcpError(`rule-list failed: ${stderr}`);
154
+ return mcpJson(stdout);
155
+ } catch (err) {
156
+ return mcpError(`rule-list: ${err.message}`);
157
+ }
158
+ });
159
+
160
+ server.registerTool('rule-show', {
161
+ title: 'Show AIWG Rule',
162
+ description: 'Fetch the full body of a specific AIWG rule by name.',
163
+ inputSchema: {
164
+ name: z.string().describe('Rule name (e.g. "no-attribution", "anti-laziness")'),
165
+ },
166
+ annotations: { readOnlyHint: true },
167
+ }, async ({ name }) => {
168
+ try {
169
+ const { stdout, code, stderr } = await runAiwgCli(['show', 'rule', name, '--json']);
170
+ if (code !== 0) return mcpError(`rule-show failed: ${stderr}`);
171
+ return mcpJson(stdout);
172
+ } catch (err) {
173
+ return mcpError(`rule-show: ${err.message}`);
174
+ }
175
+ });
176
+
177
+ // ============================================================
178
+ // agent-show (agent-list pre-exists in server.mjs)
179
+ // ============================================================
180
+ server.registerTool('agent-show', {
181
+ title: 'Show AIWG Agent Definition',
182
+ description: 'Fetch the full agent definition (system prompt + frontmatter) by name.',
183
+ inputSchema: {
184
+ name: z.string().describe('Agent name (e.g. "test-engineer", "security-auditor")'),
185
+ },
186
+ annotations: { readOnlyHint: true },
187
+ }, async ({ name }) => {
188
+ try {
189
+ const { stdout, code, stderr } = await runAiwgCli(['show', 'agent', name, '--json']);
190
+ if (code !== 0) return mcpError(`agent-show failed: ${stderr}`);
191
+ return mcpJson(stdout);
192
+ } catch (err) {
193
+ return mcpError(`agent-show: ${err.message}`);
194
+ }
195
+ });
196
+
197
+ // ============================================================
198
+ // template-list / template-show (template-render pre-exists)
199
+ // ============================================================
200
+ server.registerTool('template-list', {
201
+ title: 'List AIWG Templates',
202
+ description: 'Enumerate AIWG document templates from the canonical corpus.',
203
+ inputSchema: {
204
+ framework: z.string().optional().describe('Restrict to one framework (e.g. "sdlc-complete")'),
205
+ filter: z.string().optional().describe('Substring filter on template name'),
206
+ },
207
+ annotations: { readOnlyHint: true },
208
+ }, async ({ framework, filter }) => {
209
+ try {
210
+ const results = await scanTemplates(AIWG_ROOT, { framework, filter });
211
+ return mcpJson({ count: results.length, templates: results });
212
+ } catch (err) {
213
+ return mcpError(`template-list: ${err.message}`);
214
+ }
215
+ });
216
+
217
+ server.registerTool('template-show', {
218
+ title: 'Show AIWG Template Body',
219
+ description: 'Fetch the raw body of a template (un-rendered). For variable substitution use `template-render`.',
220
+ inputSchema: {
221
+ template: z.string().describe('Template path (e.g. "sdlc-complete/analysis-design/adr-template.md")'),
222
+ },
223
+ annotations: { readOnlyHint: true },
224
+ }, async ({ template }) => {
225
+ try {
226
+ // Allow caller to pass either a corpus-relative path or just the template filename
227
+ const candidates = [
228
+ path.join(AIWG_ROOT, 'agentic/code/frameworks', template),
229
+ path.join(AIWG_ROOT, 'agentic/code/frameworks/sdlc-complete/templates', template),
230
+ path.resolve(template),
231
+ ];
232
+ for (const c of candidates) {
233
+ try {
234
+ // Anti-traversal: ensure resolved path stays inside AIWG_ROOT
235
+ const resolved = path.resolve(c);
236
+ if (!resolved.startsWith(path.resolve(AIWG_ROOT))) continue;
237
+ const content = await fs.readFile(resolved, 'utf-8');
238
+ return mcpJson({ path: resolved, content });
239
+ } catch {
240
+ // try next
241
+ }
242
+ }
243
+ return mcpError(`template not found: ${template}`);
244
+ } catch (err) {
245
+ return mcpError(`template-show: ${err.message}`);
246
+ }
247
+ });
248
+ }
249
+
250
+ /**
251
+ * Enumerate templates by walking the canonical corpus.
252
+ * Restricted to the AIWG_ROOT subtree (no .aiwg/ project artifacts).
253
+ */
254
+ async function scanTemplates(aiwgRoot, { framework, filter } = {}) {
255
+ const results = [];
256
+ const root = path.join(aiwgRoot, 'agentic/code/frameworks');
257
+ let frameworks = [];
258
+ try {
259
+ frameworks = (await fs.readdir(root, { withFileTypes: true }))
260
+ .filter(d => d.isDirectory())
261
+ .map(d => d.name);
262
+ } catch {
263
+ return results;
264
+ }
265
+ for (const fw of frameworks) {
266
+ if (framework && fw !== framework) continue;
267
+ const tplRoot = path.join(root, fw, 'templates');
268
+ await walkTemplates(tplRoot, tplRoot, fw, results, filter);
269
+ }
270
+ return results;
271
+ }
272
+
273
+ async function walkTemplates(base, dir, framework, out, filter) {
274
+ let entries = [];
275
+ try {
276
+ entries = await fs.readdir(dir, { withFileTypes: true });
277
+ } catch {
278
+ return;
279
+ }
280
+ for (const entry of entries) {
281
+ const full = path.join(dir, entry.name);
282
+ if (entry.isDirectory()) {
283
+ await walkTemplates(base, full, framework, out, filter);
284
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
285
+ const rel = path.relative(base, full);
286
+ const name = entry.name.replace(/\.md$/, '');
287
+ if (filter && !name.includes(filter) && !rel.includes(filter)) continue;
288
+ out.push({ framework, name, relativePath: rel, path: full });
289
+ }
290
+ }
291
+ }