@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -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
|