@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -1
  3. package/bin/aiwg.mjs +349 -0
  4. package/dist/src/a2a/agent-card.js +145 -0
  5. package/dist/src/a2a/client.js +411 -0
  6. package/dist/src/a2a/hitl-cli.js +171 -0
  7. package/dist/src/a2a/hitl-driver.js +370 -0
  8. package/dist/src/a2a/hitl.js +181 -0
  9. package/dist/src/a2a/http.js +193 -0
  10. package/dist/src/a2a/jcs.js +128 -0
  11. package/dist/src/a2a/jws.js +187 -0
  12. package/dist/src/a2a/types.js +24 -0
  13. package/dist/src/a2a/webhook.js +240 -0
  14. package/dist/src/activity-log/cli.js +348 -0
  15. package/dist/src/activity-log/parser.js +81 -0
  16. package/dist/src/activity-log/types.js +50 -0
  17. package/dist/src/agents/agent-deployer.js +367 -0
  18. package/dist/src/agents/agent-packager.js +271 -0
  19. package/dist/src/agents/agent-validator.js +271 -0
  20. package/dist/src/agents/grounding/knowledge-base.js +161 -0
  21. package/dist/src/agents/grounding/types.js +12 -0
  22. package/dist/src/agents/index.js +10 -0
  23. package/dist/src/agents/packaged-agent-inventory.js +75 -0
  24. package/dist/src/agents/types.js +7 -0
  25. package/dist/src/api/index.d.ts +10 -0
  26. package/dist/src/api/index.js +10 -0
  27. package/dist/src/artifacts/address-parser.js +73 -0
  28. package/dist/src/artifacts/audit/cli.js +183 -0
  29. package/dist/src/artifacts/audit/drift.js +122 -0
  30. package/dist/src/artifacts/audit/types.js +12 -0
  31. package/dist/src/artifacts/backends/graphology-backend.js +160 -0
  32. package/dist/src/artifacts/backends/json-backend.js +129 -0
  33. package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
  34. package/dist/src/artifacts/browser-export.js +622 -0
  35. package/dist/src/artifacts/capability-resolver.js +94 -0
  36. package/dist/src/artifacts/checksum-manifest.js +91 -0
  37. package/dist/src/artifacts/citation-parser.js +162 -0
  38. package/dist/src/artifacts/cli.js +1486 -0
  39. package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
  40. package/dist/src/artifacts/corpus-tools/cli.js +393 -0
  41. package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
  42. package/dist/src/artifacts/corpus-tools/curator.js +186 -0
  43. package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
  44. package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
  45. package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
  46. package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
  47. package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
  48. package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
  49. package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
  50. package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
  51. package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
  52. package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
  53. package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
  54. package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
  55. package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
  56. package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
  57. package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
  58. package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
  59. package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
  60. package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
  61. package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
  62. package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
  63. package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
  64. package/dist/src/artifacts/corpus-views/build.js +126 -0
  65. package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
  66. package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
  67. package/dist/src/artifacts/corpus-views/renderers.js +353 -0
  68. package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
  69. package/dist/src/artifacts/dep-graph.js +173 -0
  70. package/dist/src/artifacts/discover-facets.js +375 -0
  71. package/dist/src/artifacts/embedding-index.js +354 -0
  72. package/dist/src/artifacts/enrichment/cli.js +240 -0
  73. package/dist/src/artifacts/enrichment/prompt.js +47 -0
  74. package/dist/src/artifacts/enrichment/store.js +90 -0
  75. package/dist/src/artifacts/enrichment/types.js +12 -0
  76. package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
  77. package/dist/src/artifacts/fortemi-core-sync.js +251 -0
  78. package/dist/src/artifacts/fortemi-shard-export.js +44 -0
  79. package/dist/src/artifacts/fulltext.js +108 -0
  80. package/dist/src/artifacts/graph-backend.js +51 -0
  81. package/dist/src/artifacts/graph-query.js +247 -0
  82. package/dist/src/artifacts/hybrid-query.js +225 -0
  83. package/dist/src/artifacts/index-builder.js +1089 -0
  84. package/dist/src/artifacts/index-reader.js +112 -0
  85. package/dist/src/artifacts/index-status.js +193 -0
  86. package/dist/src/artifacts/legacy-index-migration.js +169 -0
  87. package/dist/src/artifacts/move.js +154 -0
  88. package/dist/src/artifacts/operational-state.js +239 -0
  89. package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
  90. package/dist/src/artifacts/query-engine.js +1955 -0
  91. package/dist/src/artifacts/source-graph.js +529 -0
  92. package/dist/src/artifacts/stats.js +169 -0
  93. package/dist/src/artifacts/types.js +606 -0
  94. package/dist/src/artifacts/views/cli.js +293 -0
  95. package/dist/src/artifacts/views/definition.js +170 -0
  96. package/dist/src/artifacts/views/store.js +149 -0
  97. package/dist/src/artifacts/views/types.js +8 -0
  98. package/dist/src/artifacts/watcher.js +255 -0
  99. package/dist/src/catalog/builtin-models.json +636 -0
  100. package/dist/src/catalog/cli.js +228 -0
  101. package/dist/src/catalog/cli.mjs +289 -0
  102. package/dist/src/catalog/index.js +15 -0
  103. package/dist/src/catalog/loader.js +217 -0
  104. package/dist/src/catalog/loader.mjs +251 -0
  105. package/dist/src/catalog/sources.json +41 -0
  106. package/dist/src/catalog/types.js +8 -0
  107. package/dist/src/channel/manager.mjs +504 -0
  108. package/dist/src/cli/agent-spawn.js +178 -0
  109. package/dist/src/cli/cli-extension-loader.js +245 -0
  110. package/dist/src/cli/command-log.js +275 -0
  111. package/dist/src/cli/config-loader.js +232 -0
  112. package/dist/src/cli/env.js +82 -0
  113. package/dist/src/cli/errors.js +150 -0
  114. package/dist/src/cli/find-package-root.js +40 -0
  115. package/dist/src/cli/git-hooks.js +250 -0
  116. package/dist/src/cli/handlers/agentcard.js +206 -0
  117. package/dist/src/cli/handlers/artifacts.js +76 -0
  118. package/dist/src/cli/handlers/best-practices-audit.js +280 -0
  119. package/dist/src/cli/handlers/cockpit.js +137 -0
  120. package/dist/src/cli/handlers/command-log.js +37 -0
  121. package/dist/src/cli/handlers/daemon.js +59 -0
  122. package/dist/src/cli/handlers/diagnose.js +300 -0
  123. package/dist/src/cli/handlers/execution-mode.js +105 -0
  124. package/dist/src/cli/handlers/feedback.js +341 -0
  125. package/dist/src/cli/handlers/help.js +147 -0
  126. package/dist/src/cli/handlers/index.js +302 -0
  127. package/dist/src/cli/handlers/init.js +179 -0
  128. package/dist/src/cli/handlers/install.js +129 -0
  129. package/dist/src/cli/handlers/issues.js +46 -0
  130. package/dist/src/cli/handlers/lint.js +42 -0
  131. package/dist/src/cli/handlers/local-executor.js +315 -0
  132. package/dist/src/cli/handlers/marketplace.js +168 -0
  133. package/dist/src/cli/handlers/mc.js +1010 -0
  134. package/dist/src/cli/handlers/models.js +352 -0
  135. package/dist/src/cli/handlers/packages.js +155 -0
  136. package/dist/src/cli/handlers/ralph-launcher.js +717 -0
  137. package/dist/src/cli/handlers/ralph.js +575 -0
  138. package/dist/src/cli/handlers/refresh.js +432 -0
  139. package/dist/src/cli/handlers/regenerate.js +336 -0
  140. package/dist/src/cli/handlers/repo-access.js +109 -0
  141. package/dist/src/cli/handlers/run.js +165 -0
  142. package/dist/src/cli/handlers/runtime-info.js +301 -0
  143. package/dist/src/cli/handlers/sandbox.js +197 -0
  144. package/dist/src/cli/handlers/scaffolding.js +149 -0
  145. package/dist/src/cli/handlers/script-runner.js +121 -0
  146. package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
  147. package/dist/src/cli/handlers/serve.js +1835 -0
  148. package/dist/src/cli/handlers/session.js +348 -0
  149. package/dist/src/cli/handlers/setup.js +440 -0
  150. package/dist/src/cli/handlers/skill-lint.js +367 -0
  151. package/dist/src/cli/handlers/skill-usage.js +74 -0
  152. package/dist/src/cli/handlers/steward.js +567 -0
  153. package/dist/src/cli/handlers/subcommands.js +1702 -0
  154. package/dist/src/cli/handlers/team.js +337 -0
  155. package/dist/src/cli/handlers/types.js +11 -0
  156. package/dist/src/cli/handlers/use.js +2772 -0
  157. package/dist/src/cli/handlers/utilities.js +703 -0
  158. package/dist/src/cli/handlers/version.js +134 -0
  159. package/dist/src/cli/handlers/workspace-context.js +93 -0
  160. package/dist/src/cli/handlers/workspace.js +126 -0
  161. package/dist/src/cli/help-generator.js +178 -0
  162. package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
  163. package/dist/src/cli/hooks/executor.js +96 -0
  164. package/dist/src/cli/hooks/index.js +15 -0
  165. package/dist/src/cli/hooks/registry.js +143 -0
  166. package/dist/src/cli/hooks/types.js +13 -0
  167. package/dist/src/cli/log.js +492 -0
  168. package/dist/src/cli/project-isolation/detect.js +70 -0
  169. package/dist/src/cli/project-isolation/index.js +7 -0
  170. package/dist/src/cli/project-isolation/signals.js +17 -0
  171. package/dist/src/cli/project-isolation/warning.js +102 -0
  172. package/dist/src/cli/prompt-utils.js +155 -0
  173. package/dist/src/cli/provider-deployment-plan.js +126 -0
  174. package/dist/src/cli/provider-resolution.js +119 -0
  175. package/dist/src/cli/router.js +305 -0
  176. package/dist/src/cli/scope-resolver.js +392 -0
  177. package/dist/src/cli/skill-usage.js +616 -0
  178. package/dist/src/cli/ui.js +224 -0
  179. package/dist/src/cli/watch-service.js +203 -0
  180. package/dist/src/cli/workflow-orchestrator.js +478 -0
  181. package/dist/src/cli/workspace-signals.js +321 -0
  182. package/dist/src/community/footer.js +14 -0
  183. package/dist/src/community/links.js +123 -0
  184. package/dist/src/community/milestones.js +46 -0
  185. package/dist/src/community/nudge-policy.js +93 -0
  186. package/dist/src/config/aiwg-config.js +883 -0
  187. package/dist/src/config/cli.js +703 -0
  188. package/dist/src/config/gitignore.js +156 -0
  189. package/dist/src/config/project-artifacts.js +76 -0
  190. package/dist/src/config/user-config.js +428 -0
  191. package/dist/src/config/user-registry.js +127 -0
  192. package/dist/src/config/workspace.js +276 -0
  193. package/dist/src/contributors/detect.js +39 -0
  194. package/dist/src/contributors/discover.js +172 -0
  195. package/dist/src/contributors/heuristic.js +186 -0
  196. package/dist/src/contributors/index.js +11 -0
  197. package/dist/src/contributors/types.js +13 -0
  198. package/dist/src/contributors/validation.js +116 -0
  199. package/dist/src/data/community.schema.json +43 -0
  200. package/dist/src/data/community.yaml +16 -0
  201. package/dist/src/extensions/capability-index.js +270 -0
  202. package/dist/src/extensions/claude-hooks-installer.js +268 -0
  203. package/dist/src/extensions/commands/definitions.js +3485 -0
  204. package/dist/src/extensions/deployment-registration.js +463 -0
  205. package/dist/src/extensions/index.js +22 -0
  206. package/dist/src/extensions/loader.js +132 -0
  207. package/dist/src/extensions/managed-marker.js +100 -0
  208. package/dist/src/extensions/manifest.js +196 -0
  209. package/dist/src/extensions/project-local-activity.js +114 -0
  210. package/dist/src/extensions/project-local-discovery.js +261 -0
  211. package/dist/src/extensions/project-local-doctor.js +281 -0
  212. package/dist/src/extensions/project-local-gitignore.js +176 -0
  213. package/dist/src/extensions/project-local-paths.js +121 -0
  214. package/dist/src/extensions/project-local-promote.js +218 -0
  215. package/dist/src/extensions/project-local-remove.js +373 -0
  216. package/dist/src/extensions/project-local-scaffold.js +252 -0
  217. package/dist/src/extensions/project-quickref.js +291 -0
  218. package/dist/src/extensions/registry.js +368 -0
  219. package/dist/src/extensions/shadow-resolver.js +271 -0
  220. package/dist/src/extensions/types.js +86 -0
  221. package/dist/src/extensions/upstream-registry.js +195 -0
  222. package/dist/src/extensions/validation.js +631 -0
  223. package/dist/src/features/catalog.js +88 -0
  224. package/dist/src/features/cli.js +197 -0
  225. package/dist/src/features/installer.js +57 -0
  226. package/dist/src/features/paths.js +14 -0
  227. package/dist/src/features/runtime.js +21 -0
  228. package/dist/src/features/status.js +134 -0
  229. package/dist/src/hooks/laziness-detection.js +532 -0
  230. package/dist/src/intake/git-history-analyzer.js +486 -0
  231. package/dist/src/intake/index.js +9 -0
  232. package/dist/src/issues/cli.js +327 -0
  233. package/dist/src/issues/index.js +5 -0
  234. package/dist/src/issues/live.js +154 -0
  235. package/dist/src/issues/local.js +666 -0
  236. package/dist/src/issues/sync.js +143 -0
  237. package/dist/src/issues/types.js +2 -0
  238. package/dist/src/issues/workflows.js +164 -0
  239. package/dist/src/kb/cli.js +173 -0
  240. package/dist/src/lint/cli.js +171 -0
  241. package/dist/src/lint/loader.js +225 -0
  242. package/dist/src/lint/reporters.js +141 -0
  243. package/dist/src/lint/runner.js +364 -0
  244. package/dist/src/lint/types.js +10 -0
  245. package/dist/src/marketplace/cache.js +110 -0
  246. package/dist/src/marketplace/identifier.js +63 -0
  247. package/dist/src/marketplace/registry.js +36 -0
  248. package/dist/src/marketplace/sources/clawhub.js +53 -0
  249. package/dist/src/marketplace/sources/git.js +45 -0
  250. package/dist/src/marketplace/types.js +9 -0
  251. package/dist/src/mcp/adapters/codex-runtime.js +224 -0
  252. package/dist/src/mcp/cli.mjs +1197 -0
  253. package/dist/src/mcp/elicitation.mjs +149 -0
  254. package/dist/src/mcp/helpers.mjs +287 -0
  255. package/dist/src/mcp/index.mjs +11 -0
  256. package/dist/src/mcp/profiles.js +263 -0
  257. package/dist/src/mcp/profiles.mjs +360 -0
  258. package/dist/src/mcp/registry.js +376 -0
  259. package/dist/src/mcp/registry.mjs +387 -0
  260. package/dist/src/mcp/server.mjs +633 -0
  261. package/dist/src/mcp/test-simple.mjs +271 -0
  262. package/dist/src/mcp/tools/command-run.mjs +101 -0
  263. package/dist/src/mcp/tools/discovery.mjs +291 -0
  264. package/dist/src/mcp/tools/interaction.mjs +87 -0
  265. package/dist/src/mcp/tools/orchestration.mjs +320 -0
  266. package/dist/src/mcp/tools/subsystems.mjs +640 -0
  267. package/dist/src/memory/cli.js +166 -0
  268. package/dist/src/memory/project-registry.js +282 -0
  269. package/dist/src/metrics/artifact-metrics.js +184 -0
  270. package/dist/src/metrics/context-budget.js +174 -0
  271. package/dist/src/metrics/token-counter.js +133 -0
  272. package/dist/src/models/config-loader.js +228 -0
  273. package/dist/src/models/index.js +22 -0
  274. package/dist/src/models/model-capabilities.v1.json +120 -0
  275. package/dist/src/models/model-catalog.v1.json +96 -0
  276. package/dist/src/models/model-discovery.js +521 -0
  277. package/dist/src/models/provider-models.js +73 -0
  278. package/dist/src/models/provider-policy.js +273 -0
  279. package/dist/src/models/resolver.js +245 -0
  280. package/dist/src/models/router.js +70 -0
  281. package/dist/src/models/types.js +8 -0
  282. package/dist/src/models/wrapper-deployment.js +178 -0
  283. package/dist/src/models/wrapper-route.js +54 -0
  284. package/dist/src/ops/cli.js +268 -0
  285. package/dist/src/ops/registry.js +623 -0
  286. package/dist/src/packages/adapters/clawhub.js +113 -0
  287. package/dist/src/packages/adapters/git.js +153 -0
  288. package/dist/src/packages/adapters/gitea.js +93 -0
  289. package/dist/src/packages/adapters/github.js +69 -0
  290. package/dist/src/packages/adapters/local-cache.js +89 -0
  291. package/dist/src/packages/package-registry.js +143 -0
  292. package/dist/src/packages/registry.js +238 -0
  293. package/dist/src/packages/types.js +11 -0
  294. package/dist/src/plugin/cross-framework-ops.js +475 -0
  295. package/dist/src/plugin/framework-config-loader.js +235 -0
  296. package/dist/src/plugin/framework-detector.js +186 -0
  297. package/dist/src/plugin/framework-isolator.js +341 -0
  298. package/dist/src/plugin/framework-migration.js +371 -0
  299. package/dist/src/plugin/metadata-validator.js +906 -0
  300. package/dist/src/plugin/plugin-installer.js +436 -0
  301. package/dist/src/plugin/plugin-status.js +369 -0
  302. package/dist/src/plugin/plugin-uninstaller.js +473 -0
  303. package/dist/src/plugin/registry-validator.js +344 -0
  304. package/dist/src/plugin/skill-command-translator.js +415 -0
  305. package/dist/src/plugin/workspace-creator.js +189 -0
  306. package/dist/src/plugin/workspace-migrator.js +821 -0
  307. package/dist/src/policy/authorization.js +390 -0
  308. package/dist/src/policy/repo-access.js +215 -0
  309. package/dist/src/provenance/cli.js +16 -0
  310. package/dist/src/providers/capability-matrix.js +300 -0
  311. package/dist/src/providers/capability-matrix.yaml +514 -0
  312. package/dist/src/providers/provider-definitions.js +977 -0
  313. package/dist/src/providers/provider-definitions.mjs +159 -0
  314. package/dist/src/providers/provider-inventory.js +169 -0
  315. package/dist/src/quality/feedback-ab.js +174 -0
  316. package/dist/src/quality/feedback-collector.js +176 -0
  317. package/dist/src/quality/feedback-tracker.js +123 -0
  318. package/dist/src/quality/patterns/adr.json +24 -0
  319. package/dist/src/quality/patterns/sad.json +24 -0
  320. package/dist/src/quality/patterns/test-plan.json +24 -0
  321. package/dist/src/quality/patterns/use-case.json +24 -0
  322. package/dist/src/quality/scoring.js +157 -0
  323. package/dist/src/reflections/cli.js +15 -0
  324. package/dist/src/release/plan.js +139 -0
  325. package/dist/src/research/cache/manager.js +227 -0
  326. package/dist/src/research/clients/arxiv.js +156 -0
  327. package/dist/src/research/clients/base.js +197 -0
  328. package/dist/src/research/clients/crossref.js +112 -0
  329. package/dist/src/research/clients/semantic-scholar.js +126 -0
  330. package/dist/src/research/clients/unpaywall.js +87 -0
  331. package/dist/src/research/index.js +14 -0
  332. package/dist/src/research/query-cli.js +336 -0
  333. package/dist/src/research/services/acquisition.js +313 -0
  334. package/dist/src/research/services/archival.js +225 -0
  335. package/dist/src/research/services/citation.js +279 -0
  336. package/dist/src/research/services/discovery.js +243 -0
  337. package/dist/src/research/services/documentation.js +269 -0
  338. package/dist/src/research/services/index.js +14 -0
  339. package/dist/src/research/services/provenance.js +279 -0
  340. package/dist/src/research/services/quality.js +370 -0
  341. package/dist/src/research/services/types.js +7 -0
  342. package/dist/src/research/storage-cli.js +20 -0
  343. package/dist/src/research/types.js +47 -0
  344. package/dist/src/resources/index.d.ts +2 -0
  345. package/dist/src/resources/index.js +2 -0
  346. package/dist/src/resources/web-release.d.ts +89 -0
  347. package/dist/src/resources/web-release.js +886 -0
  348. package/dist/src/rlm/cache/cli.js +162 -0
  349. package/dist/src/rlm/cache/hash.js +35 -0
  350. package/dist/src/rlm/cache/store.js +170 -0
  351. package/dist/src/rlm/cache/types.js +8 -0
  352. package/dist/src/rlm/cli.js +650 -0
  353. package/dist/src/serve/a2a-terminal-observer.js +120 -0
  354. package/dist/src/serve/agent-router.js +205 -0
  355. package/dist/src/serve/dispatch-router.js +171 -0
  356. package/dist/src/serve/executor-registry.js +715 -0
  357. package/dist/src/serve/mission-conductor.js +177 -0
  358. package/dist/src/serve/orchestrator-adapter.js +113 -0
  359. package/dist/src/serve/orchestrator-override.js +94 -0
  360. package/dist/src/serve/orchestrator-pty.js +133 -0
  361. package/dist/src/serve/pty-bridge.js +799 -0
  362. package/dist/src/serve/sandbox-registry.js +832 -0
  363. package/dist/src/serve/screen-reader.js +228 -0
  364. package/dist/src/serve/stack-adapters.js +68 -0
  365. package/dist/src/serve/telemetry.js +143 -0
  366. package/dist/src/skills/adapters/clawhub.js +250 -0
  367. package/dist/src/skills/adapters/local.js +335 -0
  368. package/dist/src/skills/adapters/openclaw.js +316 -0
  369. package/dist/src/skills/cli.js +334 -0
  370. package/dist/src/skills/registry.js +117 -0
  371. package/dist/src/skills/run.js +259 -0
  372. package/dist/src/skills/runtime.js +94 -0
  373. package/dist/src/skills/types.js +10 -0
  374. package/dist/src/smiths/agentsmith/demo.js +116 -0
  375. package/dist/src/smiths/agentsmith/examples.js +300 -0
  376. package/dist/src/smiths/agentsmith/generator.js +503 -0
  377. package/dist/src/smiths/agentsmith/index.js +11 -0
  378. package/dist/src/smiths/agentsmith/types.js +8 -0
  379. package/dist/src/smiths/commandsmith/example.js +220 -0
  380. package/dist/src/smiths/commandsmith/generator.js +288 -0
  381. package/dist/src/smiths/commandsmith/index.js +41 -0
  382. package/dist/src/smiths/commandsmith/templates.js +296 -0
  383. package/dist/src/smiths/commandsmith/types.js +7 -0
  384. package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
  385. package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
  386. package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
  387. package/dist/src/smiths/context-pipeline/discovery.js +187 -0
  388. package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
  389. package/dist/src/smiths/context-pipeline/finalization.js +147 -0
  390. package/dist/src/smiths/context-pipeline/generator.js +477 -0
  391. package/dist/src/smiths/context-pipeline/index.js +30 -0
  392. package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
  393. package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
  394. package/dist/src/smiths/context-pipeline/overflow.js +212 -0
  395. package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
  396. package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
  397. package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
  398. package/dist/src/smiths/context-pipeline/types.js +23 -0
  399. package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
  400. package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
  401. package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
  402. package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
  403. package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
  404. package/dist/src/smiths/hook-bridge/index.js +79 -0
  405. package/dist/src/smiths/hook-bridge/loader.js +116 -0
  406. package/dist/src/smiths/hook-bridge/shim.js +89 -0
  407. package/dist/src/smiths/hook-bridge/types.js +31 -0
  408. package/dist/src/smiths/index.js +39 -0
  409. package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
  410. package/dist/src/smiths/mcpsmith/example.js +119 -0
  411. package/dist/src/smiths/mcpsmith/generator.js +236 -0
  412. package/dist/src/smiths/mcpsmith/index.js +17 -0
  413. package/dist/src/smiths/mcpsmith/types.js +10 -0
  414. package/dist/src/smiths/platform-paths.js +101 -0
  415. package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
  416. package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
  417. package/dist/src/smiths/skillsmith/demo.js +83 -0
  418. package/dist/src/smiths/skillsmith/examples.js +161 -0
  419. package/dist/src/smiths/skillsmith/generator.js +316 -0
  420. package/dist/src/smiths/skillsmith/index.js +12 -0
  421. package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
  422. package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
  423. package/dist/src/smiths/skillsmith/types.js +9 -0
  424. package/dist/src/smiths/toolsmith/index.js +10 -0
  425. package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
  426. package/dist/src/smiths/toolsmith/types.js +8 -0
  427. package/dist/src/storage/backends/fortemi.js +227 -0
  428. package/dist/src/storage/backends/fs.js +134 -0
  429. package/dist/src/storage/backends/logseq.js +309 -0
  430. package/dist/src/storage/backends/obsidian.js +233 -0
  431. package/dist/src/storage/cli.js +468 -0
  432. package/dist/src/storage/config.js +272 -0
  433. package/dist/src/storage/index.js +108 -0
  434. package/dist/src/storage/subsystem-cli.js +201 -0
  435. package/dist/src/storage/types.js +33 -0
  436. package/dist/src/testing/corpus/corpus-builder.js +383 -0
  437. package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
  438. package/dist/src/testing/corpus/index.js +10 -0
  439. package/dist/src/testing/fixtures/index.js +9 -0
  440. package/dist/src/testing/fixtures/test-data-factory.js +472 -0
  441. package/dist/src/testing/generators/index.js +11 -0
  442. package/dist/src/testing/generators/test-case-generator.js +393 -0
  443. package/dist/src/testing/generators/test-code-generator.js +384 -0
  444. package/dist/src/testing/generators/use-case-parser.js +325 -0
  445. package/dist/src/testing/index.js +11 -0
  446. package/dist/src/tracker/capability-protocol.js +118 -0
  447. package/dist/src/update/checker.mjs +396 -0
  448. package/dist/src/update/notifier.mjs +235 -0
  449. package/dist/src/writing/content-diversifier.js +804 -0
  450. package/dist/src/writing/example-generator.js +959 -0
  451. package/dist/src/writing/example-templates.js +99 -0
  452. package/dist/src/writing/pattern-library.js +486 -0
  453. package/dist/src/writing/patterns/banned-phrases.json +4413 -0
  454. package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
  455. package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
  456. package/dist/src/writing/patterns/hedging-language.json +2096 -0
  457. package/dist/src/writing/patterns/transition-words.json +1285 -0
  458. package/dist/src/writing/patterns/weak-verbs.json +1112 -0
  459. package/dist/src/writing/prompt-optimizer.js +660 -0
  460. package/dist/src/writing/prompt-templates.js +583 -0
  461. package/dist/src/writing/scoring-config-loader.js +168 -0
  462. package/dist/src/writing/validation-engine.js +595 -0
  463. package/dist/src/writing/validation-rules.js +380 -0
  464. package/dist/src/writing/voice-analyzer.js +439 -0
  465. package/dist/src/writing/voice-calibration.js +661 -0
  466. package/dist/src/writing/voice-profiles.json +588 -0
  467. package/package.json +65 -9
