@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,218 @@
1
+ /**
2
+ * Project-Local Bundle Promotion (Graduate)
3
+ *
4
+ * Operationalizes the identical-form portability invariant from
5
+ * @.aiwg/architecture/adr-identical-form-portability.md (#1038): a
6
+ * project-local bundle should graduate to upstream (or to a private
7
+ * corpus path) by byte-identical copy.
8
+ *
9
+ * Per the design at @.aiwg/architecture/design-doctor-log-promote.md
10
+ * (#1049), promote performs:
11
+ * 1. Pre-flight checks (bundle exists, manifest valid, no project-
12
+ * local @-refs, destination doesn't exist, identical-form layout)
13
+ * 2. Hash snapshot of source files
14
+ * 3. Recursive copy to destination
15
+ * 4. Re-hash destination — roll back (delete) on any mismatch
16
+ * 5. Update registry source: project-local → bundled (or corpus)
17
+ * 6. Optional --cleanup: remove .aiwg/<type>/<name>/ source
18
+ * 7. Activity log entry
19
+ *
20
+ * @design @.aiwg/architecture/design-doctor-log-promote.md
21
+ * @implements #1037
22
+ */
23
+ import { createHash } from 'crypto';
24
+ import { cp, mkdir, readFile, readdir, rm, stat, } from 'fs/promises';
25
+ import { resolve, join, relative } from 'path';
26
+ import { discoverProjectLocalBundles } from './project-local-discovery.js';
27
+ import { appendProjectLocalActivity } from './project-local-activity.js';
28
+ const TYPE_TO_UPSTREAM_DIR = {
29
+ extension: 'agentic/code/addons',
30
+ addon: 'agentic/code/addons',
31
+ framework: 'agentic/code/frameworks',
32
+ plugin: 'agentic/code/addons',
33
+ provider: 'agentic/code/providers',
34
+ };
35
+ async function sha256(absPath) {
36
+ const buf = await readFile(absPath);
37
+ return createHash('sha256').update(buf).digest('hex');
38
+ }
39
+ async function walk(rootAbs) {
40
+ const out = [];
41
+ async function recurse(dirAbs) {
42
+ let entries;
43
+ try {
44
+ entries = await readdir(dirAbs, { withFileTypes: true });
45
+ }
46
+ catch {
47
+ return;
48
+ }
49
+ for (const e of entries) {
50
+ const childAbs = join(dirAbs, e.name);
51
+ if (e.isDirectory()) {
52
+ await recurse(childAbs);
53
+ }
54
+ else if (e.isFile()) {
55
+ out.push(childAbs);
56
+ }
57
+ }
58
+ }
59
+ await recurse(rootAbs);
60
+ return out;
61
+ }
62
+ async function fileSize(absPath) {
63
+ try {
64
+ const st = await stat(absPath);
65
+ return st.size;
66
+ }
67
+ catch {
68
+ return 0;
69
+ }
70
+ }
71
+ /** Scan for `@.aiwg/...` references in artifact body files. */
72
+ async function findProjectLocalReferences(bundlePath) {
73
+ const out = [];
74
+ const files = await walk(bundlePath);
75
+ for (const f of files) {
76
+ if (!f.endsWith('.md') && !f.endsWith('.json') && !f.endsWith('.yaml') && !f.endsWith('.yml'))
77
+ continue;
78
+ try {
79
+ const content = await readFile(f, 'utf-8');
80
+ if (content.includes('@.aiwg/')) {
81
+ out.push(relative(bundlePath, f));
82
+ }
83
+ }
84
+ catch {
85
+ // Skip unreadable files
86
+ }
87
+ }
88
+ return out;
89
+ }
90
+ /**
91
+ * Promote a project-local bundle to its upstream home or a corpus path.
92
+ *
93
+ * Pure function over (config, projectDir, bundleId, opts). Mutates
94
+ * config.installed when the operation succeeds (caller persists).
95
+ */
96
+ export async function promoteProjectLocalBundle(config, projectDir, bundleId, opts = {}) {
97
+ const { to = 'upstream', corpusPath, dryRun = false, cleanup = false, force = false, frameworkRoot = projectDir, } = opts;
98
+ // Pre-flight 1: discover the bundle
99
+ const discovery = await discoverProjectLocalBundles(projectDir);
100
+ const bundle = discovery.bundles.find(b => b.id === bundleId);
101
+ if (!bundle) {
102
+ return { ok: false, failureReason: 'bundle-not-found', message: `No project-local bundle '${bundleId}' under configured project-local roots` };
103
+ }
104
+ // Pre-flight 2: corpus path required for --to corpus
105
+ if (to === 'corpus' && !corpusPath) {
106
+ return { ok: false, failureReason: 'destination-required', message: '--to corpus requires a path argument' };
107
+ }
108
+ // Resolve destination
109
+ const destinationParent = to === 'corpus'
110
+ ? resolve(projectDir, corpusPath)
111
+ : resolve(frameworkRoot, TYPE_TO_UPSTREAM_DIR[bundle.type]);
112
+ const destination = join(destinationParent, bundleId);
113
+ // Pre-flight 3: destination must not already exist
114
+ let destExists = false;
115
+ try {
116
+ await stat(destination);
117
+ destExists = true;
118
+ }
119
+ catch {
120
+ // Doesn't exist — good
121
+ }
122
+ if (destExists) {
123
+ return { ok: false, failureReason: 'destination-exists', message: `Destination '${destination}' already exists. Promote refuses to overwrite — remove it first.` };
124
+ }
125
+ // Pre-flight 4: project-local @-references would dangle
126
+ const refs = await findProjectLocalReferences(bundle.bundlePath);
127
+ if (refs.length > 0 && !force) {
128
+ return {
129
+ ok: false,
130
+ failureReason: 'project-local-references',
131
+ message: `Bundle contains @.aiwg/ references that would dangle after promote: ${refs.slice(0, 3).join(', ')}${refs.length > 3 ? `, +${refs.length - 3} more` : ''}. Use --force to promote anyway.`,
132
+ };
133
+ }
134
+ // Build the plan
135
+ const sourceFiles = await walk(bundle.bundlePath);
136
+ const sourceRels = sourceFiles.map(f => relative(bundle.bundlePath, f));
137
+ let totalBytes = 0;
138
+ for (const f of sourceFiles)
139
+ totalBytes += await fileSize(f);
140
+ const plan = {
141
+ bundleId,
142
+ type: bundle.type,
143
+ source: bundle.localPath,
144
+ destination,
145
+ files: sourceRels,
146
+ totalBytes,
147
+ };
148
+ if (dryRun) {
149
+ return { ok: true, plan };
150
+ }
151
+ // Snapshot source hashes
152
+ const expectedHashes = {};
153
+ for (const abs of sourceFiles) {
154
+ const rel = relative(bundle.bundlePath, abs);
155
+ expectedHashes[rel] = await sha256(abs);
156
+ }
157
+ // Copy
158
+ try {
159
+ await mkdir(destinationParent, { recursive: true });
160
+ await cp(bundle.bundlePath, destination, { recursive: true });
161
+ }
162
+ catch (err) {
163
+ const msg = err instanceof Error ? err.message : String(err);
164
+ await appendProjectLocalActivity({
165
+ event: 'promote-failed',
166
+ name: bundleId,
167
+ type: bundle.type,
168
+ summary: `copy failed: ${msg}`,
169
+ });
170
+ return { ok: false, failureReason: 'copy-failed', message: `Copy failed: ${msg}` };
171
+ }
172
+ // Verify hashes; roll back on mismatch
173
+ for (const [rel, expected] of Object.entries(expectedHashes)) {
174
+ const destAbs = join(destination, rel);
175
+ const actual = await sha256(destAbs).catch(() => null);
176
+ if (actual !== expected) {
177
+ try {
178
+ await rm(destination, { recursive: true, force: true });
179
+ }
180
+ catch { /* best effort */ }
181
+ await appendProjectLocalActivity({
182
+ event: 'promote-failed',
183
+ name: bundleId,
184
+ type: bundle.type,
185
+ summary: `hash mismatch on ${rel} — rolled back`,
186
+ });
187
+ return { ok: false, failureReason: 'hash-mismatch', message: `Hash mismatch on ${rel} after copy. Rolled back.` };
188
+ }
189
+ }
190
+ // Registry update: source flips
191
+ const entry = config.installed[bundleId];
192
+ if (entry) {
193
+ entry.source = to === 'upstream' ? 'bundled' : 'corpus';
194
+ delete entry.localPath;
195
+ delete entry.localType;
196
+ delete entry.manifestVersion;
197
+ // Keep artifactHashes — they remain valid for drift detection of the new install
198
+ }
199
+ // Cleanup source if requested
200
+ if (cleanup) {
201
+ try {
202
+ await rm(bundle.bundlePath, { recursive: true, force: true });
203
+ }
204
+ catch (err) {
205
+ // Non-fatal — promote already succeeded
206
+ const msg = err instanceof Error ? err.message : String(err);
207
+ process.stderr.write(`promote --cleanup failed (non-fatal): ${msg}\n`);
208
+ }
209
+ }
210
+ await appendProjectLocalActivity({
211
+ event: 'promote',
212
+ name: bundleId,
213
+ type: bundle.type,
214
+ summary: `${destination}${cleanup ? ' (source cleaned up)' : ''}`,
215
+ });
216
+ return { ok: true, plan, copied: sourceRels };
217
+ }
218
+ //# sourceMappingURL=project-local-promote.js.map
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Project-Local Bundle Remove
3
+ *
4
+ * Reverts a project-local bundle's deployed artifacts from provider paths
5
+ * per the case table in `.aiwg/architecture/design-aiwg-remove-revert.md`
6
+ * (#1048). Reads artifactHashes from the registry to detect pristine vs
7
+ * mutated vs replaced files.
8
+ *
9
+ * Source under `.aiwg/<type>/<name>/` is NEVER deleted (load-bearing
10
+ * invariant — `--force` does not change this).
11
+ *
12
+ * @design @.aiwg/architecture/design-aiwg-remove-revert.md
13
+ * @implements #1037
14
+ */
15
+ import { lstat, readdir, stat, unlink } from 'fs/promises';
16
+ import { resolve, join, relative } from 'path';
17
+ import { homedir } from 'os';
18
+ import { appendProjectLocalActivity } from './project-local-activity.js';
19
+ import { sha256OfFileNormalized } from './managed-marker.js';
20
+ /**
21
+ * Hash an artifact file with the managed-marker line stripped.
22
+ *
23
+ * Source files have no marker (it's deploy-time-injected); deployed files
24
+ * do. Stripping the marker on both sides makes the hash insensitive to
25
+ * the marker, which is the equivalence relation we actually want for
26
+ * pristine/mutated/drift checks. See `managed-marker.ts` for the details.
27
+ *
28
+ * @implements #1086
29
+ */
30
+ async function sha256Hex(absPath) {
31
+ return sha256OfFileNormalized(absPath);
32
+ }
33
+ /**
34
+ * Compute hashes for every artifact under a project-local bundle, keyed by
35
+ * source-relative path (e.g., "rules/my-rule.md", "skills/x/SKILL.md").
36
+ *
37
+ * Artifact dirs scanned: agents/, commands/, skills/, rules/. Skill entries
38
+ * use the SKILL.md inside the per-skill subdirectory; everything else is a
39
+ * top-level .md file.
40
+ */
41
+ export async function hashBundleArtifacts(bundleAbsPath) {
42
+ const out = {};
43
+ // Flat .md dirs
44
+ for (const dir of ['agents', 'commands', 'rules']) {
45
+ const dirAbs = join(bundleAbsPath, dir);
46
+ let entries;
47
+ try {
48
+ entries = await readdir(dirAbs);
49
+ }
50
+ catch {
51
+ continue;
52
+ }
53
+ for (const e of entries) {
54
+ if (!e.endsWith('.md'))
55
+ continue;
56
+ if (e === 'README.md' || e === 'RULES-INDEX.md' || e === 'INDEX.md')
57
+ continue;
58
+ const fileAbs = join(dirAbs, e);
59
+ try {
60
+ out[`${dir}/${e}`] = await sha256Hex(fileAbs);
61
+ }
62
+ catch {
63
+ // Read failures are non-fatal — skip the artifact
64
+ }
65
+ }
66
+ }
67
+ // Skill subdirs
68
+ const skillsAbs = join(bundleAbsPath, 'skills');
69
+ let skillEntries;
70
+ try {
71
+ skillEntries = await readdir(skillsAbs);
72
+ }
73
+ catch {
74
+ skillEntries = [];
75
+ }
76
+ for (const skill of skillEntries) {
77
+ const skillDir = join(skillsAbs, skill);
78
+ try {
79
+ const st = await stat(skillDir);
80
+ if (!st.isDirectory())
81
+ continue;
82
+ }
83
+ catch {
84
+ continue;
85
+ }
86
+ const skillMd = join(skillDir, 'SKILL.md');
87
+ try {
88
+ out[`skills/${skill}/SKILL.md`] = await sha256Hex(skillMd);
89
+ }
90
+ catch {
91
+ // No SKILL.md — skip
92
+ }
93
+ }
94
+ return out;
95
+ }
96
+ /**
97
+ * Provider-specific deploy-path conventions for the artifact directories
98
+ * we currently emit. Keyed by provider, value is the prefix relative to
99
+ * the project (or HOME for HOME-deploying providers — those are out of
100
+ * scope for revert in this iteration; they are silently skipped with a
101
+ * message).
102
+ */
103
+ // Per PUW-026 (#1127): home-deploying providers get absolute prefixes so
104
+ // `resolve(projectDir, prefix)` correctly produces the home-rooted path.
105
+ // Previously these were `null`, which silently skipped lifecycle ops
106
+ // against home-deployed project-local bundles (OpenClaw, Hermes).
107
+ const PROVIDER_PREFIX = {
108
+ claude: '.claude',
109
+ cursor: '.cursor',
110
+ factory: '.factory',
111
+ opencode: '.opencode',
112
+ windsurf: '.windsurf',
113
+ warp: '.warp',
114
+ codex: '.codex',
115
+ copilot: '.github', // copilot uses .github/agents, .github/instructions, .github/skills
116
+ openclaw: resolve(homedir(), '.openclaw'),
117
+ hermes: resolve(homedir(), '.hermes'),
118
+ };
119
+ /**
120
+ * Translate a source-relative artifact path to the provider's deploy path,
121
+ * relative to the project (or HOME) root. Returns null when the provider
122
+ * is HOME-deploying (revert from HOME is out of scope for this iteration).
123
+ *
124
+ * For most providers this is a 1:1 mapping (rules/x.md → .{p}/rules/x.md).
125
+ */
126
+ function deployedPathFor(provider, sourceRel) {
127
+ const prefix = PROVIDER_PREFIX[provider];
128
+ if (!prefix)
129
+ return null;
130
+ // Some providers rename rules to .mdc (cursor); revert checks both.
131
+ return `${prefix}/${sourceRel}`;
132
+ }
133
+ /** Try multiple plausible deployed paths (e.g., .md vs .mdc for rules). */
134
+ function candidateDeployedPaths(provider, sourceRel) {
135
+ const paths = [];
136
+ const main = deployedPathFor(provider, sourceRel);
137
+ if (main)
138
+ paths.push(main);
139
+ // Cursor rule rename
140
+ if (provider === 'cursor' && sourceRel.startsWith('rules/') && sourceRel.endsWith('.md')) {
141
+ paths.push(`.cursor/${sourceRel.slice(0, -3)}.mdc`);
142
+ }
143
+ return paths;
144
+ }
145
+ async function tryUnlink(absPath) {
146
+ try {
147
+ await unlink(absPath);
148
+ return { deleted: true };
149
+ }
150
+ catch (err) {
151
+ const e = err;
152
+ if (e.code === 'ENOENT')
153
+ return { deleted: false };
154
+ if (e.code === 'EACCES' || e.code === 'EROFS')
155
+ return { deleted: false, permission: true };
156
+ throw err;
157
+ }
158
+ }
159
+ async function classify(expectedHash, absPath) {
160
+ if (!expectedHash)
161
+ return 'unhashed';
162
+ try {
163
+ await lstat(absPath);
164
+ }
165
+ catch (err) {
166
+ if (err.code === 'ENOENT')
167
+ return 'missing';
168
+ return 'missing';
169
+ }
170
+ let actual;
171
+ try {
172
+ actual = await sha256Hex(absPath);
173
+ }
174
+ catch (err) {
175
+ if (err.code === 'EACCES')
176
+ return 'permission';
177
+ return 'missing';
178
+ }
179
+ if (actual === expectedHash)
180
+ return 'pristine';
181
+ // Mutated vs replaced — detection requires reading the file's frontmatter
182
+ // id and comparing to the bundle's artifact id. For this iteration we
183
+ // conservatively treat all hash-differs as 'mutated'; the design's case-4
184
+ // ("replaced by another bundle's artifact") is detected by registry-level
185
+ // ownership lookup (see resolveOwnership below) rather than per-file id.
186
+ return 'mutated';
187
+ }
188
+ /**
189
+ * Look up which other installed bundle (if any) records this deployed-path
190
+ * in its own registry entry. If found, the file belongs to another bundle —
191
+ * Case 4 (replaced).
192
+ */
193
+ function resolveOwnership(config, selfBundleId, provider, sourceRel) {
194
+ for (const [name, entry] of Object.entries(config.installed)) {
195
+ if (name === selfBundleId)
196
+ continue;
197
+ if (entry.source !== 'project-local')
198
+ continue;
199
+ if (!entry.artifactHashes)
200
+ continue;
201
+ if (sourceRel in entry.artifactHashes) {
202
+ // Same source-rel path claimed by another project-local bundle —
203
+ // the deployed file (if present) is theirs, not ours.
204
+ void provider;
205
+ return name;
206
+ }
207
+ }
208
+ return null;
209
+ }
210
+ /**
211
+ * Remove a project-local bundle's deploys per the design at
212
+ * `.aiwg/architecture/design-aiwg-remove-revert.md`.
213
+ *
214
+ * Pure function over (config, projectDir, opts). The caller is responsible
215
+ * for persisting the returned (mutated) config.
216
+ */
217
+ export async function removeProjectLocalBundle(config, projectDir, bundleId, opts = {}) {
218
+ const entry = config.installed[bundleId];
219
+ const isProjectLocal = entry !== undefined && entry.source === 'project-local';
220
+ if (!isProjectLocal) {
221
+ return {
222
+ found: false,
223
+ outcomes: [],
224
+ revertedProviders: [],
225
+ partialProviders: [],
226
+ isProjectLocal: false,
227
+ };
228
+ }
229
+ const { force = false, provider: onlyProvider, dryRun = false, keepRegistry = false } = opts;
230
+ const confirmMutation = opts.confirmMutation ?? (async () => false);
231
+ const installedEntry = entry;
232
+ const artifactHashes = installedEntry.artifactHashes ?? {};
233
+ const providers = Object.keys(installedEntry.deployedTo).filter(p => !onlyProvider || p === onlyProvider);
234
+ const outcomes = [];
235
+ const revertedProviders = [];
236
+ const partialProviders = [];
237
+ for (const provider of providers) {
238
+ let providerHadSkip = false;
239
+ for (const sourceRel of Object.keys(artifactHashes)) {
240
+ const owner = resolveOwnership(config, bundleId, provider, sourceRel);
241
+ if (owner) {
242
+ providerHadSkip = true;
243
+ outcomes.push({
244
+ provider,
245
+ artifactPath: sourceRel,
246
+ deployedAbsPath: '(other bundle)',
247
+ case: 'replaced',
248
+ reverted: false,
249
+ message: `owned by '${owner}' — refusing to delete`,
250
+ });
251
+ if (!dryRun) {
252
+ await appendProjectLocalActivity({
253
+ event: 'remove-conflict',
254
+ name: bundleId,
255
+ type: installedEntry.localType ?? 'extension',
256
+ summary: `${provider}:${sourceRel} owned by ${owner}`,
257
+ });
258
+ }
259
+ continue;
260
+ }
261
+ const candidates = candidateDeployedPaths(provider, sourceRel);
262
+ let resolvedAbs = null;
263
+ let detectedCase = 'missing';
264
+ for (const c of candidates) {
265
+ const abs = resolve(projectDir, c);
266
+ const k = await classify(artifactHashes[sourceRel], abs);
267
+ if (k !== 'missing') {
268
+ resolvedAbs = abs;
269
+ detectedCase = k;
270
+ break;
271
+ }
272
+ }
273
+ if (!resolvedAbs) {
274
+ // Pick the first candidate just so the outcome carries a path
275
+ const fallback = candidates[0] ? resolve(projectDir, candidates[0]) : '(unknown)';
276
+ outcomes.push({
277
+ provider,
278
+ artifactPath: sourceRel,
279
+ deployedAbsPath: fallback,
280
+ case: 'missing',
281
+ reverted: false,
282
+ message: 'already absent',
283
+ });
284
+ continue;
285
+ }
286
+ // Cases
287
+ if (detectedCase === 'pristine') {
288
+ if (dryRun) {
289
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'pristine', reverted: false, message: '[dry-run] would revert' });
290
+ }
291
+ else {
292
+ const r = await tryUnlink(resolvedAbs);
293
+ if (r.permission) {
294
+ providerHadSkip = true;
295
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'permission', reverted: false, message: 'permission denied' });
296
+ }
297
+ else {
298
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'pristine', reverted: r.deleted, message: r.deleted ? 'reverted' : 'already absent' });
299
+ }
300
+ }
301
+ continue;
302
+ }
303
+ if (detectedCase === 'mutated' || detectedCase === 'unhashed') {
304
+ const allowDelete = force || (await confirmMutation({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: 'mutation detected' }));
305
+ if (!allowDelete) {
306
+ providerHadSkip = true;
307
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: 'mutation skipped (--force to override)' });
308
+ if (!dryRun) {
309
+ await appendProjectLocalActivity({
310
+ event: 'remove-mutated',
311
+ name: bundleId,
312
+ type: installedEntry.localType ?? 'extension',
313
+ summary: `${provider}:${sourceRel} skipped`,
314
+ });
315
+ }
316
+ continue;
317
+ }
318
+ if (dryRun) {
319
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: '[dry-run] would revert (mutation override)' });
320
+ continue;
321
+ }
322
+ const r = await tryUnlink(resolvedAbs);
323
+ if (r.permission) {
324
+ providerHadSkip = true;
325
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'permission', reverted: false, message: 'permission denied' });
326
+ }
327
+ else {
328
+ outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: r.deleted, message: r.deleted ? 'reverted (mutation overridden)' : 'already absent' });
329
+ }
330
+ }
331
+ }
332
+ if (providerHadSkip) {
333
+ partialProviders.push(provider);
334
+ }
335
+ else {
336
+ revertedProviders.push(provider);
337
+ }
338
+ // Mutate registry for fully-reverted providers
339
+ if (!dryRun && !keepRegistry && !providerHadSkip) {
340
+ delete installedEntry.deployedTo[provider];
341
+ }
342
+ }
343
+ // Top-level remove activity entry
344
+ if (!dryRun) {
345
+ const summary = providers
346
+ .map(p => {
347
+ const reverted = outcomes.filter(o => o.provider === p && o.reverted).length;
348
+ const skipped = outcomes.filter(o => o.provider === p && !o.reverted).length;
349
+ return `${p}=${reverted} reverted${skipped > 0 ? `, ${skipped} skipped` : ''}`;
350
+ })
351
+ .join(', ');
352
+ await appendProjectLocalActivity({
353
+ event: force ? 'remove-force' : 'remove',
354
+ name: bundleId,
355
+ type: installedEntry.localType ?? 'extension',
356
+ summary,
357
+ });
358
+ }
359
+ // Drop the entire `installed` entry only when every provider fully reverted
360
+ if (!dryRun && !keepRegistry && Object.keys(installedEntry.deployedTo).length === 0) {
361
+ delete config.installed[bundleId];
362
+ }
363
+ // Note: source under .aiwg/<type>/<name>/ is NEVER touched.
364
+ void relative;
365
+ return {
366
+ found: true,
367
+ outcomes,
368
+ revertedProviders,
369
+ partialProviders,
370
+ isProjectLocal: true,
371
+ };
372
+ }
373
+ //# sourceMappingURL=project-local-remove.js.map