@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,281 @@
1
+ /**
2
+ * Project-Local Doctor Section
3
+ *
4
+ * Builds the "Project-local artifacts" section for `aiwg doctor` output
5
+ * per the spec at @.aiwg/architecture/design-doctor-log-promote.md (#1049).
6
+ *
7
+ * Pure function over (projectDir, frameworkRoot) — returns a string. The
8
+ * doctor handler in src/cli/handlers/utilities.ts is responsible for
9
+ * printing it. Section is fully suppressed when no project-local dirs
10
+ * are present.
11
+ *
12
+ * @design @.aiwg/architecture/design-doctor-log-promote.md
13
+ * @implements #1037
14
+ */
15
+ import { join, resolve } from 'path';
16
+ import { homedir } from 'os';
17
+ import { discoverProjectLocalBundles } from './project-local-discovery.js';
18
+ import { buildUpstreamRegistry } from './upstream-registry.js';
19
+ import { resolveShadows } from './shadow-resolver.js';
20
+ import { checkBundleManifestIgnored } from './project-local-gitignore.js';
21
+ import { sha256OfFileRawAndNormalized } from './managed-marker.js';
22
+ import { projectAiwgPath } from '../config/project-artifacts.js';
23
+ import { projectRelativePathIfInside } from './project-local-paths.js';
24
+ import { auditProjectQuickref } from './project-quickref.js';
25
+ /**
26
+ * Hash a deployed file in raw and managed-marker-normalized forms. Returns
27
+ * null on read errors (e.g., file missing — caller treats as
28
+ * deploy-not-present).
29
+ *
30
+ * Source files are recorded via the same normalization in
31
+ * `hashBundleArtifacts()`, so the equivalence relation is symmetric.
32
+ *
33
+ * @implements #1086
34
+ */
35
+ async function hashDeployed(absPath) {
36
+ try {
37
+ return await sha256OfFileRawAndNormalized(absPath);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ const TYPES = ['extension', 'addon', 'framework', 'plugin', 'provider'];
44
+ const TYPE_DIR = {
45
+ extension: 'extensions',
46
+ addon: 'addons',
47
+ framework: 'frameworks',
48
+ plugin: 'plugins',
49
+ provider: 'providers',
50
+ };
51
+ // Per PUW-026 (#1127): home-deploying providers get absolute prefixes so
52
+ // `resolve(projectDir, prefix)` correctly produces the home-rooted path
53
+ // (resolve treats absolute paths as authoritative). Previously these were
54
+ // `null`, which silently skipped lifecycle operations against home-deployed
55
+ // project-local bundles.
56
+ const PROVIDER_PREFIX = {
57
+ claude: '.claude',
58
+ cursor: '.cursor',
59
+ factory: '.factory',
60
+ opencode: '.opencode',
61
+ windsurf: '.windsurf',
62
+ warp: '.warp',
63
+ codex: '.codex',
64
+ copilot: '.github',
65
+ openclaw: resolve(homedir(), '.openclaw'),
66
+ hermes: resolve(homedir(), '.hermes'),
67
+ };
68
+ export async function buildProjectLocalDoctorSection(opts) {
69
+ const { projectDir, frameworkRoot, config, quiet = false } = opts;
70
+ const discovery = await discoverProjectLocalBundles(projectDir);
71
+ const quickrefAudit = await auditProjectQuickref(projectDir, config?.providers ?? []);
72
+ const quickrefErrors = [...quickrefAudit.errors];
73
+ if (quickrefAudit.exists) {
74
+ const quickrefRelPath = projectRelativePathIfInside(projectDir, projectAiwgPath(projectDir, 'quickref.json'));
75
+ const ignored = quickrefRelPath
76
+ ? await checkBundleManifestIgnored(projectDir, quickrefRelPath)
77
+ : null;
78
+ if (ignored === true && quickrefRelPath) {
79
+ quickrefErrors.push(`${quickrefRelPath} is ignored by git; canonical project quickref source must be committed`);
80
+ }
81
+ }
82
+ // No project-local content → no section at all
83
+ if (discovery.isEmpty && discovery.errors.length === 0 && !quickrefAudit.exists && quickrefErrors.length === 0) {
84
+ return { output: '', validationErrors: 0, denylistViolations: 0, driftCount: 0, hasFailures: false };
85
+ }
86
+ const lines = ['', '── Project-local artifacts ────────────────────────────────────'];
87
+ // Counts
88
+ if (!quiet) {
89
+ lines.push(` Discovered: ${discovery.bundles.length} bundle${discovery.bundles.length === 1 ? '' : 's'}`);
90
+ for (const t of TYPES) {
91
+ const dirName = TYPE_DIR[t];
92
+ const ofType = discovery.bundles.filter(b => b.type === t);
93
+ if (ofType.length === 0 && discovery.bundles.length > 0)
94
+ continue;
95
+ const idList = ofType.length > 0 ? ` (${ofType.map(b => b.id).join(', ')})` : '';
96
+ lines.push(` ${dirName.padEnd(11)} ${ofType.length}${idList}`);
97
+ }
98
+ lines.push('');
99
+ if (quickrefAudit.exists) {
100
+ lines.push(` Project quickref: ${quickrefAudit.skillName ?? 'invalid source'}`);
101
+ lines.push('');
102
+ }
103
+ }
104
+ // Validation
105
+ const validationErrors = discovery.errors.length + quickrefErrors.length;
106
+ if (validationErrors === 0) {
107
+ if (!quiet)
108
+ lines.push(` Validation: ✓ all manifests${quickrefAudit.exists ? ' and project quickref source' : ''} valid`);
109
+ }
110
+ else {
111
+ lines.push(` Validation: ✗ ${validationErrors} error${validationErrors === 1 ? '' : 's'}`);
112
+ for (const e of discovery.errors.slice(0, 10)) {
113
+ lines.push(` ✗ ${e.path}: ${e.field} — ${e.actual}`);
114
+ }
115
+ for (const error of quickrefErrors.slice(0, Math.max(0, 10 - discovery.errors.length))) {
116
+ lines.push(` ✗ ${error}`);
117
+ }
118
+ if (validationErrors > 10) {
119
+ lines.push(` + ${validationErrors - 10} more (run 'aiwg list --project-local' for full list)`);
120
+ }
121
+ }
122
+ lines.push('');
123
+ // Shadows + denylist
124
+ let denylistViolations = 0;
125
+ if (discovery.bundles.length > 0) {
126
+ try {
127
+ const upstream = await buildUpstreamRegistry({ frameworkRoot });
128
+ const shadowResult = await resolveShadows(discovery.bundles, upstream);
129
+ const refusals = shadowResult.resolutions.filter(r => r.verdict === 'refuse-unsafe' || r.verdict === 'refuse-phantom' || r.verdict === 'refuse-duplicate');
130
+ denylistViolations = refusals.length;
131
+ if (!quiet) {
132
+ const informational = shadowResult.shadows.filter(s => s.verdict === 'deploy-with-warning' || s.verdict === 'deploy-acknowledged');
133
+ if (informational.length > 0) {
134
+ lines.push(` Shadows (${informational.length}):`);
135
+ for (const s of informational) {
136
+ const marker = s.verdict === 'deploy-acknowledged' ? '!!' : '⚠';
137
+ const note = s.verdict === 'deploy-acknowledged' ? ' overrides safety-critical (acknowledged)' : ` overrides ${s.upstream?.source ?? 'upstream'}`;
138
+ lines.push(` ${marker} ${s.bundleId} :: ${s.artifactType}/${s.artifactId}${note}`);
139
+ }
140
+ lines.push('');
141
+ }
142
+ }
143
+ if (refusals.length > 0) {
144
+ lines.push(` Denylist violations (${refusals.length}):`);
145
+ for (const r of refusals) {
146
+ lines.push(` ✗ ${r.bundleId} :: ${r.artifactType}/${r.artifactId} [${r.verdict}]`);
147
+ }
148
+ lines.push('');
149
+ }
150
+ else if (!quiet) {
151
+ lines.push(' Denylist violations: 0');
152
+ lines.push('');
153
+ }
154
+ }
155
+ catch {
156
+ // Shadow resolution failure is non-fatal for doctor
157
+ }
158
+ }
159
+ // Drift detection (requires config and artifactHashes)
160
+ let driftCount = quickrefAudit.drift.length;
161
+ const driftLines = quickrefAudit.drift.map(message => ` ✗ project quickref :: ${message}`);
162
+ let unhashedSeen = false;
163
+ if (config) {
164
+ for (const bundle of discovery.bundles) {
165
+ const entry = config.installed[bundle.id];
166
+ if (!entry || entry.source !== 'project-local')
167
+ continue;
168
+ const hashes = entry.artifactHashes;
169
+ if (!hashes) {
170
+ unhashedSeen = true;
171
+ continue;
172
+ }
173
+ for (const provider of Object.keys(entry.deployedTo)) {
174
+ const prefix = PROVIDER_PREFIX[provider];
175
+ if (!prefix)
176
+ continue;
177
+ for (const [sourceRel, expectedHash] of Object.entries(hashes)) {
178
+ const deployedAbs = resolve(projectDir, `${prefix}/${sourceRel}`);
179
+ const actualHash = await hashDeployed(deployedAbs);
180
+ if (actualHash === null) {
181
+ // Missing — not drift, deploy is just absent
182
+ continue;
183
+ }
184
+ if (actualHash.normalized !== expectedHash && actualHash.raw !== expectedHash) {
185
+ driftCount++;
186
+ driftLines.push(` ✗ ${bundle.id} :: ${sourceRel} @ ${provider} (deployed file differs from source)`);
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ if (driftCount > 0) {
193
+ lines.push(` Drift (${driftCount}):`);
194
+ lines.push(...driftLines);
195
+ lines.push('');
196
+ }
197
+ else if (!quiet) {
198
+ lines.push(' Drift: 0');
199
+ if (unhashedSeen) {
200
+ lines.push(' (some entries lack artifactHashes — re-run `aiwg use <bundle>` to record)');
201
+ }
202
+ lines.push('');
203
+ }
204
+ // Provider deployment matrix
205
+ if (!quiet && config) {
206
+ const projectLocalEntries = Object.entries(config.installed).filter(([, e]) => e.source === 'project-local');
207
+ if (projectLocalEntries.length > 0) {
208
+ const allProviders = new Set();
209
+ for (const [, entry] of projectLocalEntries) {
210
+ for (const p of Object.keys(entry.deployedTo))
211
+ allProviders.add(p);
212
+ }
213
+ const provList = [...allProviders].sort();
214
+ if (provList.length > 0) {
215
+ lines.push(' Provider deployment matrix:');
216
+ lines.push(` ${'bundle'.padEnd(20)}${provList.map(p => p.padEnd(8)).join('')}`);
217
+ for (const [name, entry] of projectLocalEntries) {
218
+ const cells = provList.map(p => {
219
+ const c = entry.deployedTo[p];
220
+ if (!c)
221
+ return '-'.padEnd(8);
222
+ const total = c.agents + c.commands + c.skills + c.rules;
223
+ return `✓ ${total}`.padEnd(8);
224
+ }).join('');
225
+ lines.push(` ${name.padEnd(20)}${cells}`);
226
+ }
227
+ lines.push('');
228
+ }
229
+ }
230
+ }
231
+ // #1085 — flag bundles whose source is silently git-ignored. Best-effort
232
+ // (uses `git check-ignore`); skipped silently outside git repos.
233
+ let gitignoredCount = 0;
234
+ if (discovery.bundles.length > 0) {
235
+ const ignored = [];
236
+ for (const b of discovery.bundles) {
237
+ const manifestRelPath = projectRelativePathIfInside(projectDir, join(b.bundlePath, 'manifest.json'));
238
+ const isIgnored = manifestRelPath
239
+ ? await checkBundleManifestIgnored(projectDir, manifestRelPath)
240
+ : null;
241
+ if (isIgnored === true)
242
+ ignored.push(`${b.type}/${b.id} (${manifestRelPath})`);
243
+ }
244
+ gitignoredCount = ignored.length;
245
+ if (ignored.length > 0) {
246
+ lines.push(` Git tracking: ✗ ${ignored.length} bundle${ignored.length === 1 ? '' : 's'} silently ignored`);
247
+ for (const i of ignored.slice(0, 5)) {
248
+ lines.push(` ✗ ${i}`);
249
+ }
250
+ if (ignored.length > 5) {
251
+ lines.push(` + ${ignored.length - 5} more`);
252
+ }
253
+ lines.push(' Project-local bundle source should be tracked. Add to .gitignore:');
254
+ lines.push(' !.aiwg/quickref.json');
255
+ lines.push(' !.aiwg/addons/');
256
+ lines.push(' !.aiwg/extensions/');
257
+ lines.push(' !.aiwg/frameworks/');
258
+ lines.push(' !.aiwg/plugins/');
259
+ lines.push(' Or run `aiwg new-bundle <name>` to have AIWG add this block automatically.');
260
+ lines.push('');
261
+ }
262
+ else if (!quiet) {
263
+ lines.push(' Git tracking: ✓ all bundle manifests visible to git');
264
+ lines.push('');
265
+ }
266
+ }
267
+ const hasFailures = validationErrors > 0 || denylistViolations > 0 || driftCount > 0 || gitignoredCount > 0;
268
+ return {
269
+ output: lines.join('\n'),
270
+ validationErrors,
271
+ denylistViolations,
272
+ driftCount,
273
+ hasFailures,
274
+ };
275
+ }
276
+ /** Convenience accessor: just the section text. */
277
+ export async function projectLocalDoctorSection(projectDir, frameworkRoot, config, quiet = false) {
278
+ const r = await buildProjectLocalDoctorSection({ projectDir, frameworkRoot, config, quiet });
279
+ return r.output;
280
+ }
281
+ //# sourceMappingURL=project-local-doctor.js.map
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Project-local .gitignore management.
3
+ *
4
+ * AIWG-managed projects historically `.gitignore` the whole `.aiwg/` tree
5
+ * because most of it is generated state (working scratch, ralph state,
6
+ * research corpora, etc.). With #1033's project-local artifact lifecycle,
7
+ * `.aiwg/{addons,extensions,frameworks,plugins,providers}/` is now also operator-
8
+ * authored source — and a blanket ignore silently drops it from version
9
+ * control.
10
+ *
11
+ * This module provides:
12
+ *
13
+ * - `detectAiwgBlanketIgnore()` — read .gitignore, classify the rules
14
+ * - `appendAiwgSourceTrackBlock()` — append the canonical un-ignore
15
+ * block (sentinel-marked, idempotent)
16
+ * - `checkBundleManifestIgnored()` — per-bundle: is its manifest.json
17
+ * git-ignored right now?
18
+ *
19
+ * @implements #1085
20
+ */
21
+ import { readFile, writeFile, access } from 'fs/promises';
22
+ import { join } from 'path';
23
+ import { execFile } from 'child_process';
24
+ import { promisify } from 'util';
25
+ const execFileP = promisify(execFile);
26
+ /**
27
+ * Sentinel comment that marks the AIWG-managed un-ignore block.
28
+ *
29
+ * We detect existing blocks by this exact line so re-running new-bundle
30
+ * never produces duplicate blocks.
31
+ */
32
+ export const AIWG_GITIGNORE_SENTINEL = '# AIWG project-local bundle source — track these (managed by AIWG)';
33
+ /**
34
+ * The canonical block we append when a project blanket-ignores `.aiwg/`
35
+ * but doesn't yet un-ignore the source directories.
36
+ */
37
+ export const AIWG_GITIGNORE_BLOCK = [
38
+ '',
39
+ AIWG_GITIGNORE_SENTINEL,
40
+ '!.aiwg/aiwg.config',
41
+ '!.aiwg/quickref.json',
42
+ '!.aiwg/addons/',
43
+ '!.aiwg/extensions/',
44
+ '!.aiwg/frameworks/',
45
+ '!.aiwg/plugins/',
46
+ '!.aiwg/providers/',
47
+ '',
48
+ ].join('\n');
49
+ /**
50
+ * Inspect a project's `.gitignore` and classify it for our purposes.
51
+ *
52
+ * Detection rules — only the patterns we actually need:
53
+ *
54
+ * blanket ignore: a non-negation, non-comment line that matches the
55
+ * `.aiwg/` directory directly. Specifically: `.aiwg`, `.aiwg/`,
56
+ * `.aiwg/*`, `.aiwg/**`, or path-anchored variants thereof.
57
+ *
58
+ * existing negation: a line beginning with `!` that points into one of
59
+ * our four source directories. e.g. `!.aiwg/addons/` or
60
+ * `!.aiwg/extensions/foo/`.
61
+ */
62
+ export async function detectAiwgBlanketIgnore(projectDir) {
63
+ const path = join(projectDir, '.gitignore');
64
+ let raw;
65
+ try {
66
+ raw = await readFile(path, 'utf8');
67
+ }
68
+ catch {
69
+ return {
70
+ blanketIgnore: false,
71
+ hasExistingNegation: false,
72
+ hasManagedBlock: false,
73
+ gitignoreExists: false,
74
+ };
75
+ }
76
+ const lines = raw.split(/\r?\n/);
77
+ const stripped = lines.map(l => l.trim()).filter(l => l.length > 0 && !l.startsWith('#'));
78
+ const isBlanket = (l) => {
79
+ if (l.startsWith('!'))
80
+ return false;
81
+ // Strip a leading slash so `/.aiwg/` and `.aiwg/` are equivalent.
82
+ const norm = l.replace(/^\//, '');
83
+ return norm === '.aiwg' || norm === '.aiwg/' || norm === '.aiwg/*' || norm === '.aiwg/**';
84
+ };
85
+ const isSourceNegation = (l) => {
86
+ if (!l.startsWith('!'))
87
+ return false;
88
+ // `.aiwg/addons/`, `.aiwg/extensions/foo`, `/.aiwg/providers/**`, etc.
89
+ const body = l.slice(1).replace(/^\//, '');
90
+ return /^\.aiwg\/(addons|extensions|frameworks|plugins|providers)(\/.*)?$/.test(body);
91
+ };
92
+ const blanketIgnore = stripped.some(isBlanket);
93
+ const hasExistingNegation = stripped.some(isSourceNegation);
94
+ const hasManagedBlock = lines.some(l => l.trim() === AIWG_GITIGNORE_SENTINEL);
95
+ return { blanketIgnore, hasExistingNegation, hasManagedBlock, gitignoreExists: true };
96
+ }
97
+ /**
98
+ * Append the canonical un-ignore block to `.gitignore` if and only if:
99
+ *
100
+ * - `.gitignore` exists, AND
101
+ * - it blanket-ignores `.aiwg/`, AND
102
+ * - it does NOT already have any source-directory negation, AND
103
+ * - it does NOT already have our sentinel-marked block.
104
+ *
105
+ * The function is idempotent in all four conditions. No-op when the
106
+ * project doesn't blanket-ignore (operator has presumably configured a
107
+ * selective ignore already).
108
+ */
109
+ export async function appendAiwgSourceTrackBlock(projectDir) {
110
+ const report = await detectAiwgBlanketIgnore(projectDir);
111
+ if (!report.gitignoreExists) {
112
+ return { added: false, reason: 'no .gitignore — skipped' };
113
+ }
114
+ if (!report.blanketIgnore) {
115
+ return { added: false, reason: 'no blanket .aiwg ignore — already tracking sources' };
116
+ }
117
+ // Check managed-block presence BEFORE generic negation detection — once
118
+ // we've added our block, it itself contains source-directory negations,
119
+ // so the existing-negation check would otherwise mis-fire on subsequent
120
+ // runs.
121
+ if (report.hasManagedBlock) {
122
+ const path = join(projectDir, '.gitignore');
123
+ const existing = await readFile(path, 'utf8');
124
+ if (!existing.split(/\r?\n/).some(line => line.trim() === '!.aiwg/quickref.json')) {
125
+ const sep = existing.endsWith('\n') ? '' : '\n';
126
+ await writeFile(path, `${existing}${sep}!.aiwg/quickref.json\n`, 'utf8');
127
+ return { added: true, reason: 'updated managed block to track .aiwg/quickref.json' };
128
+ }
129
+ return { added: false, reason: 'block already present — no change' };
130
+ }
131
+ if (report.hasExistingNegation) {
132
+ return { added: false, reason: 'operator has explicit !.aiwg negation — no change' };
133
+ }
134
+ const path = join(projectDir, '.gitignore');
135
+ const existing = await readFile(path, 'utf8');
136
+ const sep = existing.endsWith('\n') ? '' : '\n';
137
+ await writeFile(path, existing + sep + AIWG_GITIGNORE_BLOCK, 'utf8');
138
+ return { added: true, reason: 'appended project-local source un-ignore block (bundles, config, and quickref)' };
139
+ }
140
+ /**
141
+ * Per-bundle: is its `manifest.json` currently ignored by git?
142
+ *
143
+ * Uses `git check-ignore` which is authoritative — it reflects every
144
+ * `.gitignore` precedence rule, including negations and core.excludesFile.
145
+ *
146
+ * Returns `null` when git isn't installed or the project isn't a git
147
+ * repo. Caller should treat null as "skip the check".
148
+ */
149
+ export async function checkBundleManifestIgnored(projectDir, manifestRelPath) {
150
+ // Quick sanity: ensure path doesn't try to escape projectDir
151
+ if (manifestRelPath.startsWith('/') || manifestRelPath.includes('..')) {
152
+ return null;
153
+ }
154
+ try {
155
+ await access(join(projectDir, '.git'));
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ try {
161
+ // `git check-ignore -q <path>` returns exit 0 if path is ignored,
162
+ // 1 if not ignored, 128 on error. We want a tristate.
163
+ await execFileP('git', ['check-ignore', '-q', manifestRelPath], {
164
+ cwd: projectDir,
165
+ });
166
+ // exit 0 → ignored
167
+ return true;
168
+ }
169
+ catch (err) {
170
+ const code = err.code;
171
+ if (code === 1)
172
+ return false; // not ignored
173
+ return null; // 128 or other — skip the check
174
+ }
175
+ }
176
+ //# sourceMappingURL=project-local-gitignore.js.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Project-local bundle search root resolution.
3
+ *
4
+ * The canonical project-local source tree lives under the configured AIWG
5
+ * artifact root, not necessarily `<project>/.aiwg`. Operators may also add
6
+ * extra roots for team/private bundles without moving the project corpus.
7
+ */
8
+ import { existsSync, readFileSync } from 'fs';
9
+ import { delimiter, isAbsolute, join, relative, resolve, sep } from 'path';
10
+ import { DEFAULT_PROJECT_AIWG_DIR, expandProjectArtifactPath, resolveProjectAiwgDir, } from '../config/project-artifacts.js';
11
+ export const PROJECT_LOCAL_SEARCH_PATHS_ENV = 'AIWG_PROJECT_LOCAL_PATHS';
12
+ export const PROJECT_LOCAL_TYPE_TO_DIR = {
13
+ extension: 'extensions',
14
+ addon: 'addons',
15
+ framework: 'frameworks',
16
+ plugin: 'plugins',
17
+ provider: 'providers',
18
+ };
19
+ export const PROJECT_LOCAL_DIR_TO_TYPE = Object.fromEntries(Object.entries(PROJECT_LOCAL_TYPE_TO_DIR).map(([type, dirName]) => [dirName, type]));
20
+ export const PROJECT_LOCAL_SCAN_DIRS = Object.values(PROJECT_LOCAL_TYPE_TO_DIR);
21
+ function toPortablePath(pathValue) {
22
+ return pathValue.split(sep).join('/');
23
+ }
24
+ export function isPathInside(parentPath, candidatePath) {
25
+ const parent = resolve(parentPath);
26
+ const candidate = resolve(candidatePath);
27
+ const rel = relative(parent, candidate);
28
+ return rel === '' || (rel.length > 0 && !rel.startsWith('..') && !isAbsolute(rel));
29
+ }
30
+ export function projectRelativePathIfInside(projectDir, absPath) {
31
+ if (!isPathInside(projectDir, absPath))
32
+ return null;
33
+ const rel = toPortablePath(relative(resolve(projectDir), resolve(absPath)));
34
+ return rel.length > 0 ? rel : '.';
35
+ }
36
+ function displayPrefixForAdditionalRoot(projectDir, rootPath) {
37
+ const rel = projectRelativePathIfInside(projectDir, rootPath);
38
+ return rel ?? resolve(rootPath);
39
+ }
40
+ function readConfiguredSearchPaths(projectDir, env) {
41
+ const configPath = join(resolveProjectAiwgDir(projectDir, env), 'aiwg.config');
42
+ if (!existsSync(configPath))
43
+ return [];
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(readFileSync(configPath, 'utf-8'));
47
+ }
48
+ catch {
49
+ return [];
50
+ }
51
+ if (!parsed || typeof parsed !== 'object')
52
+ return [];
53
+ const record = parsed;
54
+ const projectLocal = record.projectLocal ?? record.project_local;
55
+ if (!projectLocal || typeof projectLocal !== 'object')
56
+ return [];
57
+ const projectLocalRecord = projectLocal;
58
+ const rawPaths = projectLocalRecord.searchPaths ?? projectLocalRecord.search_paths;
59
+ if (!Array.isArray(rawPaths))
60
+ return [];
61
+ return rawPaths
62
+ .filter((value) => typeof value === 'string')
63
+ .map(value => value.trim())
64
+ .filter(value => value.length > 0);
65
+ }
66
+ export function parseProjectLocalSearchPaths(value) {
67
+ if (!value)
68
+ return [];
69
+ return value
70
+ .split(delimiter)
71
+ .map(part => part.trim())
72
+ .filter(part => part.length > 0);
73
+ }
74
+ /**
75
+ * Resolve project-local bundle roots in scan order.
76
+ *
77
+ * The configured project AIWG artifact root is always first and keeps the
78
+ * virtual `.aiwg/...` display prefix so registry bindings survive a move or
79
+ * rename. Additional roots are then loaded from `aiwg.config` and finally
80
+ * `AIWG_PROJECT_LOCAL_PATHS`.
81
+ */
82
+ export function resolveProjectLocalSearchRoots(projectDir, env = process.env) {
83
+ const roots = [];
84
+ const seen = new Set();
85
+ const addRoot = (rootPath, source, displayPrefix) => {
86
+ const absoluteRoot = resolve(rootPath);
87
+ const key = process.platform === 'win32' ? absoluteRoot.toLowerCase() : absoluteRoot;
88
+ if (seen.has(key))
89
+ return;
90
+ seen.add(key);
91
+ roots.push({ rootPath: absoluteRoot, source, displayPrefix });
92
+ };
93
+ addRoot(resolveProjectAiwgDir(projectDir, env), 'artifact-root', DEFAULT_PROJECT_AIWG_DIR);
94
+ for (const rawPath of readConfiguredSearchPaths(projectDir, env)) {
95
+ const rootPath = expandProjectArtifactPath(rawPath, projectDir);
96
+ addRoot(rootPath, 'config', displayPrefixForAdditionalRoot(projectDir, rootPath));
97
+ }
98
+ for (const rawPath of parseProjectLocalSearchPaths(env[PROJECT_LOCAL_SEARCH_PATHS_ENV])) {
99
+ const rootPath = expandProjectArtifactPath(rawPath, projectDir);
100
+ addRoot(rootPath, 'env', displayPrefixForAdditionalRoot(projectDir, rootPath));
101
+ }
102
+ return roots;
103
+ }
104
+ export function projectLocalDisplayPath(projectDir, absPath, searchRoot) {
105
+ const absolutePath = resolve(absPath);
106
+ if (searchRoot && isPathInside(searchRoot.rootPath, absolutePath)) {
107
+ const rel = toPortablePath(relative(searchRoot.rootPath, absolutePath));
108
+ const prefix = searchRoot.displayPrefix.replace(/\/+$/, '');
109
+ if (rel.length === 0)
110
+ return prefix || '.';
111
+ return prefix.length > 0 && prefix !== '.'
112
+ ? `${prefix}/${rel}`
113
+ : rel;
114
+ }
115
+ const projectRel = projectRelativePathIfInside(projectDir, absolutePath);
116
+ return projectRel ?? absolutePath;
117
+ }
118
+ export function ensureTrailingSlash(pathValue) {
119
+ return pathValue.endsWith('/') ? pathValue : `${pathValue}/`;
120
+ }
121
+ //# sourceMappingURL=project-local-paths.js.map