@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,228 @@
1
+ /**
2
+ * ScreenReader — PTY screen state parser for Orchestrator-over-PTY
3
+ *
4
+ * Parses raw PTY byte streams into structured, LLM-readable screen state.
5
+ * Uses @xterm/headless as the VT100/ANSI state machine so all escape
6
+ * sequences (colour, cursor movement, clear-screen, etc.) are handled
7
+ * correctly without a DOM.
8
+ *
9
+ * @issue #754
10
+ * @see src/serve/pty-bridge.ts — PTY WebSocket bridge
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ import { createRequire } from 'module';
14
+ // @xterm/headless is an optional dependency. Load it once at module level
15
+ // using createRequire so we can import the CJS bundle from ESM.
16
+ const _require = createRequire(import.meta.url);
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ let XtermTerminal;
19
+ try {
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const xterm = _require('@xterm/headless');
22
+ XtermTerminal = xterm.Terminal;
23
+ }
24
+ catch {
25
+ // Will be checked at construction time
26
+ }
27
+ // ============================================================
28
+ // Prompt detection patterns
29
+ // ============================================================
30
+ /** Patterns that indicate the terminal is waiting for input. */
31
+ const PROMPT_PATTERNS = [
32
+ /[$#>%]\s*$/, // bash/zsh/sh: ends with $ # > %
33
+ /^\s*\?\s+/, // inquirer: starts with ?
34
+ /\[y\/n\]/i, // yes/no confirmation
35
+ /\[y\/N\]/, // yes/no (default No)
36
+ /\[Y\/n\]/, // yes/no (default Yes)
37
+ /\(yes\/no\)/i, // SSH-style yes/no
38
+ /\(y\/n\)/i, // generic y/n
39
+ ];
40
+ // ============================================================
41
+ // ScreenReader
42
+ // ============================================================
43
+ export class ScreenReader {
44
+ terminal;
45
+ _rows;
46
+ _cols;
47
+ emitter;
48
+ disposed = false;
49
+ constructor(opts) {
50
+ if (!XtermTerminal) {
51
+ throw new Error('@xterm/headless is required for ScreenReader. Install it: npm install @xterm/headless');
52
+ }
53
+ this._rows = opts?.rows ?? 24;
54
+ this._cols = opts?.cols ?? 80;
55
+ this.emitter = new EventEmitter();
56
+ // Suppress Node.js MaxListenersExceededWarning for tests with many awaitChange calls
57
+ this.emitter.setMaxListeners(100);
58
+ this.terminal = new XtermTerminal({
59
+ rows: this._rows,
60
+ cols: this._cols,
61
+ allowProposedApi: true,
62
+ scrollback: 1000,
63
+ logLevel: 'error',
64
+ });
65
+ }
66
+ /** Feed raw PTY data into the parser */
67
+ write(data) {
68
+ if (this.disposed)
69
+ return;
70
+ const coreWriteSync = this.terminal._core?.writeSync;
71
+ if (coreWriteSync) {
72
+ coreWriteSync.call(this.terminal._core, data);
73
+ this.emitter.emit('change');
74
+ return;
75
+ }
76
+ this.terminal.write(data, () => {
77
+ // Fired after xterm has processed the write through its state machine
78
+ this.emitter.emit('change');
79
+ });
80
+ }
81
+ /** Get current parsed screen state */
82
+ getState() {
83
+ const buf = this.terminal.buffer.active;
84
+ const viewportRows = this.terminal.rows;
85
+ const viewportCols = this.terminal.cols;
86
+ // ---- visible text grid ----
87
+ const text = [];
88
+ for (let r = 0; r < viewportRows; r++) {
89
+ const line = buf.getLine(buf.viewportY + r);
90
+ if (!line) {
91
+ text.push(Array(viewportCols).fill(''));
92
+ continue;
93
+ }
94
+ const row = [];
95
+ for (let c = 0; c < viewportCols; c++) {
96
+ const cell = line.getCell(c);
97
+ row.push(cell?.getChars() ?? '');
98
+ }
99
+ text.push(row);
100
+ }
101
+ // ---- cursor ----
102
+ const cursor = {
103
+ row: buf.cursorY,
104
+ col: buf.cursorX,
105
+ };
106
+ // ---- scrollback ----
107
+ // baseY is the line index of the first viewport row in the full buffer.
108
+ // Lines 0..(baseY-1) are scrollback content.
109
+ const scrollback = [];
110
+ const scrollbackStart = Math.max(0, buf.baseY - 50); // keep last 50 scrollback lines
111
+ for (let r = scrollbackStart; r < buf.baseY; r++) {
112
+ const line = buf.getLine(r);
113
+ if (line) {
114
+ const lineStr = line.translateToString(true);
115
+ scrollback.push(lineStr);
116
+ }
117
+ }
118
+ // ---- summary ----
119
+ const summary = buildSummary(text);
120
+ // ---- prompt detection ----
121
+ const { prompt_detected, prompt_text } = detectPrompt(text, cursor);
122
+ return { text, cursor, scrollback, summary, prompt_detected, prompt_text };
123
+ }
124
+ /**
125
+ * Wait for the next screen change, with timeout.
126
+ * Resolves with updated ScreenState when write() causes a change,
127
+ * or with the current state if the timeout elapses first.
128
+ */
129
+ awaitChange(opts) {
130
+ const timeoutMs = opts?.timeout ?? 5000;
131
+ return new Promise((resolve) => {
132
+ if (this.disposed) {
133
+ resolve(this.getState());
134
+ return;
135
+ }
136
+ let timer = null;
137
+ const handler = () => {
138
+ if (timer)
139
+ clearTimeout(timer);
140
+ resolve(this.getState());
141
+ };
142
+ this.emitter.once('change', handler);
143
+ timer = setTimeout(() => {
144
+ this.emitter.removeListener('change', handler);
145
+ resolve(this.getState());
146
+ }, timeoutMs);
147
+ });
148
+ }
149
+ /**
150
+ * Flush all pending writes through xterm's internal write queue.
151
+ * Enqueues an empty write and resolves when its callback fires, which
152
+ * guarantees all previously queued writes have been processed.
153
+ */
154
+ flush() {
155
+ return new Promise((resolve) => {
156
+ if (this.disposed) {
157
+ resolve();
158
+ return;
159
+ }
160
+ this.terminal.write('', () => resolve());
161
+ });
162
+ }
163
+ /** Get human-readable summary of visible screen */
164
+ getSummary() {
165
+ return buildSummary(this.getState().text);
166
+ }
167
+ /** Clean up resources */
168
+ dispose() {
169
+ if (this.disposed)
170
+ return;
171
+ this.disposed = true;
172
+ this.emitter.removeAllListeners();
173
+ try {
174
+ this.terminal.dispose();
175
+ }
176
+ catch {
177
+ // ignore errors during cleanup
178
+ }
179
+ }
180
+ }
181
+ // ============================================================
182
+ // Helpers
183
+ // ============================================================
184
+ /**
185
+ * Build a human-readable summary from the visible text grid.
186
+ * Trailing rows that are entirely empty are stripped.
187
+ */
188
+ function buildSummary(text) {
189
+ const lines = text.map((row) => row.join('').trimEnd());
190
+ // Remove trailing blank lines
191
+ let lastNonEmpty = lines.length - 1;
192
+ while (lastNonEmpty >= 0 && lines[lastNonEmpty].trim() === '') {
193
+ lastNonEmpty--;
194
+ }
195
+ return lines.slice(0, lastNonEmpty + 1).join('\n');
196
+ }
197
+ /**
198
+ * Heuristic prompt detection.
199
+ * Examines the last non-empty visible line and the line at cursor position.
200
+ */
201
+ function detectPrompt(text, cursor) {
202
+ // Gather candidate lines: the cursor row and the last non-empty row
203
+ const candidates = [];
204
+ // Line where cursor currently sits
205
+ if (cursor.row >= 0 && cursor.row < text.length) {
206
+ const cursorLine = text[cursor.row].join('').trimEnd();
207
+ if (cursorLine)
208
+ candidates.push(cursorLine);
209
+ }
210
+ // Last non-empty visible line
211
+ for (let r = text.length - 1; r >= 0; r--) {
212
+ const line = text[r].join('').trimEnd();
213
+ if (line) {
214
+ if (!candidates.includes(line))
215
+ candidates.push(line);
216
+ break;
217
+ }
218
+ }
219
+ for (const line of candidates) {
220
+ for (const pattern of PROMPT_PATTERNS) {
221
+ if (pattern.test(line)) {
222
+ return { prompt_detected: true, prompt_text: line };
223
+ }
224
+ }
225
+ }
226
+ return { prompt_detected: false };
227
+ }
228
+ //# sourceMappingURL=screen-reader.js.map
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Per-stack executor adapters (#1546).
3
+ *
4
+ * A Mission conductor (mission-conductor.ts) fans worker cycles out across
5
+ * *heterogeneous* agentic stacks. Each stack advertises itself on the existing
6
+ * executor registry via a `runtime:<name>` capability — the convention proven
7
+ * in slice 1 (see test/unit/serve/agent-router.test.ts "cross-stack Mission
8
+ * dispatch"). A StackAdapter is the conductor-side description of how a worker
9
+ * cycle maps onto that stack's NATIVE long-running primitive, plus the runtime
10
+ * capability token the conductor filters on — so the conductor dispatches and
11
+ * captures results uniformly regardless of which stack runs the worker.
12
+ *
13
+ * The adapter does NOT run the worker. The registered executor on that stack
14
+ * runs it via `aiwg serve`'s dispatch transport (dispatch-router + the WS event
15
+ * stream). The adapter keeps the conductor stack-agnostic: it owns only the
16
+ * `runtime:<name>` token and the native-primitive description.
17
+ *
18
+ * @implements #1546
19
+ */
20
+ function makeAdapter(runtime, primitive) {
21
+ const runtimeCapability = `runtime:${runtime}`;
22
+ return {
23
+ runtime,
24
+ runtimeCapability,
25
+ primitive,
26
+ invoke(prompt) {
27
+ // prompt is carried by the dispatch payload; the descriptor records the
28
+ // mechanism so the conductor's ledger is identical-shape across stacks.
29
+ const trimmed = prompt.length > 60 ? `${prompt.slice(0, 57)}...` : prompt;
30
+ return {
31
+ runtimeCapability,
32
+ primitive,
33
+ describe: `dispatch worker to ${runtime} executor via ${primitive} (${trimmed})`,
34
+ };
35
+ },
36
+ };
37
+ }
38
+ /** Codex executor adapter — a dispatched worker drives Codex `/goal` (or `/aiwg-mission`, #1544). */
39
+ export const codexAdapter = makeAdapter('codex', '/goal');
40
+ /** Claude Code executor adapter — a dispatched worker drives the Workflow tool / subagents. */
41
+ export const claudeCodeAdapter = makeAdapter('claude-code', 'workflow-tool');
42
+ /** Built-in adapters for the two stacks the cross-stack proof exercises. */
43
+ export const BUILTIN_STACK_ADAPTERS = [codexAdapter, claudeCodeAdapter];
44
+ /**
45
+ * Registry of per-stack adapters. Operators can register additional stacks
46
+ * (the `runtime:<name>` convention is open-ended); a Mission can then dispatch
47
+ * workers to any registered runtime.
48
+ */
49
+ export class StackAdapterRegistry {
50
+ byRuntime = new Map();
51
+ constructor(adapters = BUILTIN_STACK_ADAPTERS) {
52
+ for (const a of adapters)
53
+ this.byRuntime.set(a.runtime, a);
54
+ }
55
+ register(adapter) {
56
+ this.byRuntime.set(adapter.runtime, adapter);
57
+ }
58
+ get(runtime) {
59
+ return this.byRuntime.get(runtime);
60
+ }
61
+ has(runtime) {
62
+ return this.byRuntime.has(runtime);
63
+ }
64
+ runtimes() {
65
+ return [...this.byRuntime.keys()];
66
+ }
67
+ }
68
+ //# sourceMappingURL=stack-adapters.js.map
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Telemetry Event Schema and In-Memory Store
3
+ *
4
+ * Defines the canonical event types emitted by the agent loop, MC conductor,
5
+ * and ralph launcher. Events are stored in-memory per session and forwarded
6
+ * to the browser via WebSocket push. Persisted to fortemi-react IndexedDB
7
+ * on the browser side (#717).
8
+ *
9
+ * Emission points:
10
+ * - src/cli/handlers/ralph-launcher.ts → iteration.*, gate.*, tokens.used
11
+ * - src/cli/handlers/mc.ts → session.*, mission.*, agent.*
12
+ *
13
+ * @issue #716
14
+ * @see #717 — fortemi-react storage layer (browser)
15
+ */
16
+ // ============================================================
17
+ // In-Memory Event Store
18
+ // ============================================================
19
+ const MAX_EVENTS_PER_SESSION = 10_000;
20
+ export class TelemetryStore {
21
+ events = new Map();
22
+ listeners = new Set();
23
+ /** Ingest a new event */
24
+ ingest(event) {
25
+ const list = this.events.get(event.sessionId) ?? [];
26
+ list.push(event);
27
+ // Trim oldest events when exceeding limit
28
+ if (list.length > MAX_EVENTS_PER_SESSION) {
29
+ list.splice(0, list.length - MAX_EVENTS_PER_SESSION);
30
+ }
31
+ this.events.set(event.sessionId, list);
32
+ for (const listener of this.listeners) {
33
+ try {
34
+ listener(event);
35
+ }
36
+ catch { /* ignore listener errors */ }
37
+ }
38
+ }
39
+ /** Get all events for a session, optionally filtered by type */
40
+ query(sessionId, opts = {}) {
41
+ let events = this.events.get(sessionId) ?? [];
42
+ if (opts.types?.length) {
43
+ events = events.filter((e) => opts.types.includes(e.type));
44
+ }
45
+ if (opts.since) {
46
+ events = events.filter((e) => e.timestamp >= opts.since);
47
+ }
48
+ if (opts.limit) {
49
+ events = events.slice(-opts.limit);
50
+ }
51
+ return events;
52
+ }
53
+ /** Get aggregate metrics for a session */
54
+ metrics(sessionId) {
55
+ const events = this.events.get(sessionId) ?? [];
56
+ let totalInput = 0;
57
+ let totalOutput = 0;
58
+ const tokensByModel = {};
59
+ let iterations = 0;
60
+ let gatePasses = 0;
61
+ let gateFails = 0;
62
+ let scopeDone = 0;
63
+ let scopeTotal = 0;
64
+ let activeAgents = 0;
65
+ for (const e of events) {
66
+ if (e.type === 'tokens.used') {
67
+ const p = e.payload;
68
+ totalInput += p.input;
69
+ totalOutput += p.output;
70
+ const m = tokensByModel[p.model] ?? { input: 0, output: 0 };
71
+ m.input += p.input;
72
+ m.output += p.output;
73
+ tokensByModel[p.model] = m;
74
+ }
75
+ else if (e.type === 'iteration.complete') {
76
+ iterations++;
77
+ }
78
+ else if (e.type === 'gate.pass') {
79
+ gatePasses++;
80
+ }
81
+ else if (e.type === 'gate.fail') {
82
+ gateFails++;
83
+ }
84
+ else if (e.type === 'scope.unit.complete') {
85
+ const p = e.payload;
86
+ scopeDone = p.done;
87
+ scopeTotal = p.total;
88
+ }
89
+ else if (e.type === 'agent.spawn') {
90
+ activeAgents++;
91
+ }
92
+ else if (e.type === 'agent.complete') {
93
+ activeAgents = Math.max(0, activeAgents - 1);
94
+ }
95
+ }
96
+ const passRate = gatePasses + gateFails > 0
97
+ ? Math.round((gatePasses / (gatePasses + gateFails)) * 100)
98
+ : null;
99
+ return {
100
+ sessionId,
101
+ totalInputTokens: totalInput,
102
+ totalOutputTokens: totalOutput,
103
+ tokensByModel,
104
+ iterations,
105
+ gatePasses,
106
+ gateFails,
107
+ passRate,
108
+ scopeDone,
109
+ scopeTotal,
110
+ activeAgents,
111
+ };
112
+ }
113
+ /** Subscribe to new events (returns unsubscribe fn) */
114
+ subscribe(listener) {
115
+ this.listeners.add(listener);
116
+ return () => { this.listeners.delete(listener); };
117
+ }
118
+ /** Clear all events for a session */
119
+ clear(sessionId) {
120
+ this.events.delete(sessionId);
121
+ }
122
+ /** Get all known session IDs */
123
+ sessions() {
124
+ return [...this.events.keys()];
125
+ }
126
+ }
127
+ // Singleton store
128
+ export const telemetryStore = new TelemetryStore();
129
+ // ============================================================
130
+ // Event Factory
131
+ // ============================================================
132
+ let eventCounter = 0;
133
+ export function createEvent(type, sessionId, payload, missionId) {
134
+ return {
135
+ id: `evt-${Date.now()}-${++eventCounter}`,
136
+ sessionId,
137
+ missionId,
138
+ timestamp: new Date().toISOString(),
139
+ type,
140
+ payload,
141
+ };
142
+ }
143
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1,250 @@
1
+ /**
2
+ * ClawHub Registry Adapter
3
+ *
4
+ * Connects to the ClawHub REST API at clawhub.ai for
5
+ * community skill discovery and publishing.
6
+ *
7
+ * Supports both the ClawHub web API and the `clawhub` CLI
8
+ * if installed. Falls back gracefully when neither is available.
9
+ *
10
+ * @implements #539
11
+ * @see https://clawhub.ai
12
+ * @see https://docs.openclaw.ai/tools/clawhub
13
+ */
14
+ import { execSync } from 'child_process';
15
+ import fs from 'fs';
16
+ import path from 'path';
17
+ import { getProviderDefinition, resolveProviderPathValue, } from '../../providers/provider-definitions.js';
18
+ const CLAWHUB_API_BASE = 'https://clawhub.ai/api/v1';
19
+ function resolveSkillFallbackPath(target, projectDir, name) {
20
+ const definition = getProviderDefinition(target);
21
+ if (!definition)
22
+ return path.join(projectDir, `.${target}/skills`, name);
23
+ const basePath = definition.skillNamespace.pathType === 'home-dir'
24
+ ? `~/${definition.skillNamespace.skillsBaseDir}`
25
+ : definition.skillNamespace.skillsBaseDir;
26
+ return path.join(resolveProviderPathValue(basePath, projectDir), name);
27
+ }
28
+ /**
29
+ * Attempt a ClawHub API request
30
+ */
31
+ async function clawHubFetch(endpoint) {
32
+ try {
33
+ const response = await fetch(`${CLAWHUB_API_BASE}${endpoint}`, {
34
+ headers: { 'Accept': 'application/json' },
35
+ signal: AbortSignal.timeout(10000),
36
+ });
37
+ if (!response.ok)
38
+ return null;
39
+ return await response.json();
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ /**
46
+ * Try clawhub CLI command
47
+ */
48
+ function runClawHub(args) {
49
+ try {
50
+ return execSync(`clawhub ${args}`, {
51
+ encoding: 'utf-8',
52
+ timeout: 30000,
53
+ stdio: ['pipe', 'pipe', 'pipe'],
54
+ }).trim();
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ export class ClawHubAdapter {
61
+ id = 'clawhub';
62
+ name = 'ClawHub Registry';
63
+ available = null;
64
+ async isAvailable() {
65
+ if (this.available !== null)
66
+ return this.available;
67
+ // Check CLI
68
+ const cliAvailable = runClawHub('--version 2>/dev/null') !== null;
69
+ if (cliAvailable) {
70
+ this.available = true;
71
+ return true;
72
+ }
73
+ // Check API
74
+ const apiResult = await clawHubFetch('/health');
75
+ this.available = apiResult !== null;
76
+ return this.available;
77
+ }
78
+ async search(query) {
79
+ // Try API
80
+ const apiResult = await clawHubFetch(`/skills/search?q=${encodeURIComponent(query)}`);
81
+ if (apiResult && Array.isArray(apiResult.results)) {
82
+ return apiResult.results.map((s) => ({
83
+ name: s.name,
84
+ description: s.description || '',
85
+ source: 'clawhub',
86
+ package: s.package || s.author,
87
+ platforms: s.platforms || [],
88
+ installed: false,
89
+ }));
90
+ }
91
+ // Try CLI
92
+ const cliOutput = runClawHub(`search "${query}" --json 2>/dev/null`);
93
+ if (cliOutput) {
94
+ try {
95
+ const parsed = JSON.parse(cliOutput);
96
+ if (Array.isArray(parsed)) {
97
+ return parsed.map((s) => ({
98
+ name: s.name,
99
+ description: s.description || '',
100
+ source: 'clawhub',
101
+ package: s.package || s.author,
102
+ platforms: s.platforms || [],
103
+ installed: false,
104
+ }));
105
+ }
106
+ }
107
+ catch {
108
+ // Fall through
109
+ }
110
+ }
111
+ return [];
112
+ }
113
+ async info(name) {
114
+ // Try API
115
+ const apiResult = await clawHubFetch(`/skills/${encodeURIComponent(name)}`);
116
+ if (apiResult && apiResult.name) {
117
+ return {
118
+ name: apiResult.name,
119
+ description: apiResult.description || '',
120
+ source: 'clawhub',
121
+ package: apiResult.package || apiResult.author,
122
+ platforms: apiResult.platforms || [],
123
+ version: apiResult.version,
124
+ triggers: apiResult.triggers || [],
125
+ tools: apiResult.tools || [],
126
+ installed: false,
127
+ };
128
+ }
129
+ // Try CLI
130
+ const cliOutput = runClawHub(`info "${name}" --json 2>/dev/null`);
131
+ if (cliOutput) {
132
+ try {
133
+ const parsed = JSON.parse(cliOutput);
134
+ return {
135
+ name: parsed.name || name,
136
+ description: parsed.description || '',
137
+ source: 'clawhub',
138
+ package: parsed.package || parsed.author,
139
+ platforms: parsed.platforms || [],
140
+ version: parsed.version,
141
+ triggers: parsed.triggers || [],
142
+ installed: false,
143
+ };
144
+ }
145
+ catch {
146
+ return undefined;
147
+ }
148
+ }
149
+ return undefined;
150
+ }
151
+ async list() {
152
+ // Try API
153
+ const apiResult = await clawHubFetch('/skills?limit=200');
154
+ if (apiResult && Array.isArray(apiResult.results)) {
155
+ return apiResult.results.map((s) => ({
156
+ name: s.name,
157
+ description: s.description || '',
158
+ source: 'clawhub',
159
+ package: s.package || s.author,
160
+ platforms: s.platforms || [],
161
+ installed: false,
162
+ }));
163
+ }
164
+ // Try CLI
165
+ const cliOutput = runClawHub('list --json 2>/dev/null');
166
+ if (cliOutput) {
167
+ try {
168
+ const parsed = JSON.parse(cliOutput);
169
+ if (Array.isArray(parsed)) {
170
+ return parsed.map((s) => ({
171
+ name: s.name,
172
+ description: s.description || '',
173
+ source: 'clawhub',
174
+ package: s.package || s.author,
175
+ platforms: s.platforms || [],
176
+ installed: false,
177
+ }));
178
+ }
179
+ }
180
+ catch {
181
+ // Fall through
182
+ }
183
+ }
184
+ return [];
185
+ }
186
+ async install(name, options) {
187
+ const target = options.target || 'claude';
188
+ // Determine target directory
189
+ let targetDir;
190
+ try {
191
+ const { PlatformSkillResolver } = await import('../../smiths/skillsmith/platform-resolver.js');
192
+ targetDir = PlatformSkillResolver.getSkillPath(target, options.projectDir, name);
193
+ }
194
+ catch {
195
+ targetDir = resolveSkillFallbackPath(target, options.projectDir, name);
196
+ }
197
+ // Try CLI install (downloads to a temp location, then we copy)
198
+ const cliResult = runClawHub(`install "${name}" --output "${targetDir}" 2>/dev/null`);
199
+ if (cliResult !== null)
200
+ return;
201
+ // Try API download
202
+ const apiResult = await clawHubFetch(`/skills/${encodeURIComponent(name)}/download`);
203
+ if (apiResult && apiResult.content) {
204
+ fs.mkdirSync(targetDir, { recursive: true });
205
+ const skillMdPath = path.join(targetDir, 'SKILL.md');
206
+ fs.writeFileSync(skillMdPath, apiResult.content, 'utf-8');
207
+ return;
208
+ }
209
+ throw new Error(`Could not install '${name}' from ClawHub. ` +
210
+ `Ensure the skill exists at https://clawhub.ai and the API is accessible.`);
211
+ }
212
+ async publish(packageDir) {
213
+ // Ensure clawhub.json exists — generate from manifest.json if missing
214
+ const clawHubManifestPath = path.join(packageDir, 'clawhub.json');
215
+ if (!fs.existsSync(clawHubManifestPath)) {
216
+ const manifestPath = path.join(packageDir, 'manifest.json');
217
+ if (fs.existsSync(manifestPath)) {
218
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
219
+ const pkgJsonPath = path.resolve(packageDir, '..', '..', '..', '..', 'package.json');
220
+ let version = '0.0.0';
221
+ try {
222
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
223
+ version = pkg.version || version;
224
+ }
225
+ catch {
226
+ // Use default version
227
+ }
228
+ const clawHubManifest = {
229
+ name: manifest.name || path.basename(packageDir),
230
+ version,
231
+ description: manifest.description || '',
232
+ homepage: 'https://aiwg.io',
233
+ repository: 'https://github.com/jmagly/aiwg',
234
+ skills: './skills',
235
+ tags: manifest.tags || manifest.keywords || [],
236
+ license: 'MIT',
237
+ author: 'AIWG Contributors',
238
+ };
239
+ fs.writeFileSync(clawHubManifestPath, JSON.stringify(clawHubManifest, null, 2) + '\n', 'utf-8');
240
+ }
241
+ }
242
+ // Try CLI publish
243
+ const cliResult = runClawHub(`publish "${packageDir}" 2>/dev/null`);
244
+ if (cliResult !== null)
245
+ return;
246
+ throw new Error('ClawHub publish requires the clawhub CLI. ' +
247
+ 'Install it from https://docs.openclaw.ai/tools/clawhub');
248
+ }
249
+ }
250
+ //# sourceMappingURL=clawhub.js.map