@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -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 +1462 -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 +882 -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 +64 -9
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* skill-lint — rubric-based quality scoring for SKILL.md files.
|
|
3
|
+
*
|
|
4
|
+
* Complements `validate-metadata` (#1014's CI gate, schema-only)
|
|
5
|
+
* with a richer per-skill quality score across multiple dimensions.
|
|
6
|
+
* Designed for headless use: `--json` outputs structured results for
|
|
7
|
+
* CI consumption; exit code 0/1 reflects whether all checked files
|
|
8
|
+
* meet the chosen rubric threshold.
|
|
9
|
+
*
|
|
10
|
+
* @module src/cli/handlers/skill-lint
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs/promises';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import * as yaml from 'js-yaml';
|
|
15
|
+
import { validateSkillFrontmatter } from '../../extensions/validation.js';
|
|
16
|
+
const THRESHOLDS = {
|
|
17
|
+
strict: 80,
|
|
18
|
+
standard: 60,
|
|
19
|
+
lenient: 40,
|
|
20
|
+
};
|
|
21
|
+
const DIMENSION_WEIGHTS = {
|
|
22
|
+
schema: 0.4,
|
|
23
|
+
description: 0.2,
|
|
24
|
+
discoverability: 0.2,
|
|
25
|
+
body: 0.2,
|
|
26
|
+
};
|
|
27
|
+
function scoreDimension(passes, notes = []) {
|
|
28
|
+
return passes ? { score: 100, notes: [] } : { score: 0, notes };
|
|
29
|
+
}
|
|
30
|
+
function partialDimension(score, notes) {
|
|
31
|
+
return { score: Math.max(0, Math.min(100, Math.round(score))), notes };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Score the schema dimension. Binary: pass if `SkillFrontmatterSchema`
|
|
35
|
+
* validates clean, fail otherwise. We treat schema as a hard gate
|
|
36
|
+
* because the cleanup work in #1015 made schema correctness a baseline
|
|
37
|
+
* expectation across the corpus.
|
|
38
|
+
*/
|
|
39
|
+
function scoreSchema(frontmatter) {
|
|
40
|
+
const result = validateSkillFrontmatter(frontmatter);
|
|
41
|
+
if (result.success)
|
|
42
|
+
return scoreDimension(true);
|
|
43
|
+
const notes = result.errors.errors.map((e) => `${e.path.join('.') || '<root>'}: ${e.message}`);
|
|
44
|
+
return scoreDimension(false, notes);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Score the description. Looks for non-empty content, sufficient
|
|
48
|
+
* length, and action-oriented phrasing ("Use when…", verb-leading)
|
|
49
|
+
* that helps NL routing identify when to invoke the skill.
|
|
50
|
+
*/
|
|
51
|
+
function scoreDescription(fm) {
|
|
52
|
+
const desc = typeof fm.description === 'string' ? fm.description.trim() : '';
|
|
53
|
+
if (!desc)
|
|
54
|
+
return scoreDimension(false, ['description is missing or empty']);
|
|
55
|
+
const notes = [];
|
|
56
|
+
let score = 100;
|
|
57
|
+
if (desc.length < 30) {
|
|
58
|
+
score -= 40;
|
|
59
|
+
notes.push(`description is ${desc.length} chars; aim for ≥30`);
|
|
60
|
+
}
|
|
61
|
+
// Action-oriented phrasing — either explicit "Use when…" or a verb-leading sentence.
|
|
62
|
+
const hasUseWhen = /\buse when\b/i.test(desc);
|
|
63
|
+
const startsWithVerb = /^[A-Z]?[a-z]+(?:s|e|t|d|n)\s/.test(desc); // crude verb heuristic
|
|
64
|
+
if (!hasUseWhen && !startsWithVerb) {
|
|
65
|
+
score -= 30;
|
|
66
|
+
notes.push('description missing "Use when…" clause or action-leading verb');
|
|
67
|
+
}
|
|
68
|
+
return partialDimension(score, notes);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Score discoverability. A skill is discoverable when one of:
|
|
72
|
+
* - it has a `triggers:` array of ≥2 entries (NL routing surface)
|
|
73
|
+
* - or it is explicitly not user-invocable (agent-only / library skills)
|
|
74
|
+
*
|
|
75
|
+
* Skills that are user-invocable but lack triggers won't be found by NL
|
|
76
|
+
* routing, which is the failure mode this dimension guards against.
|
|
77
|
+
*/
|
|
78
|
+
function scoreDiscoverability(fm) {
|
|
79
|
+
const triggers = Array.isArray(fm.triggers) ? fm.triggers : [];
|
|
80
|
+
const userInv = fm.userInvocable === true || fm['user-invocable'] === true;
|
|
81
|
+
if (!userInv) {
|
|
82
|
+
// Agent-only skill — discoverability not strictly needed.
|
|
83
|
+
return scoreDimension(true);
|
|
84
|
+
}
|
|
85
|
+
if (triggers.length >= 2)
|
|
86
|
+
return scoreDimension(true);
|
|
87
|
+
if (triggers.length === 1) {
|
|
88
|
+
return partialDimension(60, ['only 1 trigger phrase; aim for ≥2 for NL routing diversity']);
|
|
89
|
+
}
|
|
90
|
+
return scoreDimension(false, [
|
|
91
|
+
'user-invocable skill has no triggers — NL routing will not find it',
|
|
92
|
+
]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Score the body. Looks for a non-trivial amount of skill content
|
|
96
|
+
* after the frontmatter. Very short bodies usually indicate
|
|
97
|
+
* placeholder or stub skills.
|
|
98
|
+
*
|
|
99
|
+
* Also flags post-kernel-pivot regressions: slash-prefix references to
|
|
100
|
+
* non-kernel AIWG skills (e.g. `/issue-list`). Only kernel-listed skills
|
|
101
|
+
* are platform-invokable; everything else must be reached via
|
|
102
|
+
* `aiwg discover` / `aiwg show`. See agentic/code/addons/aiwg-utils/rules/skill-discovery.md
|
|
103
|
+
* and issue #1260.
|
|
104
|
+
*/
|
|
105
|
+
function scoreBody(body) {
|
|
106
|
+
const text = body.trim();
|
|
107
|
+
const wordCount = text.split(/\s+/).filter(Boolean).length;
|
|
108
|
+
// Kernel / built-in skills are still legitimately invokable as
|
|
109
|
+
// slash commands; references to these should not be flagged. The
|
|
110
|
+
// generated-output exception (templates like aiwg-regenerate-claude
|
|
111
|
+
// that emit user-facing CLAUDE.md) is handled by the marker below.
|
|
112
|
+
const KERNEL_SKILLS = new Set([
|
|
113
|
+
'aiwg-doctor', 'aiwg-refresh', 'aiwg-status', 'aiwg-help', 'use', 'steward',
|
|
114
|
+
// Claude Code built-ins
|
|
115
|
+
'help', 'clear', 'init', 'review', 'security-review',
|
|
116
|
+
]);
|
|
117
|
+
const slashRefRe = /`\/([a-z][a-z0-9-]+)`/g;
|
|
118
|
+
const offenders = new Set();
|
|
119
|
+
// Skip lines after the "Available Slash Commands" marker — that block
|
|
120
|
+
// is template output and slash prefixes there are intentional.
|
|
121
|
+
const lines = body.split('\n');
|
|
122
|
+
let inTemplateBlock = false;
|
|
123
|
+
for (const line of lines) {
|
|
124
|
+
if (/Available Slash Commands/i.test(line)) {
|
|
125
|
+
inTemplateBlock = true;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (inTemplateBlock && /^#{1,3}\s/.test(line)) {
|
|
129
|
+
// Next heading closes the template block.
|
|
130
|
+
inTemplateBlock = false;
|
|
131
|
+
}
|
|
132
|
+
if (inTemplateBlock)
|
|
133
|
+
continue;
|
|
134
|
+
for (const m of line.matchAll(slashRefRe)) {
|
|
135
|
+
const name = m[1];
|
|
136
|
+
if (!KERNEL_SKILLS.has(name))
|
|
137
|
+
offenders.add(name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const notes = [];
|
|
141
|
+
if (offenders.size > 0) {
|
|
142
|
+
notes.push(`slash-prefix refs to non-kernel skills: ${[...offenders].slice(0, 8).join(', ')}` +
|
|
143
|
+
(offenders.size > 8 ? ` (+${offenders.size - 8} more)` : '') +
|
|
144
|
+
' — drop the "/" prefix; non-kernel skills are reached via `aiwg discover` + `aiwg show` (#1260)');
|
|
145
|
+
}
|
|
146
|
+
if (wordCount >= 100) {
|
|
147
|
+
return offenders.size > 0 ? partialDimension(80, notes) : scoreDimension(true);
|
|
148
|
+
}
|
|
149
|
+
if (wordCount >= 30) {
|
|
150
|
+
notes.unshift(`body has ${wordCount} words; aim for ≥100`);
|
|
151
|
+
return partialDimension(offenders.size > 0 ? 45 : 60, notes);
|
|
152
|
+
}
|
|
153
|
+
notes.unshift(`body has only ${wordCount} words — likely a stub`);
|
|
154
|
+
return scoreDimension(false, notes);
|
|
155
|
+
}
|
|
156
|
+
function combineScore(dims) {
|
|
157
|
+
return Math.round(dims.schema.score * DIMENSION_WEIGHTS.schema +
|
|
158
|
+
dims.description.score * DIMENSION_WEIGHTS.description +
|
|
159
|
+
dims.discoverability.score * DIMENSION_WEIGHTS.discoverability +
|
|
160
|
+
dims.body.score * DIMENSION_WEIGHTS.body);
|
|
161
|
+
}
|
|
162
|
+
const AIWG_COMMAND_RE = /`(aiwg\s+[^`\n]+)`/g;
|
|
163
|
+
const WORKFLOW_SUPPORT_RE = /\b(skill|workflow|orchestrat|review|interpret|summari[sz]e|validate|report|decide|triage|guide)\b/i;
|
|
164
|
+
const REPLACEMENT_RISK_RE = /\b(?:just|only|simply)\s+run\s+`?aiwg\b|\b(?:replaces?|instead of)\s+(?:the\s+)?skill\b|\bdo not use this skill\b/i;
|
|
165
|
+
function inventoryCompanionCli(filePath, body) {
|
|
166
|
+
const commands = [...body.matchAll(AIWG_COMMAND_RE)]
|
|
167
|
+
.map((m) => m[1].replace(/\s+/g, ' ').trim());
|
|
168
|
+
const uniqueCommands = [...new Set(commands)];
|
|
169
|
+
if (uniqueCommands.length === 0)
|
|
170
|
+
return null;
|
|
171
|
+
const workflowLanguage = WORKFLOW_SUPPORT_RE.test(body);
|
|
172
|
+
const notes = [];
|
|
173
|
+
if (!workflowLanguage) {
|
|
174
|
+
notes.push('mentions aiwg CLI commands but does not describe the surrounding skill/workflow judgment');
|
|
175
|
+
}
|
|
176
|
+
if (REPLACEMENT_RISK_RE.test(body)) {
|
|
177
|
+
notes.push('wording may position the CLI command as replacing the skill workflow');
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
file: filePath,
|
|
181
|
+
commands: uniqueCommands.slice(0, 12),
|
|
182
|
+
workflowLanguage,
|
|
183
|
+
risk: notes.length > 0 ? 'review' : 'ok',
|
|
184
|
+
notes,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Lint a single SKILL.md file end-to-end.
|
|
189
|
+
*
|
|
190
|
+
* @param filePath - Absolute or relative path to the SKILL.md
|
|
191
|
+
* @param rubric - Strictness level (drives the pass threshold)
|
|
192
|
+
*/
|
|
193
|
+
export async function lintSkillFile(filePath, rubric = 'standard') {
|
|
194
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
195
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
196
|
+
if (!fmMatch) {
|
|
197
|
+
return {
|
|
198
|
+
file: filePath,
|
|
199
|
+
score: 0,
|
|
200
|
+
passes: false,
|
|
201
|
+
dimensions: {
|
|
202
|
+
schema: scoreDimension(false, ['no YAML frontmatter found']),
|
|
203
|
+
description: scoreDimension(false, ['no frontmatter to derive description from']),
|
|
204
|
+
discoverability: scoreDimension(false, ['no frontmatter']),
|
|
205
|
+
body: scoreBody(content),
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const [, fmText, body = ''] = fmMatch;
|
|
210
|
+
let frontmatter = {};
|
|
211
|
+
let yamlError = null;
|
|
212
|
+
try {
|
|
213
|
+
const parsed = yaml.load(fmText);
|
|
214
|
+
if (parsed && typeof parsed === 'object') {
|
|
215
|
+
frontmatter = parsed;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
yamlError = e.message.split('\n')[0];
|
|
220
|
+
}
|
|
221
|
+
const dimensions = {
|
|
222
|
+
schema: yamlError
|
|
223
|
+
? scoreDimension(false, [`YAML parse error: ${yamlError}`])
|
|
224
|
+
: scoreSchema(frontmatter),
|
|
225
|
+
description: scoreDescription(frontmatter),
|
|
226
|
+
discoverability: scoreDiscoverability(frontmatter),
|
|
227
|
+
body: scoreBody(body),
|
|
228
|
+
};
|
|
229
|
+
const score = combineScore(dimensions);
|
|
230
|
+
return {
|
|
231
|
+
file: filePath,
|
|
232
|
+
score,
|
|
233
|
+
passes: score >= THRESHOLDS[rubric],
|
|
234
|
+
dimensions,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
async function* walkSkillFiles(rootPath) {
|
|
238
|
+
const stat = await fs.stat(rootPath);
|
|
239
|
+
if (stat.isFile()) {
|
|
240
|
+
if (path.basename(rootPath) === 'SKILL.md')
|
|
241
|
+
yield rootPath;
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (!stat.isDirectory())
|
|
245
|
+
return;
|
|
246
|
+
const entries = await fs.readdir(rootPath, { withFileTypes: true });
|
|
247
|
+
for (const e of entries) {
|
|
248
|
+
if (e.name.startsWith('.') || e.name === 'node_modules')
|
|
249
|
+
continue;
|
|
250
|
+
const p = path.join(rootPath, e.name);
|
|
251
|
+
if (e.isDirectory()) {
|
|
252
|
+
yield* walkSkillFiles(p);
|
|
253
|
+
}
|
|
254
|
+
else if (e.isFile() && e.name === 'SKILL.md') {
|
|
255
|
+
yield p;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Lint all SKILL.md files under one or more paths. Returns a structured
|
|
261
|
+
* report. Each path may be a directory (walked recursively) or a
|
|
262
|
+
* specific SKILL.md file. Files in `failedCount` and the per-file list
|
|
263
|
+
* are deduplicated.
|
|
264
|
+
*
|
|
265
|
+
* Pure function — does not print or exit. The CLI handler renders
|
|
266
|
+
* output and translates the report into an exit code.
|
|
267
|
+
*/
|
|
268
|
+
export async function lintSkills(targetPaths, rubric = 'standard') {
|
|
269
|
+
const targets = Array.isArray(targetPaths) ? targetPaths : [targetPaths];
|
|
270
|
+
const seen = new Set();
|
|
271
|
+
const files = [];
|
|
272
|
+
for (const target of targets) {
|
|
273
|
+
for await (const f of walkSkillFiles(target)) {
|
|
274
|
+
const resolved = path.resolve(f);
|
|
275
|
+
if (seen.has(resolved))
|
|
276
|
+
continue;
|
|
277
|
+
seen.add(resolved);
|
|
278
|
+
files.push(await lintSkillFile(f, rubric));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const total = files.reduce((sum, f) => sum + f.score, 0);
|
|
282
|
+
const companionItems = [];
|
|
283
|
+
for (const file of seen) {
|
|
284
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
285
|
+
const body = content.match(/^---\n[\s\S]*?\n---\n?([\s\S]*)$/)?.[1] ?? content;
|
|
286
|
+
const item = inventoryCompanionCli(file, body);
|
|
287
|
+
if (item)
|
|
288
|
+
companionItems.push(item);
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
rubric,
|
|
292
|
+
threshold: THRESHOLDS[rubric],
|
|
293
|
+
files,
|
|
294
|
+
averageScore: files.length > 0 ? Math.round(total / files.length) : 0,
|
|
295
|
+
failedCount: files.filter((f) => !f.passes).length,
|
|
296
|
+
companionCli: {
|
|
297
|
+
total: companionItems.length,
|
|
298
|
+
reviewCount: companionItems.filter((i) => i.risk === 'review').length,
|
|
299
|
+
items: companionItems,
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function parseArgs(args) {
|
|
304
|
+
const targets = [];
|
|
305
|
+
let rubric = 'standard';
|
|
306
|
+
let json = false;
|
|
307
|
+
for (let i = 0; i < args.length; i++) {
|
|
308
|
+
const a = args[i];
|
|
309
|
+
if (a === '--json') {
|
|
310
|
+
json = true;
|
|
311
|
+
}
|
|
312
|
+
else if (a === '--rubric' && i + 1 < args.length) {
|
|
313
|
+
const next = args[++i];
|
|
314
|
+
if (next === 'strict' || next === 'standard' || next === 'lenient') {
|
|
315
|
+
rubric = next;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else if (!a.startsWith('-')) {
|
|
319
|
+
targets.push(a);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (targets.length === 0)
|
|
323
|
+
targets.push('agentic/code');
|
|
324
|
+
return { targets, rubric, json };
|
|
325
|
+
}
|
|
326
|
+
function renderTextReport(report) {
|
|
327
|
+
const { files, threshold, rubric, averageScore, failedCount } = report;
|
|
328
|
+
for (const f of files) {
|
|
329
|
+
if (f.passes)
|
|
330
|
+
continue;
|
|
331
|
+
console.log(`✗ ${f.file} (${f.score}/100)`);
|
|
332
|
+
for (const [name, dim] of Object.entries(f.dimensions)) {
|
|
333
|
+
if (dim.score < 100) {
|
|
334
|
+
console.log(` ${name} (${dim.score}): ${dim.notes.join('; ')}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
console.log(`\nskill-lint (rubric=${rubric}, threshold=${threshold}):`);
|
|
339
|
+
console.log(` ${files.length} file(s) scanned`);
|
|
340
|
+
console.log(` ${failedCount} below threshold`);
|
|
341
|
+
console.log(` average score: ${averageScore}/100`);
|
|
342
|
+
console.log(` companion CLI workflows: ${report.companionCli.total} inventoried, ${report.companionCli.reviewCount} need review`);
|
|
343
|
+
for (const item of report.companionCli.items.filter((i) => i.risk === 'review').slice(0, 10)) {
|
|
344
|
+
console.log(` review ${item.file}: ${item.notes.join('; ')}`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
export const skillLintHandler = {
|
|
348
|
+
id: 'skill-lint',
|
|
349
|
+
name: 'Skill Lint',
|
|
350
|
+
description: 'Score SKILL.md files against a quality rubric',
|
|
351
|
+
category: 'utility',
|
|
352
|
+
aliases: ['-skill-lint', '--skill-lint'],
|
|
353
|
+
async execute(ctx) {
|
|
354
|
+
const { targets, rubric, json } = parseArgs(ctx.args);
|
|
355
|
+
const report = await lintSkills(targets, rubric);
|
|
356
|
+
if (json) {
|
|
357
|
+
console.log(JSON.stringify(report, null, 2));
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
renderTextReport(report);
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
exitCode: report.failedCount > 0 ? 1 : 0,
|
|
364
|
+
};
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
//# sourceMappingURL=skill-lint.js.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ingestSkillUsageTranscript, printSkillUsageReport, } from '../skill-usage.js';
|
|
2
|
+
export const skillUsageHandler = {
|
|
3
|
+
id: 'skill-usage',
|
|
4
|
+
name: 'Skill Usage',
|
|
5
|
+
description: 'Report opt-in local skill, agent, and command usage events',
|
|
6
|
+
category: 'utility',
|
|
7
|
+
aliases: [],
|
|
8
|
+
async execute(ctx) {
|
|
9
|
+
if (ctx.args[0] === 'ingest-transcript') {
|
|
10
|
+
const transcriptPath = ctx.args[1];
|
|
11
|
+
if (!transcriptPath) {
|
|
12
|
+
return { exitCode: 2, message: 'Usage: aiwg skill-usage ingest-transcript <path> --provider claude-code [--project-root <path>] [--dry-run] [--json]' };
|
|
13
|
+
}
|
|
14
|
+
const provider = readStringFlag(ctx.args, '--provider') ?? 'claude-code';
|
|
15
|
+
const projectRoot = readStringFlag(ctx.args, '--project-root');
|
|
16
|
+
const dryRun = ctx.args.includes('--dry-run');
|
|
17
|
+
const json = ctx.args.includes('--json');
|
|
18
|
+
const result = await ingestSkillUsageTranscript({
|
|
19
|
+
transcriptPath,
|
|
20
|
+
provider,
|
|
21
|
+
cwd: ctx.cwd,
|
|
22
|
+
projectRoot,
|
|
23
|
+
frameworkRoot: ctx.frameworkRoot,
|
|
24
|
+
dryRun,
|
|
25
|
+
});
|
|
26
|
+
if (json) {
|
|
27
|
+
console.log(JSON.stringify(result, null, 2));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const verb = dryRun ? 'Would append' : 'Appended';
|
|
31
|
+
console.log(`${verb} ${result.appended || result.events.length} skill-usage event(s); skipped ${result.skipped} line(s).`);
|
|
32
|
+
if (result.paths.length > 0)
|
|
33
|
+
console.log(`Stores: ${result.paths.join(', ')}`);
|
|
34
|
+
}
|
|
35
|
+
return { exitCode: 0 };
|
|
36
|
+
}
|
|
37
|
+
const json = ctx.args.includes('--json');
|
|
38
|
+
const limit = readNumberFlag(ctx.args, '--limit') ?? 20;
|
|
39
|
+
const scope = readScopeFlag(ctx.args);
|
|
40
|
+
const suggestFor = readStringFlag(ctx.args, '--suggest-for');
|
|
41
|
+
await printSkillUsageReport({
|
|
42
|
+
cwd: ctx.cwd,
|
|
43
|
+
frameworkRoot: ctx.frameworkRoot,
|
|
44
|
+
json,
|
|
45
|
+
limit,
|
|
46
|
+
scope,
|
|
47
|
+
suggestFor,
|
|
48
|
+
});
|
|
49
|
+
return { exitCode: 0 };
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
function readNumberFlag(args, flag) {
|
|
53
|
+
const idx = args.indexOf(flag);
|
|
54
|
+
if (idx === -1)
|
|
55
|
+
return undefined;
|
|
56
|
+
const raw = args[idx + 1];
|
|
57
|
+
const n = Number(raw);
|
|
58
|
+
return Number.isInteger(n) && n >= 0 ? n : undefined;
|
|
59
|
+
}
|
|
60
|
+
function readStringFlag(args, flag) {
|
|
61
|
+
const idx = args.indexOf(flag);
|
|
62
|
+
if (idx === -1)
|
|
63
|
+
return undefined;
|
|
64
|
+
const raw = args[idx + 1];
|
|
65
|
+
return raw && !raw.startsWith('-') ? raw : undefined;
|
|
66
|
+
}
|
|
67
|
+
function readScopeFlag(args) {
|
|
68
|
+
const idx = args.indexOf('--scope');
|
|
69
|
+
const raw = idx === -1 ? 'all' : args[idx + 1];
|
|
70
|
+
if (raw === 'project' || raw === 'global' || raw === 'all')
|
|
71
|
+
return raw;
|
|
72
|
+
return 'all';
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=skill-usage.js.map
|