@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,821 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkspaceMigrator - Migrate legacy .aiwg/ workspaces to framework-scoped structure
|
|
3
|
+
*
|
|
4
|
+
* Migrates legacy workspace structure (.aiwg/intake/, .aiwg/requirements/, etc.)
|
|
5
|
+
* to framework-scoped structure (.aiwg/frameworks/{framework-id}/projects/{project-id}/).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Detection of legacy workspace structure
|
|
9
|
+
* - Framework detection from artifact patterns
|
|
10
|
+
* - Validation of migration safety (conflict detection)
|
|
11
|
+
* - Atomic migration with rollback capability
|
|
12
|
+
* - Backup creation before migration
|
|
13
|
+
* - Dry-run mode for simulation
|
|
14
|
+
* - Detailed migration reports
|
|
15
|
+
*
|
|
16
|
+
* @module src/plugin/workspace-migrator
|
|
17
|
+
* @version 1.0.0
|
|
18
|
+
* @since 2025-10-23
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const migrator = new WorkspaceMigrator('/path/to/project');
|
|
23
|
+
* await migrator.initialize();
|
|
24
|
+
*
|
|
25
|
+
* // Detect legacy workspace
|
|
26
|
+
* const legacy = await migrator.detectLegacyWorkspace();
|
|
27
|
+
* if (legacy) {
|
|
28
|
+
* console.log(`Found legacy workspace with ${legacy.artifactCount} artifacts`);
|
|
29
|
+
*
|
|
30
|
+
* // Detect frameworks
|
|
31
|
+
* const frameworks = await migrator.detectFrameworks();
|
|
32
|
+
* console.log(`Detected frameworks: ${frameworks.map(f => f.name).join(', ')}`);
|
|
33
|
+
*
|
|
34
|
+
* // Validate migration
|
|
35
|
+
* const validation = await migrator.validateMigration({
|
|
36
|
+
* sourcePath: legacy.path,
|
|
37
|
+
* targetPath: `.aiwg/frameworks/${frameworks[0].name}/projects/default`,
|
|
38
|
+
* framework: frameworks[0].name
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* if (validation.safe) {
|
|
42
|
+
* // Perform migration
|
|
43
|
+
* const result = await migrator.migrate({
|
|
44
|
+
* source: legacy.path,
|
|
45
|
+
* target: `.aiwg/frameworks/${frameworks[0].name}/projects/default`,
|
|
46
|
+
* framework: frameworks[0].name,
|
|
47
|
+
* backup: true,
|
|
48
|
+
* dryRun: false,
|
|
49
|
+
* overwrite: false
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* console.log(migrator.generateReport(result));
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
import * as fs from 'fs/promises';
|
|
58
|
+
import * as path from 'path';
|
|
59
|
+
import * as crypto from 'crypto';
|
|
60
|
+
// ===========================
|
|
61
|
+
// WorkspaceMigrator Class
|
|
62
|
+
// ===========================
|
|
63
|
+
export class WorkspaceMigrator {
|
|
64
|
+
projectRoot;
|
|
65
|
+
sandboxPath;
|
|
66
|
+
// Legacy workspace directories
|
|
67
|
+
LEGACY_DIRS = [
|
|
68
|
+
'intake',
|
|
69
|
+
'requirements',
|
|
70
|
+
'architecture',
|
|
71
|
+
'planning',
|
|
72
|
+
'risks',
|
|
73
|
+
'testing',
|
|
74
|
+
'security',
|
|
75
|
+
'quality',
|
|
76
|
+
'deployment',
|
|
77
|
+
'handoffs',
|
|
78
|
+
'gates',
|
|
79
|
+
'decisions',
|
|
80
|
+
'team',
|
|
81
|
+
'working',
|
|
82
|
+
'reports'
|
|
83
|
+
];
|
|
84
|
+
// Framework detection patterns
|
|
85
|
+
FRAMEWORK_PATTERNS = {
|
|
86
|
+
'sdlc-complete': [
|
|
87
|
+
'architecture/software-architecture-doc.md',
|
|
88
|
+
'requirements/use-cases/',
|
|
89
|
+
'testing/master-test-plan.md',
|
|
90
|
+
'deployment/deployment-plan.md'
|
|
91
|
+
],
|
|
92
|
+
'marketing-flow': [
|
|
93
|
+
'campaigns/',
|
|
94
|
+
'content/',
|
|
95
|
+
'analytics/'
|
|
96
|
+
],
|
|
97
|
+
'agile-complete': [
|
|
98
|
+
'backlog/',
|
|
99
|
+
'sprints/',
|
|
100
|
+
'retrospectives/'
|
|
101
|
+
]
|
|
102
|
+
};
|
|
103
|
+
constructor(projectRoot) {
|
|
104
|
+
this.projectRoot = path.resolve(projectRoot);
|
|
105
|
+
this.sandboxPath = path.join(this.projectRoot, '.aiwg');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Initialize the migrator
|
|
109
|
+
*/
|
|
110
|
+
async initialize() {
|
|
111
|
+
// Verify project root exists
|
|
112
|
+
try {
|
|
113
|
+
await fs.access(this.projectRoot);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
throw new Error(`Project root does not exist: ${this.projectRoot}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ===========================
|
|
120
|
+
// Detection Methods
|
|
121
|
+
// ===========================
|
|
122
|
+
/**
|
|
123
|
+
* Detect legacy workspace structure
|
|
124
|
+
*
|
|
125
|
+
* Returns information about legacy workspace if found, null otherwise.
|
|
126
|
+
*
|
|
127
|
+
* @returns Legacy workspace info or null if not found
|
|
128
|
+
*/
|
|
129
|
+
async detectLegacyWorkspace() {
|
|
130
|
+
const legacyPath = this.sandboxPath;
|
|
131
|
+
try {
|
|
132
|
+
await fs.access(legacyPath);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null; // No .aiwg directory exists
|
|
136
|
+
}
|
|
137
|
+
// Check for legacy directory structure (intake, requirements, etc.)
|
|
138
|
+
const foundDirs = [];
|
|
139
|
+
let artifactCount = 0;
|
|
140
|
+
let totalSize = 0;
|
|
141
|
+
for (const dir of this.LEGACY_DIRS) {
|
|
142
|
+
const dirPath = path.join(legacyPath, dir);
|
|
143
|
+
try {
|
|
144
|
+
const stat = await fs.stat(dirPath);
|
|
145
|
+
if (stat.isDirectory()) {
|
|
146
|
+
foundDirs.push(dir);
|
|
147
|
+
const dirInfo = await this.getDirectoryInfo(dirPath);
|
|
148
|
+
artifactCount += dirInfo.fileCount;
|
|
149
|
+
totalSize += dirInfo.size;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Directory doesn't exist, skip
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// If no legacy directories found, not a legacy workspace
|
|
157
|
+
if (foundDirs.length === 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
// Check for git repository
|
|
161
|
+
const hasGit = await this.hasGitRepo(legacyPath);
|
|
162
|
+
// Detect frameworks
|
|
163
|
+
const frameworks = await this.detectFrameworksFromArtifacts(legacyPath);
|
|
164
|
+
return {
|
|
165
|
+
path: legacyPath,
|
|
166
|
+
artifactCount,
|
|
167
|
+
frameworks,
|
|
168
|
+
size: totalSize,
|
|
169
|
+
hasGit
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Detect frameworks from artifact structure
|
|
174
|
+
*
|
|
175
|
+
* Analyzes artifact patterns to identify which frameworks are in use.
|
|
176
|
+
*
|
|
177
|
+
* @returns Array of detected frameworks
|
|
178
|
+
*/
|
|
179
|
+
async detectFrameworks() {
|
|
180
|
+
const legacyPath = this.sandboxPath;
|
|
181
|
+
const frameworks = [];
|
|
182
|
+
for (const [frameworkName, patterns] of Object.entries(this.FRAMEWORK_PATTERNS)) {
|
|
183
|
+
let matchCount = 0;
|
|
184
|
+
let artifactCount = 0;
|
|
185
|
+
for (const pattern of patterns) {
|
|
186
|
+
const fullPath = path.join(legacyPath, pattern);
|
|
187
|
+
try {
|
|
188
|
+
const stat = await fs.stat(fullPath);
|
|
189
|
+
if (stat.isFile() || stat.isDirectory()) {
|
|
190
|
+
matchCount++;
|
|
191
|
+
if (stat.isDirectory()) {
|
|
192
|
+
const dirInfo = await this.getDirectoryInfo(fullPath);
|
|
193
|
+
artifactCount += dirInfo.fileCount;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
artifactCount++;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// Pattern doesn't match, continue
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// If at least 50% of patterns match, framework is detected
|
|
205
|
+
if (matchCount >= patterns.length * 0.5) {
|
|
206
|
+
frameworks.push({
|
|
207
|
+
name: frameworkName,
|
|
208
|
+
path: path.join(this.sandboxPath, 'frameworks', frameworkName, 'projects', 'default'),
|
|
209
|
+
artifactCount
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// If no frameworks detected, default to sdlc-complete
|
|
214
|
+
if (frameworks.length === 0) {
|
|
215
|
+
const dirInfo = await this.getDirectoryInfo(legacyPath);
|
|
216
|
+
frameworks.push({
|
|
217
|
+
name: 'sdlc-complete',
|
|
218
|
+
path: path.join(this.sandboxPath, 'frameworks', 'sdlc-complete', 'projects', 'default'),
|
|
219
|
+
artifactCount: dirInfo.fileCount
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return frameworks;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Detect frameworks from artifacts (internal helper)
|
|
226
|
+
*
|
|
227
|
+
* @param basePath - Base path to search
|
|
228
|
+
* @returns Array of framework names
|
|
229
|
+
*/
|
|
230
|
+
async detectFrameworksFromArtifacts(basePath) {
|
|
231
|
+
const frameworks = [];
|
|
232
|
+
for (const [frameworkName, patterns] of Object.entries(this.FRAMEWORK_PATTERNS)) {
|
|
233
|
+
let matchCount = 0;
|
|
234
|
+
for (const pattern of patterns) {
|
|
235
|
+
const fullPath = path.join(basePath, pattern);
|
|
236
|
+
try {
|
|
237
|
+
await fs.access(fullPath);
|
|
238
|
+
matchCount++;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Pattern doesn't match
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// If at least 50% of patterns match, framework is detected
|
|
245
|
+
if (matchCount >= patterns.length * 0.5) {
|
|
246
|
+
frameworks.push(frameworkName);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Default to sdlc-complete if nothing detected
|
|
250
|
+
if (frameworks.length === 0) {
|
|
251
|
+
frameworks.push('sdlc-complete');
|
|
252
|
+
}
|
|
253
|
+
return frameworks;
|
|
254
|
+
}
|
|
255
|
+
// ===========================
|
|
256
|
+
// Validation Methods
|
|
257
|
+
// ===========================
|
|
258
|
+
/**
|
|
259
|
+
* Validate migration safety
|
|
260
|
+
*
|
|
261
|
+
* Checks for conflicts, permission issues, and estimates duration.
|
|
262
|
+
*
|
|
263
|
+
* @param target - Migration target configuration
|
|
264
|
+
* @returns Validation result
|
|
265
|
+
*/
|
|
266
|
+
async validateMigration(target) {
|
|
267
|
+
const warnings = [];
|
|
268
|
+
const conflicts = [];
|
|
269
|
+
// Check source exists
|
|
270
|
+
try {
|
|
271
|
+
await fs.access(target.sourcePath);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return {
|
|
275
|
+
safe: false,
|
|
276
|
+
warnings: [`Source path does not exist: ${target.sourcePath}`],
|
|
277
|
+
conflicts: [],
|
|
278
|
+
estimatedDuration: 0
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
// Check target doesn't already exist (unless overwrite is allowed)
|
|
282
|
+
try {
|
|
283
|
+
await fs.access(target.targetPath);
|
|
284
|
+
warnings.push(`Target path already exists: ${target.targetPath}`);
|
|
285
|
+
// Check for file conflicts
|
|
286
|
+
const sourceFiles = await this.listFilesRecursive(target.sourcePath);
|
|
287
|
+
for (const relPath of sourceFiles) {
|
|
288
|
+
const targetFile = path.join(target.targetPath, relPath);
|
|
289
|
+
try {
|
|
290
|
+
await fs.access(targetFile);
|
|
291
|
+
conflicts.push({
|
|
292
|
+
type: 'file',
|
|
293
|
+
path: relPath,
|
|
294
|
+
description: 'File exists in target directory',
|
|
295
|
+
resolution: 'overwrite'
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// No conflict
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
// Target doesn't exist, good
|
|
305
|
+
}
|
|
306
|
+
// Check permissions
|
|
307
|
+
const permissionIssues = await this.checkPermissions(target.sourcePath);
|
|
308
|
+
for (const issue of permissionIssues) {
|
|
309
|
+
conflicts.push({
|
|
310
|
+
type: 'permission',
|
|
311
|
+
path: issue,
|
|
312
|
+
description: 'Permission denied',
|
|
313
|
+
resolution: 'manual'
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
// Estimate duration (1ms per file + 100ms overhead)
|
|
317
|
+
const sourceFiles = await this.listFilesRecursive(target.sourcePath);
|
|
318
|
+
const estimatedDuration = Math.ceil((sourceFiles.length + 100) / 1000);
|
|
319
|
+
const safe = conflicts.filter(c => c.resolution === 'manual').length === 0;
|
|
320
|
+
return {
|
|
321
|
+
safe,
|
|
322
|
+
warnings,
|
|
323
|
+
conflicts,
|
|
324
|
+
estimatedDuration
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Check for conflicts between source and target
|
|
329
|
+
*
|
|
330
|
+
* @param source - Source directory path
|
|
331
|
+
* @param target - Target directory path
|
|
332
|
+
* @returns Array of conflicts
|
|
333
|
+
*/
|
|
334
|
+
async checkConflicts(source, target) {
|
|
335
|
+
const conflicts = [];
|
|
336
|
+
try {
|
|
337
|
+
await fs.access(target);
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Target doesn't exist, no conflicts
|
|
341
|
+
return conflicts;
|
|
342
|
+
}
|
|
343
|
+
const sourceFiles = await this.listFilesRecursive(source);
|
|
344
|
+
for (const relPath of sourceFiles) {
|
|
345
|
+
const targetFile = path.join(target, relPath);
|
|
346
|
+
try {
|
|
347
|
+
await fs.access(targetFile);
|
|
348
|
+
conflicts.push({
|
|
349
|
+
type: 'file',
|
|
350
|
+
path: relPath,
|
|
351
|
+
description: 'File exists in target directory',
|
|
352
|
+
resolution: 'overwrite'
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
// No conflict
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return conflicts;
|
|
360
|
+
}
|
|
361
|
+
// ===========================
|
|
362
|
+
// Migration Methods
|
|
363
|
+
// ===========================
|
|
364
|
+
/**
|
|
365
|
+
* Perform workspace migration
|
|
366
|
+
*
|
|
367
|
+
* Migrates legacy workspace to framework-scoped structure.
|
|
368
|
+
* Supports dry-run mode, backup creation, and atomic operations.
|
|
369
|
+
*
|
|
370
|
+
* @param options - Migration options
|
|
371
|
+
* @returns Migration result
|
|
372
|
+
*/
|
|
373
|
+
async migrate(options) {
|
|
374
|
+
const startTime = Date.now();
|
|
375
|
+
const migrationId = this.generateMigrationId();
|
|
376
|
+
const errors = [];
|
|
377
|
+
let filesMovedCount = 0;
|
|
378
|
+
let filesCopiedCount = 0;
|
|
379
|
+
let filesSkippedCount = 0;
|
|
380
|
+
let backupPath;
|
|
381
|
+
try {
|
|
382
|
+
// Validate source exists
|
|
383
|
+
try {
|
|
384
|
+
await fs.access(options.source);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
throw new Error(`Source path does not exist: ${options.source}`);
|
|
388
|
+
}
|
|
389
|
+
// Create backup if requested
|
|
390
|
+
if (options.backup && !options.dryRun) {
|
|
391
|
+
backupPath = await this.createBackup(options.source, migrationId);
|
|
392
|
+
}
|
|
393
|
+
// Get list of files to migrate
|
|
394
|
+
const sourceFiles = await this.listFilesRecursive(options.source);
|
|
395
|
+
// Filter out framework and registry directories (shouldn't be in legacy workspace)
|
|
396
|
+
const filesToMigrate = sourceFiles.filter((filePath) => {
|
|
397
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
398
|
+
return !normalizedPath.startsWith('frameworks/') &&
|
|
399
|
+
normalizedPath !== 'frameworks' &&
|
|
400
|
+
!normalizedPath.startsWith('backups/') &&
|
|
401
|
+
normalizedPath !== 'backups';
|
|
402
|
+
});
|
|
403
|
+
// Dry-run mode: simulate without actual changes
|
|
404
|
+
if (options.dryRun) {
|
|
405
|
+
for (const relPath of filesToMigrate) {
|
|
406
|
+
const targetPath = path.join(options.target, relPath);
|
|
407
|
+
try {
|
|
408
|
+
await fs.access(targetPath);
|
|
409
|
+
if (options.overwrite) {
|
|
410
|
+
filesCopiedCount++;
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
filesSkippedCount++;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
filesCopiedCount++;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
// Actual migration
|
|
423
|
+
// Create target directory
|
|
424
|
+
await fs.mkdir(options.target, { recursive: true });
|
|
425
|
+
// Migrate each file
|
|
426
|
+
for (const relPath of filesToMigrate) {
|
|
427
|
+
const sourcePath = path.join(options.source, relPath);
|
|
428
|
+
const targetPath = path.join(options.target, relPath);
|
|
429
|
+
try {
|
|
430
|
+
// Check if target exists
|
|
431
|
+
let targetExists = false;
|
|
432
|
+
try {
|
|
433
|
+
await fs.access(targetPath);
|
|
434
|
+
targetExists = true;
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
// Target doesn't exist
|
|
438
|
+
}
|
|
439
|
+
if (targetExists && !options.overwrite) {
|
|
440
|
+
filesSkippedCount++;
|
|
441
|
+
errors.push({
|
|
442
|
+
path: relPath,
|
|
443
|
+
error: 'Target file exists, skipped (overwrite=false)',
|
|
444
|
+
severity: 'warning'
|
|
445
|
+
});
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
// Create target directory
|
|
449
|
+
const targetDir = path.dirname(targetPath);
|
|
450
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
451
|
+
// Copy file
|
|
452
|
+
await fs.copyFile(sourcePath, targetPath);
|
|
453
|
+
filesCopiedCount++;
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
errors.push({
|
|
457
|
+
path: relPath,
|
|
458
|
+
error: error.message,
|
|
459
|
+
severity: 'error'
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
const copyErrors = errors.filter(error => error.severity === 'error');
|
|
464
|
+
if (copyErrors.length > 0) {
|
|
465
|
+
throw new Error(`Failed to copy ${copyErrors.length} migration file(s)`);
|
|
466
|
+
}
|
|
467
|
+
// Update registry. A registry failure is fatal because a copied
|
|
468
|
+
// workspace without matching registry state is only partially migrated.
|
|
469
|
+
await this.updateRegistry(options.framework, migrationId);
|
|
470
|
+
}
|
|
471
|
+
const duration = Date.now() - startTime;
|
|
472
|
+
return {
|
|
473
|
+
id: migrationId,
|
|
474
|
+
success: !errors.some(e => e.severity === 'error' || e.severity === 'critical'),
|
|
475
|
+
filesMovedCount,
|
|
476
|
+
filesCopiedCount,
|
|
477
|
+
filesSkippedCount,
|
|
478
|
+
errors,
|
|
479
|
+
duration,
|
|
480
|
+
backupPath
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
const duration = Date.now() - startTime;
|
|
485
|
+
if (backupPath) {
|
|
486
|
+
try {
|
|
487
|
+
await this.restoreBackup(backupPath);
|
|
488
|
+
}
|
|
489
|
+
catch (rollbackError) {
|
|
490
|
+
errors.push({
|
|
491
|
+
path: backupPath,
|
|
492
|
+
error: `Automatic rollback failed: ${rollbackError.message}`,
|
|
493
|
+
severity: 'critical'
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return {
|
|
498
|
+
id: migrationId,
|
|
499
|
+
success: false,
|
|
500
|
+
filesMovedCount,
|
|
501
|
+
filesCopiedCount,
|
|
502
|
+
filesSkippedCount,
|
|
503
|
+
errors: [
|
|
504
|
+
...errors,
|
|
505
|
+
{
|
|
506
|
+
path: options.source,
|
|
507
|
+
error: error.message,
|
|
508
|
+
severity: 'critical'
|
|
509
|
+
}
|
|
510
|
+
],
|
|
511
|
+
duration,
|
|
512
|
+
backupPath
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Rollback migration
|
|
518
|
+
*
|
|
519
|
+
* Restores workspace from backup created during migration.
|
|
520
|
+
*
|
|
521
|
+
* @param migrationId - Migration ID to rollback
|
|
522
|
+
*/
|
|
523
|
+
async rollback(migrationId) {
|
|
524
|
+
const externalBackupPath = `${this.sandboxPath}.backup.${migrationId}`;
|
|
525
|
+
const legacyInternalBackupPath = path.join(this.sandboxPath, 'backups', migrationId);
|
|
526
|
+
let backupPath = externalBackupPath;
|
|
527
|
+
try {
|
|
528
|
+
await fs.access(backupPath);
|
|
529
|
+
}
|
|
530
|
+
catch {
|
|
531
|
+
try {
|
|
532
|
+
await fs.access(legacyInternalBackupPath);
|
|
533
|
+
// Preserve legacy internal backups outside .aiwg before replacing the
|
|
534
|
+
// workspace that currently contains them.
|
|
535
|
+
await fs.rm(externalBackupPath, { recursive: true, force: true });
|
|
536
|
+
await fs.cp(legacyInternalBackupPath, externalBackupPath, { recursive: true });
|
|
537
|
+
backupPath = externalBackupPath;
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
throw new Error(`Backup not found for migration ID: ${migrationId}`);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
await this.restoreBackup(backupPath);
|
|
544
|
+
}
|
|
545
|
+
// ===========================
|
|
546
|
+
// Reporting Methods
|
|
547
|
+
// ===========================
|
|
548
|
+
/**
|
|
549
|
+
* Generate migration report
|
|
550
|
+
*
|
|
551
|
+
* Creates human-readable migration report with statistics and errors.
|
|
552
|
+
*
|
|
553
|
+
* @param result - Migration result
|
|
554
|
+
* @returns Formatted report string
|
|
555
|
+
*/
|
|
556
|
+
generateReport(result) {
|
|
557
|
+
const lines = [];
|
|
558
|
+
lines.push('Migration Report');
|
|
559
|
+
lines.push('='.repeat(80));
|
|
560
|
+
lines.push('');
|
|
561
|
+
lines.push(`Migration ID: ${result.id}`);
|
|
562
|
+
lines.push(`Status: ${result.success ? '✓ SUCCESS' : '❌ FAILED'}`);
|
|
563
|
+
lines.push(`Duration: ${result.duration}ms`);
|
|
564
|
+
lines.push('');
|
|
565
|
+
lines.push('Statistics:');
|
|
566
|
+
lines.push(` Files Moved: ${result.filesMovedCount}`);
|
|
567
|
+
lines.push(` Files Copied: ${result.filesCopiedCount}`);
|
|
568
|
+
lines.push(` Files Skipped: ${result.filesSkippedCount}`);
|
|
569
|
+
lines.push('');
|
|
570
|
+
if (result.backupPath) {
|
|
571
|
+
lines.push(`Backup Created: ${result.backupPath}`);
|
|
572
|
+
lines.push('');
|
|
573
|
+
}
|
|
574
|
+
if (result.errors.length > 0) {
|
|
575
|
+
lines.push('Errors:');
|
|
576
|
+
result.errors.forEach((error, index) => {
|
|
577
|
+
const icon = error.severity === 'critical' ? '❌' :
|
|
578
|
+
error.severity === 'error' ? '⚠️' : 'ℹ️';
|
|
579
|
+
lines.push(` ${index + 1}. ${icon} [${error.severity.toUpperCase()}] ${error.path}`);
|
|
580
|
+
lines.push(` ${error.error}`);
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
lines.push('No errors encountered.');
|
|
585
|
+
}
|
|
586
|
+
return lines.join('\n');
|
|
587
|
+
}
|
|
588
|
+
// ===========================
|
|
589
|
+
// Helper Methods
|
|
590
|
+
// ===========================
|
|
591
|
+
/**
|
|
592
|
+
* Get directory information (file count and size)
|
|
593
|
+
*/
|
|
594
|
+
async getDirectoryInfo(dirPath) {
|
|
595
|
+
let fileCount = 0;
|
|
596
|
+
let size = 0;
|
|
597
|
+
try {
|
|
598
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
599
|
+
for (const entry of entries) {
|
|
600
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
601
|
+
if (entry.isDirectory()) {
|
|
602
|
+
const subInfo = await this.getDirectoryInfo(fullPath);
|
|
603
|
+
fileCount += subInfo.fileCount;
|
|
604
|
+
size += subInfo.size;
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
fileCount++;
|
|
608
|
+
const stat = await fs.stat(fullPath);
|
|
609
|
+
size += stat.size;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
catch {
|
|
614
|
+
// Permission denied or doesn't exist
|
|
615
|
+
}
|
|
616
|
+
return { fileCount, size };
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Check if directory has git repository
|
|
620
|
+
*/
|
|
621
|
+
async hasGitRepo(dirPath) {
|
|
622
|
+
const gitPath = path.join(dirPath, '.git');
|
|
623
|
+
try {
|
|
624
|
+
await fs.access(gitPath);
|
|
625
|
+
return true;
|
|
626
|
+
}
|
|
627
|
+
catch {
|
|
628
|
+
return false;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* List all files recursively
|
|
633
|
+
*/
|
|
634
|
+
async listFilesRecursive(dirPath) {
|
|
635
|
+
const files = [];
|
|
636
|
+
const walk = async (currentPath, relativePath = '') => {
|
|
637
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
638
|
+
for (const entry of entries) {
|
|
639
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
640
|
+
const relPath = path.join(relativePath, entry.name);
|
|
641
|
+
if (entry.isDirectory()) {
|
|
642
|
+
await walk(fullPath, relPath);
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
files.push(relPath);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
await walk(dirPath);
|
|
650
|
+
return files;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Check permissions for all files in directory
|
|
654
|
+
*/
|
|
655
|
+
async checkPermissions(dirPath) {
|
|
656
|
+
const issues = [];
|
|
657
|
+
const walk = async (currentPath, relativePath = '') => {
|
|
658
|
+
try {
|
|
659
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true });
|
|
660
|
+
for (const entry of entries) {
|
|
661
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
662
|
+
const relPath = path.join(relativePath, entry.name);
|
|
663
|
+
try {
|
|
664
|
+
await fs.access(fullPath, fs.constants.R_OK);
|
|
665
|
+
}
|
|
666
|
+
catch {
|
|
667
|
+
issues.push(relPath);
|
|
668
|
+
}
|
|
669
|
+
if (entry.isDirectory()) {
|
|
670
|
+
await walk(fullPath, relPath);
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
catch {
|
|
675
|
+
issues.push(relativePath);
|
|
676
|
+
}
|
|
677
|
+
};
|
|
678
|
+
await walk(dirPath);
|
|
679
|
+
return issues;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Create backup of workspace
|
|
683
|
+
*/
|
|
684
|
+
async createBackup(sourcePath, migrationId) {
|
|
685
|
+
const backupPath = `${sourcePath}.backup.${migrationId}`;
|
|
686
|
+
const files = await this.listFilesRecursive(sourcePath);
|
|
687
|
+
await fs.mkdir(backupPath, { recursive: true });
|
|
688
|
+
for (const relPath of files) {
|
|
689
|
+
const source = path.join(sourcePath, relPath);
|
|
690
|
+
const target = path.join(backupPath, relPath);
|
|
691
|
+
// Create target directory
|
|
692
|
+
const targetDir = path.dirname(target);
|
|
693
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
694
|
+
// Copy file
|
|
695
|
+
await fs.copyFile(source, target);
|
|
696
|
+
}
|
|
697
|
+
const sourceInfo = await this.getDirectoryInfo(sourcePath);
|
|
698
|
+
const manifest = {
|
|
699
|
+
timestamp: new Date().toISOString(),
|
|
700
|
+
sourcePath,
|
|
701
|
+
backupPath,
|
|
702
|
+
checksum: await this.computeDirectoryChecksum(backupPath),
|
|
703
|
+
fileCount: files.length,
|
|
704
|
+
totalSize: sourceInfo.size,
|
|
705
|
+
migrationId
|
|
706
|
+
};
|
|
707
|
+
await fs.writeFile(path.join(backupPath, 'migration-manifest.json'), JSON.stringify(manifest, null, 2));
|
|
708
|
+
return backupPath;
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Replace the current workspace with a preserved backup.
|
|
712
|
+
*/
|
|
713
|
+
async restoreBackup(backupPath) {
|
|
714
|
+
const files = (await this.listFilesRecursive(backupPath))
|
|
715
|
+
.filter(relPath => relPath.replace(/\\/g, '/') !== 'migration-manifest.json');
|
|
716
|
+
await fs.rm(this.sandboxPath, { recursive: true, force: true });
|
|
717
|
+
await fs.mkdir(this.sandboxPath, { recursive: true });
|
|
718
|
+
for (const relPath of files) {
|
|
719
|
+
const sourcePath = path.join(backupPath, relPath);
|
|
720
|
+
const targetPath = path.join(this.sandboxPath, relPath);
|
|
721
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
722
|
+
await fs.copyFile(sourcePath, targetPath);
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Compute a stable content checksum, excluding backup metadata.
|
|
727
|
+
*/
|
|
728
|
+
async computeDirectoryChecksum(directory) {
|
|
729
|
+
const files = (await this.listFilesRecursive(directory))
|
|
730
|
+
.filter(relPath => relPath.replace(/\\/g, '/') !== 'migration-manifest.json')
|
|
731
|
+
.sort();
|
|
732
|
+
const hash = crypto.createHash('sha256');
|
|
733
|
+
for (const relPath of files) {
|
|
734
|
+
hash.update(await fs.readFile(path.join(directory, relPath)));
|
|
735
|
+
}
|
|
736
|
+
return hash.digest('hex');
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Update framework registry after migration
|
|
740
|
+
*/
|
|
741
|
+
async updateRegistry(frameworkId, migrationId) {
|
|
742
|
+
const registryPath = path.join(this.sandboxPath, 'frameworks', 'registry.json');
|
|
743
|
+
// Load or create registry. Malformed existing state must fail the
|
|
744
|
+
// migration so the caller can restore the backup atomically.
|
|
745
|
+
let registry;
|
|
746
|
+
try {
|
|
747
|
+
const content = await fs.readFile(registryPath, 'utf-8');
|
|
748
|
+
const parsed = JSON.parse(content);
|
|
749
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
750
|
+
throw new Error('registry root must be an object');
|
|
751
|
+
}
|
|
752
|
+
registry = parsed;
|
|
753
|
+
if (registry.plugins === undefined) {
|
|
754
|
+
registry.plugins = [];
|
|
755
|
+
}
|
|
756
|
+
else if (!Array.isArray(registry.plugins)) {
|
|
757
|
+
throw new Error('registry.plugins must be an array');
|
|
758
|
+
}
|
|
759
|
+
registry.version = typeof registry.version === 'string' ? registry.version : '1.0.0';
|
|
760
|
+
registry.lastModified = typeof registry.lastModified === 'string'
|
|
761
|
+
? registry.lastModified
|
|
762
|
+
: new Date().toISOString();
|
|
763
|
+
}
|
|
764
|
+
catch (error) {
|
|
765
|
+
if (error?.code !== 'ENOENT') {
|
|
766
|
+
throw new Error(`Failed to load registry: ${error.message}`);
|
|
767
|
+
}
|
|
768
|
+
registry = {
|
|
769
|
+
version: '1.0.0',
|
|
770
|
+
lastModified: new Date().toISOString(),
|
|
771
|
+
plugins: []
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
// Check if framework already exists
|
|
775
|
+
const existingIndex = registry.plugins.findIndex(p => p.id === frameworkId);
|
|
776
|
+
const pluginEntry = {
|
|
777
|
+
id: frameworkId,
|
|
778
|
+
type: 'framework',
|
|
779
|
+
name: frameworkId.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
|
780
|
+
version: '1.0.0',
|
|
781
|
+
path: `frameworks/${frameworkId}`,
|
|
782
|
+
installedAt: new Date().toISOString(),
|
|
783
|
+
projects: ['default'],
|
|
784
|
+
health: {
|
|
785
|
+
status: 'healthy',
|
|
786
|
+
lastCheck: new Date().toISOString()
|
|
787
|
+
},
|
|
788
|
+
metadata: {
|
|
789
|
+
migrationId,
|
|
790
|
+
migratedAt: new Date().toISOString()
|
|
791
|
+
}
|
|
792
|
+
};
|
|
793
|
+
if (existingIndex >= 0) {
|
|
794
|
+
// Update existing entry
|
|
795
|
+
registry.plugins[existingIndex] = {
|
|
796
|
+
...registry.plugins[existingIndex],
|
|
797
|
+
...pluginEntry,
|
|
798
|
+
installedAt: registry.plugins[existingIndex].installedAt // Preserve original install date
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
else {
|
|
802
|
+
// Add new entry
|
|
803
|
+
registry.plugins.push(pluginEntry);
|
|
804
|
+
}
|
|
805
|
+
registry.lastModified = new Date().toISOString();
|
|
806
|
+
// Ensure directory exists
|
|
807
|
+
await fs.mkdir(path.dirname(registryPath), { recursive: true });
|
|
808
|
+
// Write registry
|
|
809
|
+
await fs.writeFile(registryPath, JSON.stringify(registry, null, 2));
|
|
810
|
+
console.debug(`[WorkspaceMigrator] Registry updated for framework: ${frameworkId}, migration: ${migrationId}`);
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* Generate unique migration ID
|
|
814
|
+
*/
|
|
815
|
+
generateMigrationId() {
|
|
816
|
+
const timestamp = Date.now();
|
|
817
|
+
const random = crypto.randomBytes(4).toString('hex');
|
|
818
|
+
return `migration-${timestamp}-${random}`;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
//# sourceMappingURL=workspace-migrator.js.map
|