@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,631 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod Validation Schemas for Extension Types
|
|
3
|
+
*
|
|
4
|
+
* Provides strict runtime validation for all extension types with helpful
|
|
5
|
+
* error messages. Ensures extension manifests conform to the unified schema.
|
|
6
|
+
*
|
|
7
|
+
* @implements @.aiwg/requirements/use-cases/UC-003-extension-validation.md
|
|
8
|
+
* @architecture @.aiwg/architecture/unified-extension-schema.md
|
|
9
|
+
* @tests @test/unit/extensions/validation.test.ts
|
|
10
|
+
* @version 1.0.0
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
// ============================================
|
|
14
|
+
// Core Enums & Primitives
|
|
15
|
+
// ============================================
|
|
16
|
+
/**
|
|
17
|
+
* Extension type discriminator
|
|
18
|
+
*/
|
|
19
|
+
export const ExtensionTypeSchema = z.enum([
|
|
20
|
+
'agent',
|
|
21
|
+
'command',
|
|
22
|
+
'skill',
|
|
23
|
+
'hook',
|
|
24
|
+
'tool',
|
|
25
|
+
'mcp-server',
|
|
26
|
+
'framework',
|
|
27
|
+
'addon',
|
|
28
|
+
'template',
|
|
29
|
+
'prompt',
|
|
30
|
+
]);
|
|
31
|
+
/**
|
|
32
|
+
* Extension lifecycle status
|
|
33
|
+
*/
|
|
34
|
+
export const ExtensionStatusSchema = z.enum([
|
|
35
|
+
'stable',
|
|
36
|
+
'beta',
|
|
37
|
+
'experimental',
|
|
38
|
+
'deprecated',
|
|
39
|
+
'archived',
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* Platform support level
|
|
43
|
+
*/
|
|
44
|
+
export const PlatformSupportSchema = z.enum([
|
|
45
|
+
'full',
|
|
46
|
+
'partial',
|
|
47
|
+
'experimental',
|
|
48
|
+
'none',
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* Hook lifecycle events
|
|
52
|
+
*/
|
|
53
|
+
export const HookEventSchema = z.enum([
|
|
54
|
+
'pre-session',
|
|
55
|
+
'post-session',
|
|
56
|
+
'pre-command',
|
|
57
|
+
'post-command',
|
|
58
|
+
'pre-agent',
|
|
59
|
+
'post-agent',
|
|
60
|
+
'pre-write',
|
|
61
|
+
'post-write',
|
|
62
|
+
'pre-bash',
|
|
63
|
+
'post-bash',
|
|
64
|
+
]);
|
|
65
|
+
// ============================================
|
|
66
|
+
// Shared Schemas
|
|
67
|
+
// ============================================
|
|
68
|
+
/**
|
|
69
|
+
* Platform compatibility matrix
|
|
70
|
+
*/
|
|
71
|
+
export const PlatformCompatibilitySchema = z.object({
|
|
72
|
+
claude: PlatformSupportSchema.optional(),
|
|
73
|
+
factory: PlatformSupportSchema.optional(),
|
|
74
|
+
cursor: PlatformSupportSchema.optional(),
|
|
75
|
+
copilot: PlatformSupportSchema.optional(),
|
|
76
|
+
windsurf: PlatformSupportSchema.optional(),
|
|
77
|
+
codex: PlatformSupportSchema.optional(),
|
|
78
|
+
opencode: PlatformSupportSchema.optional(),
|
|
79
|
+
generic: PlatformSupportSchema.optional(),
|
|
80
|
+
}).refine((data) => Object.values(data).some((val) => val !== undefined), { message: 'At least one platform must be specified' });
|
|
81
|
+
/**
|
|
82
|
+
* Deployment configuration
|
|
83
|
+
*/
|
|
84
|
+
export const DeploymentConfigSchema = z.object({
|
|
85
|
+
pathTemplate: z.string().min(1, 'Path template is required'),
|
|
86
|
+
pathOverrides: z.record(z.string()).optional(),
|
|
87
|
+
additionalFiles: z.array(z.string()).optional(),
|
|
88
|
+
autoInstall: z.boolean().optional().default(false),
|
|
89
|
+
core: z.boolean().optional().default(false),
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* A single .aiwg/ path entry in a memory footprint
|
|
93
|
+
*/
|
|
94
|
+
export const MemoryPathSchema = z.object({
|
|
95
|
+
path: z.string().min(1, 'Memory path is required'),
|
|
96
|
+
description: z.string().min(1, 'Memory path description is required'),
|
|
97
|
+
});
|
|
98
|
+
/**
|
|
99
|
+
* .aiwg/ memory footprint declaration
|
|
100
|
+
*/
|
|
101
|
+
export const MemoryFootprintSchema = z.object({
|
|
102
|
+
creates: z.array(MemoryPathSchema).optional(),
|
|
103
|
+
normalizedFiles: z.array(MemoryPathSchema).optional(),
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* Deprecation information
|
|
107
|
+
*/
|
|
108
|
+
export const DeprecationSchema = z.object({
|
|
109
|
+
date: z.string().datetime({ message: 'Date must be ISO 8601 format' }),
|
|
110
|
+
successor: z.string().optional(),
|
|
111
|
+
reason: z.string().min(1, 'Deprecation reason is required'),
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Installation state
|
|
115
|
+
*/
|
|
116
|
+
export const InstallationSchema = z.object({
|
|
117
|
+
installedAt: z.string().datetime({ message: 'Install timestamp must be ISO 8601 format' }),
|
|
118
|
+
installedFrom: z.enum(['builtin', 'registry', 'local', 'git']),
|
|
119
|
+
installedPath: z.string().min(1),
|
|
120
|
+
enabled: z.boolean(),
|
|
121
|
+
});
|
|
122
|
+
/**
|
|
123
|
+
* Signature verification
|
|
124
|
+
*/
|
|
125
|
+
export const SignatureSchema = z.object({
|
|
126
|
+
algorithm: z.enum(['pgp', 'ed25519']),
|
|
127
|
+
value: z.string().min(1),
|
|
128
|
+
publicKey: z.string().optional(),
|
|
129
|
+
});
|
|
130
|
+
// ============================================
|
|
131
|
+
// Type-Specific Metadata Schemas
|
|
132
|
+
// ============================================
|
|
133
|
+
/**
|
|
134
|
+
* Agent-specific metadata
|
|
135
|
+
*/
|
|
136
|
+
export const AgentMetadataSchema = z.object({
|
|
137
|
+
type: z.literal('agent'),
|
|
138
|
+
role: z.string().min(1, 'Agent role is required'),
|
|
139
|
+
model: z.object({
|
|
140
|
+
tier: z.enum(['haiku', 'sonnet', 'opus']),
|
|
141
|
+
override: z.string().optional(),
|
|
142
|
+
}),
|
|
143
|
+
tools: z.array(z.string()).min(1, 'At least one tool is required'),
|
|
144
|
+
template: z.string().optional(),
|
|
145
|
+
maxTools: z.number().int().positive().optional(),
|
|
146
|
+
canDelegate: z.boolean().optional(),
|
|
147
|
+
readOnly: z.boolean().optional(),
|
|
148
|
+
workflow: z.array(z.string()).optional(),
|
|
149
|
+
expertise: z.array(z.string()).optional(),
|
|
150
|
+
responsibilities: z.array(z.string()).optional(),
|
|
151
|
+
});
|
|
152
|
+
/**
|
|
153
|
+
* Command argument definition
|
|
154
|
+
*/
|
|
155
|
+
export const CommandArgumentSchema = z.object({
|
|
156
|
+
name: z.string().min(1),
|
|
157
|
+
description: z.string().min(1),
|
|
158
|
+
required: z.boolean(),
|
|
159
|
+
type: z.enum(['string', 'number', 'boolean']),
|
|
160
|
+
default: z.union([z.string(), z.number(), z.boolean()]).optional(),
|
|
161
|
+
position: z.number().int().nonnegative().optional(),
|
|
162
|
+
});
|
|
163
|
+
/**
|
|
164
|
+
* Command option definition
|
|
165
|
+
*/
|
|
166
|
+
export const CommandOptionSchema = z.object({
|
|
167
|
+
name: z.string().min(1),
|
|
168
|
+
description: z.string().min(1),
|
|
169
|
+
type: z.enum(['string', 'boolean', 'number', 'array']),
|
|
170
|
+
default: z.union([z.string(), z.boolean(), z.number()]).optional(),
|
|
171
|
+
short: z.string().length(1).optional(),
|
|
172
|
+
long: z.string().min(2).optional(),
|
|
173
|
+
});
|
|
174
|
+
/**
|
|
175
|
+
* Command-specific metadata
|
|
176
|
+
*
|
|
177
|
+
* @deprecated As a source format — commands are generated from skills at deploy time.
|
|
178
|
+
*/
|
|
179
|
+
export const CommandMetadataSchema = z.object({
|
|
180
|
+
type: z.literal('command'),
|
|
181
|
+
template: z.enum(['utility', 'transformation', 'orchestration']),
|
|
182
|
+
arguments: z.array(CommandArgumentSchema).optional(),
|
|
183
|
+
options: z.array(CommandOptionSchema).optional(),
|
|
184
|
+
argumentHint: z.string().optional(),
|
|
185
|
+
allowedTools: z.array(z.string()).optional(),
|
|
186
|
+
model: z.string().optional(),
|
|
187
|
+
modelRole: z.enum(['reasoning', 'coding', 'efficiency']).optional(),
|
|
188
|
+
modelTier: z.enum(['economy', 'standard', 'premium']).optional(),
|
|
189
|
+
modelEffort: z.enum(['minimal', 'low', 'medium', 'high', 'xhigh']).optional(),
|
|
190
|
+
modelRationale: z.string().min(1).optional(),
|
|
191
|
+
executionSteps: z.array(z.string()).optional(),
|
|
192
|
+
successCriteria: z.array(z.string()).optional(),
|
|
193
|
+
cliDisabled: z.boolean().optional(),
|
|
194
|
+
executedViaSkillRunner: z.boolean().optional(),
|
|
195
|
+
generatedFrom: z.string().optional(),
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* Command translation hints for skill→command generation
|
|
199
|
+
*/
|
|
200
|
+
export const CommandHintSchema = z.object({
|
|
201
|
+
argumentHint: z.string().optional(),
|
|
202
|
+
allowedTools: z.array(z.string()).optional(),
|
|
203
|
+
template: z.enum(['utility', 'transformation', 'orchestration']).optional(),
|
|
204
|
+
arguments: z.array(CommandArgumentSchema).optional(),
|
|
205
|
+
options: z.array(CommandOptionSchema).optional(),
|
|
206
|
+
executionSteps: z.array(z.string()).optional(),
|
|
207
|
+
successCriteria: z.array(z.string()).optional(),
|
|
208
|
+
model: z.string().optional(),
|
|
209
|
+
cliDisabled: z.boolean().optional(),
|
|
210
|
+
executedViaSkillRunner: z.boolean().optional(),
|
|
211
|
+
});
|
|
212
|
+
/**
|
|
213
|
+
* Skill reference material
|
|
214
|
+
*/
|
|
215
|
+
export const SkillReferenceSchema = z.object({
|
|
216
|
+
filename: z.string().min(1),
|
|
217
|
+
description: z.string().min(1),
|
|
218
|
+
path: z.string().min(1),
|
|
219
|
+
});
|
|
220
|
+
/**
|
|
221
|
+
* SKILL.md frontmatter schema
|
|
222
|
+
*
|
|
223
|
+
* Validates the YAML frontmatter block at the top of a SKILL.md file.
|
|
224
|
+
* This is distinct from {@link SkillMetadataSchema}, which validates the
|
|
225
|
+
* `metadata` field of an Extension manifest.
|
|
226
|
+
*
|
|
227
|
+
* `description` is REQUIRED and must be non-empty. Codex rejects SKILL.md
|
|
228
|
+
* files that lack a description; Claude Code uses this field for
|
|
229
|
+
* natural-language invocation. Do NOT relax this rule — a blank description
|
|
230
|
+
* is what caused the 107-file regression we are guarding against.
|
|
231
|
+
*/
|
|
232
|
+
export const SkillFrontmatterSchema = z.object({
|
|
233
|
+
name: z.string().min(1, 'Skill name is required'),
|
|
234
|
+
description: z
|
|
235
|
+
.string({
|
|
236
|
+
required_error: 'Description is required (Codex rejects SKILL.md without it)',
|
|
237
|
+
})
|
|
238
|
+
.min(1, 'Description is required and must be non-empty'),
|
|
239
|
+
version: z.string().regex(/^\d+\.\d+\.\d+/, 'Version must be semver or CalVer format (e.g., 1.0.0)').optional(),
|
|
240
|
+
namespace: z.string().optional(),
|
|
241
|
+
platforms: z.union([z.array(z.string()), z.string()]).optional(),
|
|
242
|
+
// Triggers, when declared, must be a non-empty array of non-empty phrases.
|
|
243
|
+
// An explicit `triggers: []` (or whitespace-only entries) is the
|
|
244
|
+
// discoverability anti-pattern (#1623): a declared-but-empty NL routing
|
|
245
|
+
// surface that silently fails `aiwg discover`. Omitting the field entirely
|
|
246
|
+
// stays valid — this guards the regression, it does not mandate triggers.
|
|
247
|
+
triggers: z
|
|
248
|
+
.array(z
|
|
249
|
+
.string()
|
|
250
|
+
.refine((s) => s.trim().length > 0, { message: 'trigger phrases must be non-empty' }))
|
|
251
|
+
.min(1, 'triggers is declared but empty — add at least one phrase or remove the field (empty-triggers anti-pattern, #1623)')
|
|
252
|
+
.optional(),
|
|
253
|
+
aliases: z.array(z.string()).optional(),
|
|
254
|
+
deprecated_names: z.array(z.string()).optional(),
|
|
255
|
+
tools: z.union([z.array(z.string()), z.string()]).optional(),
|
|
256
|
+
'allowed-tools': z.union([z.array(z.string()), z.string()]).optional(),
|
|
257
|
+
allowedTools: z.union([z.array(z.string()), z.string()]).optional(),
|
|
258
|
+
effort: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
|
|
259
|
+
'user-invocable': z.boolean().optional(),
|
|
260
|
+
userInvocable: z.boolean().optional(),
|
|
261
|
+
'disable-model-invocation': z.boolean().optional(),
|
|
262
|
+
disableModelInvocation: z.boolean().optional(),
|
|
263
|
+
context: z.enum(['fork', 'inherit']).optional(),
|
|
264
|
+
author: z.string().optional(),
|
|
265
|
+
license: z.string().optional(),
|
|
266
|
+
metadata: z.record(z.unknown()).optional(),
|
|
267
|
+
}).passthrough();
|
|
268
|
+
/**
|
|
269
|
+
* Validate SKILL.md frontmatter.
|
|
270
|
+
*
|
|
271
|
+
* Use this when parsing the YAML frontmatter block of a SKILL.md file to
|
|
272
|
+
* catch missing or empty `description` fields before deployment.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* const result = validateSkillFrontmatter(parsedYaml);
|
|
277
|
+
* if (!result.success) {
|
|
278
|
+
* throw new Error('Invalid SKILL.md frontmatter: ' +
|
|
279
|
+
* formatValidationErrors(result.errors).join(', '));
|
|
280
|
+
* }
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
export function validateSkillFrontmatter(data) {
|
|
284
|
+
const result = SkillFrontmatterSchema.safeParse(data);
|
|
285
|
+
return result.success
|
|
286
|
+
? { success: true, data: result.data }
|
|
287
|
+
: { success: false, errors: result.error };
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Skill-specific metadata
|
|
291
|
+
*/
|
|
292
|
+
export const SkillMetadataSchema = z.object({
|
|
293
|
+
type: z.literal('skill'),
|
|
294
|
+
triggerPhrases: z.array(z.string()).min(1, 'At least one trigger phrase is required'),
|
|
295
|
+
autoTrigger: z.boolean().optional().default(false),
|
|
296
|
+
autoTriggerConditions: z.array(z.string()).optional(),
|
|
297
|
+
tools: z.array(z.string()).optional(),
|
|
298
|
+
references: z.array(SkillReferenceSchema).optional(),
|
|
299
|
+
inputRequirements: z.array(z.string()).optional(),
|
|
300
|
+
outputFormat: z.string().optional(),
|
|
301
|
+
// Official Claude Code SKILL.md frontmatter
|
|
302
|
+
effort: z.union([z.literal(1), z.literal(2), z.literal(3)]).optional(),
|
|
303
|
+
userInvocable: z.boolean().optional(),
|
|
304
|
+
disableModelInvocation: z.boolean().optional(),
|
|
305
|
+
context: z.enum(['fork', 'inherit']).optional(),
|
|
306
|
+
allowedTools: z.array(z.string()).optional(),
|
|
307
|
+
// Command translation hints
|
|
308
|
+
commandHint: CommandHintSchema.optional(),
|
|
309
|
+
});
|
|
310
|
+
/**
|
|
311
|
+
* Hook-specific metadata
|
|
312
|
+
*/
|
|
313
|
+
export const HookMetadataSchema = z.object({
|
|
314
|
+
type: z.literal('hook'),
|
|
315
|
+
event: HookEventSchema,
|
|
316
|
+
priority: z.number().int().optional().default(100),
|
|
317
|
+
canModify: z.boolean().optional().default(false),
|
|
318
|
+
canBlock: z.boolean().optional().default(false),
|
|
319
|
+
configSchema: z.record(z.unknown()).optional(),
|
|
320
|
+
});
|
|
321
|
+
/**
|
|
322
|
+
* Tool-specific metadata
|
|
323
|
+
*/
|
|
324
|
+
export const ToolMetadataSchema = z.object({
|
|
325
|
+
type: z.literal('tool'),
|
|
326
|
+
category: z.enum(['core', 'languages', 'utilities', 'custom']),
|
|
327
|
+
executable: z.string().min(1, 'Executable path is required'),
|
|
328
|
+
verificationStatus: z.enum(['verified', 'unverified']).optional(),
|
|
329
|
+
lastVerified: z.string().datetime().optional(),
|
|
330
|
+
manPage: z.string().optional(),
|
|
331
|
+
aliases: z.array(z.string()).optional(),
|
|
332
|
+
relatedTools: z.array(z.string()).optional(),
|
|
333
|
+
platformNotes: z.record(z.string()).optional(),
|
|
334
|
+
installHint: z.string().optional(),
|
|
335
|
+
});
|
|
336
|
+
/**
|
|
337
|
+
* MCP tool summary
|
|
338
|
+
*/
|
|
339
|
+
export const MCPToolSummarySchema = z.object({
|
|
340
|
+
name: z.string().min(1),
|
|
341
|
+
description: z.string().min(1),
|
|
342
|
+
dangerous: z.boolean(),
|
|
343
|
+
});
|
|
344
|
+
/**
|
|
345
|
+
* MCP Server-specific metadata
|
|
346
|
+
*/
|
|
347
|
+
export const MCPServerMetadataSchema = z.object({
|
|
348
|
+
type: z.literal('mcp-server'),
|
|
349
|
+
mcpVersion: z.string().min(1, 'MCP version is required'),
|
|
350
|
+
transport: z.enum(['stdio', 'http']),
|
|
351
|
+
port: z.number().int().positive().optional(),
|
|
352
|
+
capabilities: z.object({
|
|
353
|
+
tools: z.boolean(),
|
|
354
|
+
resources: z.boolean(),
|
|
355
|
+
prompts: z.boolean(),
|
|
356
|
+
sampling: z.boolean(),
|
|
357
|
+
logging: z.boolean(),
|
|
358
|
+
}),
|
|
359
|
+
sourceType: z.enum(['cli', 'api', 'catalog', 'nl', 'extension']),
|
|
360
|
+
sourceCommand: z.string().optional(),
|
|
361
|
+
sourceBaseUrl: z.string().url().optional(),
|
|
362
|
+
workingDirectory: z.string().optional(),
|
|
363
|
+
environment: z.record(z.string()).optional(),
|
|
364
|
+
tools: z.array(MCPToolSummarySchema).optional(),
|
|
365
|
+
resources: z.array(z.string()).optional(),
|
|
366
|
+
prompts: z.array(z.string()).optional(),
|
|
367
|
+
});
|
|
368
|
+
/**
|
|
369
|
+
* Framework-specific metadata
|
|
370
|
+
*/
|
|
371
|
+
export const FrameworkMetadataSchema = z.object({
|
|
372
|
+
type: z.literal('framework'),
|
|
373
|
+
domain: z.string().min(1, 'Framework domain is required'),
|
|
374
|
+
includes: z.object({
|
|
375
|
+
agents: z.array(z.string()).optional(),
|
|
376
|
+
commands: z.array(z.string()).optional(),
|
|
377
|
+
skills: z.array(z.string()).optional(),
|
|
378
|
+
hooks: z.array(z.string()).optional(),
|
|
379
|
+
templates: z.array(z.string()).optional(),
|
|
380
|
+
prompts: z.array(z.string()).optional(),
|
|
381
|
+
}),
|
|
382
|
+
configSchema: z.record(z.unknown()).optional(),
|
|
383
|
+
defaultConfig: z.record(z.unknown()).optional(),
|
|
384
|
+
});
|
|
385
|
+
/**
|
|
386
|
+
* Addon-specific metadata
|
|
387
|
+
*/
|
|
388
|
+
export const AddonMetadataSchema = z.object({
|
|
389
|
+
type: z.literal('addon'),
|
|
390
|
+
entry: z.object({
|
|
391
|
+
agents: z.string().optional(),
|
|
392
|
+
commands: z.string().optional(),
|
|
393
|
+
skills: z.string().optional(),
|
|
394
|
+
hooks: z.string().optional(),
|
|
395
|
+
templates: z.string().optional(),
|
|
396
|
+
prompts: z.string().optional(),
|
|
397
|
+
}),
|
|
398
|
+
provides: z.object({
|
|
399
|
+
agents: z.array(z.string()).optional(),
|
|
400
|
+
commands: z.array(z.string()).optional(),
|
|
401
|
+
skills: z.array(z.string()).optional(),
|
|
402
|
+
hooks: z.array(z.string()).optional(),
|
|
403
|
+
templates: z.array(z.string()).optional(),
|
|
404
|
+
prompts: z.array(z.string()).optional(),
|
|
405
|
+
}),
|
|
406
|
+
});
|
|
407
|
+
/**
|
|
408
|
+
* Template variable definition
|
|
409
|
+
*/
|
|
410
|
+
export const TemplateVariableSchema = z.object({
|
|
411
|
+
name: z.string().min(1),
|
|
412
|
+
description: z.string().min(1),
|
|
413
|
+
type: z.enum(['string', 'number', 'boolean', 'array', 'object']),
|
|
414
|
+
required: z.boolean(),
|
|
415
|
+
default: z.unknown().optional(),
|
|
416
|
+
});
|
|
417
|
+
/**
|
|
418
|
+
* Template-specific metadata
|
|
419
|
+
*/
|
|
420
|
+
export const TemplateMetadataSchema = z.object({
|
|
421
|
+
type: z.literal('template'),
|
|
422
|
+
format: z.string().min(1, 'Template format is required'),
|
|
423
|
+
variables: z.array(TemplateVariableSchema).optional(),
|
|
424
|
+
sections: z.array(z.string()).optional(),
|
|
425
|
+
targetArtifact: z.string().optional(),
|
|
426
|
+
});
|
|
427
|
+
/**
|
|
428
|
+
* Prompt-specific metadata
|
|
429
|
+
*/
|
|
430
|
+
export const PromptMetadataSchema = z.object({
|
|
431
|
+
type: z.literal('prompt'),
|
|
432
|
+
category: z.string().min(1, 'Prompt category is required'),
|
|
433
|
+
purpose: z.string().min(1, 'Prompt purpose is required'),
|
|
434
|
+
useWhen: z.array(z.string()).min(1, 'At least one use-when condition is required'),
|
|
435
|
+
variables: z.array(z.string()).optional(),
|
|
436
|
+
requiredContext: z.array(z.string()).optional(),
|
|
437
|
+
});
|
|
438
|
+
/**
|
|
439
|
+
* Union of all type-specific metadata schemas
|
|
440
|
+
*/
|
|
441
|
+
export const ExtensionMetadataSchema = z.discriminatedUnion('type', [
|
|
442
|
+
AgentMetadataSchema,
|
|
443
|
+
CommandMetadataSchema,
|
|
444
|
+
SkillMetadataSchema,
|
|
445
|
+
HookMetadataSchema,
|
|
446
|
+
ToolMetadataSchema,
|
|
447
|
+
MCPServerMetadataSchema,
|
|
448
|
+
FrameworkMetadataSchema,
|
|
449
|
+
AddonMetadataSchema,
|
|
450
|
+
TemplateMetadataSchema,
|
|
451
|
+
PromptMetadataSchema,
|
|
452
|
+
]);
|
|
453
|
+
// ============================================
|
|
454
|
+
// Base Extension Schema
|
|
455
|
+
// ============================================
|
|
456
|
+
/**
|
|
457
|
+
* Complete extension schema
|
|
458
|
+
*
|
|
459
|
+
* Validates all required and optional fields according to the unified schema.
|
|
460
|
+
*/
|
|
461
|
+
export const ExtensionSchema = z.object({
|
|
462
|
+
// Core Identity
|
|
463
|
+
id: z.string().regex(/^[a-z][a-z0-9-]*$/, 'ID must be kebab-case (lowercase, hyphens only)'),
|
|
464
|
+
type: ExtensionTypeSchema,
|
|
465
|
+
name: z.string().min(1, 'Name is required'),
|
|
466
|
+
description: z.string().min(1, 'Description is required'),
|
|
467
|
+
version: z.string().regex(/^\d+\.\d+\.\d+/, 'Version must be semver or CalVer format (e.g., 1.0.0 or 2026.1.5)'),
|
|
468
|
+
// Discovery & Classification
|
|
469
|
+
capabilities: z.array(z.string()).min(1, 'At least one capability is required'),
|
|
470
|
+
keywords: z.array(z.string()).min(1, 'At least one keyword is required'),
|
|
471
|
+
category: z.string().optional(),
|
|
472
|
+
// Platform & Deployment
|
|
473
|
+
platforms: PlatformCompatibilitySchema,
|
|
474
|
+
deployment: DeploymentConfigSchema,
|
|
475
|
+
// Dependencies & Requirements
|
|
476
|
+
requires: z.array(z.string()).optional(),
|
|
477
|
+
recommends: z.array(z.string()).optional(),
|
|
478
|
+
conflicts: z.array(z.string()).optional(),
|
|
479
|
+
systemDependencies: z.record(z.string()).optional(),
|
|
480
|
+
// Metadata & Documentation
|
|
481
|
+
author: z.string().optional(),
|
|
482
|
+
license: z.string().optional(),
|
|
483
|
+
repository: z.string().url().optional(),
|
|
484
|
+
homepage: z.string().url().optional(),
|
|
485
|
+
bugs: z.string().url().optional(),
|
|
486
|
+
documentation: z.record(z.string()).optional(),
|
|
487
|
+
researchCompliance: z.record(z.array(z.string())).optional(),
|
|
488
|
+
memory: MemoryFootprintSchema.optional(),
|
|
489
|
+
// Type-Specific Data
|
|
490
|
+
metadata: ExtensionMetadataSchema,
|
|
491
|
+
// Lifecycle & Status
|
|
492
|
+
status: ExtensionStatusSchema.optional().default('stable'),
|
|
493
|
+
deprecation: DeprecationSchema.optional(),
|
|
494
|
+
installation: InstallationSchema.optional(),
|
|
495
|
+
// Validation & Quality
|
|
496
|
+
checksum: z.string().optional(),
|
|
497
|
+
signature: SignatureSchema.optional(),
|
|
498
|
+
}).refine((data) => data.type === data.metadata.type, { message: 'Extension type must match metadata type' });
|
|
499
|
+
/**
|
|
500
|
+
* Validate an extension manifest
|
|
501
|
+
*
|
|
502
|
+
* @param data - Unknown data to validate
|
|
503
|
+
* @returns Validation result with typed data or errors
|
|
504
|
+
*
|
|
505
|
+
* @example
|
|
506
|
+
* ```typescript
|
|
507
|
+
* const result = validateExtension(data);
|
|
508
|
+
* if (result.success) {
|
|
509
|
+
* console.log('Valid extension:', result.data.name);
|
|
510
|
+
* } else {
|
|
511
|
+
* console.error('Validation errors:', result.errors.format());
|
|
512
|
+
* }
|
|
513
|
+
* ```
|
|
514
|
+
*/
|
|
515
|
+
export function validateExtension(data) {
|
|
516
|
+
const result = ExtensionSchema.safeParse(data);
|
|
517
|
+
if (result.success) {
|
|
518
|
+
return {
|
|
519
|
+
success: true,
|
|
520
|
+
data: result.data,
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
return {
|
|
525
|
+
success: false,
|
|
526
|
+
errors: result.error,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Type guard to check if data is a valid extension
|
|
532
|
+
*
|
|
533
|
+
* @param data - Unknown data to check
|
|
534
|
+
* @returns True if data is a valid extension
|
|
535
|
+
*
|
|
536
|
+
* @example
|
|
537
|
+
* ```typescript
|
|
538
|
+
* if (isValidExtension(data)) {
|
|
539
|
+
* // TypeScript knows data is ValidatedExtension here
|
|
540
|
+
* console.log(data.name);
|
|
541
|
+
* }
|
|
542
|
+
* ```
|
|
543
|
+
*/
|
|
544
|
+
export function isValidExtension(data) {
|
|
545
|
+
return ExtensionSchema.safeParse(data).success;
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Validate and throw on error
|
|
549
|
+
*
|
|
550
|
+
* Use this when you want validation errors to propagate as exceptions.
|
|
551
|
+
*
|
|
552
|
+
* @param data - Unknown data to validate
|
|
553
|
+
* @returns Validated extension data
|
|
554
|
+
* @throws {z.ZodError} If validation fails
|
|
555
|
+
*
|
|
556
|
+
* @example
|
|
557
|
+
* ```typescript
|
|
558
|
+
* try {
|
|
559
|
+
* const extension = validateExtensionStrict(data);
|
|
560
|
+
* console.log('Valid extension:', extension.name);
|
|
561
|
+
* } catch (error) {
|
|
562
|
+
* if (error instanceof z.ZodError) {
|
|
563
|
+
* console.error('Validation failed:', error.format());
|
|
564
|
+
* }
|
|
565
|
+
* }
|
|
566
|
+
* ```
|
|
567
|
+
*/
|
|
568
|
+
export function validateExtensionStrict(data) {
|
|
569
|
+
return ExtensionSchema.parse(data);
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Validate extension metadata only
|
|
573
|
+
*
|
|
574
|
+
* Useful for validating type-specific metadata in isolation.
|
|
575
|
+
*
|
|
576
|
+
* @param data - Unknown metadata to validate
|
|
577
|
+
* @returns Validation result
|
|
578
|
+
*/
|
|
579
|
+
export function validateExtensionMetadata(data) {
|
|
580
|
+
const result = ExtensionMetadataSchema.safeParse(data);
|
|
581
|
+
if (result.success) {
|
|
582
|
+
return { success: true, data: result.data };
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
return { success: false, errors: result.error };
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Format validation errors for display
|
|
590
|
+
*
|
|
591
|
+
* Converts Zod errors into human-readable messages.
|
|
592
|
+
*
|
|
593
|
+
* @param errors - Zod validation errors
|
|
594
|
+
* @returns Formatted error messages
|
|
595
|
+
*
|
|
596
|
+
* @example
|
|
597
|
+
* ```typescript
|
|
598
|
+
* const result = validateExtension(data);
|
|
599
|
+
* if (!result.success) {
|
|
600
|
+
* const messages = formatValidationErrors(result.errors);
|
|
601
|
+
* console.error('Validation failed:\n' + messages.join('\n'));
|
|
602
|
+
* }
|
|
603
|
+
* ```
|
|
604
|
+
*/
|
|
605
|
+
export function formatValidationErrors(errors) {
|
|
606
|
+
return errors.issues.map((issue) => {
|
|
607
|
+
const path = issue.path.join('.');
|
|
608
|
+
return `${path}: ${issue.message}`;
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Check if extension matches expected type
|
|
613
|
+
*
|
|
614
|
+
* Type-safe way to validate extension type before accessing type-specific fields.
|
|
615
|
+
*
|
|
616
|
+
* @param extension - Validated extension
|
|
617
|
+
* @param type - Expected extension type
|
|
618
|
+
* @returns True if extension matches type
|
|
619
|
+
*
|
|
620
|
+
* @example
|
|
621
|
+
* ```typescript
|
|
622
|
+
* if (isExtensionType(extension, 'agent')) {
|
|
623
|
+
* // TypeScript narrows metadata to AgentMetadata
|
|
624
|
+
* console.log(extension.metadata.role);
|
|
625
|
+
* }
|
|
626
|
+
* ```
|
|
627
|
+
*/
|
|
628
|
+
export function isExtensionType(extension, type) {
|
|
629
|
+
return extension.type === type && extension.metadata.type === type;
|
|
630
|
+
}
|
|
631
|
+
//# sourceMappingURL=validation.js.map
|