@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,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill→Command Translation Layer
|
|
3
|
+
*
|
|
4
|
+
* Generates command files from canonical SKILL.md sources for providers that
|
|
5
|
+
* require command format natively (Factory, OpenCode, Warp, Windsurf, Copilot,
|
|
6
|
+
* Codex, OpenClaw).
|
|
7
|
+
*
|
|
8
|
+
* Skills are the canonical source format; commands are deployment artifacts.
|
|
9
|
+
* See ADR: Skills as the Canonical Extension Type.
|
|
10
|
+
*
|
|
11
|
+
* @implements .aiwg/architecture/adr-skills-canonical-extension-type.md
|
|
12
|
+
* @issue #550
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'fs/promises';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
// ============================================
|
|
17
|
+
// Provider Configuration
|
|
18
|
+
// ============================================
|
|
19
|
+
/**
|
|
20
|
+
* Providers that need command files generated from skills.
|
|
21
|
+
*
|
|
22
|
+
* Providers not listed here get skills deployed natively (no translation needed).
|
|
23
|
+
*/
|
|
24
|
+
const PROVIDERS_NEEDING_COMMANDS = new Set([
|
|
25
|
+
'factory',
|
|
26
|
+
'opencode', // OpenCode scans .opencode/command/**/*.md via ConfigCommand.load() (PUW-006 #1107)
|
|
27
|
+
'warp',
|
|
28
|
+
'windsurf',
|
|
29
|
+
'copilot',
|
|
30
|
+
'codex',
|
|
31
|
+
'openclaw',
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Providers where skills are deployed natively (no command generation needed).
|
|
35
|
+
*/
|
|
36
|
+
const SKILLS_ONLY_PROVIDERS = new Set([
|
|
37
|
+
'claude',
|
|
38
|
+
'cursor',
|
|
39
|
+
'hermes',
|
|
40
|
+
'openhuman',
|
|
41
|
+
]);
|
|
42
|
+
/**
|
|
43
|
+
* Check if a provider needs command files generated from skills.
|
|
44
|
+
*/
|
|
45
|
+
export function providerNeedsCommands(provider) {
|
|
46
|
+
return PROVIDERS_NEEDING_COMMANDS.has(provider);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a provider uses skills natively (no command translation).
|
|
50
|
+
*/
|
|
51
|
+
export function providerUsesSkillsNatively(provider) {
|
|
52
|
+
return SKILLS_ONLY_PROVIDERS.has(provider);
|
|
53
|
+
}
|
|
54
|
+
// ============================================
|
|
55
|
+
// Frontmatter Parsing
|
|
56
|
+
// ============================================
|
|
57
|
+
/**
|
|
58
|
+
* Parse YAML-like frontmatter from a SKILL.md file.
|
|
59
|
+
*
|
|
60
|
+
* This is a lightweight parser that handles the subset of YAML used in
|
|
61
|
+
* SKILL.md frontmatter. For full YAML support, a library like js-yaml
|
|
62
|
+
* would be needed, but the frontmatter format is simple enough for this.
|
|
63
|
+
*/
|
|
64
|
+
export function parseFrontmatter(content) {
|
|
65
|
+
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
|
|
66
|
+
if (!fmMatch) {
|
|
67
|
+
return { frontmatter: {}, body: content };
|
|
68
|
+
}
|
|
69
|
+
const fmRaw = fmMatch[1];
|
|
70
|
+
const body = fmMatch[2];
|
|
71
|
+
const frontmatter = {};
|
|
72
|
+
// Parse top-level keys
|
|
73
|
+
const lines = fmRaw.split('\n');
|
|
74
|
+
let i = 0;
|
|
75
|
+
while (i < lines.length) {
|
|
76
|
+
const line = lines[i];
|
|
77
|
+
// description: ...
|
|
78
|
+
const descMatch = line.match(/^description:\s*(.+)/);
|
|
79
|
+
if (descMatch) {
|
|
80
|
+
frontmatter.description = descMatch[1].trim();
|
|
81
|
+
i++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// userInvocable: false
|
|
85
|
+
const uiMatch = line.match(/^userInvocable:\s*(true|false)/i);
|
|
86
|
+
if (uiMatch) {
|
|
87
|
+
frontmatter.userInvocable = uiMatch[1].toLowerCase() === 'true';
|
|
88
|
+
i++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// user-invocable: false (kebab-case variant)
|
|
92
|
+
const uiKebabMatch = line.match(/^user-invocable:\s*(true|false)/i);
|
|
93
|
+
if (uiKebabMatch) {
|
|
94
|
+
frontmatter.userInvocable = uiKebabMatch[1].toLowerCase() === 'true';
|
|
95
|
+
i++;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// effort: N
|
|
99
|
+
const effortMatch = line.match(/^effort:\s*(\d+)/);
|
|
100
|
+
if (effortMatch) {
|
|
101
|
+
frontmatter.effort = parseInt(effortMatch[1], 10);
|
|
102
|
+
i++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// context: fork|inherit
|
|
106
|
+
const ctxMatch = line.match(/^context:\s*(\w+)/);
|
|
107
|
+
if (ctxMatch) {
|
|
108
|
+
frontmatter.context = ctxMatch[1];
|
|
109
|
+
i++;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// disableModelInvocation: true
|
|
113
|
+
const dmiMatch = line.match(/^(?:disableModelInvocation|disable-model-invocation):\s*(true|false)/i);
|
|
114
|
+
if (dmiMatch) {
|
|
115
|
+
frontmatter.disableModelInvocation = dmiMatch[1].toLowerCase() === 'true';
|
|
116
|
+
i++;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// allowed-tools: (top-level, for the skill itself)
|
|
120
|
+
const atMatch = line.match(/^allowed-tools:\s*(.+)/);
|
|
121
|
+
if (atMatch) {
|
|
122
|
+
frontmatter.allowedTools = atMatch[1].trim();
|
|
123
|
+
i++;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
// commandHint: block
|
|
127
|
+
if (line.match(/^commandHint:\s*$/)) {
|
|
128
|
+
const hint = {};
|
|
129
|
+
i++;
|
|
130
|
+
while (i < lines.length && lines[i].match(/^\s+/)) {
|
|
131
|
+
const hintLine = lines[i].trim();
|
|
132
|
+
const ahMatch = hintLine.match(/^argumentHint:\s*(.+)/);
|
|
133
|
+
if (ahMatch) {
|
|
134
|
+
hint.argumentHint = ahMatch[1].trim();
|
|
135
|
+
i++;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
const hatMatch = hintLine.match(/^allowedTools:\s*(.+)/);
|
|
139
|
+
if (hatMatch) {
|
|
140
|
+
hint.allowedTools = hatMatch[1].trim();
|
|
141
|
+
i++;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const tmplMatch = hintLine.match(/^template:\s*(.+)/);
|
|
145
|
+
if (tmplMatch) {
|
|
146
|
+
hint.template = tmplMatch[1].trim();
|
|
147
|
+
i++;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const modMatch = hintLine.match(/^model:\s*(.+)/);
|
|
151
|
+
if (modMatch) {
|
|
152
|
+
hint.model = modMatch[1].trim();
|
|
153
|
+
i++;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const roleMatch = hintLine.match(/^modelRole:\s*(reasoning|coding|efficiency)\s*$/);
|
|
157
|
+
if (roleMatch) {
|
|
158
|
+
hint.modelRole = roleMatch[1];
|
|
159
|
+
i++;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const tierMatch = hintLine.match(/^modelTier:\s*(economy|standard|premium)\s*$/);
|
|
163
|
+
if (tierMatch) {
|
|
164
|
+
hint.modelTier = tierMatch[1];
|
|
165
|
+
i++;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const effortMatch = hintLine.match(/^modelEffort:\s*(minimal|low|medium|high|xhigh)\s*$/);
|
|
169
|
+
if (effortMatch) {
|
|
170
|
+
hint.modelEffort = effortMatch[1];
|
|
171
|
+
i++;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
const rationaleMatch = hintLine.match(/^modelRationale:\s*(.+)$/);
|
|
175
|
+
if (rationaleMatch) {
|
|
176
|
+
hint.modelRationale = rationaleMatch[1].trim();
|
|
177
|
+
i++;
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const catMatch = hintLine.match(/^category:\s*(.+)/);
|
|
181
|
+
if (catMatch) {
|
|
182
|
+
hint.category = catMatch[1].trim();
|
|
183
|
+
i++;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const orchMatch = hintLine.match(/^orchestration:\s*(true|false)/i);
|
|
187
|
+
if (orchMatch) {
|
|
188
|
+
hint.orchestration = orchMatch[1].toLowerCase() === 'true';
|
|
189
|
+
i++;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
const cliMatch = hintLine.match(/^cliDisabled:\s*(true|false)/i);
|
|
193
|
+
if (cliMatch) {
|
|
194
|
+
hint.cliDisabled = cliMatch[1].toLowerCase() === 'true';
|
|
195
|
+
i++;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
i++;
|
|
199
|
+
}
|
|
200
|
+
frontmatter.commandHint = hint;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
i++;
|
|
204
|
+
}
|
|
205
|
+
return { frontmatter, body };
|
|
206
|
+
}
|
|
207
|
+
// ============================================
|
|
208
|
+
// Command Generation
|
|
209
|
+
// ============================================
|
|
210
|
+
/**
|
|
211
|
+
* Generate a command .md file content from parsed skill data.
|
|
212
|
+
*
|
|
213
|
+
* Maps SKILL.md frontmatter to legacy command frontmatter format:
|
|
214
|
+
* - `description:` from skill description
|
|
215
|
+
* - `argument-hint:` from commandHint.argumentHint
|
|
216
|
+
* - `allowed-tools:` from commandHint.allowedTools (comma-separated)
|
|
217
|
+
*/
|
|
218
|
+
export function generateCommandContent(_skillName, frontmatter, body, provider) {
|
|
219
|
+
const lines = ['---'];
|
|
220
|
+
// description is always included
|
|
221
|
+
if (frontmatter.description) {
|
|
222
|
+
lines.push(`description: ${frontmatter.description}`);
|
|
223
|
+
}
|
|
224
|
+
const hint = frontmatter.commandHint;
|
|
225
|
+
// argument-hint from commandHint
|
|
226
|
+
if (hint?.argumentHint) {
|
|
227
|
+
lines.push(`argument-hint: ${hint.argumentHint}`);
|
|
228
|
+
}
|
|
229
|
+
// allowed-tools: prefer commandHint.allowedTools, fall back to top-level allowedTools
|
|
230
|
+
const tools = hint?.allowedTools ?? frontmatter.allowedTools;
|
|
231
|
+
if (tools) {
|
|
232
|
+
const toolStr = Array.isArray(tools) ? tools.join(', ') : tools;
|
|
233
|
+
lines.push(`allowed-tools: ${toolStr}`);
|
|
234
|
+
}
|
|
235
|
+
const modelPolicy = resolveSkillModelPolicy(hint);
|
|
236
|
+
if (modelPolicy) {
|
|
237
|
+
lines.push(`aiwg-model-role: ${modelPolicy.modelRole}`);
|
|
238
|
+
lines.push(`aiwg-model-tier: ${modelPolicy.modelTier}`);
|
|
239
|
+
if (modelPolicy.modelEffort)
|
|
240
|
+
lines.push(`aiwg-model-effort: ${modelPolicy.modelEffort}`);
|
|
241
|
+
if (hint?.modelRationale)
|
|
242
|
+
lines.push(`aiwg-model-rationale: ${hint.modelRationale}`);
|
|
243
|
+
if (provider === 'claude') {
|
|
244
|
+
lines.push(`model: ${modelPolicy.legacyModel}`);
|
|
245
|
+
if (modelPolicy.modelEffort) {
|
|
246
|
+
const effort = modelPolicy.modelEffort === 'medium' ? 2
|
|
247
|
+
: modelPolicy.modelEffort === 'high' || modelPolicy.modelEffort === 'xhigh' ? 3 : 1;
|
|
248
|
+
lines.push(`effort: ${effort}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
lines.push('---');
|
|
253
|
+
lines.push('');
|
|
254
|
+
// Body content is passed through unchanged
|
|
255
|
+
lines.push(body.trimStart());
|
|
256
|
+
return lines.join('\n');
|
|
257
|
+
}
|
|
258
|
+
// ============================================
|
|
259
|
+
// Translation Pipeline
|
|
260
|
+
// ============================================
|
|
261
|
+
/**
|
|
262
|
+
* Translate all skills in a directory to command files.
|
|
263
|
+
*
|
|
264
|
+
* Reads each subdirectory in `skillsDir` as a skill, parses SKILL.md,
|
|
265
|
+
* and generates a corresponding command .md file.
|
|
266
|
+
*
|
|
267
|
+
* @param skillsDir - Source skills directory (e.g., `agentic/code/frameworks/sdlc-complete/skills/`)
|
|
268
|
+
* @param options - Translation options (provider, target dir, dry-run)
|
|
269
|
+
* @returns Translation result with counts and any errors
|
|
270
|
+
*/
|
|
271
|
+
export async function translateSkillsToCommands(skillsDir, options) {
|
|
272
|
+
const result = {
|
|
273
|
+
provider: options.provider,
|
|
274
|
+
targetDir: options.targetDir,
|
|
275
|
+
translated: [],
|
|
276
|
+
skipped: [],
|
|
277
|
+
errors: [],
|
|
278
|
+
totalProcessed: 0,
|
|
279
|
+
};
|
|
280
|
+
// Check if this provider needs commands. nameFilter overrides the
|
|
281
|
+
// provider gating: when an operator passes an explicit filter (e.g. Claude
|
|
282
|
+
// flow→command emission per PUW-015 #1116), they're opting in to selective
|
|
283
|
+
// translation regardless of the provider's default skills-native posture.
|
|
284
|
+
if (!options.nameFilter && !providerNeedsCommands(options.provider)) {
|
|
285
|
+
if (options.verbose) {
|
|
286
|
+
console.log(` Provider '${options.provider}' uses skills natively — skipping command generation`);
|
|
287
|
+
}
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
// Read skill directories
|
|
291
|
+
let entries;
|
|
292
|
+
try {
|
|
293
|
+
const dirEntries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
294
|
+
entries = dirEntries.filter(e => e.isDirectory()).map(e => e.name);
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// No skills directory — nothing to translate
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
// Process each skill
|
|
301
|
+
for (const skillName of entries) {
|
|
302
|
+
// Apply name filter when provided (PUW-015 / #1116 — Claude flow filter).
|
|
303
|
+
if (options.nameFilter && !options.nameFilter(skillName)) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
result.totalProcessed++;
|
|
307
|
+
const skillMdPath = path.join(skillsDir, skillName, 'SKILL.md');
|
|
308
|
+
try {
|
|
309
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
310
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
311
|
+
// Skip background-only skills (userInvocable: false)
|
|
312
|
+
if (frontmatter.userInvocable === false) {
|
|
313
|
+
const skipped = {
|
|
314
|
+
sourcePath: skillMdPath,
|
|
315
|
+
skillName,
|
|
316
|
+
commandFilename: `${skillName}.md`,
|
|
317
|
+
content: '',
|
|
318
|
+
skipped: true,
|
|
319
|
+
skipReason: 'userInvocable: false (background-only skill)',
|
|
320
|
+
};
|
|
321
|
+
result.skipped.push(skipped);
|
|
322
|
+
if (options.verbose) {
|
|
323
|
+
console.log(` Skipped: ${skillName} (background-only)`);
|
|
324
|
+
}
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
// Generate command content
|
|
328
|
+
const commandContent = generateCommandContent(skillName, frontmatter, body, options.provider);
|
|
329
|
+
const commandFilename = `${skillName}.md`;
|
|
330
|
+
const translated = {
|
|
331
|
+
sourcePath: skillMdPath,
|
|
332
|
+
skillName,
|
|
333
|
+
commandFilename,
|
|
334
|
+
content: commandContent,
|
|
335
|
+
skipped: false,
|
|
336
|
+
};
|
|
337
|
+
// Write file (unless dry-run)
|
|
338
|
+
if (!options.dryRun) {
|
|
339
|
+
const targetPath = path.join(options.targetDir, commandFilename);
|
|
340
|
+
await fs.mkdir(options.targetDir, { recursive: true });
|
|
341
|
+
await fs.writeFile(targetPath, commandContent, 'utf-8');
|
|
342
|
+
// Copilot dual-write per PUW-004 (#1105): also emit to
|
|
343
|
+
// `.github/prompts/<skill>.prompt.md` so Copilot Chat picks up the
|
|
344
|
+
// skills as `/`-invocable prompt files. Always-deploy invariant
|
|
345
|
+
// (ADR-1 §0.6) keeps the legacy `.github/commands/` write above.
|
|
346
|
+
if (options.provider === 'copilot') {
|
|
347
|
+
const projectRoot = options.projectPath
|
|
348
|
+
?? path.dirname(path.dirname(options.targetDir));
|
|
349
|
+
const promptsDir = path.join(projectRoot, '.github', 'prompts');
|
|
350
|
+
const promptPath = path.join(promptsDir, `${skillName}.prompt.md`);
|
|
351
|
+
await fs.mkdir(promptsDir, { recursive: true });
|
|
352
|
+
await fs.writeFile(promptPath, commandContent, 'utf-8');
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
result.translated.push(translated);
|
|
356
|
+
if (options.verbose) {
|
|
357
|
+
console.log(` Translated: ${skillName} → ${commandFilename}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
// SKILL.md might not exist (skill has no markdown file) — skip gracefully
|
|
362
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
363
|
+
if (errMsg.includes('ENOENT')) {
|
|
364
|
+
// No SKILL.md — skip silently
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
result.errors.push({ skillName, error: errMsg });
|
|
368
|
+
if (options.verbose) {
|
|
369
|
+
console.error(` Error: ${skillName} — ${errMsg}`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Translate a single SKILL.md content string to command format.
|
|
377
|
+
*
|
|
378
|
+
* Convenience function for testing and one-off translations.
|
|
379
|
+
*
|
|
380
|
+
* @param skillName - Skill name (used for display only)
|
|
381
|
+
* @param skillContent - Raw SKILL.md file content
|
|
382
|
+
* @returns Generated command .md content, or null if skill should be skipped
|
|
383
|
+
*/
|
|
384
|
+
export function translateSingleSkill(skillName, skillContent, provider) {
|
|
385
|
+
const { frontmatter, body } = parseFrontmatter(skillContent);
|
|
386
|
+
// Skip background-only skills
|
|
387
|
+
if (frontmatter.userInvocable === false) {
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
return generateCommandContent(skillName, frontmatter, body, provider);
|
|
391
|
+
}
|
|
392
|
+
/** Deterministically migrate legacy commandHint.model into portable intent. */
|
|
393
|
+
export function resolveSkillModelPolicy(hint) {
|
|
394
|
+
if (!hint)
|
|
395
|
+
return null;
|
|
396
|
+
const legacy = hint.model?.trim().toLowerCase();
|
|
397
|
+
const legacyRole = legacy === 'opus' ? 'reasoning'
|
|
398
|
+
: legacy === 'haiku' ? 'efficiency'
|
|
399
|
+
: legacy ? 'coding' : undefined;
|
|
400
|
+
const modelRole = hint.modelRole ?? legacyRole;
|
|
401
|
+
if (!modelRole)
|
|
402
|
+
return null;
|
|
403
|
+
const modelTier = hint.modelTier
|
|
404
|
+
?? (modelRole === 'reasoning' ? 'premium'
|
|
405
|
+
: modelRole === 'efficiency' ? 'economy' : 'standard');
|
|
406
|
+
return {
|
|
407
|
+
modelRole,
|
|
408
|
+
modelTier,
|
|
409
|
+
modelEffort: hint.modelEffort,
|
|
410
|
+
legacyModel: modelRole === 'reasoning' ? 'opus'
|
|
411
|
+
: modelRole === 'efficiency' ? 'haiku' : 'sonnet',
|
|
412
|
+
source: hint.modelRole || hint.modelTier ? 'canonical' : 'legacy',
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=skill-command-translator.js.map
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkspaceCreator - Create framework-scoped workspaces
|
|
3
|
+
*
|
|
4
|
+
* Creates framework-specific directories and shared resources for
|
|
5
|
+
* multi-framework projects. Supports Claude, Codex, and Cursor frameworks.
|
|
6
|
+
*
|
|
7
|
+
* FID-007 Framework-Scoped Workspaces creation logic.
|
|
8
|
+
*
|
|
9
|
+
* @module src/plugin/workspace-creator
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
* @since 2025-10-23
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs/promises';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
// ===========================
|
|
16
|
+
// WorkspaceCreator Class
|
|
17
|
+
// ===========================
|
|
18
|
+
export class WorkspaceCreator {
|
|
19
|
+
projectRoot;
|
|
20
|
+
SUPPORTED_FRAMEWORKS = ['claude', 'codex', 'cursor'];
|
|
21
|
+
SHARED_DIRS = [
|
|
22
|
+
'intake',
|
|
23
|
+
'requirements',
|
|
24
|
+
'architecture',
|
|
25
|
+
'planning',
|
|
26
|
+
'testing',
|
|
27
|
+
'deployment',
|
|
28
|
+
'security',
|
|
29
|
+
'quality',
|
|
30
|
+
'risks',
|
|
31
|
+
'reports',
|
|
32
|
+
'working',
|
|
33
|
+
'handoffs',
|
|
34
|
+
'gates',
|
|
35
|
+
'decisions',
|
|
36
|
+
'team',
|
|
37
|
+
'management'
|
|
38
|
+
];
|
|
39
|
+
constructor(projectRoot) {
|
|
40
|
+
this.projectRoot = path.resolve(projectRoot);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create framework-specific workspace
|
|
44
|
+
*
|
|
45
|
+
* @param framework - Framework name (claude, codex, cursor)
|
|
46
|
+
* @param options - Creation options
|
|
47
|
+
*/
|
|
48
|
+
async createFrameworkWorkspace(framework, options = {}) {
|
|
49
|
+
if (!this.SUPPORTED_FRAMEWORKS.includes(framework)) {
|
|
50
|
+
throw new Error(`Unsupported framework: ${framework}`);
|
|
51
|
+
}
|
|
52
|
+
const frameworkPath = path.join(this.projectRoot, '.aiwg', framework);
|
|
53
|
+
const sharedPath = path.join(this.projectRoot, '.aiwg', 'shared');
|
|
54
|
+
// Create framework directory structure
|
|
55
|
+
await fs.mkdir(frameworkPath, { recursive: true });
|
|
56
|
+
await fs.mkdir(path.join(frameworkPath, 'agents'), { recursive: true });
|
|
57
|
+
await fs.mkdir(path.join(frameworkPath, 'commands'), { recursive: true });
|
|
58
|
+
await fs.mkdir(path.join(frameworkPath, 'memory'), { recursive: true });
|
|
59
|
+
await fs.mkdir(path.join(frameworkPath, 'context'), { recursive: true });
|
|
60
|
+
// Create shared directory structure
|
|
61
|
+
await fs.mkdir(sharedPath, { recursive: true });
|
|
62
|
+
for (const dir of this.SHARED_DIRS) {
|
|
63
|
+
await fs.mkdir(path.join(sharedPath, dir), { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
// Create default config file
|
|
66
|
+
const configPath = path.join(frameworkPath, 'settings.json');
|
|
67
|
+
try {
|
|
68
|
+
await fs.access(configPath);
|
|
69
|
+
// Config already exists, don't overwrite
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
await fs.writeFile(configPath, JSON.stringify({
|
|
73
|
+
framework,
|
|
74
|
+
version: options.version || '1.0.0',
|
|
75
|
+
created: new Date().toISOString()
|
|
76
|
+
}, null, 2));
|
|
77
|
+
}
|
|
78
|
+
// Create README
|
|
79
|
+
const readmePath = path.join(frameworkPath, 'README.md');
|
|
80
|
+
try {
|
|
81
|
+
await fs.access(readmePath);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
await fs.writeFile(readmePath, `# ${framework.charAt(0).toUpperCase() + framework.slice(1)} Framework Workspace\n\nFramework-specific configuration and resources.\n`);
|
|
85
|
+
}
|
|
86
|
+
// Create .gitignore
|
|
87
|
+
const gitignorePath = path.join(frameworkPath, '.gitignore');
|
|
88
|
+
try {
|
|
89
|
+
await fs.access(gitignorePath);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
await fs.writeFile(gitignorePath, '*.log\nmemory/\n*.tmp\n');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Add framework to existing project
|
|
97
|
+
*
|
|
98
|
+
* @param framework - Framework name to add
|
|
99
|
+
*/
|
|
100
|
+
async addFrameworkToProject(framework) {
|
|
101
|
+
// Create workspace for new framework
|
|
102
|
+
await this.createFrameworkWorkspace(framework);
|
|
103
|
+
// Update workspace registry
|
|
104
|
+
const registryPath = path.join(this.projectRoot, '.aiwg', 'registry.json');
|
|
105
|
+
let registry = { frameworks: [] };
|
|
106
|
+
try {
|
|
107
|
+
const content = await fs.readFile(registryPath, 'utf-8');
|
|
108
|
+
registry = JSON.parse(content);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Registry doesn't exist yet
|
|
112
|
+
}
|
|
113
|
+
if (!registry.frameworks.includes(framework)) {
|
|
114
|
+
registry.frameworks.push(framework);
|
|
115
|
+
await fs.writeFile(registryPath, JSON.stringify(registry, null, 2));
|
|
116
|
+
}
|
|
117
|
+
// Update workspace.json
|
|
118
|
+
const workspacePath = path.join(this.projectRoot, '.aiwg', 'workspace.json');
|
|
119
|
+
try {
|
|
120
|
+
const content = await fs.readFile(workspacePath, 'utf-8');
|
|
121
|
+
const workspace = JSON.parse(content);
|
|
122
|
+
if (!workspace.frameworks) {
|
|
123
|
+
workspace.frameworks = [];
|
|
124
|
+
}
|
|
125
|
+
if (!workspace.frameworks.includes(framework)) {
|
|
126
|
+
workspace.frameworks.push(framework);
|
|
127
|
+
await fs.writeFile(workspacePath, JSON.stringify(workspace, null, 2));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// workspace.json doesn't exist
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Initialize empty workspace structure
|
|
136
|
+
*
|
|
137
|
+
* @param options - Initialization options
|
|
138
|
+
*/
|
|
139
|
+
async initializeWorkspace(options = {}) {
|
|
140
|
+
const aiwgPath = path.join(this.projectRoot, '.aiwg');
|
|
141
|
+
// Create .aiwg directory
|
|
142
|
+
await fs.mkdir(aiwgPath, { recursive: true });
|
|
143
|
+
// Create shared directory with SDLC subdirs
|
|
144
|
+
const sharedPath = path.join(aiwgPath, 'shared');
|
|
145
|
+
await fs.mkdir(sharedPath, { recursive: true });
|
|
146
|
+
for (const dir of this.SHARED_DIRS) {
|
|
147
|
+
await fs.mkdir(path.join(sharedPath, dir), { recursive: true });
|
|
148
|
+
}
|
|
149
|
+
// Create workspace.json
|
|
150
|
+
const workspacePath = path.join(aiwgPath, 'workspace.json');
|
|
151
|
+
try {
|
|
152
|
+
await fs.access(workspacePath);
|
|
153
|
+
// Already exists, don't overwrite
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
await fs.writeFile(workspacePath, JSON.stringify({
|
|
157
|
+
version: '1.0.0',
|
|
158
|
+
frameworks: [],
|
|
159
|
+
created: new Date().toISOString()
|
|
160
|
+
}, null, 2));
|
|
161
|
+
}
|
|
162
|
+
// Create .gitignore
|
|
163
|
+
const gitignorePath = path.join(aiwgPath, '.gitignore');
|
|
164
|
+
try {
|
|
165
|
+
await fs.access(gitignorePath);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
await fs.writeFile(gitignorePath, '*.log\nworking/\n*.tmp\n');
|
|
169
|
+
}
|
|
170
|
+
// Create README
|
|
171
|
+
const readmePath = path.join(aiwgPath, 'README.md');
|
|
172
|
+
try {
|
|
173
|
+
await fs.access(readmePath);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
await fs.writeFile(readmePath, '# AIWG Workspace\n\nFramework-scoped workspace for AIWG.\n');
|
|
177
|
+
}
|
|
178
|
+
// Auto-detect and create framework workspaces if requested
|
|
179
|
+
if (options.autoDetect) {
|
|
180
|
+
const { FrameworkDetector } = await import('./framework-detector.js');
|
|
181
|
+
const detector = new FrameworkDetector(this.projectRoot);
|
|
182
|
+
const frameworks = await detector.detectFrameworks();
|
|
183
|
+
for (const framework of frameworks) {
|
|
184
|
+
await this.createFrameworkWorkspace(framework);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=workspace-creator.js.map
|