@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,335 @@
1
+ /**
2
+ * Local Registry Adapter
3
+ *
4
+ * Scans agentic/code/ for skill manifests and SKILL.md files.
5
+ * Also checks deployed skills in the current project's provider directory.
6
+ *
7
+ * @implements #539
8
+ */
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import { getProviderDefinition, resolveProviderPathValue, } from '../../providers/provider-definitions.js';
13
+ const _scriptDir = path.dirname(fileURLToPath(import.meta.url));
14
+ const AIWG_ROOT = process.env.AIWG_ROOT || path.resolve(_scriptDir, '../../../');
15
+ function resolveSkillFallbackPath(target, projectDir, name) {
16
+ const definition = getProviderDefinition(target);
17
+ if (!definition)
18
+ return path.join(projectDir, `.${target}/skills`, name);
19
+ const basePath = definition.skillNamespace.pathType === 'home-dir'
20
+ ? `~/${definition.skillNamespace.skillsBaseDir}`
21
+ : definition.skillNamespace.skillsBaseDir;
22
+ return path.join(resolveProviderPathValue(basePath, projectDir), name);
23
+ }
24
+ /**
25
+ * Parse YAML-like frontmatter from SKILL.md content
26
+ */
27
+ function parseFrontmatter(content) {
28
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
29
+ if (!match)
30
+ return {};
31
+ const result = {};
32
+ for (const line of match[1].split('\n')) {
33
+ const kv = line.match(/^(\w+):\s*(.+)$/);
34
+ if (kv) {
35
+ result[kv[1]] = kv[2].replace(/^['"]|['"]$/g, '');
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Parse platforms from frontmatter value like "[claude-code, hermes, openclaw]"
42
+ */
43
+ function parsePlatforms(value) {
44
+ if (!value)
45
+ return [];
46
+ return value
47
+ .replace(/^\[|\]$/g, '')
48
+ .split(',')
49
+ .map((s) => s.trim())
50
+ .filter(Boolean);
51
+ }
52
+ /**
53
+ * Extract triggers section from SKILL.md content
54
+ */
55
+ function extractTriggers(content) {
56
+ const triggerSection = content.match(/## Triggers\n\n([\s\S]*?)(?:\n##|\n$)/);
57
+ if (!triggerSection)
58
+ return [];
59
+ return triggerSection[1]
60
+ .split('\n')
61
+ .filter((line) => line.startsWith('- '))
62
+ .map((line) => line.replace(/^- ["']?|["']?$/g, '').trim())
63
+ .filter(Boolean);
64
+ }
65
+ /**
66
+ * Recursively find all manifest.json files under a directory
67
+ */
68
+ function findManifests(dir) {
69
+ const results = [];
70
+ if (!fs.existsSync(dir))
71
+ return results;
72
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
73
+ for (const entry of entries) {
74
+ const fullPath = path.join(dir, entry.name);
75
+ if (entry.isDirectory()) {
76
+ // Check for skills/manifest.json pattern
77
+ const manifestPath = path.join(fullPath, 'skills', 'manifest.json');
78
+ if (fs.existsSync(manifestPath)) {
79
+ results.push(manifestPath);
80
+ }
81
+ // Recurse into subdirectories
82
+ results.push(...findManifests(fullPath));
83
+ }
84
+ }
85
+ return results;
86
+ }
87
+ /**
88
+ * Deduplicate manifests — keep the shallowest path for each manifest
89
+ */
90
+ function deduplicateManifests(paths) {
91
+ const seen = new Set();
92
+ return paths.filter((p) => {
93
+ if (seen.has(p))
94
+ return false;
95
+ seen.add(p);
96
+ return true;
97
+ });
98
+ }
99
+ export class LocalAdapter {
100
+ id = 'local';
101
+ name = 'Local (AIWG Installation)';
102
+ cachedSkills = null;
103
+ async isAvailable() {
104
+ return fs.existsSync(path.join(AIWG_ROOT, 'agentic', 'code'));
105
+ }
106
+ async list() {
107
+ if (this.cachedSkills)
108
+ return this.cachedSkills;
109
+ const skills = [];
110
+ const agenticDir = path.join(AIWG_ROOT, 'agentic', 'code');
111
+ if (!fs.existsSync(agenticDir))
112
+ return skills;
113
+ // Find all manifest.json files in frameworks/ and addons/
114
+ const frameworksDir = path.join(agenticDir, 'frameworks');
115
+ const addonsDir = path.join(agenticDir, 'addons');
116
+ const manifestPaths = deduplicateManifests([
117
+ ...findManifests(frameworksDir),
118
+ ...findManifests(addonsDir),
119
+ ]);
120
+ for (const manifestPath of manifestPaths) {
121
+ try {
122
+ const raw = fs.readFileSync(manifestPath, 'utf-8');
123
+ const manifest = JSON.parse(raw);
124
+ const skillsDir = path.dirname(manifestPath);
125
+ // Derive package name from path
126
+ // e.g., agentic/code/frameworks/sdlc-complete/skills/manifest.json → sdlc-complete
127
+ const parts = manifestPath.split(path.sep);
128
+ const frameworkIdx = parts.indexOf('frameworks');
129
+ const addonIdx = parts.indexOf('addons');
130
+ const packageName = frameworkIdx >= 0
131
+ ? parts[frameworkIdx + 1]
132
+ : addonIdx >= 0
133
+ ? parts[addonIdx + 1]
134
+ : manifest.name;
135
+ for (const skill of manifest.skills) {
136
+ // Try to read SKILL.md for platform info
137
+ const skillMdPath = path.join(skillsDir, skill.name, 'SKILL.md');
138
+ let platforms = [];
139
+ if (fs.existsSync(skillMdPath)) {
140
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
141
+ const fm = parseFrontmatter(content);
142
+ platforms = parsePlatforms(fm.platforms);
143
+ }
144
+ skills.push({
145
+ name: skill.name,
146
+ description: skill.description,
147
+ source: 'local',
148
+ package: packageName,
149
+ platforms,
150
+ installed: true,
151
+ });
152
+ }
153
+ }
154
+ catch {
155
+ // Skip malformed manifests
156
+ }
157
+ }
158
+ // Also scan for SKILL.md files not in any manifest (standalone skills)
159
+ const skillMdPaths = this.findSkillMds(agenticDir);
160
+ const knownNames = new Set(skills.map((s) => s.name));
161
+ for (const skillMdPath of skillMdPaths) {
162
+ const skillName = path.basename(path.dirname(skillMdPath));
163
+ if (knownNames.has(skillName))
164
+ continue;
165
+ try {
166
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
167
+ const fm = parseFrontmatter(content);
168
+ const platforms = parsePlatforms(fm.platforms);
169
+ // Extract description from first paragraph after frontmatter
170
+ const bodyMatch = content.match(/---\n\n# .+\n\n(.+)/);
171
+ const description = bodyMatch
172
+ ? bodyMatch[1].slice(0, 120)
173
+ : `Skill: ${skillName}`;
174
+ // Derive package
175
+ const parts = skillMdPath.split(path.sep);
176
+ const frameworkIdx = parts.indexOf('frameworks');
177
+ const addonIdx = parts.indexOf('addons');
178
+ const packageName = frameworkIdx >= 0
179
+ ? parts[frameworkIdx + 1]
180
+ : addonIdx >= 0
181
+ ? parts[addonIdx + 1]
182
+ : 'unknown';
183
+ skills.push({
184
+ name: skillName,
185
+ description,
186
+ source: 'local',
187
+ package: packageName,
188
+ platforms,
189
+ installed: true,
190
+ });
191
+ }
192
+ catch {
193
+ // Skip unreadable files
194
+ }
195
+ }
196
+ this.cachedSkills = skills;
197
+ return skills;
198
+ }
199
+ async search(query) {
200
+ const all = await this.list();
201
+ const q = query.toLowerCase();
202
+ return all.filter((s) => s.name.toLowerCase().includes(q) ||
203
+ s.description.toLowerCase().includes(q) ||
204
+ (s.package && s.package.toLowerCase().includes(q)));
205
+ }
206
+ async info(name) {
207
+ const all = await this.list();
208
+ const match = all.find((s) => s.name === name);
209
+ if (!match)
210
+ return undefined;
211
+ // Find the SKILL.md for full details
212
+ const agenticDir = path.join(AIWG_ROOT, 'agentic', 'code');
213
+ const skillMdPaths = this.findSkillMds(agenticDir);
214
+ const skillMdPath = skillMdPaths.find((p) => path.basename(path.dirname(p)) === name);
215
+ const details = { ...match };
216
+ if (skillMdPath) {
217
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
218
+ details.path = skillMdPath;
219
+ details.triggers = extractTriggers(content);
220
+ details.content = content;
221
+ }
222
+ // Check manifest for scripts
223
+ const manifestPaths = deduplicateManifests([
224
+ ...findManifests(path.join(agenticDir, 'frameworks')),
225
+ ...findManifests(path.join(agenticDir, 'addons')),
226
+ ]);
227
+ for (const manifestPath of manifestPaths) {
228
+ try {
229
+ const raw = fs.readFileSync(manifestPath, 'utf-8');
230
+ const manifest = JSON.parse(raw);
231
+ const skillEntry = manifest.skills.find((s) => s.name === name);
232
+ if (skillEntry) {
233
+ details.triggers = details.triggers?.length
234
+ ? details.triggers
235
+ : skillEntry.triggers;
236
+ details.scripts = skillEntry.scripts;
237
+ details.version = manifest.version;
238
+ break;
239
+ }
240
+ }
241
+ catch {
242
+ // Skip
243
+ }
244
+ }
245
+ return details;
246
+ }
247
+ async install(name, options) {
248
+ const details = await this.info(name);
249
+ if (!details || !details.path) {
250
+ throw new Error(`Skill '${name}' not found in local registry`);
251
+ }
252
+ const target = options.target || 'claude';
253
+ const projectDir = options.projectDir;
254
+ // Use PlatformSkillResolver for cross-platform path resolution
255
+ let targetDir;
256
+ try {
257
+ const { PlatformSkillResolver } = await import('../../smiths/skillsmith/platform-resolver.js');
258
+ targetDir = PlatformSkillResolver.getSkillPath(target, projectDir, name);
259
+ }
260
+ catch {
261
+ targetDir = resolveSkillFallbackPath(target, projectDir, name);
262
+ }
263
+ // Copy skill directory to target
264
+ const sourceDir = path.dirname(details.path);
265
+ fs.mkdirSync(targetDir, { recursive: true });
266
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
267
+ for (const entry of entries) {
268
+ const srcPath = path.join(sourceDir, entry.name);
269
+ const destPath = path.join(targetDir, entry.name);
270
+ if (entry.isFile()) {
271
+ fs.copyFileSync(srcPath, destPath);
272
+ }
273
+ else if (entry.isDirectory()) {
274
+ fs.cpSync(srcPath, destPath, { recursive: true });
275
+ }
276
+ }
277
+ // Codex `agents/openai.yaml` UI sidecar (#1129 PUW-028).
278
+ // Additive — sidecar absence is graceful. Failures here are non-fatal.
279
+ if (target === 'codex') {
280
+ try {
281
+ const { emitCodexSidecar } = await import('../../smiths/skillsmith/codex-sidecar.js');
282
+ const skillMdPath = path.join(targetDir, 'SKILL.md');
283
+ let metadata = {};
284
+ try {
285
+ const skillContent = fs.readFileSync(skillMdPath, 'utf8');
286
+ const fmMatch = /^---\s*\n([\s\S]*?)\n---/.exec(skillContent);
287
+ if (fmMatch) {
288
+ const yaml = await import('js-yaml');
289
+ const fm = yaml.load(fmMatch[1]);
290
+ if (fm && typeof fm === 'object') {
291
+ metadata = fm;
292
+ }
293
+ }
294
+ }
295
+ catch {
296
+ // Frontmatter parse failure → fall through with empty metadata;
297
+ // sidecar will use folder name as display_name.
298
+ }
299
+ await emitCodexSidecar(targetDir, metadata);
300
+ }
301
+ catch (err) {
302
+ // Sidecar emission must never block the deploy. Log and move on.
303
+ console.warn(`Warning: Codex sidecar emission failed for ${name}: ${err instanceof Error ? err.message : String(err)}`);
304
+ }
305
+ }
306
+ }
307
+ /**
308
+ * Find all SKILL.md files recursively
309
+ */
310
+ findSkillMds(dir) {
311
+ const results = [];
312
+ if (!fs.existsSync(dir))
313
+ return results;
314
+ const walk = (currentDir) => {
315
+ try {
316
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
317
+ for (const entry of entries) {
318
+ const fullPath = path.join(currentDir, entry.name);
319
+ if (entry.isDirectory()) {
320
+ walk(fullPath);
321
+ }
322
+ else if (entry.name === 'SKILL.md') {
323
+ results.push(fullPath);
324
+ }
325
+ }
326
+ }
327
+ catch {
328
+ // Permission error or similar — skip
329
+ }
330
+ };
331
+ walk(dir);
332
+ return results;
333
+ }
334
+ }
335
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1,316 @@
1
+ /**
2
+ * OpenClaw Registry Adapter
3
+ *
4
+ * Delegates to the `openclaw` CLI for skill operations.
5
+ * Parses CLI output to provide structured results.
6
+ * Falls back gracefully when OpenClaw is not installed.
7
+ *
8
+ * @implements #539
9
+ * @see https://docs.openclaw.ai
10
+ */
11
+ import { execSync } from 'child_process';
12
+ import fs from 'fs';
13
+ import path from 'path';
14
+ import { getProviderDefinition, resolveProviderPathValue, } from '../../providers/provider-definitions.js';
15
+ function resolveSkillFallbackPath(target, projectDir, name) {
16
+ const definition = getProviderDefinition(target);
17
+ if (!definition)
18
+ return path.join(projectDir, `.${target}/skills`, name);
19
+ const basePath = definition.skillNamespace.pathType === 'home-dir'
20
+ ? `~/${definition.skillNamespace.skillsBaseDir}`
21
+ : definition.skillNamespace.skillsBaseDir;
22
+ return path.join(resolveProviderPathValue(basePath, projectDir), name);
23
+ }
24
+ /**
25
+ * Execute an openclaw CLI command and return stdout
26
+ */
27
+ function runOpenClaw(args) {
28
+ try {
29
+ return execSync(`openclaw ${args}`, {
30
+ encoding: 'utf-8',
31
+ timeout: 30000,
32
+ stdio: ['pipe', 'pipe', 'pipe'],
33
+ }).trim();
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Parse openclaw skills list output into SkillResult[]
41
+ *
42
+ * Expected format is newline-separated entries. We handle both
43
+ * structured JSON output (if openclaw supports --json) and
44
+ * plain text output by scanning ~/.openclaw/skills/ directly.
45
+ */
46
+ function parseSkillsFromDirectory() {
47
+ const results = [];
48
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
49
+ const skillsDir = path.join(homeDir, '.openclaw', 'skills');
50
+ if (!fs.existsSync(skillsDir))
51
+ return results;
52
+ try {
53
+ for (const skillMdPath of findSkillMarkdownFiles(skillsDir)) {
54
+ const skillDir = path.dirname(skillMdPath);
55
+ const name = path.basename(skillDir);
56
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
57
+ // Extract description from first paragraph after heading
58
+ const descMatch = content.match(/^# .+\n\n(.+)/m);
59
+ const description = descMatch
60
+ ? descMatch[1].slice(0, 120)
61
+ : `Skill: ${name}`;
62
+ // Extract platforms from frontmatter
63
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
64
+ let platforms = [];
65
+ if (fmMatch) {
66
+ const platformLine = fmMatch[1]
67
+ .split('\n')
68
+ .find((l) => l.startsWith('platforms:'));
69
+ if (platformLine) {
70
+ platforms = platformLine
71
+ .replace(/^platforms:\s*\[?/, '')
72
+ .replace(/\]?\s*$/, '')
73
+ .split(',')
74
+ .map((s) => s.trim())
75
+ .filter(Boolean);
76
+ }
77
+ }
78
+ results.push({
79
+ name,
80
+ description,
81
+ source: 'openclaw',
82
+ platforms,
83
+ installed: true,
84
+ });
85
+ }
86
+ }
87
+ catch {
88
+ // Permission error or similar
89
+ }
90
+ return results;
91
+ }
92
+ function findSkillMarkdownFiles(skillsDir) {
93
+ const found = [];
94
+ if (!fs.existsSync(skillsDir))
95
+ return found;
96
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
97
+ if (!entry.isDirectory())
98
+ continue;
99
+ const direct = path.join(skillsDir, entry.name, 'SKILL.md');
100
+ if (fs.existsSync(direct)) {
101
+ found.push(direct);
102
+ continue;
103
+ }
104
+ // OpenClaw supports one namespace level under ~/.openclaw/skills/
105
+ // (for example ~/.openclaw/skills/aiwg/<skill>/SKILL.md).
106
+ const namespaceDir = path.join(skillsDir, entry.name);
107
+ for (const child of fs.readdirSync(namespaceDir, { withFileTypes: true })) {
108
+ if (!child.isDirectory())
109
+ continue;
110
+ const nested = path.join(namespaceDir, child.name, 'SKILL.md');
111
+ if (fs.existsSync(nested))
112
+ found.push(nested);
113
+ }
114
+ }
115
+ return found;
116
+ }
117
+ function findSkillDir(name) {
118
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
119
+ const skillsDir = path.join(homeDir, '.openclaw', 'skills');
120
+ const direct = path.join(skillsDir, name);
121
+ if (fs.existsSync(path.join(direct, 'SKILL.md')))
122
+ return direct;
123
+ const namespaced = path.join(skillsDir, 'aiwg', name);
124
+ if (fs.existsSync(path.join(namespaced, 'SKILL.md')))
125
+ return namespaced;
126
+ if (fs.existsSync(skillsDir)) {
127
+ for (const skillMd of findSkillMarkdownFiles(skillsDir)) {
128
+ if (path.basename(path.dirname(skillMd)) === name)
129
+ return path.dirname(skillMd);
130
+ }
131
+ }
132
+ return null;
133
+ }
134
+ export class OpenClawAdapter {
135
+ id = 'openclaw';
136
+ name = 'OpenClaw CLI';
137
+ cachedSkills = null;
138
+ async isAvailable() {
139
+ // Check for openclaw CLI or the ~/.openclaw/skills/ directory
140
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
141
+ const openclawDir = path.join(homeDir, '.openclaw');
142
+ if (fs.existsSync(openclawDir))
143
+ return true;
144
+ try {
145
+ execSync('openclaw --version 2>/dev/null', { encoding: 'utf-8' });
146
+ return true;
147
+ }
148
+ catch {
149
+ return false;
150
+ }
151
+ }
152
+ async list() {
153
+ if (this.cachedSkills)
154
+ return this.cachedSkills;
155
+ // Try openclaw CLI with JSON output first
156
+ const jsonOutput = runOpenClaw('skills list --json 2>/dev/null');
157
+ if (jsonOutput) {
158
+ try {
159
+ const parsed = JSON.parse(jsonOutput);
160
+ if (Array.isArray(parsed)) {
161
+ this.cachedSkills = parsed.map((s) => ({
162
+ name: s.name || s.id,
163
+ description: s.description || '',
164
+ source: 'openclaw',
165
+ platforms: s.platforms || [],
166
+ installed: true,
167
+ }));
168
+ return this.cachedSkills;
169
+ }
170
+ }
171
+ catch {
172
+ // Fall through to directory scan
173
+ }
174
+ }
175
+ // Fall back to reading ~/.openclaw/skills/ directly
176
+ this.cachedSkills = parseSkillsFromDirectory();
177
+ return this.cachedSkills;
178
+ }
179
+ async search(query) {
180
+ // Try CLI delegation first
181
+ const cliOutput = runOpenClaw(`skills search "${query}" --json 2>/dev/null`);
182
+ if (cliOutput) {
183
+ try {
184
+ const parsed = JSON.parse(cliOutput);
185
+ if (Array.isArray(parsed)) {
186
+ return parsed.map((s) => ({
187
+ name: s.name || s.id,
188
+ description: s.description || '',
189
+ source: 'openclaw',
190
+ platforms: s.platforms || [],
191
+ installed: s.installed ?? false,
192
+ }));
193
+ }
194
+ }
195
+ catch {
196
+ // Fall through to local filter
197
+ }
198
+ }
199
+ // Fall back to filtering local skills
200
+ const all = await this.list();
201
+ const q = query.toLowerCase();
202
+ return all.filter((s) => s.name.toLowerCase().includes(q) ||
203
+ s.description.toLowerCase().includes(q));
204
+ }
205
+ async info(name) {
206
+ const skillDir = findSkillDir(name);
207
+ const skillMdPath = skillDir ? path.join(skillDir, 'SKILL.md') : '';
208
+ if (!skillMdPath || !fs.existsSync(skillMdPath)) {
209
+ // Try CLI
210
+ const cliOutput = runOpenClaw(`skills info "${name}" --json 2>/dev/null`);
211
+ if (cliOutput) {
212
+ try {
213
+ const parsed = JSON.parse(cliOutput);
214
+ return {
215
+ name: parsed.name || name,
216
+ description: parsed.description || '',
217
+ source: 'openclaw',
218
+ platforms: parsed.platforms || [],
219
+ triggers: parsed.triggers || [],
220
+ version: parsed.version,
221
+ };
222
+ }
223
+ catch {
224
+ return undefined;
225
+ }
226
+ }
227
+ return undefined;
228
+ }
229
+ const content = fs.readFileSync(skillMdPath, 'utf-8');
230
+ // Parse frontmatter
231
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
232
+ let platforms = [];
233
+ if (fmMatch) {
234
+ const platformLine = fmMatch[1]
235
+ .split('\n')
236
+ .find((l) => l.startsWith('platforms:'));
237
+ if (platformLine) {
238
+ platforms = platformLine
239
+ .replace(/^platforms:\s*\[?/, '')
240
+ .replace(/\]?\s*$/, '')
241
+ .split(',')
242
+ .map((s) => s.trim())
243
+ .filter(Boolean);
244
+ }
245
+ }
246
+ // Extract triggers
247
+ const triggerSection = content.match(/## Triggers\n\n([\s\S]*?)(?:\n##|\n$)/);
248
+ const triggers = triggerSection
249
+ ? triggerSection[1]
250
+ .split('\n')
251
+ .filter((line) => line.startsWith('- '))
252
+ .map((line) => line.replace(/^- ["']?|["']?$/g, '').trim())
253
+ .filter(Boolean)
254
+ : [];
255
+ // Extract description
256
+ const descMatch = content.match(/^# .+\n\n(.+)/m);
257
+ const description = descMatch ? descMatch[1] : `Skill: ${name}`;
258
+ return {
259
+ name,
260
+ description,
261
+ source: 'openclaw',
262
+ platforms,
263
+ triggers,
264
+ path: skillMdPath,
265
+ content,
266
+ installed: true,
267
+ };
268
+ }
269
+ async install(name, options) {
270
+ // Try openclaw CLI install first
271
+ const cliResult = runOpenClaw(`skills install "${name}" 2>/dev/null`);
272
+ if (cliResult !== null) {
273
+ // CLI handled it — if target is different from openclaw, copy to target
274
+ if (options.target && options.target !== 'openclaw') {
275
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
276
+ const sourceDir = path.join(homeDir, '.openclaw', 'skills', name);
277
+ if (fs.existsSync(sourceDir)) {
278
+ await this.copyToTarget(name, sourceDir, options);
279
+ }
280
+ }
281
+ return;
282
+ }
283
+ // If CLI not available but skill exists in ~/.openclaw/skills/, copy it
284
+ const sourceDir = findSkillDir(name);
285
+ if (sourceDir && fs.existsSync(sourceDir)) {
286
+ await this.copyToTarget(name, sourceDir, options);
287
+ return;
288
+ }
289
+ throw new Error(`Skill '${name}' not found in OpenClaw. ` +
290
+ `Ensure it's installed via 'openclaw skills install ${name}' or available at ~/.openclaw/skills/${name}/ or ~/.openclaw/skills/aiwg/${name}/`);
291
+ }
292
+ async copyToTarget(name, sourceDir, options) {
293
+ const target = options.target || 'openclaw';
294
+ let targetDir;
295
+ try {
296
+ const { PlatformSkillResolver } = await import('../../smiths/skillsmith/platform-resolver.js');
297
+ targetDir = PlatformSkillResolver.getSkillPath(target, options.projectDir, name);
298
+ }
299
+ catch {
300
+ targetDir = resolveSkillFallbackPath(target, options.projectDir, name);
301
+ }
302
+ fs.mkdirSync(targetDir, { recursive: true });
303
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
304
+ for (const entry of entries) {
305
+ const srcPath = path.join(sourceDir, entry.name);
306
+ const destPath = path.join(targetDir, entry.name);
307
+ if (entry.isFile()) {
308
+ fs.copyFileSync(srcPath, destPath);
309
+ }
310
+ else if (entry.isDirectory()) {
311
+ fs.cpSync(srcPath, destPath, { recursive: true });
312
+ }
313
+ }
314
+ }
315
+ }
316
+ //# sourceMappingURL=openclaw.js.map