@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,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-Local Bundle Promotion (Graduate)
|
|
3
|
+
*
|
|
4
|
+
* Operationalizes the identical-form portability invariant from
|
|
5
|
+
* @.aiwg/architecture/adr-identical-form-portability.md (#1038): a
|
|
6
|
+
* project-local bundle should graduate to upstream (or to a private
|
|
7
|
+
* corpus path) by byte-identical copy.
|
|
8
|
+
*
|
|
9
|
+
* Per the design at @.aiwg/architecture/design-doctor-log-promote.md
|
|
10
|
+
* (#1049), promote performs:
|
|
11
|
+
* 1. Pre-flight checks (bundle exists, manifest valid, no project-
|
|
12
|
+
* local @-refs, destination doesn't exist, identical-form layout)
|
|
13
|
+
* 2. Hash snapshot of source files
|
|
14
|
+
* 3. Recursive copy to destination
|
|
15
|
+
* 4. Re-hash destination — roll back (delete) on any mismatch
|
|
16
|
+
* 5. Update registry source: project-local → bundled (or corpus)
|
|
17
|
+
* 6. Optional --cleanup: remove .aiwg/<type>/<name>/ source
|
|
18
|
+
* 7. Activity log entry
|
|
19
|
+
*
|
|
20
|
+
* @design @.aiwg/architecture/design-doctor-log-promote.md
|
|
21
|
+
* @implements #1037
|
|
22
|
+
*/
|
|
23
|
+
import { createHash } from 'crypto';
|
|
24
|
+
import { cp, mkdir, readFile, readdir, rm, stat, } from 'fs/promises';
|
|
25
|
+
import { resolve, join, relative } from 'path';
|
|
26
|
+
import { discoverProjectLocalBundles } from './project-local-discovery.js';
|
|
27
|
+
import { appendProjectLocalActivity } from './project-local-activity.js';
|
|
28
|
+
const TYPE_TO_UPSTREAM_DIR = {
|
|
29
|
+
extension: 'agentic/code/addons',
|
|
30
|
+
addon: 'agentic/code/addons',
|
|
31
|
+
framework: 'agentic/code/frameworks',
|
|
32
|
+
plugin: 'agentic/code/addons',
|
|
33
|
+
provider: 'agentic/code/providers',
|
|
34
|
+
};
|
|
35
|
+
async function sha256(absPath) {
|
|
36
|
+
const buf = await readFile(absPath);
|
|
37
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
38
|
+
}
|
|
39
|
+
async function walk(rootAbs) {
|
|
40
|
+
const out = [];
|
|
41
|
+
async function recurse(dirAbs) {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = await readdir(dirAbs, { withFileTypes: true });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const e of entries) {
|
|
50
|
+
const childAbs = join(dirAbs, e.name);
|
|
51
|
+
if (e.isDirectory()) {
|
|
52
|
+
await recurse(childAbs);
|
|
53
|
+
}
|
|
54
|
+
else if (e.isFile()) {
|
|
55
|
+
out.push(childAbs);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
await recurse(rootAbs);
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
async function fileSize(absPath) {
|
|
63
|
+
try {
|
|
64
|
+
const st = await stat(absPath);
|
|
65
|
+
return st.size;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Scan for `@.aiwg/...` references in artifact body files. */
|
|
72
|
+
async function findProjectLocalReferences(bundlePath) {
|
|
73
|
+
const out = [];
|
|
74
|
+
const files = await walk(bundlePath);
|
|
75
|
+
for (const f of files) {
|
|
76
|
+
if (!f.endsWith('.md') && !f.endsWith('.json') && !f.endsWith('.yaml') && !f.endsWith('.yml'))
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
const content = await readFile(f, 'utf-8');
|
|
80
|
+
if (content.includes('@.aiwg/')) {
|
|
81
|
+
out.push(relative(bundlePath, f));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Skip unreadable files
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Promote a project-local bundle to its upstream home or a corpus path.
|
|
92
|
+
*
|
|
93
|
+
* Pure function over (config, projectDir, bundleId, opts). Mutates
|
|
94
|
+
* config.installed when the operation succeeds (caller persists).
|
|
95
|
+
*/
|
|
96
|
+
export async function promoteProjectLocalBundle(config, projectDir, bundleId, opts = {}) {
|
|
97
|
+
const { to = 'upstream', corpusPath, dryRun = false, cleanup = false, force = false, frameworkRoot = projectDir, } = opts;
|
|
98
|
+
// Pre-flight 1: discover the bundle
|
|
99
|
+
const discovery = await discoverProjectLocalBundles(projectDir);
|
|
100
|
+
const bundle = discovery.bundles.find(b => b.id === bundleId);
|
|
101
|
+
if (!bundle) {
|
|
102
|
+
return { ok: false, failureReason: 'bundle-not-found', message: `No project-local bundle '${bundleId}' under configured project-local roots` };
|
|
103
|
+
}
|
|
104
|
+
// Pre-flight 2: corpus path required for --to corpus
|
|
105
|
+
if (to === 'corpus' && !corpusPath) {
|
|
106
|
+
return { ok: false, failureReason: 'destination-required', message: '--to corpus requires a path argument' };
|
|
107
|
+
}
|
|
108
|
+
// Resolve destination
|
|
109
|
+
const destinationParent = to === 'corpus'
|
|
110
|
+
? resolve(projectDir, corpusPath)
|
|
111
|
+
: resolve(frameworkRoot, TYPE_TO_UPSTREAM_DIR[bundle.type]);
|
|
112
|
+
const destination = join(destinationParent, bundleId);
|
|
113
|
+
// Pre-flight 3: destination must not already exist
|
|
114
|
+
let destExists = false;
|
|
115
|
+
try {
|
|
116
|
+
await stat(destination);
|
|
117
|
+
destExists = true;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Doesn't exist — good
|
|
121
|
+
}
|
|
122
|
+
if (destExists) {
|
|
123
|
+
return { ok: false, failureReason: 'destination-exists', message: `Destination '${destination}' already exists. Promote refuses to overwrite — remove it first.` };
|
|
124
|
+
}
|
|
125
|
+
// Pre-flight 4: project-local @-references would dangle
|
|
126
|
+
const refs = await findProjectLocalReferences(bundle.bundlePath);
|
|
127
|
+
if (refs.length > 0 && !force) {
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
failureReason: 'project-local-references',
|
|
131
|
+
message: `Bundle contains @.aiwg/ references that would dangle after promote: ${refs.slice(0, 3).join(', ')}${refs.length > 3 ? `, +${refs.length - 3} more` : ''}. Use --force to promote anyway.`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Build the plan
|
|
135
|
+
const sourceFiles = await walk(bundle.bundlePath);
|
|
136
|
+
const sourceRels = sourceFiles.map(f => relative(bundle.bundlePath, f));
|
|
137
|
+
let totalBytes = 0;
|
|
138
|
+
for (const f of sourceFiles)
|
|
139
|
+
totalBytes += await fileSize(f);
|
|
140
|
+
const plan = {
|
|
141
|
+
bundleId,
|
|
142
|
+
type: bundle.type,
|
|
143
|
+
source: bundle.localPath,
|
|
144
|
+
destination,
|
|
145
|
+
files: sourceRels,
|
|
146
|
+
totalBytes,
|
|
147
|
+
};
|
|
148
|
+
if (dryRun) {
|
|
149
|
+
return { ok: true, plan };
|
|
150
|
+
}
|
|
151
|
+
// Snapshot source hashes
|
|
152
|
+
const expectedHashes = {};
|
|
153
|
+
for (const abs of sourceFiles) {
|
|
154
|
+
const rel = relative(bundle.bundlePath, abs);
|
|
155
|
+
expectedHashes[rel] = await sha256(abs);
|
|
156
|
+
}
|
|
157
|
+
// Copy
|
|
158
|
+
try {
|
|
159
|
+
await mkdir(destinationParent, { recursive: true });
|
|
160
|
+
await cp(bundle.bundlePath, destination, { recursive: true });
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
164
|
+
await appendProjectLocalActivity({
|
|
165
|
+
event: 'promote-failed',
|
|
166
|
+
name: bundleId,
|
|
167
|
+
type: bundle.type,
|
|
168
|
+
summary: `copy failed: ${msg}`,
|
|
169
|
+
});
|
|
170
|
+
return { ok: false, failureReason: 'copy-failed', message: `Copy failed: ${msg}` };
|
|
171
|
+
}
|
|
172
|
+
// Verify hashes; roll back on mismatch
|
|
173
|
+
for (const [rel, expected] of Object.entries(expectedHashes)) {
|
|
174
|
+
const destAbs = join(destination, rel);
|
|
175
|
+
const actual = await sha256(destAbs).catch(() => null);
|
|
176
|
+
if (actual !== expected) {
|
|
177
|
+
try {
|
|
178
|
+
await rm(destination, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
catch { /* best effort */ }
|
|
181
|
+
await appendProjectLocalActivity({
|
|
182
|
+
event: 'promote-failed',
|
|
183
|
+
name: bundleId,
|
|
184
|
+
type: bundle.type,
|
|
185
|
+
summary: `hash mismatch on ${rel} — rolled back`,
|
|
186
|
+
});
|
|
187
|
+
return { ok: false, failureReason: 'hash-mismatch', message: `Hash mismatch on ${rel} after copy. Rolled back.` };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Registry update: source flips
|
|
191
|
+
const entry = config.installed[bundleId];
|
|
192
|
+
if (entry) {
|
|
193
|
+
entry.source = to === 'upstream' ? 'bundled' : 'corpus';
|
|
194
|
+
delete entry.localPath;
|
|
195
|
+
delete entry.localType;
|
|
196
|
+
delete entry.manifestVersion;
|
|
197
|
+
// Keep artifactHashes — they remain valid for drift detection of the new install
|
|
198
|
+
}
|
|
199
|
+
// Cleanup source if requested
|
|
200
|
+
if (cleanup) {
|
|
201
|
+
try {
|
|
202
|
+
await rm(bundle.bundlePath, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
// Non-fatal — promote already succeeded
|
|
206
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
207
|
+
process.stderr.write(`promote --cleanup failed (non-fatal): ${msg}\n`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
await appendProjectLocalActivity({
|
|
211
|
+
event: 'promote',
|
|
212
|
+
name: bundleId,
|
|
213
|
+
type: bundle.type,
|
|
214
|
+
summary: `${destination}${cleanup ? ' (source cleaned up)' : ''}`,
|
|
215
|
+
});
|
|
216
|
+
return { ok: true, plan, copied: sourceRels };
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=project-local-promote.js.map
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-Local Bundle Remove
|
|
3
|
+
*
|
|
4
|
+
* Reverts a project-local bundle's deployed artifacts from provider paths
|
|
5
|
+
* per the case table in `.aiwg/architecture/design-aiwg-remove-revert.md`
|
|
6
|
+
* (#1048). Reads artifactHashes from the registry to detect pristine vs
|
|
7
|
+
* mutated vs replaced files.
|
|
8
|
+
*
|
|
9
|
+
* Source under `.aiwg/<type>/<name>/` is NEVER deleted (load-bearing
|
|
10
|
+
* invariant — `--force` does not change this).
|
|
11
|
+
*
|
|
12
|
+
* @design @.aiwg/architecture/design-aiwg-remove-revert.md
|
|
13
|
+
* @implements #1037
|
|
14
|
+
*/
|
|
15
|
+
import { lstat, readdir, stat, unlink } from 'fs/promises';
|
|
16
|
+
import { resolve, join, relative } from 'path';
|
|
17
|
+
import { homedir } from 'os';
|
|
18
|
+
import { appendProjectLocalActivity } from './project-local-activity.js';
|
|
19
|
+
import { sha256OfFileNormalized } from './managed-marker.js';
|
|
20
|
+
/**
|
|
21
|
+
* Hash an artifact file with the managed-marker line stripped.
|
|
22
|
+
*
|
|
23
|
+
* Source files have no marker (it's deploy-time-injected); deployed files
|
|
24
|
+
* do. Stripping the marker on both sides makes the hash insensitive to
|
|
25
|
+
* the marker, which is the equivalence relation we actually want for
|
|
26
|
+
* pristine/mutated/drift checks. See `managed-marker.ts` for the details.
|
|
27
|
+
*
|
|
28
|
+
* @implements #1086
|
|
29
|
+
*/
|
|
30
|
+
async function sha256Hex(absPath) {
|
|
31
|
+
return sha256OfFileNormalized(absPath);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compute hashes for every artifact under a project-local bundle, keyed by
|
|
35
|
+
* source-relative path (e.g., "rules/my-rule.md", "skills/x/SKILL.md").
|
|
36
|
+
*
|
|
37
|
+
* Artifact dirs scanned: agents/, commands/, skills/, rules/. Skill entries
|
|
38
|
+
* use the SKILL.md inside the per-skill subdirectory; everything else is a
|
|
39
|
+
* top-level .md file.
|
|
40
|
+
*/
|
|
41
|
+
export async function hashBundleArtifacts(bundleAbsPath) {
|
|
42
|
+
const out = {};
|
|
43
|
+
// Flat .md dirs
|
|
44
|
+
for (const dir of ['agents', 'commands', 'rules']) {
|
|
45
|
+
const dirAbs = join(bundleAbsPath, dir);
|
|
46
|
+
let entries;
|
|
47
|
+
try {
|
|
48
|
+
entries = await readdir(dirAbs);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
for (const e of entries) {
|
|
54
|
+
if (!e.endsWith('.md'))
|
|
55
|
+
continue;
|
|
56
|
+
if (e === 'README.md' || e === 'RULES-INDEX.md' || e === 'INDEX.md')
|
|
57
|
+
continue;
|
|
58
|
+
const fileAbs = join(dirAbs, e);
|
|
59
|
+
try {
|
|
60
|
+
out[`${dir}/${e}`] = await sha256Hex(fileAbs);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Read failures are non-fatal — skip the artifact
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Skill subdirs
|
|
68
|
+
const skillsAbs = join(bundleAbsPath, 'skills');
|
|
69
|
+
let skillEntries;
|
|
70
|
+
try {
|
|
71
|
+
skillEntries = await readdir(skillsAbs);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
skillEntries = [];
|
|
75
|
+
}
|
|
76
|
+
for (const skill of skillEntries) {
|
|
77
|
+
const skillDir = join(skillsAbs, skill);
|
|
78
|
+
try {
|
|
79
|
+
const st = await stat(skillDir);
|
|
80
|
+
if (!st.isDirectory())
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const skillMd = join(skillDir, 'SKILL.md');
|
|
87
|
+
try {
|
|
88
|
+
out[`skills/${skill}/SKILL.md`] = await sha256Hex(skillMd);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// No SKILL.md — skip
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Provider-specific deploy-path conventions for the artifact directories
|
|
98
|
+
* we currently emit. Keyed by provider, value is the prefix relative to
|
|
99
|
+
* the project (or HOME for HOME-deploying providers — those are out of
|
|
100
|
+
* scope for revert in this iteration; they are silently skipped with a
|
|
101
|
+
* message).
|
|
102
|
+
*/
|
|
103
|
+
// Per PUW-026 (#1127): home-deploying providers get absolute prefixes so
|
|
104
|
+
// `resolve(projectDir, prefix)` correctly produces the home-rooted path.
|
|
105
|
+
// Previously these were `null`, which silently skipped lifecycle ops
|
|
106
|
+
// against home-deployed project-local bundles (OpenClaw, Hermes).
|
|
107
|
+
const PROVIDER_PREFIX = {
|
|
108
|
+
claude: '.claude',
|
|
109
|
+
cursor: '.cursor',
|
|
110
|
+
factory: '.factory',
|
|
111
|
+
opencode: '.opencode',
|
|
112
|
+
windsurf: '.windsurf',
|
|
113
|
+
warp: '.warp',
|
|
114
|
+
codex: '.codex',
|
|
115
|
+
copilot: '.github', // copilot uses .github/agents, .github/instructions, .github/skills
|
|
116
|
+
openclaw: resolve(homedir(), '.openclaw'),
|
|
117
|
+
hermes: resolve(homedir(), '.hermes'),
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Translate a source-relative artifact path to the provider's deploy path,
|
|
121
|
+
* relative to the project (or HOME) root. Returns null when the provider
|
|
122
|
+
* is HOME-deploying (revert from HOME is out of scope for this iteration).
|
|
123
|
+
*
|
|
124
|
+
* For most providers this is a 1:1 mapping (rules/x.md → .{p}/rules/x.md).
|
|
125
|
+
*/
|
|
126
|
+
function deployedPathFor(provider, sourceRel) {
|
|
127
|
+
const prefix = PROVIDER_PREFIX[provider];
|
|
128
|
+
if (!prefix)
|
|
129
|
+
return null;
|
|
130
|
+
// Some providers rename rules to .mdc (cursor); revert checks both.
|
|
131
|
+
return `${prefix}/${sourceRel}`;
|
|
132
|
+
}
|
|
133
|
+
/** Try multiple plausible deployed paths (e.g., .md vs .mdc for rules). */
|
|
134
|
+
function candidateDeployedPaths(provider, sourceRel) {
|
|
135
|
+
const paths = [];
|
|
136
|
+
const main = deployedPathFor(provider, sourceRel);
|
|
137
|
+
if (main)
|
|
138
|
+
paths.push(main);
|
|
139
|
+
// Cursor rule rename
|
|
140
|
+
if (provider === 'cursor' && sourceRel.startsWith('rules/') && sourceRel.endsWith('.md')) {
|
|
141
|
+
paths.push(`.cursor/${sourceRel.slice(0, -3)}.mdc`);
|
|
142
|
+
}
|
|
143
|
+
return paths;
|
|
144
|
+
}
|
|
145
|
+
async function tryUnlink(absPath) {
|
|
146
|
+
try {
|
|
147
|
+
await unlink(absPath);
|
|
148
|
+
return { deleted: true };
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const e = err;
|
|
152
|
+
if (e.code === 'ENOENT')
|
|
153
|
+
return { deleted: false };
|
|
154
|
+
if (e.code === 'EACCES' || e.code === 'EROFS')
|
|
155
|
+
return { deleted: false, permission: true };
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function classify(expectedHash, absPath) {
|
|
160
|
+
if (!expectedHash)
|
|
161
|
+
return 'unhashed';
|
|
162
|
+
try {
|
|
163
|
+
await lstat(absPath);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (err.code === 'ENOENT')
|
|
167
|
+
return 'missing';
|
|
168
|
+
return 'missing';
|
|
169
|
+
}
|
|
170
|
+
let actual;
|
|
171
|
+
try {
|
|
172
|
+
actual = await sha256Hex(absPath);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err.code === 'EACCES')
|
|
176
|
+
return 'permission';
|
|
177
|
+
return 'missing';
|
|
178
|
+
}
|
|
179
|
+
if (actual === expectedHash)
|
|
180
|
+
return 'pristine';
|
|
181
|
+
// Mutated vs replaced — detection requires reading the file's frontmatter
|
|
182
|
+
// id and comparing to the bundle's artifact id. For this iteration we
|
|
183
|
+
// conservatively treat all hash-differs as 'mutated'; the design's case-4
|
|
184
|
+
// ("replaced by another bundle's artifact") is detected by registry-level
|
|
185
|
+
// ownership lookup (see resolveOwnership below) rather than per-file id.
|
|
186
|
+
return 'mutated';
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Look up which other installed bundle (if any) records this deployed-path
|
|
190
|
+
* in its own registry entry. If found, the file belongs to another bundle —
|
|
191
|
+
* Case 4 (replaced).
|
|
192
|
+
*/
|
|
193
|
+
function resolveOwnership(config, selfBundleId, provider, sourceRel) {
|
|
194
|
+
for (const [name, entry] of Object.entries(config.installed)) {
|
|
195
|
+
if (name === selfBundleId)
|
|
196
|
+
continue;
|
|
197
|
+
if (entry.source !== 'project-local')
|
|
198
|
+
continue;
|
|
199
|
+
if (!entry.artifactHashes)
|
|
200
|
+
continue;
|
|
201
|
+
if (sourceRel in entry.artifactHashes) {
|
|
202
|
+
// Same source-rel path claimed by another project-local bundle —
|
|
203
|
+
// the deployed file (if present) is theirs, not ours.
|
|
204
|
+
void provider;
|
|
205
|
+
return name;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Remove a project-local bundle's deploys per the design at
|
|
212
|
+
* `.aiwg/architecture/design-aiwg-remove-revert.md`.
|
|
213
|
+
*
|
|
214
|
+
* Pure function over (config, projectDir, opts). The caller is responsible
|
|
215
|
+
* for persisting the returned (mutated) config.
|
|
216
|
+
*/
|
|
217
|
+
export async function removeProjectLocalBundle(config, projectDir, bundleId, opts = {}) {
|
|
218
|
+
const entry = config.installed[bundleId];
|
|
219
|
+
const isProjectLocal = entry !== undefined && entry.source === 'project-local';
|
|
220
|
+
if (!isProjectLocal) {
|
|
221
|
+
return {
|
|
222
|
+
found: false,
|
|
223
|
+
outcomes: [],
|
|
224
|
+
revertedProviders: [],
|
|
225
|
+
partialProviders: [],
|
|
226
|
+
isProjectLocal: false,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const { force = false, provider: onlyProvider, dryRun = false, keepRegistry = false } = opts;
|
|
230
|
+
const confirmMutation = opts.confirmMutation ?? (async () => false);
|
|
231
|
+
const installedEntry = entry;
|
|
232
|
+
const artifactHashes = installedEntry.artifactHashes ?? {};
|
|
233
|
+
const providers = Object.keys(installedEntry.deployedTo).filter(p => !onlyProvider || p === onlyProvider);
|
|
234
|
+
const outcomes = [];
|
|
235
|
+
const revertedProviders = [];
|
|
236
|
+
const partialProviders = [];
|
|
237
|
+
for (const provider of providers) {
|
|
238
|
+
let providerHadSkip = false;
|
|
239
|
+
for (const sourceRel of Object.keys(artifactHashes)) {
|
|
240
|
+
const owner = resolveOwnership(config, bundleId, provider, sourceRel);
|
|
241
|
+
if (owner) {
|
|
242
|
+
providerHadSkip = true;
|
|
243
|
+
outcomes.push({
|
|
244
|
+
provider,
|
|
245
|
+
artifactPath: sourceRel,
|
|
246
|
+
deployedAbsPath: '(other bundle)',
|
|
247
|
+
case: 'replaced',
|
|
248
|
+
reverted: false,
|
|
249
|
+
message: `owned by '${owner}' — refusing to delete`,
|
|
250
|
+
});
|
|
251
|
+
if (!dryRun) {
|
|
252
|
+
await appendProjectLocalActivity({
|
|
253
|
+
event: 'remove-conflict',
|
|
254
|
+
name: bundleId,
|
|
255
|
+
type: installedEntry.localType ?? 'extension',
|
|
256
|
+
summary: `${provider}:${sourceRel} owned by ${owner}`,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const candidates = candidateDeployedPaths(provider, sourceRel);
|
|
262
|
+
let resolvedAbs = null;
|
|
263
|
+
let detectedCase = 'missing';
|
|
264
|
+
for (const c of candidates) {
|
|
265
|
+
const abs = resolve(projectDir, c);
|
|
266
|
+
const k = await classify(artifactHashes[sourceRel], abs);
|
|
267
|
+
if (k !== 'missing') {
|
|
268
|
+
resolvedAbs = abs;
|
|
269
|
+
detectedCase = k;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (!resolvedAbs) {
|
|
274
|
+
// Pick the first candidate just so the outcome carries a path
|
|
275
|
+
const fallback = candidates[0] ? resolve(projectDir, candidates[0]) : '(unknown)';
|
|
276
|
+
outcomes.push({
|
|
277
|
+
provider,
|
|
278
|
+
artifactPath: sourceRel,
|
|
279
|
+
deployedAbsPath: fallback,
|
|
280
|
+
case: 'missing',
|
|
281
|
+
reverted: false,
|
|
282
|
+
message: 'already absent',
|
|
283
|
+
});
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
// Cases
|
|
287
|
+
if (detectedCase === 'pristine') {
|
|
288
|
+
if (dryRun) {
|
|
289
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'pristine', reverted: false, message: '[dry-run] would revert' });
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const r = await tryUnlink(resolvedAbs);
|
|
293
|
+
if (r.permission) {
|
|
294
|
+
providerHadSkip = true;
|
|
295
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'permission', reverted: false, message: 'permission denied' });
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'pristine', reverted: r.deleted, message: r.deleted ? 'reverted' : 'already absent' });
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
if (detectedCase === 'mutated' || detectedCase === 'unhashed') {
|
|
304
|
+
const allowDelete = force || (await confirmMutation({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: 'mutation detected' }));
|
|
305
|
+
if (!allowDelete) {
|
|
306
|
+
providerHadSkip = true;
|
|
307
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: 'mutation skipped (--force to override)' });
|
|
308
|
+
if (!dryRun) {
|
|
309
|
+
await appendProjectLocalActivity({
|
|
310
|
+
event: 'remove-mutated',
|
|
311
|
+
name: bundleId,
|
|
312
|
+
type: installedEntry.localType ?? 'extension',
|
|
313
|
+
summary: `${provider}:${sourceRel} skipped`,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (dryRun) {
|
|
319
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: false, message: '[dry-run] would revert (mutation override)' });
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
const r = await tryUnlink(resolvedAbs);
|
|
323
|
+
if (r.permission) {
|
|
324
|
+
providerHadSkip = true;
|
|
325
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: 'permission', reverted: false, message: 'permission denied' });
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
outcomes.push({ provider, artifactPath: sourceRel, deployedAbsPath: resolvedAbs, case: detectedCase, reverted: r.deleted, message: r.deleted ? 'reverted (mutation overridden)' : 'already absent' });
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (providerHadSkip) {
|
|
333
|
+
partialProviders.push(provider);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
revertedProviders.push(provider);
|
|
337
|
+
}
|
|
338
|
+
// Mutate registry for fully-reverted providers
|
|
339
|
+
if (!dryRun && !keepRegistry && !providerHadSkip) {
|
|
340
|
+
delete installedEntry.deployedTo[provider];
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Top-level remove activity entry
|
|
344
|
+
if (!dryRun) {
|
|
345
|
+
const summary = providers
|
|
346
|
+
.map(p => {
|
|
347
|
+
const reverted = outcomes.filter(o => o.provider === p && o.reverted).length;
|
|
348
|
+
const skipped = outcomes.filter(o => o.provider === p && !o.reverted).length;
|
|
349
|
+
return `${p}=${reverted} reverted${skipped > 0 ? `, ${skipped} skipped` : ''}`;
|
|
350
|
+
})
|
|
351
|
+
.join(', ');
|
|
352
|
+
await appendProjectLocalActivity({
|
|
353
|
+
event: force ? 'remove-force' : 'remove',
|
|
354
|
+
name: bundleId,
|
|
355
|
+
type: installedEntry.localType ?? 'extension',
|
|
356
|
+
summary,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
// Drop the entire `installed` entry only when every provider fully reverted
|
|
360
|
+
if (!dryRun && !keepRegistry && Object.keys(installedEntry.deployedTo).length === 0) {
|
|
361
|
+
delete config.installed[bundleId];
|
|
362
|
+
}
|
|
363
|
+
// Note: source under .aiwg/<type>/<name>/ is NEVER touched.
|
|
364
|
+
void relative;
|
|
365
|
+
return {
|
|
366
|
+
found: true,
|
|
367
|
+
outcomes,
|
|
368
|
+
revertedProviders,
|
|
369
|
+
partialProviders,
|
|
370
|
+
isProjectLocal: true,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=project-local-remove.js.map
|