@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,492 @@
1
+ /**
2
+ * AIWG CLI Structured Logger
3
+ *
4
+ * Two public surfaces:
5
+ *
6
+ * debug(scope, msg, ...args) — cheap, env-gated, stderr-only diagnostic log.
7
+ * Unchanged from Phase 4 (#921). Use this for
8
+ * ad-hoc troubleshooting prints that no-op
9
+ * unless AIWG_DEBUG is set.
10
+ *
11
+ * getLogger(scope) — structured Logger (this file's main surface).
12
+ * Every record carries full provenance
13
+ * metadata (ts, invocation_id, command, user,
14
+ * cwd, aiwg_version, git_sha, channel, node,
15
+ * platform, tty, ci) and is written to both
16
+ * stderr (pretty) and ~/.aiwg/logs/aiwg-YYYY-
17
+ * MM-DD.jsonl (structured).
18
+ *
19
+ * Phase 4.5 of the CLI Stabilization Epic (#925) extends the Phase 4 debug()
20
+ * helper into a full structured-logging stack.
21
+ *
22
+ * To enable debug-level output:
23
+ * AIWG_DEBUG=1 aiwg use all # enable everything (debug)
24
+ * AIWG_LOG_LEVEL=debug aiwg use all # same
25
+ * AIWG_LOG_LEVEL=info aiwg use all # info and above
26
+ * aiwg use all -v # info (verbose)
27
+ * aiwg use all -vv # debug
28
+ * aiwg use all --quiet # error only
29
+ * AIWG_LOG_FILE=/tmp/aiwg.jsonl aiwg use all # override JSONL path
30
+ * AIWG_LOG_DISABLE=1 aiwg --version # skip all logging
31
+ *
32
+ * Scope syntax (passed to both the debug() filter AND the Logger):
33
+ * 'cli:*' — any cli:* scope
34
+ * 'cli:use:*,net:*' — multiple globs
35
+ * 'cli:*,-cli:use:deploy' — include/exclude
36
+ */
37
+ import { hostname, platform, arch, userInfo, homedir, release } from 'os';
38
+ import { appendFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'fs';
39
+ import path from 'path';
40
+ const LEVEL_ORDER = {
41
+ debug: 10,
42
+ info: 20,
43
+ warn: 30,
44
+ error: 40,
45
+ silent: 50,
46
+ };
47
+ function coerceLevel(raw) {
48
+ if (!raw)
49
+ return null;
50
+ const lower = raw.toLowerCase();
51
+ if (lower === 'debug' || lower === 'info' || lower === 'warn' || lower === 'error' || lower === 'silent') {
52
+ return lower;
53
+ }
54
+ if (lower === '1' || lower === 'true' || lower === 'all')
55
+ return 'debug';
56
+ if (lower === '0' || lower === 'false' || lower === 'off')
57
+ return 'silent';
58
+ return null;
59
+ }
60
+ function compileScopeFilter(raw) {
61
+ if (!raw || raw === '0' || raw.toLowerCase() === 'false') {
62
+ return { includes: [], excludes: [], any: false };
63
+ }
64
+ if (raw === '1' || raw.toLowerCase() === 'true' || raw === '*') {
65
+ return { includes: [/.*/], excludes: [], any: true };
66
+ }
67
+ const parts = raw.split(',').map(s => s.trim()).filter(Boolean);
68
+ const includes = [];
69
+ const excludes = [];
70
+ for (const part of parts) {
71
+ const negated = part.startsWith('-');
72
+ const pattern = negated ? part.slice(1) : part;
73
+ const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
74
+ const regex = new RegExp('^' + escaped.replace(/\*/g, '[^:]*') + '$');
75
+ (negated ? excludes : includes).push(regex);
76
+ }
77
+ return { includes, excludes, any: includes.length > 0 };
78
+ }
79
+ function scopeMatches(filter, scope) {
80
+ if (!filter.any)
81
+ return false;
82
+ for (const ex of filter.excludes) {
83
+ if (ex.test(scope))
84
+ return false;
85
+ }
86
+ for (const inc of filter.includes) {
87
+ if (inc.test(scope))
88
+ return true;
89
+ }
90
+ return false;
91
+ }
92
+ let cachedProvenance = null;
93
+ let invocationIdOverride = null;
94
+ /**
95
+ * Override the invocation ID discovered by the logger. Called from the
96
+ * top-level entry (bin/aiwg.mjs) once the ID has been minted or inherited
97
+ * from `AIWG_INVOCATION_ID`. Safe to call before the logger is used.
98
+ */
99
+ export function setInvocationId(id) {
100
+ invocationIdOverride = id;
101
+ if (cachedProvenance)
102
+ cachedProvenance.invocation_id = id;
103
+ }
104
+ export function getInvocationId() {
105
+ if (invocationIdOverride)
106
+ return invocationIdOverride;
107
+ if (cachedProvenance)
108
+ return cachedProvenance.invocation_id;
109
+ // Fallback: a synthesized id if the entry never called setInvocationId
110
+ // (typically only happens in unit tests that import the logger directly).
111
+ return process.env['AIWG_INVOCATION_ID'] ?? 'unknown';
112
+ }
113
+ function detectCI() {
114
+ for (const k of ['CI', 'CONTINUOUS_INTEGRATION', 'GITHUB_ACTIONS', 'GITLAB_CI', 'CIRCLECI', 'TRAVIS', 'BUILDKITE', 'JENKINS_URL', 'TF_BUILD', 'TEAMCITY_VERSION']) {
115
+ const v = process.env[k];
116
+ if (v && v !== '0' && v.toLowerCase() !== 'false')
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+ function detectVersion() {
122
+ try {
123
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
124
+ const require = (0, eval)('require');
125
+ const fs = require('fs');
126
+ let dir = __dirname;
127
+ for (let i = 0; i < 10; i++) {
128
+ const pkgPath = path.join(dir, 'package.json');
129
+ if (fs.existsSync(pkgPath)) {
130
+ try {
131
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
132
+ if (pkg.name === 'aiwg')
133
+ return pkg.version;
134
+ }
135
+ catch { /* keep walking */ }
136
+ }
137
+ const parent = path.dirname(dir);
138
+ if (parent === dir)
139
+ break;
140
+ dir = parent;
141
+ }
142
+ }
143
+ catch { /* fall through */ }
144
+ return 'unknown';
145
+ }
146
+ function detectGitSha() {
147
+ // Lightweight git detection: look for aiwg repo's .git/HEAD. No git CLI spawn.
148
+ try {
149
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
150
+ const require = (0, eval)('require');
151
+ const fs = require('fs');
152
+ let dir = __dirname;
153
+ for (let i = 0; i < 10; i++) {
154
+ const gitDir = path.join(dir, '.git');
155
+ if (fs.existsSync(gitDir)) {
156
+ const head = fs.readFileSync(path.join(gitDir, 'HEAD'), 'utf-8').trim();
157
+ if (head.startsWith('ref:')) {
158
+ const refPath = path.join(gitDir, head.slice(5).trim());
159
+ if (fs.existsSync(refPath)) {
160
+ return fs.readFileSync(refPath, 'utf-8').trim().slice(0, 8);
161
+ }
162
+ }
163
+ return head.slice(0, 8);
164
+ }
165
+ const parent = path.dirname(dir);
166
+ if (parent === dir)
167
+ break;
168
+ dir = parent;
169
+ }
170
+ }
171
+ catch { /* non-git installs are fine */ }
172
+ return undefined;
173
+ }
174
+ function detectChannel() {
175
+ // Minimal detection without loading the full channel manager (circular risk).
176
+ try {
177
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
178
+ const require = (0, eval)('require');
179
+ const fs = require('fs');
180
+ const channelFile = path.join(homedir(), '.aiwg', 'channel.json');
181
+ if (fs.existsSync(channelFile)) {
182
+ const json = JSON.parse(fs.readFileSync(channelFile, 'utf-8'));
183
+ if (json.devMode)
184
+ return 'dev';
185
+ if (json.channel)
186
+ return json.channel;
187
+ }
188
+ }
189
+ catch { /* ignore */ }
190
+ return 'stable';
191
+ }
192
+ function getProvenance() {
193
+ if (cachedProvenance)
194
+ return cachedProvenance;
195
+ const id = invocationIdOverride ?? process.env['AIWG_INVOCATION_ID'] ?? 'unknown';
196
+ cachedProvenance = {
197
+ pid: process.pid,
198
+ ppid: process.ppid,
199
+ user: userInfo().username,
200
+ host: hostname(),
201
+ cwd: process.cwd(),
202
+ aiwg_version: detectVersion(),
203
+ git_sha: detectGitSha(),
204
+ channel: detectChannel(),
205
+ node_version: process.version,
206
+ platform: platform(),
207
+ arch: arch(),
208
+ os_release: release(),
209
+ tty: process.stderr.isTTY ?? false,
210
+ ci: detectCI(),
211
+ invocation_id: id,
212
+ };
213
+ return cachedProvenance;
214
+ }
215
+ let cachedConfig = null;
216
+ let currentLevelOverride = null;
217
+ function resolveConfig() {
218
+ if (cachedConfig)
219
+ return cachedConfig;
220
+ const disabled = process.env['AIWG_LOG_DISABLE'] === '1' ||
221
+ process.env['AIWG_LOG_DISABLE']?.toLowerCase() === 'true';
222
+ // Precedence: AIWG_LOG_LEVEL > AIWG_DEBUG (implies debug) > default info.
223
+ // When AIWG_LOG_DISABLE is set, silent wins.
224
+ let level = 'info';
225
+ if (disabled) {
226
+ level = 'silent';
227
+ }
228
+ else {
229
+ const envLevel = coerceLevel(process.env['AIWG_LOG_LEVEL']);
230
+ if (envLevel)
231
+ level = envLevel;
232
+ else if (process.env['AIWG_DEBUG'])
233
+ level = 'debug';
234
+ }
235
+ // AIWG_LOG_LEVEL may carry either a bare level ('debug') or a scope filter
236
+ // ('cli:use:*=debug,net:*=info'). The scope-level form is richer; keep both
237
+ // paths for backward compat. Today the simple form is supported.
238
+ const scopeFilter = compileScopeFilter(process.env['AIWG_DEBUG']);
239
+ // Log file: env override wins; default is ~/.aiwg/logs/aiwg-YYYY-MM-DD.jsonl.
240
+ let logFile = null;
241
+ if (!disabled) {
242
+ if (process.env['AIWG_LOG_FILE']) {
243
+ logFile = process.env['AIWG_LOG_FILE'];
244
+ }
245
+ else {
246
+ const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
247
+ logFile = path.join(homedir(), '.aiwg', 'logs', `aiwg-${today}.jsonl`);
248
+ }
249
+ }
250
+ const retentionDays = (() => {
251
+ const raw = process.env['AIWG_LOG_RETENTION_DAYS'];
252
+ const n = raw ? parseInt(raw, 10) : NaN;
253
+ return Number.isFinite(n) && n > 0 ? n : 30;
254
+ })();
255
+ cachedConfig = { level, scopeFilter, logFile, disabled, retentionDays };
256
+ return cachedConfig;
257
+ }
258
+ /**
259
+ * Override the log level from code (typically from bin/aiwg.mjs after
260
+ * parsing -v / -vv / --quiet flags). Must be called before the first
261
+ * Logger method to affect records.
262
+ */
263
+ export function setLogLevel(level) {
264
+ currentLevelOverride = level;
265
+ if (cachedConfig)
266
+ cachedConfig.level = level;
267
+ }
268
+ function effectiveLevel() {
269
+ if (currentLevelOverride)
270
+ return currentLevelOverride;
271
+ return resolveConfig().level;
272
+ }
273
+ // ── JSONL sink ────────────────────────────────────────────────────────────────
274
+ let logFileEnsured = false;
275
+ function ensureLogDir(logFile) {
276
+ if (logFileEnsured)
277
+ return;
278
+ try {
279
+ mkdirSync(path.dirname(logFile), { recursive: true });
280
+ logFileEnsured = true;
281
+ }
282
+ catch {
283
+ // Disk full / permission denied — downgrade to stderr-only silently.
284
+ logFileEnsured = true; // don't retry per-record
285
+ }
286
+ }
287
+ /**
288
+ * Prune daily log files older than `retentionDays`. Run once at startup
289
+ * (bounded work: one directory listing). Silent on failure.
290
+ */
291
+ export function pruneOldLogs() {
292
+ const cfg = resolveConfig();
293
+ if (cfg.disabled || !cfg.logFile)
294
+ return;
295
+ const dir = path.dirname(cfg.logFile);
296
+ if (!existsSync(dir))
297
+ return;
298
+ const cutoff = Date.now() - cfg.retentionDays * 24 * 60 * 60 * 1000;
299
+ try {
300
+ const entries = readdirSync(dir);
301
+ for (const name of entries) {
302
+ if (!/^aiwg-\d{4}-\d{2}-\d{2}\.jsonl$/.test(name))
303
+ continue;
304
+ const full = path.join(dir, name);
305
+ try {
306
+ const s = statSync(full);
307
+ if (s.mtimeMs < cutoff)
308
+ unlinkSync(full);
309
+ }
310
+ catch { /* ignore per-file errors */ }
311
+ }
312
+ }
313
+ catch { /* ignore listing errors */ }
314
+ }
315
+ function writeJsonl(record) {
316
+ const cfg = resolveConfig();
317
+ if (cfg.disabled || !cfg.logFile)
318
+ return;
319
+ try {
320
+ ensureLogDir(cfg.logFile);
321
+ // Sync append — cheap for typical record sizes, simpler than backpressure
322
+ // management. Can move to async append with a tiny queue if we see perf
323
+ // impact on hot paths.
324
+ appendFileSync(cfg.logFile, JSON.stringify(record) + '\n', 'utf-8');
325
+ }
326
+ catch {
327
+ // Never fail the command because logging failed.
328
+ }
329
+ }
330
+ // ── Span support ──────────────────────────────────────────────────────────────
331
+ function shortSpanId() {
332
+ // 6 base32 chars = ~30 bits of entropy — enough for per-invocation uniqueness.
333
+ const buf = new Uint8Array(4);
334
+ if (typeof globalThis.crypto?.getRandomValues === 'function') {
335
+ globalThis.crypto.getRandomValues(buf);
336
+ }
337
+ else {
338
+ for (let i = 0; i < 4; i++)
339
+ buf[i] = Math.floor(Math.random() * 256);
340
+ }
341
+ const base32 = '0123456789abcdefghjkmnpqrstvwxyz';
342
+ let out = '';
343
+ let acc = 0;
344
+ let bits = 0;
345
+ for (const byte of buf) {
346
+ acc = (acc << 8) | byte;
347
+ bits += 8;
348
+ while (bits >= 5) {
349
+ out += base32[(acc >> (bits - 5)) & 0x1f];
350
+ bits -= 5;
351
+ }
352
+ }
353
+ return out.slice(0, 6);
354
+ }
355
+ function shouldLog(level, scope) {
356
+ const cfg = resolveConfig();
357
+ if (cfg.disabled)
358
+ return false;
359
+ if (LEVEL_ORDER[level] < LEVEL_ORDER[effectiveLevel()])
360
+ return false;
361
+ // AIWG_DEBUG scope filter, when set, acts as an allow-list for debug-level
362
+ // records only. Higher levels always pass.
363
+ if (level === 'debug' && cfg.scopeFilter.any) {
364
+ return scopeMatches(cfg.scopeFilter, scope);
365
+ }
366
+ return true;
367
+ }
368
+ function emit(level, scope, msg, ctx, spanId, extraFields) {
369
+ if (!shouldLog(level, scope))
370
+ return;
371
+ const now = new Date();
372
+ const prov = getProvenance();
373
+ const record = {
374
+ ts: now.toISOString(),
375
+ ts_unix_ms: now.getTime(),
376
+ invocation_id: prov.invocation_id,
377
+ span_id: spanId,
378
+ parent_span_id: ctx.parentSpanId,
379
+ scope,
380
+ level,
381
+ msg,
382
+ pid: prov.pid,
383
+ ppid: prov.ppid,
384
+ user: prov.user,
385
+ host: prov.host,
386
+ cwd: prov.cwd,
387
+ aiwg_version: prov.aiwg_version,
388
+ channel: prov.channel,
389
+ node_version: prov.node_version,
390
+ platform: prov.platform,
391
+ arch: prov.arch,
392
+ os_release: prov.os_release,
393
+ tty: prov.tty,
394
+ ci: prov.ci,
395
+ ...(prov.git_sha ? { git_sha: prov.git_sha } : {}),
396
+ ...ctx.fields,
397
+ ...(extraFields ?? {}),
398
+ };
399
+ // Pretty output to stderr (human-readable). Gated by effective level.
400
+ // File records always carry full provenance; terminal output is condensed
401
+ // so operators aren't drowned in metadata.
402
+ const colorReset = '\x1b[0m';
403
+ const color = level === 'error' ? '\x1b[31m' :
404
+ level === 'warn' ? '\x1b[33m' :
405
+ level === 'info' ? '\x1b[36m' :
406
+ '\x1b[2m';
407
+ const useColor = prov.tty && !process.env['NO_COLOR'];
408
+ const prefix = useColor ? `${color}[${level}]${colorReset}` : `[${level}]`;
409
+ const line = `${prefix} ${scope ? scope + ' ' : ''}${msg}`;
410
+ // eslint-disable-next-line no-console
411
+ console.error(line);
412
+ // JSONL sink (structured, always full provenance).
413
+ writeJsonl(record);
414
+ }
415
+ export function getLogger(scope = 'cli', extraFields = {}) {
416
+ return makeLogger({ scope, parentSpanId: '0', fields: extraFields });
417
+ }
418
+ function makeLogger(ctx) {
419
+ const currentSpanId = ctx.parentSpanId === '0' ? '0' : ctx.parentSpanId;
420
+ return {
421
+ debug(msg, fields) { emit('debug', ctx.scope, msg, ctx, currentSpanId, fields); },
422
+ info(msg, fields) { emit('info', ctx.scope, msg, ctx, currentSpanId, fields); },
423
+ warn(msg, fields) { emit('warn', ctx.scope, msg, ctx, currentSpanId, fields); },
424
+ error(msg, fields) { emit('error', ctx.scope, msg, ctx, currentSpanId, fields); },
425
+ child(opts) {
426
+ return makeLogger({
427
+ scope: opts.scope ?? ctx.scope,
428
+ parentSpanId: ctx.parentSpanId,
429
+ fields: { ...ctx.fields, ...(opts.fields ?? {}) },
430
+ });
431
+ },
432
+ span(name, fields) {
433
+ const spanId = shortSpanId();
434
+ const started = Date.now();
435
+ const spanCtx = {
436
+ scope: ctx.scope,
437
+ parentSpanId: spanId,
438
+ fields: { ...ctx.fields, ...(fields ?? {}) },
439
+ };
440
+ emit('debug', ctx.scope, `span:begin:${name}`, spanCtx, spanId, { span_name: name });
441
+ return {
442
+ end(endMsg, endFields) {
443
+ const duration_ms = Date.now() - started;
444
+ emit('debug', ctx.scope, endMsg ?? `span:end:${name}`, spanCtx, spanId, {
445
+ span_name: name,
446
+ duration_ms,
447
+ ...(endFields ?? {}),
448
+ });
449
+ },
450
+ debug(msg, f) { emit('debug', ctx.scope, msg, spanCtx, spanId, f); },
451
+ info(msg, f) { emit('info', ctx.scope, msg, spanCtx, spanId, f); },
452
+ warn(msg, f) { emit('warn', ctx.scope, msg, spanCtx, spanId, f); },
453
+ error(msg, f) { emit('error', ctx.scope, msg, spanCtx, spanId, f); },
454
+ };
455
+ },
456
+ };
457
+ }
458
+ // ── Phase 4 debug() helper (unchanged, kept for backward compat) ──────────────
459
+ const DEBUG_FILTER = compileScopeFilter(process.env['AIWG_DEBUG']);
460
+ /**
461
+ * Emit a debug log record to stderr. No-op when AIWG_DEBUG is unset or
462
+ * the scope does not match.
463
+ *
464
+ * Backward-compatible with the Phase 4 API. New code should prefer
465
+ * getLogger(scope).debug() which also writes to the JSONL sink.
466
+ */
467
+ export function debug(scope, ...args) {
468
+ if (!scopeMatches(DEBUG_FILTER, scope))
469
+ return;
470
+ const ts = new Date().toISOString();
471
+ // eslint-disable-next-line no-console
472
+ console.error(`[${ts}] [${scope}]`, ...args);
473
+ }
474
+ export function isDebugEnabled(scope) {
475
+ return scopeMatches(DEBUG_FILTER, scope);
476
+ }
477
+ // ── Diagnostic helpers for 'aiwg diagnose' ────────────────────────────────────
478
+ /**
479
+ * Return the effective logger configuration — used by `aiwg version --verbose`
480
+ * and `aiwg diagnose` to surface where logs go and what level is in effect.
481
+ */
482
+ export function getLoggerInfo() {
483
+ const cfg = resolveConfig();
484
+ return {
485
+ level: effectiveLevel(),
486
+ disabled: cfg.disabled,
487
+ logFile: cfg.logFile,
488
+ retentionDays: cfg.retentionDays,
489
+ provenance: getProvenance(),
490
+ };
491
+ }
492
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1,70 @@
1
+ // Stat-only signal-walk used by warning.ts to decide whether the cwd looks
2
+ // like a project. Stat-only is required so detection stays under 50ms even
3
+ // in deep directories (NFR-PERF-01). Walk depth is bounded by
4
+ // MAX_PARENT_DEPTH (NFR-PERF-02).
5
+ import { existsSync, readdirSync, statSync } from 'node:fs';
6
+ import { join, parse } from 'node:path';
7
+ import { PROJECT_SIGNALS, CSPROJ_PATTERN, MAX_PARENT_DEPTH } from './signals.js';
8
+ // Walk `start` and up to MAX_PARENT_DEPTH parents looking for any entry in
9
+ // PROJECT_SIGNALS, or any file matching CSPROJ_PATTERN. Returns on first
10
+ // hit so a project root in cwd short-circuits the walk.
11
+ export function detectProjectSignal(start) {
12
+ let dir = start;
13
+ for (let depth = 0; depth <= MAX_PARENT_DEPTH; depth++) {
14
+ for (const signal of PROJECT_SIGNALS) {
15
+ if (existsSync(join(dir, signal))) {
16
+ return { found: true, signal, foundAt: dir };
17
+ }
18
+ }
19
+ if (hasCsprojFile(dir)) {
20
+ return { found: true, signal: '*.csproj', foundAt: dir };
21
+ }
22
+ const parent = parse(dir).dir;
23
+ if (parent === dir)
24
+ break;
25
+ dir = parent;
26
+ }
27
+ return { found: false, signal: null, foundAt: null };
28
+ }
29
+ // True when `dir` directly contains at least one *.csproj file.
30
+ function hasCsprojFile(dir) {
31
+ try {
32
+ const entries = readdirSync(dir);
33
+ for (const entry of entries) {
34
+ if (CSPROJ_PATTERN.test(entry)) {
35
+ const full = join(dir, entry);
36
+ try {
37
+ if (statSync(full).isFile())
38
+ return true;
39
+ }
40
+ catch {
41
+ // Ignore stat failures for individual entries — keep walking.
42
+ }
43
+ }
44
+ }
45
+ }
46
+ catch {
47
+ // Unreadable dir is treated as "no signal here." Walk continues.
48
+ }
49
+ return false;
50
+ }
51
+ // True when `cwd` is one of the directories where we should prompt the
52
+ // user. $HOME, /, and /tmp are the canonical surprise-deploy locations.
53
+ // The check tolerates trailing separators on Windows.
54
+ export function isUnsuitableCwd(cwd, home) {
55
+ const normalized = stripTrailingSep(cwd);
56
+ if (normalized === stripTrailingSep(home))
57
+ return true;
58
+ if (normalized === '/')
59
+ return true;
60
+ if (normalized === '/tmp')
61
+ return true;
62
+ return false;
63
+ }
64
+ function stripTrailingSep(p) {
65
+ if (p.length > 1 && (p.endsWith('/') || p.endsWith('\\'))) {
66
+ return p.slice(0, -1);
67
+ }
68
+ return p;
69
+ }
70
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1,7 @@
1
+ // Public API for the project-isolation module. Consumers (use.ts) should
2
+ // import from here, not from internal files, so the module shape can evolve
3
+ // without rippling.
4
+ export { maybeWarnProjectIsolation, WARNING_TEXT, GLOBAL_INSTALL_INFO, DEFAULT_DELAY_MS } from './warning.js';
5
+ export { detectProjectSignal, isUnsuitableCwd } from './detect.js';
6
+ export { PROJECT_SIGNALS, CSPROJ_PATTERN, MAX_PARENT_DEPTH } from './signals.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,17 @@
1
+ // Single source of truth for project-signal filenames used by detect.ts.
2
+ // Adding a new ecosystem means adding one entry here; nothing else changes (NFR-MAINT-01).
3
+ export const PROJECT_SIGNALS = [
4
+ '.git',
5
+ 'package.json',
6
+ 'pyproject.toml',
7
+ 'Cargo.toml',
8
+ 'go.mod',
9
+ 'pom.xml',
10
+ 'Gemfile',
11
+ 'build.gradle',
12
+ ];
13
+ // .csproj is matched separately via glob in detect.ts because the filename
14
+ // varies by project name.
15
+ export const CSPROJ_PATTERN = /\.csproj$/i;
16
+ export const MAX_PARENT_DEPTH = 3;
17
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1,102 @@
1
+ // Warning emission + 3-second cancellable delay used by the `aiwg use`
2
+ // invocation path. Wraps detect.ts to enforce the trigger contract defined
3
+ // in UC-NUA-002 / SAD §5.1.2.
4
+ import { homedir } from 'node:os';
5
+ import { detectProjectSignal, isUnsuitableCwd } from './detect.js';
6
+ // Verbatim warning text from UC-NUA-002. Tests assert string equality so
7
+ // any wording change here breaks the build deliberately (NFR-USE-01).
8
+ export const WARNING_TEXT = 'No project detected here. AIWG will deploy to the current directory. To associate AIWG with a specific project, run this from your project root. Continuing in 3 seconds — press Ctrl-C to cancel.';
9
+ export const GLOBAL_INSTALL_INFO = 'AIWG_GLOBAL_INSTALL=1 set — deploying to current directory without project check.';
10
+ export const DEFAULT_DELAY_MS = 3000;
11
+ // The entrypoint called early in `aiwg use`. Returns synchronously when no
12
+ // warning is needed; awaits the delay when the warning fires.
13
+ export async function maybeWarnProjectIsolation(opts = { cwd: process.cwd() }) {
14
+ const cwd = opts.cwd;
15
+ const home = opts.home ?? homedir();
16
+ const env = opts.env ?? process.env;
17
+ const writer = opts.writer ?? defaultStderrWriter;
18
+ const logActivity = opts.logActivity ?? defaultActivityLogger;
19
+ const delayMs = opts.delayMs ?? DEFAULT_DELAY_MS;
20
+ const delayWithCancel = opts.delayWithCancel ?? defaultDelayWithCancel;
21
+ // Env-var opt-out is checked first so detection work is skipped entirely
22
+ // (NFR-REL-02, NFR-PERF-01).
23
+ if (env.AIWG_GLOBAL_INSTALL === '1') {
24
+ writer(GLOBAL_INSTALL_INFO);
25
+ return { cancelled: false, outcome: 'global-install' };
26
+ }
27
+ // If we find a signal anywhere on the walk, the cwd is part of a project.
28
+ // We continue silently — no warning, no info line — to keep the
29
+ // default UX unchanged (NFR-COMPAT-02).
30
+ const detection = detectProjectSignal(cwd);
31
+ if (detection.found) {
32
+ return { cancelled: false, outcome: 'project-signal-found' };
33
+ }
34
+ // No signal AND the cwd isn't a recognized surprise location. We assume
35
+ // the user knows what they're doing and continue silently.
36
+ if (!isUnsuitableCwd(cwd, home)) {
37
+ return { cancelled: false, outcome: 'cwd-ok' };
38
+ }
39
+ writer(WARNING_TEXT);
40
+ const result = await delayWithCancel(delayMs);
41
+ if (result.cancelled) {
42
+ return { cancelled: true, outcome: 'cancelled' };
43
+ }
44
+ // Activity-log write happens AFTER a non-cancelled emission so cancelled
45
+ // runs leave no on-disk evidence (NFR-OBS-01 + UC-NUA-002 A2 postcondition).
46
+ try {
47
+ await logActivity('warn', `no-project-signal: ${cwd}`);
48
+ }
49
+ catch {
50
+ // Activity-log failure must not block deployment — it's observability,
51
+ // not control flow. Swallow and continue.
52
+ }
53
+ return { cancelled: false, outcome: 'warned' };
54
+ }
55
+ function defaultStderrWriter(msg) {
56
+ process.stderr.write(msg + '\n');
57
+ }
58
+ // Wait `ms` milliseconds OR until the user sends SIGINT. Either branch
59
+ // removes the listener so the rest of the process stays responsive.
60
+ function defaultDelayWithCancel(ms) {
61
+ return new Promise((resolve) => {
62
+ const onSigint = () => {
63
+ cleanup();
64
+ resolve({ cancelled: true });
65
+ };
66
+ const timer = setTimeout(() => {
67
+ cleanup();
68
+ resolve({ cancelled: false });
69
+ }, ms);
70
+ const cleanup = () => {
71
+ clearTimeout(timer);
72
+ process.removeListener('SIGINT', onSigint);
73
+ };
74
+ process.on('SIGINT', onSigint);
75
+ });
76
+ }
77
+ // Lazy-imported activity-log writer so a missing storage adapter at startup
78
+ // (e.g. in tests that don't touch the filesystem) doesn't crash the load.
79
+ async function defaultActivityLogger(operation, summary) {
80
+ const { resolveStorage } = await import('../../storage/index.js');
81
+ const { formatEntry } = await import('../../activity-log/types.js');
82
+ const adapter = await resolveStorage('activity_log');
83
+ const line = formatEntry({
84
+ timestamp: new Date(),
85
+ operation: operation,
86
+ summary,
87
+ });
88
+ const path = 'activity.log';
89
+ if (typeof adapter.append === 'function') {
90
+ const existing = (await adapter.read(path)) ?? '';
91
+ if (existing.length > 0 && !existing.endsWith('\n')) {
92
+ await adapter.append(path, '\n');
93
+ }
94
+ await adapter.append(path, line + '\n');
95
+ }
96
+ else {
97
+ const existing = (await adapter.read(path)) ?? '';
98
+ const trailing = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
99
+ await adapter.write(path, existing + trailing + line + '\n');
100
+ }
101
+ }
102
+ //# sourceMappingURL=warning.js.map