@@ -0,0 +1,183 @@
1
+ /**
2
+ * `aiwg index doctor --rlm-audit` subcommand.
3
+ *
4
+ * Audits enriched index entries for content drift. Per-entry workflow:
5
+ * 1. Read stored SemanticFields.
6
+ * 2. Compute current artifact content hash.
7
+ * 3. If hashes match: ok (or stale-age if past freshness window).
8
+ * 4. If hashes differ: classify status as 'skip' (no recomputed input)
9
+ * or 'drift' (overlap/symbol thresholds exceeded).
10
+ *
11
+ * To classify drift the audit needs a *recomputed* enrichment for each
12
+ * mismatching entry. Producing that requires an RLM dispatch, which lives
13
+ * in agent skills, not the CLI. So this command operates in two passes:
14
+ *
15
+ * Pass 1 (default): Hash check only. Reports ok / stale-age / would-need-recompute.
16
+ * Pass 2 (--apply): Operator supplies a directory of recomputed JSON
17
+ * files (one per entry) and the audit classifies drift.
18
+ *
19
+ * @implements #1208
20
+ */
21
+ import { existsSync, readFileSync } from 'node:fs';
22
+ import { join } from 'node:path';
23
+ import { computeContentHash, list as listEnrichments, resolveSemanticRoot, get as getEnrichment, } from '../enrichment/store.js';
24
+ import { validateEnrichmentOutput } from '../enrichment/prompt.js';
25
+ import { projectAiwgPath } from '../../config/project-artifacts.js';
26
+ import { detectDrift } from './drift.js';
27
+ import { DEFAULT_THRESHOLDS } from './types.js';
28
+ export async function main(args) {
29
+ if (!args.includes('--rlm-audit')) {
30
+ printUsage();
31
+ if (args.length > 0)
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ const filter = flagValue(args, '--filter');
36
+ const strict = args.includes('--strict');
37
+ const json = args.includes('--json');
38
+ const recompDir = flagValue(args, '--recomputed-dir');
39
+ const thresholds = loadThresholds();
40
+ const root = resolveSemanticRoot();
41
+ // Build current-hash map for every enrichment that has a corresponding artifact
42
+ const allSummaries = listEnrichments(root, /* currentHashes */ {});
43
+ let summaries = allSummaries;
44
+ if (filter) {
45
+ const re = new RegExp(filter);
46
+ summaries = allSummaries.filter((s) => re.test(s.artifactId));
47
+ }
48
+ const rows = [];
49
+ for (const s of summaries) {
50
+ const stored = getEnrichment(root, s.artifactId);
51
+ let currentHash;
52
+ try {
53
+ currentHash = computeContentHash(readFileSync(s.artifactId));
54
+ }
55
+ catch {
56
+ rows.push({
57
+ artifactId: s.artifactId,
58
+ status: 'skip',
59
+ reason: 'artifact not readable from configured path',
60
+ storedHash: stored.enrichedHash,
61
+ currentHash: null,
62
+ ageDays: null,
63
+ });
64
+ continue;
65
+ }
66
+ let recomputed = null;
67
+ if (recompDir && stored.enrichedHash !== currentHash) {
68
+ const sanitized = s.artifactId.replace(/\//g, '__');
69
+ const candidate = join(recompDir, `${sanitized}.json`);
70
+ if (existsSync(candidate)) {
71
+ try {
72
+ const raw = JSON.parse(readFileSync(candidate, 'utf-8'));
73
+ const issues = validateEnrichmentOutput(raw);
74
+ if (issues.length === 0) {
75
+ recomputed = {
76
+ summary: raw['summary'],
77
+ declaredSymbols: raw['declared_symbols'],
78
+ citations: raw['citations'],
79
+ inferredTags: raw['inferred_tags'],
80
+ openQuestions: raw['open_questions'],
81
+ enrichedAt: new Date().toISOString(),
82
+ enrichedBy: 'audit-recompute',
83
+ enrichedHash: currentHash,
84
+ };
85
+ }
86
+ }
87
+ catch { /* leave recomputed null → status: skip */ }
88
+ }
89
+ }
90
+ rows.push(detectDrift({
91
+ artifactId: s.artifactId,
92
+ stored,
93
+ currentHash,
94
+ recomputed,
95
+ thresholds,
96
+ }));
97
+ }
98
+ const report = {
99
+ total: rows.length,
100
+ ok: rows.filter((r) => r.status === 'ok').length,
101
+ drift: rows.filter((r) => r.status === 'drift').length,
102
+ staleAge: rows.filter((r) => r.status === 'stale-age').length,
103
+ skipped: rows.filter((r) => r.status === 'skip').length,
104
+ thresholds,
105
+ rows,
106
+ };
107
+ if (json) {
108
+ console.log(JSON.stringify(report, null, 2));
109
+ }
110
+ else {
111
+ printHumanReport(report);
112
+ }
113
+ if (strict && (report.drift > 0 || report.staleAge > 0)) {
114
+ process.exitCode = 1;
115
+ }
116
+ }
117
+ function loadThresholds() {
118
+ // Try .aiwg/index/audit.config.yaml → fall back to defaults
119
+ const path = projectAiwgPath(process.cwd(), 'index', 'audit.config.yaml');
120
+ if (!existsSync(path))
121
+ return DEFAULT_THRESHOLDS;
122
+ try {
123
+ const yamlMod = require('js-yaml');
124
+ const raw = (yamlMod.load(readFileSync(path, 'utf-8')) ?? {});
125
+ const div = (raw['divergence'] ?? {});
126
+ return {
127
+ keywordOverlapMin: typeof div['keyword_overlap_min'] === 'number' ? div['keyword_overlap_min'] : DEFAULT_THRESHOLDS.keywordOverlapMin,
128
+ symbolChangeCritical: typeof div['symbol_change_critical'] === 'boolean' ? div['symbol_change_critical'] : DEFAULT_THRESHOLDS.symbolChangeCritical,
129
+ freshnessMaxDays: typeof div['freshness_max_days'] === 'number' ? div['freshness_max_days'] : DEFAULT_THRESHOLDS.freshnessMaxDays,
130
+ };
131
+ }
132
+ catch {
133
+ return DEFAULT_THRESHOLDS;
134
+ }
135
+ }
136
+ function printHumanReport(r) {
137
+ console.log(`Audited ${r.total} enriched entries`);
138
+ console.log(` ok: ${r.ok}`);
139
+ console.log(` drift: ${r.drift}`);
140
+ console.log(` stale-age: ${r.staleAge}`);
141
+ console.log(` skipped: ${r.skipped}`);
142
+ console.log('');
143
+ if (r.drift === 0 && r.staleAge === 0)
144
+ return;
145
+ console.log(`Thresholds: overlap ≥${(r.thresholds.keywordOverlapMin * 100).toFixed(0)}%, freshness ≤${r.thresholds.freshnessMaxDays}d`);
146
+ console.log('');
147
+ for (const row of r.rows) {
148
+ if (row.status === 'ok' || row.status === 'skip')
149
+ continue;
150
+ const icon = row.status === 'drift' ? '⚠' : '⏰';
151
+ console.log(`${icon} ${row.artifactId}`);
152
+ console.log(` ${row.reason}`);
153
+ if (row.symbolDelta && (row.symbolDelta.added.length > 0 || row.symbolDelta.removed.length > 0)) {
154
+ if (row.symbolDelta.added.length > 0)
155
+ console.log(` + ${row.symbolDelta.added.join(', ')}`);
156
+ if (row.symbolDelta.removed.length > 0)
157
+ console.log(` - ${row.symbolDelta.removed.join(', ')}`);
158
+ }
159
+ if (row.remediation) {
160
+ console.log(` fix: ${row.remediation}`);
161
+ }
162
+ console.log('');
163
+ }
164
+ }
165
+ function flagValue(args, flag) {
166
+ const i = args.indexOf(flag);
167
+ return i !== -1 && args[i + 1] ? args[i + 1] : undefined;
168
+ }
169
+ function printUsage() {
170
+ console.log('aiwg index doctor --rlm-audit [options]');
171
+ console.log('');
172
+ console.log('Audits enriched index entries for content drift against the stored');
173
+ console.log('semantic summary and declared-symbol set.');
174
+ console.log('');
175
+ console.log('Options:');
176
+ console.log(' --filter <regex> Restrict audit to artifact IDs matching regex');
177
+ console.log(' --recomputed-dir <path> Directory of recomputed enrichment JSONs');
178
+ console.log(' --strict Exit non-zero on any drift or stale-age');
179
+ console.log(' --json Emit JSON report');
180
+ console.log('');
181
+ console.log('Threshold config: .aiwg/index/audit.config.yaml');
182
+ }
183
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Drift detection logic.
3
+ *
4
+ * Pure functions — given a stored SemanticFields and a current artifact
5
+ * snapshot, classify status and produce a DriftRow. The CLI layer
6
+ * orchestrates filesystem I/O around these primitives.
7
+ *
8
+ * @implements #1208
9
+ */
10
+ import { DEFAULT_THRESHOLDS } from './types.js';
11
+ const STOP_WORDS = new Set([
12
+ 'the', 'a', 'an', 'and', 'or', 'but', 'if', 'on', 'in', 'at', 'to',
13
+ 'for', 'of', 'is', 'are', 'was', 'were', 'be', 'been', 'this', 'that',
14
+ 'with', 'from', 'as', 'by', 'it',
15
+ ]);
16
+ /** Tokenize and de-stop a string into a content keyword set. */
17
+ export function keywords(text) {
18
+ const tokens = text
19
+ .toLowerCase()
20
+ .split(/[^a-z0-9]+/)
21
+ .filter((t) => t.length > 2 && !STOP_WORDS.has(t));
22
+ return new Set(tokens);
23
+ }
24
+ /** Jaccard-like overlap ratio between two keyword sets. */
25
+ export function keywordOverlap(a, b) {
26
+ if (a.size === 0 && b.size === 0)
27
+ return 1;
28
+ let intersect = 0;
29
+ for (const t of a)
30
+ if (b.has(t))
31
+ intersect++;
32
+ const union = a.size + b.size - intersect;
33
+ return union === 0 ? 1 : intersect / union;
34
+ }
35
+ /** Symmetric difference between two symbol arrays. */
36
+ export function symbolDelta(stored, current) {
37
+ const sset = new Set(stored);
38
+ const cset = new Set(current);
39
+ const added = [];
40
+ const removed = [];
41
+ for (const c of cset)
42
+ if (!sset.has(c))
43
+ added.push(c);
44
+ for (const s of sset)
45
+ if (!cset.has(s))
46
+ removed.push(s);
47
+ added.sort();
48
+ removed.sort();
49
+ return { added, removed };
50
+ }
51
+ /** Classify drift for a single entry. */
52
+ export function detectDrift(input) {
53
+ const t = { ...DEFAULT_THRESHOLDS, ...(input.thresholds ?? {}) };
54
+ const now = input.now ?? new Date();
55
+ const ageDays = Math.max(0, Math.floor((now.getTime() - new Date(input.stored.enrichedAt).getTime()) / 86_400_000));
56
+ // Hash matches → entry is content-fresh; only flag if past freshness window
57
+ if (input.stored.enrichedHash === input.currentHash) {
58
+ if (ageDays > t.freshnessMaxDays) {
59
+ return {
60
+ artifactId: input.artifactId,
61
+ status: 'stale-age',
62
+ reason: `enriched ${ageDays}d ago (>${t.freshnessMaxDays}d threshold), content unchanged`,
63
+ storedHash: input.stored.enrichedHash,
64
+ currentHash: input.currentHash,
65
+ ageDays,
66
+ };
67
+ }
68
+ return {
69
+ artifactId: input.artifactId,
70
+ status: 'ok',
71
+ reason: 'content unchanged',
72
+ storedHash: input.stored.enrichedHash,
73
+ currentHash: input.currentHash,
74
+ ageDays,
75
+ };
76
+ }
77
+ // Hash differs but no recomputation supplied → can't classify drift, skip
78
+ if (!input.recomputed) {
79
+ return {
80
+ artifactId: input.artifactId,
81
+ status: 'skip',
82
+ reason: 'hash differs but no recomputed enrichment supplied',
83
+ storedHash: input.stored.enrichedHash,
84
+ currentHash: input.currentHash,
85
+ ageDays,
86
+ };
87
+ }
88
+ // Hash differs AND recomputed → check semantic divergence
89
+ const overlap = keywordOverlap(keywords(input.stored.summary), keywords(input.recomputed.summary));
90
+ const delta = symbolDelta(input.stored.declaredSymbols, input.recomputed.declaredSymbols);
91
+ const symbolDriftSignificant = t.symbolChangeCritical && (delta.added.length > 0 || delta.removed.length > 0);
92
+ const overlapDriftSignificant = overlap < t.keywordOverlapMin;
93
+ if (overlapDriftSignificant || symbolDriftSignificant) {
94
+ const reasons = [];
95
+ if (overlapDriftSignificant)
96
+ reasons.push(`summary overlap ${(overlap * 100).toFixed(0)}% < ${(t.keywordOverlapMin * 100).toFixed(0)}%`);
97
+ if (symbolDriftSignificant)
98
+ reasons.push(`symbols changed (+${delta.added.length}/-${delta.removed.length})`);
99
+ return {
100
+ artifactId: input.artifactId,
101
+ status: 'drift',
102
+ reason: reasons.join('; '),
103
+ storedHash: input.stored.enrichedHash,
104
+ currentHash: input.currentHash,
105
+ ageDays,
106
+ overlap,
107
+ symbolDelta: delta,
108
+ remediation: `aiwg index enrich --using-rlm --files "${input.artifactId}" --force`,
109
+ };
110
+ }
111
+ return {
112
+ artifactId: input.artifactId,
113
+ status: 'ok',
114
+ reason: 'hash differs but semantic content within thresholds',
115
+ storedHash: input.stored.enrichedHash,
116
+ currentHash: input.currentHash,
117
+ ageDays,
118
+ overlap,
119
+ symbolDelta: delta,
120
+ };
121
+ }
122
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Drift audit — type definitions.
3
+ *
4
+ * @implements #1208
5
+ * @see .aiwg/architecture/adr-rlm-index-features-impl-plan.md
6
+ */
7
+ export const DEFAULT_THRESHOLDS = {
8
+ keywordOverlapMin: 0.70,
9
+ symbolChangeCritical: true,
10
+ freshnessMaxDays: 90,
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Graphology Graph Backend
3
+ *
4
+ * Optional implementation of GraphBackend using the graphology library.
5
+ * Provides typed/attributed edges, BFS/DFS traversal, community detection,
6
+ * and shortest-path algorithms.
7
+ *
8
+ * Install: npm install graphology graphology-types graphology-operators graphology-traversal
9
+ *
10
+ * @implements #728
11
+ * @source @src/artifacts/graph-backend.ts
12
+ * @tests @test/unit/artifacts/graphology-backend.test.ts
13
+ */
14
+ import { normalizeEdges } from '../types.js';
15
+ /**
16
+ * Graphology-backed graph with rich traversal and operator ecosystem.
17
+ *
18
+ * Uses dynamic import so the graphology package is only loaded when this
19
+ * backend is explicitly selected. Projects that don't install graphology
20
+ * pay zero cost.
21
+ */
22
+ export class GraphologyBackend {
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ graph;
25
+ constructor(graphInstance) {
26
+ this.graph = graphInstance;
27
+ }
28
+ /**
29
+ * Factory: creates a GraphologyBackend with a fresh directed multigraph.
30
+ * Throws a clear error if graphology is not installed.
31
+ */
32
+ static async create() {
33
+ try {
34
+ const graphology = await import('graphology');
35
+ const Graph = graphology.default ?? graphology;
36
+ const graph = new Graph({ type: 'directed', multi: true });
37
+ return new GraphologyBackend(graph);
38
+ }
39
+ catch {
40
+ throw new Error('graphology backend requires: npm install graphology graphology-types graphology-operators graphology-traversal');
41
+ }
42
+ }
43
+ // --- Mutation ---
44
+ addNode(id, attrs) {
45
+ if (!this.graph.hasNode(id)) {
46
+ this.graph.addNode(id, attrs ?? {});
47
+ }
48
+ else if (attrs) {
49
+ this.graph.mergeNodeAttributes(id, attrs);
50
+ }
51
+ }
52
+ addEdge(source, target, type = 'depends-on', attrs) {
53
+ if (!this.graph.hasNode(source))
54
+ this.graph.addNode(source, {});
55
+ if (!this.graph.hasNode(target))
56
+ this.graph.addNode(target, {});
57
+ this.graph.addEdge(source, target, { type, ...attrs });
58
+ }
59
+ // --- Query ---
60
+ hasNode(id) {
61
+ return this.graph.hasNode(id);
62
+ }
63
+ hasEdge(source, target, edgeType) {
64
+ if (!edgeType)
65
+ return this.graph.hasEdge(source, target);
66
+ const edges = this.graph.edges(source, target);
67
+ return edges.some((e) => this.graph.getEdgeAttribute(e, 'type') === edgeType);
68
+ }
69
+ getNodeAttrs(id) {
70
+ if (!this.graph.hasNode(id))
71
+ return undefined;
72
+ return this.graph.getNodeAttributes(id);
73
+ }
74
+ nodes() {
75
+ return this.graph.nodes();
76
+ }
77
+ // --- Traversal ---
78
+ neighbors(nodeId, direction, edgeType) {
79
+ if (!this.graph.hasNode(nodeId))
80
+ return [];
81
+ let edgeIterator;
82
+ if (direction === 'in') {
83
+ edgeIterator = this.graph.inEdges(nodeId);
84
+ }
85
+ else if (direction === 'out') {
86
+ edgeIterator = this.graph.outEdges(nodeId);
87
+ }
88
+ else {
89
+ edgeIterator = this.graph.edges(nodeId);
90
+ }
91
+ const results = new Set();
92
+ for (const edgeKey of edgeIterator) {
93
+ if (edgeType && this.graph.getEdgeAttribute(edgeKey, 'type') !== edgeType)
94
+ continue;
95
+ const src = this.graph.source(edgeKey);
96
+ const tgt = this.graph.target(edgeKey);
97
+ // Add the "other" node
98
+ results.add(src === nodeId ? tgt : src);
99
+ }
100
+ return [...results];
101
+ }
102
+ // --- Set operations ---
103
+ intersection(setA, setB) {
104
+ const b = new Set(setB);
105
+ return setA.filter(x => b.has(x));
106
+ }
107
+ difference(setA, setB) {
108
+ const b = new Set(setB);
109
+ return setA.filter(x => !b.has(x));
110
+ }
111
+ union(setA, setB) {
112
+ return [...new Set([...setA, ...setB])];
113
+ }
114
+ // --- Persistence ---
115
+ serialize() {
116
+ const result = {};
117
+ this.graph.forEachNode((id) => {
118
+ const upstream = [];
119
+ const downstream = [];
120
+ for (const edgeKey of this.graph.inEdges(id)) {
121
+ upstream.push({
122
+ path: this.graph.source(edgeKey),
123
+ type: this.graph.getEdgeAttribute(edgeKey, 'type') ?? 'depends-on',
124
+ });
125
+ }
126
+ for (const edgeKey of this.graph.outEdges(id)) {
127
+ downstream.push({
128
+ path: this.graph.target(edgeKey),
129
+ type: this.graph.getEdgeAttribute(edgeKey, 'type') ?? 'depends-on',
130
+ });
131
+ }
132
+ result[id] = { upstream, downstream };
133
+ });
134
+ return result;
135
+ }
136
+ deserialize(data) {
137
+ this.graph.clear();
138
+ // First pass: add all declared nodes
139
+ for (const id of Object.keys(data)) {
140
+ if (!this.graph.hasNode(id))
141
+ this.graph.addNode(id, {});
142
+ }
143
+ // Second pass: add edges (upstream edges define the directed relationships)
144
+ for (const [id, node] of Object.entries(data)) {
145
+ const upEdges = normalizeEdges(node.upstream);
146
+ for (const edge of upEdges) {
147
+ if (!this.graph.hasNode(edge.path))
148
+ this.graph.addNode(edge.path, {});
149
+ this.graph.addEdge(edge.path, id, { type: edge.type });
150
+ }
151
+ }
152
+ }
153
+ nodeCount() {
154
+ return this.graph.order;
155
+ }
156
+ edgeCount() {
157
+ return this.graph.size;
158
+ }
159
+ }
160
+ //# sourceMappingURL=graphology-backend.js.map
@@ -0,0 +1,129 @@
1
+ /**
2
+ * JSON Graph Backend
3
+ *
4
+ * Default zero-dependency implementation of GraphBackend wrapping the
5
+ * existing DependencyGraph adjacency list format. Suitable for projects
6
+ * with <5k nodes.
7
+ *
8
+ * @implements #727
9
+ * @source @src/artifacts/graph-backend.ts
10
+ * @tests @test/unit/artifacts/graph-backend.test.ts
11
+ */
12
+ import { normalizeEdges } from '../types.js';
13
+ /**
14
+ * JSON-backed graph using plain objects and JS Set operations.
15
+ *
16
+ * This is the default backend — always available, no external dependencies.
17
+ */
18
+ export class JsonGraphBackend {
19
+ graph = new Map();
20
+ // --- Mutation ---
21
+ addNode(id, attrs) {
22
+ if (!this.graph.has(id)) {
23
+ this.graph.set(id, { upstream: [], downstream: [], attrs: attrs ?? {} });
24
+ }
25
+ else if (attrs) {
26
+ const node = this.graph.get(id);
27
+ Object.assign(node.attrs, attrs);
28
+ }
29
+ }
30
+ addEdge(source, target, type = 'depends-on', attrs) {
31
+ // Ensure both nodes exist
32
+ this.addNode(source);
33
+ this.addNode(target);
34
+ const sourceNode = this.graph.get(source);
35
+ const targetNode = this.graph.get(target);
36
+ // Add downstream edge on source
37
+ sourceNode.downstream.push({ path: target, type, ...attrs });
38
+ // Add upstream edge on target
39
+ targetNode.upstream.push({ path: source, type, ...attrs });
40
+ }
41
+ // --- Query ---
42
+ hasNode(id) {
43
+ return this.graph.has(id);
44
+ }
45
+ hasEdge(source, target, edgeType) {
46
+ const node = this.graph.get(source);
47
+ if (!node)
48
+ return false;
49
+ return node.downstream.some(e => e.path === target && (!edgeType || e.type === edgeType));
50
+ }
51
+ getNodeAttrs(id) {
52
+ return this.graph.get(id)?.attrs;
53
+ }
54
+ nodes() {
55
+ return [...this.graph.keys()];
56
+ }
57
+ // --- Traversal ---
58
+ neighbors(nodeId, direction, edgeType) {
59
+ const node = this.graph.get(nodeId);
60
+ if (!node)
61
+ return [];
62
+ const results = new Set();
63
+ if (direction === 'in' || direction === 'both') {
64
+ for (const edge of node.upstream) {
65
+ if (!edgeType || edge.type === edgeType) {
66
+ results.add(edge.path);
67
+ }
68
+ }
69
+ }
70
+ if (direction === 'out' || direction === 'both') {
71
+ for (const edge of node.downstream) {
72
+ if (!edgeType || edge.type === edgeType) {
73
+ results.add(edge.path);
74
+ }
75
+ }
76
+ }
77
+ return [...results];
78
+ }
79
+ // --- Set operations ---
80
+ intersection(setA, setB) {
81
+ const b = new Set(setB);
82
+ return setA.filter(x => b.has(x));
83
+ }
84
+ difference(setA, setB) {
85
+ const b = new Set(setB);
86
+ return setA.filter(x => !b.has(x));
87
+ }
88
+ union(setA, setB) {
89
+ return [...new Set([...setA, ...setB])];
90
+ }
91
+ // --- Persistence ---
92
+ serialize() {
93
+ const result = {};
94
+ for (const [id, node] of this.graph) {
95
+ result[id] = {
96
+ upstream: [...node.upstream],
97
+ downstream: [...node.downstream],
98
+ };
99
+ }
100
+ return result;
101
+ }
102
+ deserialize(data) {
103
+ this.graph.clear();
104
+ for (const [id, node] of Object.entries(data)) {
105
+ const upstream = normalizeEdges(node.upstream);
106
+ const downstream = normalizeEdges(node.downstream);
107
+ this.graph.set(id, { upstream, downstream, attrs: {} });
108
+ }
109
+ // Ensure all referenced nodes exist
110
+ for (const [, node] of this.graph) {
111
+ for (const edge of [...node.upstream, ...node.downstream]) {
112
+ if (!this.graph.has(edge.path)) {
113
+ this.graph.set(edge.path, { upstream: [], downstream: [], attrs: {} });
114
+ }
115
+ }
116
+ }
117
+ }
118
+ nodeCount() {
119
+ return this.graph.size;
120
+ }
121
+ edgeCount() {
122
+ let count = 0;
123
+ for (const [, node] of this.graph) {
124
+ count += node.downstream.length;
125
+ }
126
+ return count;
127
+ }
128
+ }
129
+ //# sourceMappingURL=json-backend.js.map