@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,156 @@
1
+ /**
2
+ * Gitignore Helper
3
+ *
4
+ * Shared module for checking and updating .gitignore files with recommended
5
+ * AIWG runtime and provider directory patterns.
6
+ *
7
+ * @implements #553
8
+ * @module src/config/gitignore
9
+ */
10
+ import * as fs from 'fs/promises';
11
+ import * as path from 'path';
12
+ // ===========================
13
+ // Recommended Patterns
14
+ // ===========================
15
+ /**
16
+ * AIWG runtime subdirectories that should be gitignored.
17
+ * NOTE: .aiwg/ itself is intentionally NOT included — it contains
18
+ * project artifacts (requirements, architecture, etc.) that should be versioned.
19
+ * Only the high-churn runtime subdirectories are ignored.
20
+ */
21
+ export const AIWG_RUNTIME_PATTERNS = [
22
+ '.aiwg/working/',
23
+ // .aiwg/.index/ is the artifact graph index (JSON nodes/edges + checksum
24
+ // manifest). It is a pure build artifact, fully regenerable from corpus
25
+ // content via `aiwg index build --all`, so it is ignored rather than committed.
26
+ '.aiwg/.index/',
27
+ '.aiwg/ralph/',
28
+ '.aiwg/ralph-external/',
29
+ '.aiwg/security-engineering/reviews/disclosures/',
30
+ ];
31
+ /**
32
+ * Provider conventional directories for non-native deployments.
33
+ * These are generated by `aiwg use` and should not be version-controlled.
34
+ * Claude Code native dirs (.claude/agents/, .claude/skills/, etc.) are intentionally
35
+ * excluded from this list — they are authored artifacts worth versioning.
36
+ */
37
+ export const PROVIDER_CONVENTIONAL_PATTERNS = [
38
+ '.codex/',
39
+ '.cursor/agents/',
40
+ '.cursor/commands/',
41
+ '.cursor/skills/',
42
+ '.factory/skills/',
43
+ '.factory/rules/',
44
+ '.warp/',
45
+ '.windsurf/agents/',
46
+ '.windsurf/skills/',
47
+ '.windsurf/rules/',
48
+ ];
49
+ /**
50
+ * Claude Code session state patterns (machine-local, should not be versioned).
51
+ */
52
+ export const CLAUDE_SESSION_PATTERNS = [
53
+ '.claude/settings.local.json',
54
+ ];
55
+ /** All recommended patterns combined */
56
+ export const ALL_RECOMMENDED_PATTERNS = [
57
+ ...AIWG_RUNTIME_PATTERNS,
58
+ ...CLAUDE_SESSION_PATTERNS,
59
+ ...PROVIDER_CONVENTIONAL_PATTERNS,
60
+ ];
61
+ // ===========================
62
+ // Core Functions
63
+ // ===========================
64
+ /**
65
+ * Check which recommended patterns are missing from the project's .gitignore.
66
+ */
67
+ export async function checkGitignore(projectRoot) {
68
+ const gitignorePath = path.join(projectRoot, '.gitignore');
69
+ let content = '';
70
+ let exists = false;
71
+ try {
72
+ content = await fs.readFile(gitignorePath, 'utf-8');
73
+ exists = true;
74
+ }
75
+ catch {
76
+ // File doesn't exist — all patterns are missing
77
+ }
78
+ const lines = content.split('\n').map(l => l.trim());
79
+ const isCovered = (pattern) => {
80
+ // Exact match
81
+ if (lines.includes(pattern))
82
+ return true;
83
+ // Pattern without trailing slash is also sufficient
84
+ if (lines.includes(pattern.replace(/\/$/, '')))
85
+ return true;
86
+ // Parent directory is ignored (covers all children)
87
+ const parts = pattern.split('/').filter(Boolean);
88
+ for (let i = 1; i < parts.length; i++) {
89
+ const parent = parts.slice(0, i).join('/') + '/';
90
+ if (lines.includes(parent) || lines.includes(parent.replace(/\/$/, ''))) {
91
+ return true;
92
+ }
93
+ }
94
+ return false;
95
+ };
96
+ const missingRuntime = AIWG_RUNTIME_PATTERNS.filter(p => !isCovered(p));
97
+ const missingSession = CLAUDE_SESSION_PATTERNS.filter(p => !isCovered(p));
98
+ const missingProvider = PROVIDER_CONVENTIONAL_PATTERNS.filter(p => !isCovered(p));
99
+ const missing = [...missingRuntime, ...missingSession, ...missingProvider];
100
+ return { exists, missing, missingRuntime, missingSession, missingProvider };
101
+ }
102
+ /**
103
+ * Append missing patterns to .gitignore, creating the file if it doesn't exist.
104
+ * Patterns are grouped with comments.
105
+ */
106
+ export async function appendGitignore(projectRoot, patterns) {
107
+ const gitignorePath = path.join(projectRoot, '.gitignore');
108
+ let existing = '';
109
+ let fileExists = false;
110
+ try {
111
+ existing = await fs.readFile(gitignorePath, 'utf-8');
112
+ fileExists = true;
113
+ }
114
+ catch {
115
+ // File doesn't exist, will create
116
+ }
117
+ const existingLines = existing.split('\n').map(l => l.trim());
118
+ const toAdd = [];
119
+ const alreadyPresent = [];
120
+ for (const pattern of patterns) {
121
+ if (existingLines.includes(pattern) || existingLines.includes(pattern.replace(/\/$/, ''))) {
122
+ alreadyPresent.push(pattern);
123
+ }
124
+ else {
125
+ toAdd.push(pattern);
126
+ }
127
+ }
128
+ if (toAdd.length > 0) {
129
+ const runtimeToAdd = toAdd.filter(p => AIWG_RUNTIME_PATTERNS.includes(p));
130
+ const sessionToAdd = toAdd.filter(p => CLAUDE_SESSION_PATTERNS.includes(p));
131
+ const providerToAdd = toAdd.filter(p => PROVIDER_CONVENTIONAL_PATTERNS.includes(p));
132
+ let block = '';
133
+ if (runtimeToAdd.length > 0) {
134
+ block += '\n# AIWG — ignore only high-churn runtime subdirs, NOT .aiwg/ itself\n';
135
+ block += runtimeToAdd.join('\n') + '\n';
136
+ }
137
+ if (sessionToAdd.length > 0) {
138
+ block += '\n# Claude Code local session state\n';
139
+ block += sessionToAdd.join('\n') + '\n';
140
+ }
141
+ if (providerToAdd.length > 0) {
142
+ block += '\n# Agentic provider conventional dirs (generated by aiwg use, not authored)\n';
143
+ block += providerToAdd.join('\n') + '\n';
144
+ }
145
+ const newContent = existing.endsWith('\n') || existing === ''
146
+ ? existing + block
147
+ : existing + '\n' + block;
148
+ await fs.writeFile(gitignorePath, newContent, 'utf-8');
149
+ }
150
+ return {
151
+ added: toAdd,
152
+ alreadyPresent,
153
+ created: !fileExists && toAdd.length > 0,
154
+ };
155
+ }
156
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Project AIWG artifact directory resolution.
3
+ *
4
+ * The public contract has long documented `AIWG_ARTIFACTS_PATH` as the
5
+ * override for the project-local `.aiwg/` artifact root. Keep that contract
6
+ * centralized so callers do not hardcode `<project>/.aiwg`.
7
+ */
8
+ import { homedir } from 'os';
9
+ import { existsSync, readFileSync } from 'fs';
10
+ import { isAbsolute, join, resolve } from 'path';
11
+ export const DEFAULT_PROJECT_AIWG_DIR = '.aiwg';
12
+ export const AIWG_ARTIFACTS_PATH_ENV = 'AIWG_ARTIFACTS_PATH';
13
+ export const PROJECT_AIWG_LOCATION_FILE = '.aiwg-location';
14
+ const ARTIFACT_PATH_ENV_ALIASES = [
15
+ AIWG_ARTIFACTS_PATH_ENV,
16
+ 'AIWG_PROJECT_ARTIFACTS_PATH',
17
+ 'AIWG_PROJECT_AIWG_DIR',
18
+ ];
19
+ export function expandProjectArtifactPath(pathValue, projectDir) {
20
+ const trimmed = pathValue.trim();
21
+ if (trimmed === '~')
22
+ return homedir();
23
+ if (trimmed.startsWith('~/'))
24
+ return resolve(homedir(), trimmed.slice(2));
25
+ if (isAbsolute(trimmed))
26
+ return trimmed;
27
+ return resolve(projectDir, trimmed);
28
+ }
29
+ export function parseProjectArtifactLocation(contents) {
30
+ for (const rawLine of contents.split(/\r?\n/)) {
31
+ let line = rawLine.trim();
32
+ if (line.length === 0 || line.startsWith('#'))
33
+ continue;
34
+ if (line.startsWith('export '))
35
+ line = line.slice('export '.length).trim();
36
+ const assignment = line.match(/^AIWG_ARTIFACTS_PATH\s*=\s*(.+)$/);
37
+ if (assignment)
38
+ line = assignment[1].trim();
39
+ if ((line.startsWith('"') && line.endsWith('"')) ||
40
+ (line.startsWith("'") && line.endsWith("'"))) {
41
+ line = line.slice(1, -1);
42
+ }
43
+ return line.length > 0 ? line : null;
44
+ }
45
+ return null;
46
+ }
47
+ export function readProjectArtifactLocation(projectDir) {
48
+ const pointerPath = resolve(projectDir, PROJECT_AIWG_LOCATION_FILE);
49
+ if (!existsSync(pointerPath))
50
+ return null;
51
+ return parseProjectArtifactLocation(readFileSync(pointerPath, 'utf-8'));
52
+ }
53
+ /**
54
+ * Resolve the directory that contains AIWG project artifacts.
55
+ *
56
+ * Defaults to `<projectDir>/.aiwg`. When `AIWG_ARTIFACTS_PATH` is set, the
57
+ * override may be absolute, project-relative, or `~/`-relative. The override
58
+ * intentionally points at the artifact directory itself, not its parent, so
59
+ * callers can rename `.aiwg` or place it outside the checkout.
60
+ */
61
+ export function resolveProjectAiwgDir(projectDir, env = process.env) {
62
+ for (const key of ARTIFACT_PATH_ENV_ALIASES) {
63
+ const value = env[key];
64
+ if (typeof value === 'string' && value.trim().length > 0) {
65
+ return expandProjectArtifactPath(value, projectDir);
66
+ }
67
+ }
68
+ const configuredLocation = readProjectArtifactLocation(projectDir);
69
+ if (configuredLocation)
70
+ return expandProjectArtifactPath(configuredLocation, projectDir);
71
+ return resolve(projectDir, DEFAULT_PROJECT_AIWG_DIR);
72
+ }
73
+ export function projectAiwgPath(projectDir, ...segments) {
74
+ return join(resolveProjectAiwgDir(projectDir), ...segments);
75
+ }
76
+ //# sourceMappingURL=project-artifacts.js.map
@@ -0,0 +1,428 @@
1
+ /**
2
+ * User-Level Configuration Manager
3
+ *
4
+ * Manages the ~/.aiwg/ (or ~/.config/aiwg/) user configuration directory.
5
+ * Provides get/set/list/validate/reset/path operations for all config files.
6
+ *
7
+ * Resolution order:
8
+ * 1. AIWG_CONFIG env var (explicit override)
9
+ * 2. --config-dir CLI flag (explicit override)
10
+ * 3. ~/.aiwg (primary — simple, discoverable)
11
+ * 4. ~/.config/aiwg (fallback — XDG-compliant)
12
+ *
13
+ * New config files are created in whichever path already exists,
14
+ * defaulting to ~/.aiwg if neither exists.
15
+ *
16
+ * @implements #545
17
+ */
18
+ import { readFile, writeFile, mkdir, access } from 'fs/promises';
19
+ import { resolve } from 'path';
20
+ import { homedir } from 'os';
21
+ import { existsSync } from 'fs';
22
+ /**
23
+ * Known config files in the user config directory
24
+ */
25
+ export const KNOWN_CONFIG_FILES = [
26
+ { filename: 'config.yaml', description: 'Global AIWG user preferences' },
27
+ { filename: 'models.json', description: 'Model tier and provider overrides' },
28
+ { filename: 'ops.json', description: 'Ops workspace registry' },
29
+ { filename: 'mcp-servers.json', description: 'MCP server registry (single source of truth)' },
30
+ { filename: 'packages.yaml', description: 'Installed remote packages (aiwg install)' },
31
+ ];
32
+ /**
33
+ * Default user config values
34
+ */
35
+ export const DEFAULT_USER_CONFIG = {
36
+ apiVersion: 'aiwg.io/v1',
37
+ kind: 'UserConfig',
38
+ defaults: {
39
+ provider: 'claude',
40
+ verbosity: 'normal',
41
+ },
42
+ telemetry: {
43
+ enabled: false,
44
+ },
45
+ updates: {
46
+ channel: 'stable',
47
+ checkOnStartup: true,
48
+ },
49
+ community: {
50
+ nudges: true,
51
+ },
52
+ };
53
+ /**
54
+ * Resolve the active user config directory
55
+ *
56
+ * Resolution order:
57
+ * 1. Explicit override (AIWG_CONFIG env or --config-dir)
58
+ * 2. ~/.aiwg (primary)
59
+ * 3. ~/.config/aiwg (fallback)
60
+ * 4. ~/.aiwg (default if neither exists)
61
+ */
62
+ export function resolveConfigDir(overridePath) {
63
+ // 1. Explicit override from env or CLI flag
64
+ const envOverride = process.env.AIWG_CONFIG;
65
+ if (overridePath) {
66
+ return resolve(overridePath);
67
+ }
68
+ if (envOverride) {
69
+ return resolve(envOverride);
70
+ }
71
+ // 2. Check primary path: ~/.aiwg
72
+ const primaryPath = resolve(homedir(), '.aiwg');
73
+ if (existsSync(primaryPath)) {
74
+ return primaryPath;
75
+ }
76
+ // 3. Check fallback path: ~/.config/aiwg
77
+ const fallbackPath = resolve(homedir(), '.config/aiwg');
78
+ if (existsSync(fallbackPath)) {
79
+ return fallbackPath;
80
+ }
81
+ // 4. Default to primary if neither exists
82
+ return primaryPath;
83
+ }
84
+ /**
85
+ * User-level configuration manager
86
+ */
87
+ export class UserConfig {
88
+ configDir;
89
+ configCache = null;
90
+ constructor(overridePath) {
91
+ this.configDir = resolveConfigDir(overridePath);
92
+ }
93
+ /**
94
+ * Get the resolved config directory path
95
+ */
96
+ getPath() {
97
+ return this.configDir;
98
+ }
99
+ /**
100
+ * Ensure the config directory exists
101
+ */
102
+ async ensureDir() {
103
+ await mkdir(this.configDir, { recursive: true });
104
+ }
105
+ /**
106
+ * Get a config value by dot-notation key
107
+ *
108
+ * Supports keys like:
109
+ * - "defaults.provider"
110
+ * - "telemetry.enabled"
111
+ * - "updates.channel"
112
+ */
113
+ async get(key) {
114
+ const config = await this.loadConfig();
115
+ return getNestedValue(config, key);
116
+ }
117
+ /**
118
+ * Set a config value by dot-notation key
119
+ */
120
+ async set(key, value) {
121
+ const config = await this.loadConfig();
122
+ const parsed = parseValue(value);
123
+ setNestedValue(config, key, parsed);
124
+ await this.saveConfig(config);
125
+ this.configCache = config;
126
+ }
127
+ /**
128
+ * List all config values (merged view across all files)
129
+ */
130
+ async list() {
131
+ const result = {};
132
+ // Load config.yaml (or defaults)
133
+ const config = await this.loadConfig();
134
+ result['config.yaml'] = config;
135
+ // Check for other known files
136
+ for (const spec of KNOWN_CONFIG_FILES) {
137
+ if (spec.filename === 'config.yaml')
138
+ continue;
139
+ const filePath = resolve(this.configDir, spec.filename);
140
+ try {
141
+ await access(filePath);
142
+ const content = await readFile(filePath, 'utf-8');
143
+ if (spec.filename.endsWith('.json')) {
144
+ result[spec.filename] = JSON.parse(content);
145
+ }
146
+ else {
147
+ result[spec.filename] = content;
148
+ }
149
+ }
150
+ catch {
151
+ // File doesn't exist, skip
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ /**
157
+ * Validate all config files
158
+ *
159
+ * Returns array of validation issues (empty = all valid)
160
+ */
161
+ async validate() {
162
+ const issues = [];
163
+ // Check config directory exists
164
+ if (!existsSync(this.configDir)) {
165
+ issues.push({
166
+ file: this.configDir,
167
+ severity: 'info',
168
+ message: 'Config directory does not exist (will be created on first use)',
169
+ });
170
+ return issues;
171
+ }
172
+ // Validate config.yaml
173
+ const configPath = resolve(this.configDir, 'config.yaml');
174
+ if (existsSync(configPath)) {
175
+ try {
176
+ const content = await readFile(configPath, 'utf-8');
177
+ const parsed = parseYamlSimple(content);
178
+ if (!parsed.apiVersion) {
179
+ issues.push({
180
+ file: 'config.yaml',
181
+ severity: 'warning',
182
+ message: 'Missing apiVersion field',
183
+ });
184
+ }
185
+ if (!parsed.kind) {
186
+ issues.push({
187
+ file: 'config.yaml',
188
+ severity: 'warning',
189
+ message: 'Missing kind field',
190
+ });
191
+ }
192
+ }
193
+ catch (err) {
194
+ issues.push({
195
+ file: 'config.yaml',
196
+ severity: 'error',
197
+ message: `Failed to parse: ${err instanceof Error ? err.message : String(err)}`,
198
+ });
199
+ }
200
+ }
201
+ // Validate models.json
202
+ const modelsPath = resolve(this.configDir, 'models.json');
203
+ if (existsSync(modelsPath)) {
204
+ try {
205
+ const content = await readFile(modelsPath, 'utf-8');
206
+ JSON.parse(content);
207
+ }
208
+ catch (err) {
209
+ issues.push({
210
+ file: 'models.json',
211
+ severity: 'error',
212
+ message: `Invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
213
+ });
214
+ }
215
+ }
216
+ // Validate ops.json if present
217
+ const opsPath = resolve(this.configDir, 'ops.json');
218
+ if (existsSync(opsPath)) {
219
+ try {
220
+ const content = await readFile(opsPath, 'utf-8');
221
+ const parsed = JSON.parse(content);
222
+ if (parsed.apiVersion && parsed.apiVersion !== 'aiwg.io/v1') {
223
+ issues.push({
224
+ file: 'ops.json',
225
+ severity: 'warning',
226
+ message: `Unknown apiVersion: ${parsed.apiVersion}`,
227
+ });
228
+ }
229
+ }
230
+ catch (err) {
231
+ issues.push({
232
+ file: 'ops.json',
233
+ severity: 'error',
234
+ message: `Failed to parse: ${err instanceof Error ? err.message : String(err)}`,
235
+ });
236
+ }
237
+ }
238
+ return issues;
239
+ }
240
+ /**
241
+ * Reset a key to its default value, or reset all config
242
+ */
243
+ async reset(key) {
244
+ if (!key) {
245
+ // Reset entire config to defaults
246
+ await this.saveConfig({ ...DEFAULT_USER_CONFIG });
247
+ this.configCache = null;
248
+ return;
249
+ }
250
+ // Reset specific key
251
+ const config = await this.loadConfig();
252
+ const defaultValue = getNestedValue(DEFAULT_USER_CONFIG, key);
253
+ if (defaultValue !== undefined) {
254
+ setNestedValue(config, key, defaultValue);
255
+ await this.saveConfig(config);
256
+ this.configCache = config;
257
+ }
258
+ }
259
+ /**
260
+ * Load config.yaml, creating defaults if it doesn't exist
261
+ */
262
+ async loadConfig() {
263
+ if (this.configCache) {
264
+ return this.configCache;
265
+ }
266
+ const configPath = resolve(this.configDir, 'config.yaml');
267
+ try {
268
+ const content = await readFile(configPath, 'utf-8');
269
+ const parsed = parseYamlSimple(content);
270
+ this.configCache = {
271
+ ...DEFAULT_USER_CONFIG,
272
+ ...parsed,
273
+ defaults: { ...DEFAULT_USER_CONFIG.defaults, ...parsed.defaults },
274
+ telemetry: { ...DEFAULT_USER_CONFIG.telemetry, ...parsed.telemetry },
275
+ updates: { ...DEFAULT_USER_CONFIG.updates, ...parsed.updates },
276
+ community: { ...DEFAULT_USER_CONFIG.community, ...parsed.community },
277
+ };
278
+ return this.configCache;
279
+ }
280
+ catch {
281
+ // File doesn't exist — return defaults (don't create file yet)
282
+ this.configCache = {
283
+ ...DEFAULT_USER_CONFIG,
284
+ defaults: { ...DEFAULT_USER_CONFIG.defaults },
285
+ telemetry: { ...DEFAULT_USER_CONFIG.telemetry },
286
+ updates: { ...DEFAULT_USER_CONFIG.updates },
287
+ community: { ...DEFAULT_USER_CONFIG.community },
288
+ };
289
+ return this.configCache;
290
+ }
291
+ }
292
+ /**
293
+ * Save config.yaml
294
+ */
295
+ async saveConfig(config) {
296
+ await this.ensureDir();
297
+ const configPath = resolve(this.configDir, 'config.yaml');
298
+ const yaml = serializeYamlSimple(config);
299
+ await writeFile(configPath, yaml, 'utf-8');
300
+ }
301
+ }
302
+ // ============================================
303
+ // Simple YAML helpers (no dependency needed for flat configs)
304
+ // ============================================
305
+ /**
306
+ * Minimal YAML parser for flat/nested config files.
307
+ * Handles the subset we use: scalars, nested objects (2 levels).
308
+ * For complex YAML, users should use a full parser.
309
+ */
310
+ export function parseYamlSimple(content) {
311
+ const result = {};
312
+ let currentSection = null;
313
+ for (const line of content.split('\n')) {
314
+ // Skip comments and empty lines
315
+ if (line.trim().startsWith('#') || line.trim() === '')
316
+ continue;
317
+ const indent = line.length - line.trimStart().length;
318
+ const trimmed = line.trim();
319
+ // Key: value pair
320
+ const match = trimmed.match(/^([^:]+):\s*(.*)$/);
321
+ if (!match)
322
+ continue;
323
+ const key = match[1].trim();
324
+ const rawValue = match[2].trim();
325
+ if (indent === 0) {
326
+ if (rawValue === '' || rawValue === undefined) {
327
+ // Section header
328
+ currentSection = key;
329
+ if (!(key in result)) {
330
+ result[key] = {};
331
+ }
332
+ }
333
+ else {
334
+ // Top-level key-value
335
+ currentSection = null;
336
+ result[key] = parseScalar(rawValue);
337
+ }
338
+ }
339
+ else if (currentSection && indent >= 2) {
340
+ // Nested key under current section
341
+ const section = result[currentSection];
342
+ section[key] = parseScalar(rawValue);
343
+ }
344
+ }
345
+ return result;
346
+ }
347
+ function parseScalar(value) {
348
+ if (value === 'true')
349
+ return true;
350
+ if (value === 'false')
351
+ return false;
352
+ if (value === 'null' || value === '~')
353
+ return null;
354
+ if (/^-?\d+$/.test(value))
355
+ return parseInt(value, 10);
356
+ if (/^-?\d+\.\d+$/.test(value))
357
+ return parseFloat(value);
358
+ // Strip quotes
359
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
360
+ return value.slice(1, -1);
361
+ }
362
+ return value;
363
+ }
364
+ /**
365
+ * Minimal YAML serializer for our config format
366
+ */
367
+ export function serializeYamlSimple(obj, indent = 0) {
368
+ const lines = [];
369
+ const pad = ' '.repeat(indent);
370
+ for (const [key, value] of Object.entries(obj)) {
371
+ if (value === null || value === undefined) {
372
+ lines.push(`${pad}${key}:`);
373
+ }
374
+ else if (typeof value === 'object' && !Array.isArray(value)) {
375
+ lines.push(`${pad}${key}:`);
376
+ lines.push(serializeYamlSimple(value, indent + 2));
377
+ }
378
+ else if (typeof value === 'string') {
379
+ // Quote strings that could be misinterpreted
380
+ const needsQuote = /[:#{}[\],&*?|>!%@`]/.test(value) || value === '';
381
+ lines.push(`${pad}${key}: ${needsQuote ? `"${value}"` : value}`);
382
+ }
383
+ else {
384
+ lines.push(`${pad}${key}: ${String(value)}`);
385
+ }
386
+ }
387
+ return lines.join('\n');
388
+ }
389
+ // ============================================
390
+ // Dot-notation helpers
391
+ // ============================================
392
+ function getNestedValue(obj, path) {
393
+ const parts = path.split('.');
394
+ let current = obj;
395
+ for (const part of parts) {
396
+ if (current === null || current === undefined || typeof current !== 'object') {
397
+ return undefined;
398
+ }
399
+ current = current[part];
400
+ }
401
+ return current;
402
+ }
403
+ function setNestedValue(obj, path, value) {
404
+ const parts = path.split('.');
405
+ let current = obj;
406
+ for (let i = 0; i < parts.length - 1; i++) {
407
+ const part = parts[i];
408
+ if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {
409
+ current[part] = {};
410
+ }
411
+ current = current[part];
412
+ }
413
+ current[parts[parts.length - 1]] = value;
414
+ }
415
+ function parseValue(value) {
416
+ if (value === 'true')
417
+ return true;
418
+ if (value === 'false')
419
+ return false;
420
+ if (value === 'null')
421
+ return null;
422
+ if (/^-?\d+$/.test(value))
423
+ return parseInt(value, 10);
424
+ if (/^-?\d+\.\d+$/.test(value))
425
+ return parseFloat(value);
426
+ return value;
427
+ }
428
+ //# sourceMappingURL=user-config.js.map