@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex hook translator — emits TOML hook entries for ~/.codex/config.toml.
|
|
3
|
+
*
|
|
4
|
+
* Per ADR-3 §5 backup-and-rollback: the operator-managed config file
|
|
5
|
+
* (~/.codex/config.toml) is read, AIWG-tagged entries are merged in
|
|
6
|
+
* (via _aiwg_managed: true), and the file is written atomically with a
|
|
7
|
+
* timestamped backup.
|
|
8
|
+
*
|
|
9
|
+
* Codex hook events map per the assessment matrix; this translator
|
|
10
|
+
* supports a conservative subset known to exist in the loader.
|
|
11
|
+
*/
|
|
12
|
+
import { promises as fs } from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import { substituteEnvVars } from './shim.js';
|
|
16
|
+
/** Codex-native event names (subset; extend when verified against codex-rs). */
|
|
17
|
+
const CODEX_EVENT_MAP = {
|
|
18
|
+
PreToolUse: 'before_tool',
|
|
19
|
+
PostToolUse: 'after_tool',
|
|
20
|
+
UserPromptSubmit: 'before_prompt',
|
|
21
|
+
SessionStart: 'session_start',
|
|
22
|
+
SessionEnd: 'session_end',
|
|
23
|
+
Stop: 'session_end',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Render a single TOML hook entry for a Codex config block.
|
|
27
|
+
*
|
|
28
|
+
* Codex's hook TOML shape (per the assessment):
|
|
29
|
+
* [[hooks.<event>]]
|
|
30
|
+
* command = "..."
|
|
31
|
+
* args = ["..."]
|
|
32
|
+
* _aiwg_managed = true
|
|
33
|
+
*
|
|
34
|
+
* Operators add their own hooks at the same shape; the _aiwg_managed flag
|
|
35
|
+
* lets `aiwg remove --addon aiwg-hooks` distinguish AIWG entries from
|
|
36
|
+
* operator-authored ones.
|
|
37
|
+
*/
|
|
38
|
+
export function renderCodexHookToml(source) {
|
|
39
|
+
const lines = [];
|
|
40
|
+
for (const event of source.events) {
|
|
41
|
+
const codexEvent = CODEX_EVENT_MAP[event];
|
|
42
|
+
if (!codexEvent)
|
|
43
|
+
continue;
|
|
44
|
+
const subCommand = substituteEnvVars(source.command, 'codex');
|
|
45
|
+
const subArgs = (source.args || []).map((a) => substituteEnvVars(a, 'codex'));
|
|
46
|
+
lines.push(`[[hooks.${codexEvent}]]`);
|
|
47
|
+
lines.push(`# AIWG-managed hook: ${source.id} — ${source.description}`);
|
|
48
|
+
lines.push(`command = "${subCommand.replace(/"/g, '\\"')}"`);
|
|
49
|
+
if (subArgs.length > 0) {
|
|
50
|
+
lines.push(`args = [${subArgs.map((a) => `"${a.replace(/"/g, '\\"')}"`).join(', ')}]`);
|
|
51
|
+
}
|
|
52
|
+
if (source.safetyCritical) {
|
|
53
|
+
lines.push(`# safety-critical: cannot be auto-removed without --allow-unsafe-shadow`);
|
|
54
|
+
}
|
|
55
|
+
lines.push(`_aiwg_managed = true`);
|
|
56
|
+
lines.push(`_aiwg_id = "${source.id}"`);
|
|
57
|
+
lines.push('');
|
|
58
|
+
}
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
const SPILLOVER_START = '# >>> AIWG-managed hooks (do not edit between markers)';
|
|
62
|
+
const SPILLOVER_END = '# <<< AIWG-managed hooks';
|
|
63
|
+
/**
|
|
64
|
+
* Inject AIWG-managed hook block into existing TOML config, preserving
|
|
65
|
+
* everything outside the markers. Idempotent — replaces an existing block
|
|
66
|
+
* rather than appending.
|
|
67
|
+
*/
|
|
68
|
+
export function injectHookBlock(existingToml, hookBlock) {
|
|
69
|
+
const startIdx = existingToml.indexOf(SPILLOVER_START);
|
|
70
|
+
const endIdx = existingToml.indexOf(SPILLOVER_END);
|
|
71
|
+
const aiwgSection = `${SPILLOVER_START}\n${hookBlock}\n${SPILLOVER_END}\n`;
|
|
72
|
+
if (startIdx === -1 || endIdx === -1 || endIdx < startIdx) {
|
|
73
|
+
const trimmed = existingToml.replace(/\n+$/, '');
|
|
74
|
+
return (trimmed.length > 0 ? trimmed + '\n\n' : '') + aiwgSection;
|
|
75
|
+
}
|
|
76
|
+
const before = existingToml.slice(0, startIdx);
|
|
77
|
+
const after = existingToml.slice(endIdx + SPILLOVER_END.length).replace(/^\n+/, '\n');
|
|
78
|
+
return `${before}${aiwgSection}${after}`;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Translate one HookSource to Codex TOML config.
|
|
82
|
+
*
|
|
83
|
+
* Writes to ~/.codex/config.toml (user-global), backing up the existing
|
|
84
|
+
* file if no AIWG signature is found per ADR-3 §5.
|
|
85
|
+
*/
|
|
86
|
+
export async function translateForCodex(source, options) {
|
|
87
|
+
const result = {
|
|
88
|
+
provider: 'codex',
|
|
89
|
+
emittedPaths: [],
|
|
90
|
+
warnings: [],
|
|
91
|
+
skipped: false,
|
|
92
|
+
};
|
|
93
|
+
if (source.degradeOn?.includes('codex')) {
|
|
94
|
+
result.skipped = true;
|
|
95
|
+
result.skipReason = 'degrade-on declared codex';
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
const configPath = path.join(homedir(), '.codex', 'config.toml');
|
|
99
|
+
const block = renderCodexHookToml(source);
|
|
100
|
+
if (block.trim().length === 0) {
|
|
101
|
+
result.skipped = true;
|
|
102
|
+
result.skipReason = 'no Codex-mapped events';
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
if (options.dryRun) {
|
|
106
|
+
result.emittedPaths.push(configPath + ' (dry-run)');
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
let existing = '';
|
|
110
|
+
try {
|
|
111
|
+
existing = await fs.readFile(configPath, 'utf8');
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err.code !== 'ENOENT')
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
// Backup-and-rollback per ADR-3 §5.
|
|
118
|
+
if (existing && !existing.includes(SPILLOVER_START)) {
|
|
119
|
+
const backupPath = `${configPath}.bak.${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
120
|
+
await fs.writeFile(backupPath, existing, 'utf8');
|
|
121
|
+
result.warnings.push(`Backed up pre-existing config to ${backupPath}`);
|
|
122
|
+
}
|
|
123
|
+
const updated = injectHookBlock(existing, block);
|
|
124
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
125
|
+
await fs.writeFile(configPath, updated, 'utf8');
|
|
126
|
+
result.emittedPaths.push(configPath);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=codex-translator.js.map
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copilot hook translator — emits dual-format JSON: a workflow file at
|
|
3
|
+
* `.github/hooks/<id>.json` plus an inline `hooks:` block embedded in the
|
|
4
|
+
* agent .agent.md frontmatter when the hook targets a specific agent.
|
|
5
|
+
*
|
|
6
|
+
* Per the parity research, Copilot hook discovery is partially documented;
|
|
7
|
+
* the emission here is conservative — produces the shape Copilot Chat is
|
|
8
|
+
* known to consume, marks AIWG provenance, and stages behind the feature
|
|
9
|
+
* flag handled by the orchestrator.
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { substituteEnvVars } from './shim.js';
|
|
14
|
+
const COPILOT_EVENT_MAP = {
|
|
15
|
+
PreToolUse: 'pre_tool_use',
|
|
16
|
+
PostToolUse: 'post_tool_use',
|
|
17
|
+
UserPromptSubmit: 'pre_chat',
|
|
18
|
+
SessionStart: 'session_start',
|
|
19
|
+
SessionEnd: 'session_end',
|
|
20
|
+
Stop: 'session_end',
|
|
21
|
+
};
|
|
22
|
+
export async function translateForCopilot(source, options) {
|
|
23
|
+
const result = {
|
|
24
|
+
provider: 'copilot',
|
|
25
|
+
emittedPaths: [],
|
|
26
|
+
warnings: [],
|
|
27
|
+
skipped: false,
|
|
28
|
+
};
|
|
29
|
+
if (source.degradeOn?.includes('copilot')) {
|
|
30
|
+
result.skipped = true;
|
|
31
|
+
result.skipReason = 'degrade-on declared copilot';
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
const hooksDir = path.join(options.projectPath, '.github', 'hooks');
|
|
35
|
+
const filePath = path.join(hooksDir, `${source.id}.json`);
|
|
36
|
+
const events = source.events
|
|
37
|
+
.map((e) => COPILOT_EVENT_MAP[e])
|
|
38
|
+
.filter((e) => Boolean(e));
|
|
39
|
+
if (events.length === 0) {
|
|
40
|
+
result.skipped = true;
|
|
41
|
+
result.skipReason = 'no Copilot-mapped events';
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
const subCommand = substituteEnvVars(source.command, 'copilot');
|
|
45
|
+
const subArgs = (source.args || []).map((a) => substituteEnvVars(a, 'copilot'));
|
|
46
|
+
const payload = {
|
|
47
|
+
_aiwg_managed: true,
|
|
48
|
+
_aiwg_id: source.id,
|
|
49
|
+
description: source.description,
|
|
50
|
+
events,
|
|
51
|
+
command: subCommand,
|
|
52
|
+
args: subArgs,
|
|
53
|
+
safety_critical: !!source.safetyCritical,
|
|
54
|
+
};
|
|
55
|
+
if (options.dryRun) {
|
|
56
|
+
result.emittedPaths.push(filePath + ' (dry-run)');
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
await fs.mkdir(hooksDir, { recursive: true });
|
|
60
|
+
await fs.writeFile(filePath, JSON.stringify(payload, null, 2) + '\n', 'utf8');
|
|
61
|
+
result.emittedPaths.push(filePath);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=copilot-translator.js.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory hook translator — emits per-droid hook scripts that use
|
|
3
|
+
* $FACTORY_PROJECT_DIR instead of $CLAUDE_PROJECT_DIR.
|
|
4
|
+
*
|
|
5
|
+
* Per ADR-3 §2: the canonical $AIWG_PROJECT_DIR is substituted with
|
|
6
|
+
* $FACTORY_PROJECT_DIR at deploy time. The translator emits a wrapper
|
|
7
|
+
* shell script under .factory/hooks/<id>.sh that calls the AIWG hook
|
|
8
|
+
* command with the right env-var binding.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from 'node:fs';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { generateShimBash } from './shim.js';
|
|
13
|
+
export async function translateForFactory(source, options) {
|
|
14
|
+
const result = {
|
|
15
|
+
provider: 'factory',
|
|
16
|
+
emittedPaths: [],
|
|
17
|
+
warnings: [],
|
|
18
|
+
skipped: false,
|
|
19
|
+
};
|
|
20
|
+
if (source.degradeOn?.includes('factory')) {
|
|
21
|
+
result.skipped = true;
|
|
22
|
+
result.skipReason = 'degrade-on declared factory';
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
const hooksDir = path.join(options.projectPath, '.factory', 'hooks');
|
|
26
|
+
const scriptPath = path.join(hooksDir, `${source.id}.sh`);
|
|
27
|
+
const shim = generateShimBash('factory', source.command, source.args || []);
|
|
28
|
+
if (options.dryRun) {
|
|
29
|
+
result.emittedPaths.push(scriptPath + ' (dry-run)');
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
await fs.mkdir(hooksDir, { recursive: true });
|
|
33
|
+
await fs.writeFile(scriptPath, shim, 'utf8');
|
|
34
|
+
try {
|
|
35
|
+
await fs.chmod(scriptPath, 0o755);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Non-POSIX
|
|
39
|
+
}
|
|
40
|
+
result.emittedPaths.push(scriptPath);
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=factory-translator.js.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hermes hook translator — emits a Python plugin stub at
|
|
3
|
+
* ~/.hermes/plugins/<id>.py that registers itself with Hermes' Python
|
|
4
|
+
* plugin system and shells out to the AIWG hook command.
|
|
5
|
+
*
|
|
6
|
+
* Hermes' hook surface per the parity assessment is Python-plugin-based;
|
|
7
|
+
* shelling out from Python is a common pattern, so the emitted plugin is
|
|
8
|
+
* a thin wrapper that subprocess.run()s the canonical AIWG command.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from 'node:fs';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { substituteEnvVars } from './shim.js';
|
|
14
|
+
const HERMES_EVENT_MAP = {
|
|
15
|
+
PreToolUse: 'pre_tool',
|
|
16
|
+
PostToolUse: 'post_tool',
|
|
17
|
+
UserPromptSubmit: 'pre_prompt',
|
|
18
|
+
SessionStart: 'session_start',
|
|
19
|
+
SessionEnd: 'session_end',
|
|
20
|
+
Stop: 'session_end',
|
|
21
|
+
};
|
|
22
|
+
function renderHermesPlugin(source) {
|
|
23
|
+
const events = source.events
|
|
24
|
+
.map((e) => HERMES_EVENT_MAP[e])
|
|
25
|
+
.filter((e) => Boolean(e));
|
|
26
|
+
const subCommand = substituteEnvVars(source.command, 'hermes');
|
|
27
|
+
const subArgs = (source.args || []).map((a) => substituteEnvVars(a, 'hermes'));
|
|
28
|
+
return `# AIWG-managed hook plugin (ADR-3 / PUW-018)
|
|
29
|
+
# Hook id: ${source.id}
|
|
30
|
+
# Description: ${source.description}
|
|
31
|
+
# Generated by AIWG; do not edit manually.
|
|
32
|
+
|
|
33
|
+
from hermes.plugin import register_hook
|
|
34
|
+
import os
|
|
35
|
+
import subprocess
|
|
36
|
+
|
|
37
|
+
EVENTS = ${JSON.stringify(events)}
|
|
38
|
+
COMMAND = ${JSON.stringify(subCommand)}
|
|
39
|
+
ARGS = ${JSON.stringify(subArgs)}
|
|
40
|
+
AIWG_ID = ${JSON.stringify(source.id)}
|
|
41
|
+
SAFETY_CRITICAL = ${source.safetyCritical ? 'True' : 'False'}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _run(payload=None):
|
|
45
|
+
env = dict(os.environ)
|
|
46
|
+
env.setdefault('AIWG_PROJECT_DIR', os.environ.get('HERMES_PROJECT_DIR', os.getcwd()))
|
|
47
|
+
env['AIWG_HOOK_EVENT'] = payload.get('event', 'unknown') if payload else 'unknown'
|
|
48
|
+
cmd = [COMMAND] + ARGS if not COMMAND.startswith('#!') else [COMMAND, *ARGS]
|
|
49
|
+
return subprocess.run(cmd, env=env, check=False).returncode
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
for _event in EVENTS:
|
|
53
|
+
register_hook(_event, _run, aiwg_managed=True, aiwg_id=AIWG_ID,
|
|
54
|
+
safety_critical=SAFETY_CRITICAL)
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
export async function translateForHermes(source, options) {
|
|
58
|
+
const result = {
|
|
59
|
+
provider: 'hermes',
|
|
60
|
+
emittedPaths: [],
|
|
61
|
+
warnings: [],
|
|
62
|
+
skipped: false,
|
|
63
|
+
};
|
|
64
|
+
if (source.degradeOn?.includes('hermes')) {
|
|
65
|
+
result.skipped = true;
|
|
66
|
+
result.skipReason = 'degrade-on declared hermes';
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
const events = source.events
|
|
70
|
+
.map((e) => HERMES_EVENT_MAP[e])
|
|
71
|
+
.filter((e) => Boolean(e));
|
|
72
|
+
if (events.length === 0) {
|
|
73
|
+
result.skipped = true;
|
|
74
|
+
result.skipReason = 'no Hermes-mapped events';
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
const pluginDir = path.join(homedir(), '.hermes', 'plugins');
|
|
78
|
+
const pluginPath = path.join(pluginDir, `${source.id}.py`);
|
|
79
|
+
if (options.dryRun) {
|
|
80
|
+
result.emittedPaths.push(pluginPath + ' (dry-run)');
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
await fs.mkdir(pluginDir, { recursive: true });
|
|
84
|
+
await fs.writeFile(pluginPath, renderHermesPlugin(source), 'utf8');
|
|
85
|
+
result.emittedPaths.push(pluginPath);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=hermes-translator.js.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hook-bridge — cross-provider hook translation per ADR-3.
|
|
3
|
+
*
|
|
4
|
+
* Public API: bridgeAll(sources, providers, opts) translates every source
|
|
5
|
+
* for every provider, returning a flat list of TranslateResult. Per ADR-3
|
|
6
|
+
* §7 autoInstall policy, the orchestrator passes the explicitly-enabled
|
|
7
|
+
* providers (operator opts in via --enable-cross-provider-hooks plus per-
|
|
8
|
+
* provider flags); this module doesn't make that policy decision itself.
|
|
9
|
+
*
|
|
10
|
+
* @module smiths/hook-bridge
|
|
11
|
+
*/
|
|
12
|
+
import { translateForCodex } from './codex-translator.js';
|
|
13
|
+
import { translateForCopilot } from './copilot-translator.js';
|
|
14
|
+
import { translateForFactory } from './factory-translator.js';
|
|
15
|
+
import { translateForHermes } from './hermes-translator.js';
|
|
16
|
+
import { getProviderDefinition } from '../../providers/provider-definitions.js';
|
|
17
|
+
export { AIWG_ENV_VARS, NATIVE_ENV_VAR_MAP } from './types.js';
|
|
18
|
+
export { substituteEnvVars, generateShimBash, EXIT_CODE_MAP } from './shim.js';
|
|
19
|
+
export { translateForCodex, renderCodexHookToml, injectHookBlock as injectCodexHookBlock } from './codex-translator.js';
|
|
20
|
+
export { translateForCopilot } from './copilot-translator.js';
|
|
21
|
+
export { translateForFactory } from './factory-translator.js';
|
|
22
|
+
export { translateForHermes } from './hermes-translator.js';
|
|
23
|
+
export { loadHookSources } from './loader.js';
|
|
24
|
+
/**
|
|
25
|
+
* Provider id → translator function. Adding a new provider requires:
|
|
26
|
+
* 1. New file `<provider>-translator.ts` exporting a ProviderTranslator
|
|
27
|
+
* 2. Entry below
|
|
28
|
+
* 3. Native env var entry in types.ts NATIVE_ENV_VAR_MAP
|
|
29
|
+
* 4. Native exit code entry in shim.ts EXIT_CODE_MAP
|
|
30
|
+
* 5. Native event mapping in the per-provider file
|
|
31
|
+
*/
|
|
32
|
+
export const TRANSLATORS = {
|
|
33
|
+
codex: translateForCodex,
|
|
34
|
+
copilot: translateForCopilot,
|
|
35
|
+
factory: translateForFactory,
|
|
36
|
+
hermes: translateForHermes,
|
|
37
|
+
};
|
|
38
|
+
function resolveHookTranslator(providerId) {
|
|
39
|
+
const adapterKey = getProviderDefinition(providerId)?.adapters.hookBridge ?? providerId;
|
|
40
|
+
return adapterKey ? TRANSLATORS[adapterKey] : undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Translate one source across an explicit list of providers. Per-provider
|
|
44
|
+
* failures are captured as TranslateResult entries (skipped=true with
|
|
45
|
+
* reason); they do not throw to the caller.
|
|
46
|
+
*/
|
|
47
|
+
export async function bridgeAll(sources, providers, options) {
|
|
48
|
+
const results = [];
|
|
49
|
+
for (const source of sources) {
|
|
50
|
+
for (const providerId of providers) {
|
|
51
|
+
const translator = resolveHookTranslator(providerId);
|
|
52
|
+
if (!translator) {
|
|
53
|
+
results.push({
|
|
54
|
+
provider: providerId,
|
|
55
|
+
emittedPaths: [],
|
|
56
|
+
warnings: [],
|
|
57
|
+
skipped: true,
|
|
58
|
+
skipReason: 'no translator registered',
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const r = await translator(source, options);
|
|
64
|
+
results.push(r);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
results.push({
|
|
68
|
+
provider: providerId,
|
|
69
|
+
emittedPaths: [],
|
|
70
|
+
warnings: [`translator threw: ${err instanceof Error ? err.message : String(err)}`],
|
|
71
|
+
skipped: true,
|
|
72
|
+
skipReason: 'translator error',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return results;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical hook source loader.
|
|
3
|
+
*
|
|
4
|
+
* Reads HookSource YAML/JSON files from a known directory layout. Per the
|
|
5
|
+
* orchestrator wiring in `src/cli/handlers/use.ts`, the operator opts in to
|
|
6
|
+
* cross-provider hook translation via `--enable-cross-provider-hooks`; when
|
|
7
|
+
* the flag is set, this loader gathers the canonical source files and the
|
|
8
|
+
* `bridgeAll()` API translates them.
|
|
9
|
+
*
|
|
10
|
+
* Source location convention: `agentic/code/addons/aiwg-hooks/canonical/*.yaml`
|
|
11
|
+
* Each file declares one HookSource per the schema in `types.ts`.
|
|
12
|
+
*
|
|
13
|
+
* The loader is forgiving: missing directory yields an empty source list
|
|
14
|
+
* (not an error) so operators can opt in to the flag without authoring
|
|
15
|
+
* any sources first.
|
|
16
|
+
*/
|
|
17
|
+
import { promises as fs } from 'node:fs';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
import * as yaml from 'js-yaml';
|
|
20
|
+
const VALID_EVENTS = new Set([
|
|
21
|
+
'PreToolUse',
|
|
22
|
+
'PostToolUse',
|
|
23
|
+
'UserPromptSubmit',
|
|
24
|
+
'SessionStart',
|
|
25
|
+
'SessionEnd',
|
|
26
|
+
'Stop',
|
|
27
|
+
]);
|
|
28
|
+
/**
|
|
29
|
+
* Validate and normalize a parsed HookSource. Returns null if the input
|
|
30
|
+
* doesn't satisfy the minimal schema. Caller logs the rejection.
|
|
31
|
+
*/
|
|
32
|
+
function normalize(input, filePath) {
|
|
33
|
+
if (!input || typeof input !== 'object') {
|
|
34
|
+
return { source: null, error: `${filePath}: not an object` };
|
|
35
|
+
}
|
|
36
|
+
const o = input;
|
|
37
|
+
if (typeof o.id !== 'string' || !o.id) {
|
|
38
|
+
return { source: null, error: `${filePath}: missing or non-string \`id\`` };
|
|
39
|
+
}
|
|
40
|
+
if (typeof o.command !== 'string' || !o.command) {
|
|
41
|
+
return { source: null, error: `${filePath}: missing or non-string \`command\`` };
|
|
42
|
+
}
|
|
43
|
+
const events = Array.isArray(o.events) ? o.events.filter((e) => typeof e === 'string' && VALID_EVENTS.has(e)) : [];
|
|
44
|
+
if (events.length === 0) {
|
|
45
|
+
return { source: null, error: `${filePath}: \`events\` must be a non-empty array of valid event names` };
|
|
46
|
+
}
|
|
47
|
+
const source = {
|
|
48
|
+
id: o.id,
|
|
49
|
+
description: typeof o.description === 'string' ? o.description : '',
|
|
50
|
+
events,
|
|
51
|
+
command: o.command,
|
|
52
|
+
args: Array.isArray(o.args) ? o.args.filter((a) => typeof a === 'string') : undefined,
|
|
53
|
+
safetyCritical: o['safety-critical'] === true || o.safetyCritical === true,
|
|
54
|
+
degradeOn: Array.isArray(o['degrade-on'])
|
|
55
|
+
? o['degrade-on'].filter((p) => typeof p === 'string')
|
|
56
|
+
: Array.isArray(o.degradeOn)
|
|
57
|
+
? o.degradeOn.filter((p) => typeof p === 'string')
|
|
58
|
+
: undefined,
|
|
59
|
+
workingDir: typeof o['working-dir'] === 'string'
|
|
60
|
+
? o['working-dir']
|
|
61
|
+
: typeof o.workingDir === 'string'
|
|
62
|
+
? o.workingDir
|
|
63
|
+
: undefined,
|
|
64
|
+
};
|
|
65
|
+
return { source };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Load all canonical hook sources from `<frameworkRoot>/agentic/code/addons/
|
|
69
|
+
* aiwg-hooks/canonical/`. Returns the parsed sources plus any rejections so
|
|
70
|
+
* the orchestrator can warn operators about malformed files.
|
|
71
|
+
*/
|
|
72
|
+
export async function loadHookSources(frameworkRoot) {
|
|
73
|
+
const dir = path.join(frameworkRoot, 'agentic', 'code', 'addons', 'aiwg-hooks', 'canonical');
|
|
74
|
+
const sources = [];
|
|
75
|
+
const errors = [];
|
|
76
|
+
let entries;
|
|
77
|
+
try {
|
|
78
|
+
entries = await fs.readdir(dir);
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (err.code === 'ENOENT') {
|
|
82
|
+
return { sources, errors };
|
|
83
|
+
}
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
if (!/\.(yaml|yml|json)$/i.test(entry))
|
|
88
|
+
continue;
|
|
89
|
+
const filePath = path.join(dir, entry);
|
|
90
|
+
let raw;
|
|
91
|
+
try {
|
|
92
|
+
raw = await fs.readFile(filePath, 'utf8');
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
errors.push(`${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = entry.endsWith('.json') ? JSON.parse(raw) : yaml.load(raw);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
errors.push(`${filePath}: parse error — ${err instanceof Error ? err.message : String(err)}`);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const { source, error } = normalize(parsed, filePath);
|
|
107
|
+
if (error) {
|
|
108
|
+
errors.push(error);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (source)
|
|
112
|
+
sources.push(source);
|
|
113
|
+
}
|
|
114
|
+
return { sources, errors };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook bridge shim — env-var contract substitution + canonical schemas.
|
|
3
|
+
*
|
|
4
|
+
* Per ADR-3 §2: hook authors write canonical $AIWG_* env vars. Translators
|
|
5
|
+
* substitute them with the provider-native equivalents at deploy time so
|
|
6
|
+
* authors don't need to maintain N copies of the same hook.
|
|
7
|
+
*/
|
|
8
|
+
import { AIWG_ENV_VARS, NATIVE_ENV_VAR_MAP } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Substitute canonical AIWG env vars with the provider's native equivalents.
|
|
11
|
+
*
|
|
12
|
+
* Example for codex:
|
|
13
|
+
* "$AIWG_PROJECT_DIR/scripts/scan.sh" → "$CODEX_WORKSPACE/scripts/scan.sh"
|
|
14
|
+
*
|
|
15
|
+
* When a provider has no native equivalent for a given canonical var, the
|
|
16
|
+
* canonical name is preserved. Hook authors who need the value despite the
|
|
17
|
+
* gap can rely on the runtime shim setting $AIWG_PROJECT_DIR (etc.) before
|
|
18
|
+
* invoking the command — that's the per-ADR-3-§2 fallback.
|
|
19
|
+
*/
|
|
20
|
+
export function substituteEnvVars(input, provider) {
|
|
21
|
+
const mapping = NATIVE_ENV_VAR_MAP[provider];
|
|
22
|
+
if (!mapping)
|
|
23
|
+
return input;
|
|
24
|
+
let out = input;
|
|
25
|
+
for (const [canonicalKey, canonicalRef] of Object.entries(AIWG_ENV_VARS)) {
|
|
26
|
+
const native = mapping[canonicalKey];
|
|
27
|
+
if (!native)
|
|
28
|
+
continue;
|
|
29
|
+
// Replace both $VAR and ${VAR} forms.
|
|
30
|
+
const escaped = canonicalRef.replace(/\$/g, '\\$');
|
|
31
|
+
out = out.replace(new RegExp(escaped + '\\b', 'g'), native);
|
|
32
|
+
out = out.replace(new RegExp('\\${' + canonicalRef.slice(1) + '}', 'g'), native);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Canonical exit-code mapping per ADR-3 §4.
|
|
38
|
+
*
|
|
39
|
+
* AIWG canonical:
|
|
40
|
+
* 0 = allow
|
|
41
|
+
* 1 = block
|
|
42
|
+
* 2 = warn-and-continue
|
|
43
|
+
*
|
|
44
|
+
* Provider mapping returns the native exit code(s) that mean each AIWG
|
|
45
|
+
* semantic. Used by the wrapper shim to translate hook exit codes back to
|
|
46
|
+
* what the provider expects.
|
|
47
|
+
*/
|
|
48
|
+
export const EXIT_CODE_MAP = {
|
|
49
|
+
claude: { allow: 0, block: 1, warn: 0 /* warn surfaces via stderr only */ },
|
|
50
|
+
codex: { allow: 0, block: 1, warn: 2 },
|
|
51
|
+
copilot: { allow: 0, block: 1, warn: 0 },
|
|
52
|
+
factory: { allow: 0, block: 1, warn: 0 },
|
|
53
|
+
hermes: { allow: 0, block: 1, warn: 2 },
|
|
54
|
+
openclaw: { allow: 0, block: 1, warn: 2 },
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Generate a small bash shim that:
|
|
58
|
+
* 1. exports $AIWG_PROJECT_DIR + $AIWG_TOOL_NAME from native env vars
|
|
59
|
+
* 2. reads native stdin, transforms to AIWG canonical JSON
|
|
60
|
+
* 3. pipes to the hook command
|
|
61
|
+
* 4. translates the exit code back per ADR-3 §4
|
|
62
|
+
*
|
|
63
|
+
* The shim is what gets installed as the actual hook artifact on the
|
|
64
|
+
* provider; the AIWG hook command runs inside it.
|
|
65
|
+
*/
|
|
66
|
+
export function generateShimBash(provider, hookCommand, args = []) {
|
|
67
|
+
const native = NATIVE_ENV_VAR_MAP[provider] || {};
|
|
68
|
+
const projectDirSrc = native.PROJECT_DIR || '$PWD';
|
|
69
|
+
const toolNameSrc = native.TOOL_NAME || '"${AIWG_TOOL_NAME:-unknown}"';
|
|
70
|
+
// Substitute canonical env vars in the command + args ahead of shim emission
|
|
71
|
+
// so the shim invocation references native names where available.
|
|
72
|
+
const subCommand = substituteEnvVars(hookCommand, provider);
|
|
73
|
+
const subArgs = args.map((a) => substituteEnvVars(a, provider));
|
|
74
|
+
return [
|
|
75
|
+
'#!/usr/bin/env bash',
|
|
76
|
+
`# AIWG hook bridge shim (ADR-3) — provider: ${provider}`,
|
|
77
|
+
'set -e',
|
|
78
|
+
'',
|
|
79
|
+
`export AIWG_PROJECT_DIR="${projectDirSrc}"`,
|
|
80
|
+
`export AIWG_TOOL_NAME=${toolNameSrc}`,
|
|
81
|
+
`export AIWG_HOOK_EVENT="${'${AIWG_HOOK_EVENT:-unknown}'}"`,
|
|
82
|
+
'',
|
|
83
|
+
'# Forward stdin verbatim. Hook command can re-parse if it needs the',
|
|
84
|
+
'# canonical AIWG schema; the env-var contract above is the primary',
|
|
85
|
+
'# integration surface for cross-provider portability.',
|
|
86
|
+
`${subCommand}${subArgs.length ? ' ' + subArgs.map((a) => `"${a}"`).join(' ') : ''}`,
|
|
87
|
+
].join('\n');
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=shim.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-provider hook bridge types (PUW-018 / #1119).
|
|
3
|
+
*
|
|
4
|
+
* Per ADR-3 §1: AIWG hooks are authored in a canonical source format and
|
|
5
|
+
* per-provider translators emit native artifacts at deploy time. This module
|
|
6
|
+
* defines the shared type surface that translators consume.
|
|
7
|
+
*/
|
|
8
|
+
/** Canonical AIWG env vars. Translators substitute these at deploy time. */
|
|
9
|
+
export const AIWG_ENV_VARS = {
|
|
10
|
+
PROJECT_DIR: '$AIWG_PROJECT_DIR',
|
|
11
|
+
TOOL_NAME: '$AIWG_TOOL_NAME',
|
|
12
|
+
HOOK_EVENT: '$AIWG_HOOK_EVENT',
|
|
13
|
+
SESSION_ID: '$AIWG_SESSION_ID',
|
|
14
|
+
};
|
|
15
|
+
/** Native env-var contract per ADR-3 §2 table. */
|
|
16
|
+
export const NATIVE_ENV_VAR_MAP = {
|
|
17
|
+
claude: {
|
|
18
|
+
PROJECT_DIR: '$CLAUDE_PROJECT_DIR',
|
|
19
|
+
TOOL_NAME: '$CLAUDE_TOOL_NAME',
|
|
20
|
+
},
|
|
21
|
+
factory: {
|
|
22
|
+
PROJECT_DIR: '$FACTORY_PROJECT_DIR',
|
|
23
|
+
},
|
|
24
|
+
codex: {
|
|
25
|
+
PROJECT_DIR: '$CODEX_WORKSPACE',
|
|
26
|
+
},
|
|
27
|
+
copilot: {
|
|
28
|
+
PROJECT_DIR: '$GITHUB_WORKSPACE',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIWG Smiths - Tool and Server Generation Framework
|
|
3
|
+
*
|
|
4
|
+
* The Smiths ecosystem provides:
|
|
5
|
+
* - Toolsmith: Tool specification generation for subagent scenarios
|
|
6
|
+
* - MCPsmith: MCP server generation from any command/API
|
|
7
|
+
* - AgentSmith: Custom agent generation with platform-aware deployment
|
|
8
|
+
* - SkillSmith: Skill generation with platform-aware deployment
|
|
9
|
+
* - CommandSmith: Platform-aware slash command generation
|
|
10
|
+
* - ContextPipeline: AIWG.md + AGENTS.md generator (cross-platform context bridge)
|
|
11
|
+
*
|
|
12
|
+
* @module smiths
|
|
13
|
+
*/
|
|
14
|
+
// Re-export Toolsmith (excluding Platform to avoid conflict)
|
|
15
|
+
export * from './toolsmith/types.js';
|
|
16
|
+
// Re-export MCPsmith
|
|
17
|
+
export * from './mcpsmith/index.js';
|
|
18
|
+
// Re-export AgentSmith
|
|
19
|
+
export * from './agentsmith/index.js';
|
|
20
|
+
// Re-export SkillSmith
|
|
21
|
+
export * from './skillsmith/index.js';
|
|
22
|
+
// Re-export CommandSmith
|
|
23
|
+
export * from './commandsmith/index.js';
|
|
24
|
+
// Re-export context-pipeline (AIWG.md + AGENTS.md generator; ADR-1).
|
|
25
|
+
// Namespaced (not flat * export) because its types overlap with agentsmith
|
|
26
|
+
// (different concern — assembly of cross-platform context vs subagent persona generation).
|
|
27
|
+
export * as ContextPipeline from './context-pipeline/index.js';
|
|
28
|
+
// Re-export hook-bridge (cross-provider hook translator; ADR-3 / PUW-018).
|
|
29
|
+
// Namespaced because translator types overlap by intent (HookSource etc.).
|
|
30
|
+
export * as HookBridge from './hook-bridge/index.js';
|
|
31
|
+
export const SMITHS_DIR = '.aiwg/smiths';
|
|
32
|
+
export const TOOLSMITH_DIR = `${SMITHS_DIR}/toolsmith`;
|
|
33
|
+
export const MCPSMITH_DIR = `${SMITHS_DIR}/mcpsmith`;
|
|
34
|
+
export const AGENTSMITH_DIR = `${SMITHS_DIR}/agentsmith`;
|
|
35
|
+
export const SKILLSMITH_DIR = `${SMITHS_DIR}/skillsmith`;
|
|
36
|
+
export const COMMANDSMITH_DIR = `${SMITHS_DIR}/commandsmith`;
|
|
37
|
+
export const CONTEXT_PIPELINE_DIR = `${SMITHS_DIR}/context-pipeline`;
|
|
38
|
+
export const HOOK_BRIDGE_DIR = `${SMITHS_DIR}/hook-bridge`;
|
|
39
|
+
//# sourceMappingURL=index.js.map
|