@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Artifact Index Reader
|
|
3
|
+
*
|
|
4
|
+
* Shared utility to load .aiwg/.index/ JSON files.
|
|
5
|
+
* Used by query, deps, and stats commands.
|
|
6
|
+
*
|
|
7
|
+
* @implements #420
|
|
8
|
+
* @source @src/artifacts/types.ts
|
|
9
|
+
* @tests @test/unit/artifacts/index-reader.test.ts
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { getGraphIndexDir, getProjectIndexRoot } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Load a JSON file from the index directory
|
|
16
|
+
*
|
|
17
|
+
* @param cwd - Project root directory
|
|
18
|
+
* @param filename - JSON file to load (e.g. 'metadata.json')
|
|
19
|
+
* @returns Parsed JSON or null if file doesn't exist or is corrupt
|
|
20
|
+
*/
|
|
21
|
+
export function loadIndexFile(cwd, filename) {
|
|
22
|
+
const filePath = path.join(getProjectIndexRoot(cwd), filename);
|
|
23
|
+
if (!fs.existsSync(filePath)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
28
|
+
return JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load the master metadata index
|
|
36
|
+
*/
|
|
37
|
+
export function loadMetadataIndex(cwd) {
|
|
38
|
+
return loadIndexFile(cwd, 'metadata.json');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load the tag reverse index
|
|
42
|
+
*/
|
|
43
|
+
export function loadTagIndex(cwd) {
|
|
44
|
+
return loadIndexFile(cwd, 'tags.json');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load the dependency graph
|
|
48
|
+
*/
|
|
49
|
+
export function loadDependencyGraph(cwd) {
|
|
50
|
+
return loadIndexFile(cwd, 'dependencies.json');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Load the index statistics
|
|
54
|
+
*/
|
|
55
|
+
export function loadIndexStats(cwd) {
|
|
56
|
+
return loadIndexFile(cwd, 'stats.json');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if an index exists
|
|
60
|
+
*/
|
|
61
|
+
export function indexExists(cwd) {
|
|
62
|
+
const metadataPath = path.join(getProjectIndexRoot(cwd), 'metadata.json');
|
|
63
|
+
return fs.existsSync(metadataPath);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Write a JSON file to the index directory atomically
|
|
67
|
+
*
|
|
68
|
+
* Uses write-to-temp + rename for POSIX-safe atomic writes.
|
|
69
|
+
*
|
|
70
|
+
* @param cwd - Project root directory
|
|
71
|
+
* @param filename - JSON file to write
|
|
72
|
+
* @param data - Data to serialize
|
|
73
|
+
* @param indexDir - Override index directory (for multi-graph support)
|
|
74
|
+
*/
|
|
75
|
+
export function writeIndexFile(cwd, filename, data, indexDir) {
|
|
76
|
+
const dirPath = indexDir ?? getProjectIndexRoot(cwd);
|
|
77
|
+
const filePath = path.join(dirPath, filename);
|
|
78
|
+
const tmpPath = `${filePath}.tmp`;
|
|
79
|
+
// Ensure directory exists
|
|
80
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
81
|
+
// Write to temp, then rename (atomic on POSIX)
|
|
82
|
+
fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
83
|
+
fs.renameSync(tmpPath, filePath);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Resolve the index directory for a graph type
|
|
87
|
+
*
|
|
88
|
+
* @param cwd - Project root directory
|
|
89
|
+
* @param graph - Graph type (undefined = default .aiwg/.index/)
|
|
90
|
+
* @returns Absolute path to the index directory
|
|
91
|
+
*/
|
|
92
|
+
export function resolveIndexDir(cwd, graph) {
|
|
93
|
+
if (graph)
|
|
94
|
+
return getGraphIndexDir(cwd, graph);
|
|
95
|
+
return getProjectIndexRoot(cwd);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Load a JSON file from a graph-specific index directory
|
|
99
|
+
*/
|
|
100
|
+
export function loadGraphIndexFile(cwd, filename, graph) {
|
|
101
|
+
const dir = resolveIndexDir(cwd, graph);
|
|
102
|
+
const filePath = path.join(dir, filename);
|
|
103
|
+
if (!fs.existsSync(filePath))
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=index-reader.js.map
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Index-graph registry status + drift surface (#1624).
|
|
3
|
+
*
|
|
4
|
+
* The durable index-graph registry already exists — built-in graphs, module-
|
|
5
|
+
* declared graphs (framework/addon `manifest.json` → `index.graphs`), and
|
|
6
|
+
* operator graphs (`.aiwg/aiwg.config` → `index.graphs`) all compose into
|
|
7
|
+
* `GRAPH_CONFIGS`. But there was no reliable way to answer "which durable
|
|
8
|
+
* indices exist, are they built, are they fresh, and is anything drifting?"
|
|
9
|
+
* `aiwg index stats` is per-graph; nothing enumerated the whole registry.
|
|
10
|
+
*
|
|
11
|
+
* This module is that surface. `collectIndexStatus` is a pure-ish reader (no
|
|
12
|
+
* mutation beyond the unavoidable `loadUserGraphConfigs` registry population)
|
|
13
|
+
* that both `aiwg index status` and the `aiwg doctor` durable-index check
|
|
14
|
+
* consume. `showIndexStatus` renders it (human table or JSON).
|
|
15
|
+
*
|
|
16
|
+
* @implements #1624
|
|
17
|
+
* @source @src/cli/handlers/subcommands.ts
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { GRAPH_CONFIGS, BUILTIN_GRAPH_CONFIGS, getGraphIndexDir, getProjectIndexRoot, loadGlobalGraphConfigs, loadUserGraphConfigs, } from './types.js';
|
|
22
|
+
import { getFortemiCoreSyncStatus, } from './fortemi-core-sync.js';
|
|
23
|
+
function readBuiltMeta(indexDir) {
|
|
24
|
+
try {
|
|
25
|
+
const metaPath = path.join(indexDir, 'metadata.json');
|
|
26
|
+
if (!fs.existsSync(metaPath))
|
|
27
|
+
return { builtAt: null, entries: null };
|
|
28
|
+
const idx = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
|
|
29
|
+
return {
|
|
30
|
+
builtAt: typeof idx.builtAt === 'string' ? idx.builtAt : null,
|
|
31
|
+
entries: idx.entries ? Object.keys(idx.entries).length : 0,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { builtAt: null, entries: null };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Enumerate every registered graph (built-in + module + operator) with its
|
|
40
|
+
* build state, freshness, and drift, plus on-disk orphan index dirs and any
|
|
41
|
+
* non-silent config-load warnings.
|
|
42
|
+
*
|
|
43
|
+
* @param nowMs - injectable clock for deterministic tests (defaults to Date.now()).
|
|
44
|
+
*/
|
|
45
|
+
export function collectIndexStatus(cwd, nowMs) {
|
|
46
|
+
// Populate the registry from module + operator config, collecting warnings
|
|
47
|
+
// instead of letting malformed defs vanish (#1624).
|
|
48
|
+
const warnings = [];
|
|
49
|
+
loadUserGraphConfigs(cwd, warnings);
|
|
50
|
+
loadGlobalGraphConfigs(warnings);
|
|
51
|
+
const now = nowMs ?? Date.now();
|
|
52
|
+
const graphs = [];
|
|
53
|
+
for (const [name, config] of Object.entries(GRAPH_CONFIGS)) {
|
|
54
|
+
const location = getGraphIndexDir(cwd, name);
|
|
55
|
+
const { builtAt, entries } = readBuiltMeta(location);
|
|
56
|
+
const built = builtAt !== null || entries !== null;
|
|
57
|
+
let ageHours = null;
|
|
58
|
+
if (builtAt) {
|
|
59
|
+
const t = Date.parse(builtAt);
|
|
60
|
+
if (!Number.isNaN(t))
|
|
61
|
+
ageHours = Math.round((now - t) / 3_600_000);
|
|
62
|
+
}
|
|
63
|
+
graphs.push({
|
|
64
|
+
name,
|
|
65
|
+
origin: name in BUILTIN_GRAPH_CONFIGS ? 'builtin' : 'registered',
|
|
66
|
+
shared: config.shared,
|
|
67
|
+
defaultBuild: config.defaultBuild,
|
|
68
|
+
location,
|
|
69
|
+
built,
|
|
70
|
+
builtAt,
|
|
71
|
+
ageHours,
|
|
72
|
+
entries,
|
|
73
|
+
// A graph that opts into default builds but has no index on disk is a
|
|
74
|
+
// missing durable index the operator probably expects to exist.
|
|
75
|
+
missing: config.defaultBuild && !built,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// On-disk drift: project-local index dirs (`.aiwg/.index/<name>`) that no
|
|
79
|
+
// registered graph claims. The framework graph lives in XDG, not here, so
|
|
80
|
+
// this scan is project-local by construction.
|
|
81
|
+
const reservedIndexDirs = new Set(['fortemi-core']);
|
|
82
|
+
const registeredNames = new Set(Object.keys(GRAPH_CONFIGS));
|
|
83
|
+
const orphanIndexDirs = [];
|
|
84
|
+
const projectIndexRoot = getProjectIndexRoot(cwd);
|
|
85
|
+
try {
|
|
86
|
+
for (const d of fs.readdirSync(projectIndexRoot, { withFileTypes: true })) {
|
|
87
|
+
if (d.isDirectory() &&
|
|
88
|
+
!registeredNames.has(d.name) &&
|
|
89
|
+
!reservedIndexDirs.has(d.name)) {
|
|
90
|
+
orphanIndexDirs.push(path.join(projectIndexRoot, d.name));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// No project index root yet — not drift.
|
|
96
|
+
}
|
|
97
|
+
const missing = graphs.filter((g) => g.missing).length;
|
|
98
|
+
const built = graphs.filter((g) => g.built).length;
|
|
99
|
+
return {
|
|
100
|
+
graphs,
|
|
101
|
+
orphanIndexDirs,
|
|
102
|
+
warnings,
|
|
103
|
+
fortemiCore: getFortemiCoreSyncStatus(cwd),
|
|
104
|
+
summary: {
|
|
105
|
+
total: graphs.length,
|
|
106
|
+
built,
|
|
107
|
+
missing,
|
|
108
|
+
orphans: orphanIndexDirs.length,
|
|
109
|
+
warnings: warnings.length,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** Render `aiwg index status` (human table or JSON). */
|
|
114
|
+
export async function showIndexStatus(cwd, opts = {}) {
|
|
115
|
+
const report = collectIndexStatus(cwd);
|
|
116
|
+
if (opts.json) {
|
|
117
|
+
console.log(JSON.stringify(report, null, 2));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log('Index-graph registry status');
|
|
121
|
+
console.log('');
|
|
122
|
+
const rows = report.graphs
|
|
123
|
+
.slice()
|
|
124
|
+
.sort((a, b) => a.origin === b.origin
|
|
125
|
+
? a.name.localeCompare(b.name)
|
|
126
|
+
: a.origin === 'builtin'
|
|
127
|
+
? -1
|
|
128
|
+
: 1);
|
|
129
|
+
// Column header.
|
|
130
|
+
console.log(' ' +
|
|
131
|
+
'GRAPH'.padEnd(22) +
|
|
132
|
+
'ORIGIN'.padEnd(12) +
|
|
133
|
+
'STATE'.padEnd(10) +
|
|
134
|
+
'ENTRIES'.padEnd(9) +
|
|
135
|
+
'AGE'.padEnd(10) +
|
|
136
|
+
'LOCATION');
|
|
137
|
+
for (const g of rows) {
|
|
138
|
+
const state = g.built ? 'built' : g.missing ? 'MISSING' : 'unbuilt';
|
|
139
|
+
const age = g.ageHours === null
|
|
140
|
+
? '—'
|
|
141
|
+
: g.ageHours < 48
|
|
142
|
+
? `${g.ageHours}h`
|
|
143
|
+
: `${Math.round(g.ageHours / 24)}d`;
|
|
144
|
+
console.log(' ' +
|
|
145
|
+
g.name.padEnd(22) +
|
|
146
|
+
g.origin.padEnd(12) +
|
|
147
|
+
state.padEnd(10) +
|
|
148
|
+
String(g.entries ?? '—').padEnd(9) +
|
|
149
|
+
age.padEnd(10) +
|
|
150
|
+
shortenPath(g.location, cwd));
|
|
151
|
+
}
|
|
152
|
+
if (report.orphanIndexDirs.length > 0) {
|
|
153
|
+
console.log('');
|
|
154
|
+
console.log(`⚠ Drift — ${report.orphanIndexDirs.length} on-disk index dir(s) match no registered graph:`);
|
|
155
|
+
for (const d of report.orphanIndexDirs)
|
|
156
|
+
console.log(` ${shortenPath(d, cwd)}`);
|
|
157
|
+
console.log(' (remove the dir, or register the graph under index.graphs in .aiwg/aiwg.config)');
|
|
158
|
+
}
|
|
159
|
+
if (report.warnings.length > 0) {
|
|
160
|
+
console.log('');
|
|
161
|
+
console.log(`⚠ ${report.warnings.length} graph-config warning(s) — these were previously dropped silently (#1624):`);
|
|
162
|
+
for (const w of report.warnings)
|
|
163
|
+
console.log(` [${w.source}] ${w.graph}: ${w.reason}`);
|
|
164
|
+
}
|
|
165
|
+
if (report.fortemiCore.optedIn) {
|
|
166
|
+
console.log('');
|
|
167
|
+
const state = report.fortemiCore.built
|
|
168
|
+
? report.fortemiCore.stale
|
|
169
|
+
? 'STALE'
|
|
170
|
+
: 'built'
|
|
171
|
+
: 'MISSING';
|
|
172
|
+
console.log(`Fortemi Core static index: ${state} (${report.fortemiCore.itemCount ?? 0} item(s)) → ${shortenPath(report.fortemiCore.location, cwd)}`);
|
|
173
|
+
if (report.fortemiCore.reason)
|
|
174
|
+
console.log(` ${report.fortemiCore.reason}`);
|
|
175
|
+
}
|
|
176
|
+
const { missing } = report.summary;
|
|
177
|
+
if (missing > 0) {
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(`⚠ ${missing} registered durable index(es) are not built. Run \`aiwg index build --all\`.`);
|
|
180
|
+
}
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log(`${report.summary.total} graph(s): ${report.summary.built} built, ${missing} missing, ` +
|
|
183
|
+
`${report.summary.orphans} orphan(s), ${report.summary.warnings} warning(s).`);
|
|
184
|
+
}
|
|
185
|
+
function shortenPath(p, cwd) {
|
|
186
|
+
if (p.startsWith(cwd + path.sep))
|
|
187
|
+
return '.' + p.slice(cwd.length);
|
|
188
|
+
const home = process.env.HOME;
|
|
189
|
+
if (home && p.startsWith(home + path.sep))
|
|
190
|
+
return '~' + p.slice(home.length);
|
|
191
|
+
return p;
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=index-status.js.map
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { INDEX_VERSION, getGraphIndexDir, getProjectIndexRoot } from './types.js';
|
|
6
|
+
import { syncFortemiCoreIndex } from './fortemi-core-sync.js';
|
|
7
|
+
const INDEX_FILES = ['metadata.json', 'tags.json', 'dependencies.json', 'stats.json'];
|
|
8
|
+
function sha256File(filePath) {
|
|
9
|
+
if (!fs.existsSync(filePath))
|
|
10
|
+
return null;
|
|
11
|
+
return createHash('sha256').update(fs.readFileSync(filePath)).digest('hex');
|
|
12
|
+
}
|
|
13
|
+
function readJson(filePath) {
|
|
14
|
+
try {
|
|
15
|
+
return { value: JSON.parse(fs.readFileSync(filePath, 'utf-8')), reason: null };
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
return {
|
|
19
|
+
value: null,
|
|
20
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function resolveHome(options) {
|
|
25
|
+
return options.homeDir ?? process.env.AIWG_HOME ?? os.homedir();
|
|
26
|
+
}
|
|
27
|
+
function resolveXdgData(options) {
|
|
28
|
+
return options.xdgDataHome ?? process.env.XDG_DATA_HOME ?? path.join(resolveHome(options), '.local', 'share');
|
|
29
|
+
}
|
|
30
|
+
function scopePaths(cwd, scope, options) {
|
|
31
|
+
switch (scope) {
|
|
32
|
+
case 'project':
|
|
33
|
+
return {
|
|
34
|
+
sourceDir: getProjectIndexRoot(cwd),
|
|
35
|
+
destinationDir: getGraphIndexDir(cwd, 'project'),
|
|
36
|
+
syncRoot: cwd,
|
|
37
|
+
graph: 'project',
|
|
38
|
+
};
|
|
39
|
+
case 'user': {
|
|
40
|
+
const home = resolveHome(options);
|
|
41
|
+
return {
|
|
42
|
+
sourceDir: path.join(home, '.aiwg', '.index'),
|
|
43
|
+
destinationDir: path.join(home, '.aiwg', '.index', 'user'),
|
|
44
|
+
syncRoot: null,
|
|
45
|
+
graph: 'user',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
case 'global': {
|
|
49
|
+
const xdg = resolveXdgData(options);
|
|
50
|
+
return {
|
|
51
|
+
sourceDir: path.join(xdg, 'aiwg', 'index'),
|
|
52
|
+
destinationDir: path.join(xdg, 'aiwg', 'index', 'global'),
|
|
53
|
+
syncRoot: null,
|
|
54
|
+
graph: 'global',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function validateLegacyMetadata(sourceDir) {
|
|
60
|
+
const metadataPath = path.join(sourceDir, 'metadata.json');
|
|
61
|
+
if (!fs.existsSync(metadataPath)) {
|
|
62
|
+
return { index: null, reason: 'metadata.json not found' };
|
|
63
|
+
}
|
|
64
|
+
const parsed = readJson(metadataPath);
|
|
65
|
+
if (!parsed.value) {
|
|
66
|
+
return { index: null, reason: `metadata.json is unreadable: ${parsed.reason}` };
|
|
67
|
+
}
|
|
68
|
+
if (parsed.value.version !== INDEX_VERSION) {
|
|
69
|
+
return {
|
|
70
|
+
index: null,
|
|
71
|
+
reason: `metadata.json schema version ${String(parsed.value.version ?? 'missing')} is not compatible with ${INDEX_VERSION}`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (!parsed.value.entries || typeof parsed.value.entries !== 'object' || Array.isArray(parsed.value.entries)) {
|
|
75
|
+
return { index: null, reason: 'metadata.json entries must be an object' };
|
|
76
|
+
}
|
|
77
|
+
return { index: parsed.value, reason: null };
|
|
78
|
+
}
|
|
79
|
+
function migrateOneScope(cwd, scope, options) {
|
|
80
|
+
const { sourceDir, destinationDir, syncRoot, graph } = scopePaths(cwd, scope, options);
|
|
81
|
+
const baseResult = {
|
|
82
|
+
scope,
|
|
83
|
+
sourceDir,
|
|
84
|
+
destinationDir,
|
|
85
|
+
status: 'skipped',
|
|
86
|
+
files: [],
|
|
87
|
+
entries: null,
|
|
88
|
+
reason: null,
|
|
89
|
+
fortemiCore: null,
|
|
90
|
+
};
|
|
91
|
+
if (!fs.existsSync(sourceDir)) {
|
|
92
|
+
return { ...baseResult, reason: 'legacy index directory not found' };
|
|
93
|
+
}
|
|
94
|
+
if (path.resolve(sourceDir) === path.resolve(destinationDir)) {
|
|
95
|
+
return {
|
|
96
|
+
...baseResult,
|
|
97
|
+
reason: 'source and destination are the same directory; no migration needed',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const validation = validateLegacyMetadata(sourceDir);
|
|
101
|
+
if (!validation.index) {
|
|
102
|
+
return {
|
|
103
|
+
...baseResult,
|
|
104
|
+
status: 'needs-rebuild',
|
|
105
|
+
reason: validation.reason,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
let changed = false;
|
|
109
|
+
let anyCreated = false;
|
|
110
|
+
for (const name of INDEX_FILES) {
|
|
111
|
+
const sourcePath = path.join(sourceDir, name);
|
|
112
|
+
const destinationPath = path.join(destinationDir, name);
|
|
113
|
+
if (!fs.existsSync(sourcePath)) {
|
|
114
|
+
baseResult.files.push({ name, status: 'skipped' });
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const sourceHash = sha256File(sourcePath);
|
|
118
|
+
const destinationHash = sha256File(destinationPath);
|
|
119
|
+
const exists = destinationHash !== null;
|
|
120
|
+
const same = sourceHash !== null && sourceHash === destinationHash;
|
|
121
|
+
const status = same ? 'unchanged' : exists ? 'updated' : 'created';
|
|
122
|
+
baseResult.files.push({ name, status });
|
|
123
|
+
if (!same) {
|
|
124
|
+
changed = true;
|
|
125
|
+
if (!exists)
|
|
126
|
+
anyCreated = true;
|
|
127
|
+
if (!options.dryRun) {
|
|
128
|
+
fs.mkdirSync(destinationDir, { recursive: true });
|
|
129
|
+
fs.copyFileSync(sourcePath, destinationPath);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
baseResult.entries = Object.keys(validation.index.entries).length;
|
|
134
|
+
baseResult.status = changed ? (anyCreated ? 'created' : 'updated') : 'unchanged';
|
|
135
|
+
if (!options.dryRun && options.syncFortemi !== false && syncRoot) {
|
|
136
|
+
const manifest = syncFortemiCoreIndex(syncRoot, {
|
|
137
|
+
graph,
|
|
138
|
+
generatedAt: options.generatedAt,
|
|
139
|
+
});
|
|
140
|
+
baseResult.fortemiCore = {
|
|
141
|
+
status: manifest.status,
|
|
142
|
+
exportPath: manifest.export_path,
|
|
143
|
+
itemCount: manifest.item_count,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return baseResult;
|
|
147
|
+
}
|
|
148
|
+
function defaultReportPath(cwd) {
|
|
149
|
+
return path.join(getProjectIndexRoot(cwd), 'migrations', 'legacy-index-migration.json');
|
|
150
|
+
}
|
|
151
|
+
export function migrateLegacyIndex(cwd, options = {}) {
|
|
152
|
+
const generatedAt = options.generatedAt ?? new Date().toISOString();
|
|
153
|
+
const scopes = options.scopes?.length ? options.scopes : ['project'];
|
|
154
|
+
const results = scopes.map((scope) => migrateOneScope(cwd, scope, { ...options, generatedAt }));
|
|
155
|
+
const report = {
|
|
156
|
+
schemaVersion: 'aiwg.legacy-index-migration.v1',
|
|
157
|
+
dryRun: options.dryRun === true,
|
|
158
|
+
generatedAt,
|
|
159
|
+
results,
|
|
160
|
+
reportPath: options.dryRun ? null : defaultReportPath(cwd),
|
|
161
|
+
};
|
|
162
|
+
if (!options.dryRun) {
|
|
163
|
+
const reportPath = defaultReportPath(cwd);
|
|
164
|
+
fs.mkdirSync(path.dirname(reportPath), { recursive: true });
|
|
165
|
+
fs.writeFileSync(reportPath, JSON.stringify(report, null, 2) + '\n', 'utf-8');
|
|
166
|
+
}
|
|
167
|
+
return report;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=legacy-index-migration.js.map
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { access, cp, mkdir, readFile, readdir, rename, rm, rmdir, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { buildIndex } from './index-builder.js';
|
|
5
|
+
import { syncFortemiCoreIndex } from './fortemi-core-sync.js';
|
|
6
|
+
import { PROJECT_AIWG_LOCATION_FILE, expandProjectArtifactPath, resolveProjectAiwgDir, } from '../config/project-artifacts.js';
|
|
7
|
+
const GITIGNORE_BLOCK = [
|
|
8
|
+
'',
|
|
9
|
+
'# AIWG artifact root pointer (local/private path)',
|
|
10
|
+
PROJECT_AIWG_LOCATION_FILE,
|
|
11
|
+
'',
|
|
12
|
+
].join('\n');
|
|
13
|
+
async function exists(filePath) {
|
|
14
|
+
try {
|
|
15
|
+
await access(filePath);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function samePath(left, right) {
|
|
23
|
+
return path.resolve(left) === path.resolve(right);
|
|
24
|
+
}
|
|
25
|
+
async function isEmptyDirectory(dir) {
|
|
26
|
+
try {
|
|
27
|
+
const info = await stat(dir);
|
|
28
|
+
if (!info.isDirectory())
|
|
29
|
+
return false;
|
|
30
|
+
const entries = await readdir(dir);
|
|
31
|
+
return entries.length === 0;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function pointerValueFor(projectDir, destination) {
|
|
38
|
+
const relative = path.relative(projectDir, destination).split(path.sep).join('/');
|
|
39
|
+
return relative.length > 0 ? relative : '.';
|
|
40
|
+
}
|
|
41
|
+
async function ensureGitignorePointer(projectDir, dryRun) {
|
|
42
|
+
const gitignorePath = path.join(projectDir, '.gitignore');
|
|
43
|
+
let current = '';
|
|
44
|
+
try {
|
|
45
|
+
current = await readFile(gitignorePath, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error.code !== 'ENOENT')
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
const lines = current.split(/\r?\n/).map(line => line.trim());
|
|
52
|
+
if (lines.includes(PROJECT_AIWG_LOCATION_FILE))
|
|
53
|
+
return false;
|
|
54
|
+
if (!dryRun) {
|
|
55
|
+
const separator = current.length === 0 || current.endsWith('\n') ? '' : '\n';
|
|
56
|
+
await writeFile(gitignorePath, `${current}${separator}${GITIGNORE_BLOCK}`, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
async function writePointer(projectDir, pointerValue, dryRun) {
|
|
61
|
+
const pointerPath = path.join(projectDir, PROJECT_AIWG_LOCATION_FILE);
|
|
62
|
+
if (!dryRun) {
|
|
63
|
+
await writeFile(pointerPath, [
|
|
64
|
+
'# AIWG artifact root.',
|
|
65
|
+
'# Generated by `aiwg artifacts move`; AIWG_ARTIFACTS_PATH overrides this file.',
|
|
66
|
+
pointerValue,
|
|
67
|
+
'',
|
|
68
|
+
].join('\n'), 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
return pointerPath;
|
|
71
|
+
}
|
|
72
|
+
async function moveDirectory(source, destination) {
|
|
73
|
+
const destinationExists = await exists(destination);
|
|
74
|
+
if (destinationExists) {
|
|
75
|
+
if (!(await isEmptyDirectory(destination))) {
|
|
76
|
+
throw new Error(`Destination already exists and is not empty: ${destination}`);
|
|
77
|
+
}
|
|
78
|
+
await rmdir(destination);
|
|
79
|
+
}
|
|
80
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
81
|
+
try {
|
|
82
|
+
await rename(source, destination);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error.code !== 'EXDEV')
|
|
86
|
+
throw error;
|
|
87
|
+
await cp(source, destination, { recursive: true, errorOnExist: true, force: false });
|
|
88
|
+
await rm(source, { recursive: true, force: false });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function withTemporaryArtifactEnv(artifactDir, callback) {
|
|
92
|
+
const previous = process.env.AIWG_ARTIFACTS_PATH;
|
|
93
|
+
process.env.AIWG_ARTIFACTS_PATH = artifactDir;
|
|
94
|
+
try {
|
|
95
|
+
return await callback();
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (previous === undefined) {
|
|
99
|
+
delete process.env.AIWG_ARTIFACTS_PATH;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
process.env.AIWG_ARTIFACTS_PATH = previous;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export async function moveProjectArtifacts(options) {
|
|
107
|
+
const projectDir = path.resolve(options.projectDir);
|
|
108
|
+
const source = path.resolve(options.from ? expandProjectArtifactPath(options.from, projectDir) : resolveProjectAiwgDir(projectDir));
|
|
109
|
+
const destination = path.resolve(expandProjectArtifactPath(options.to, projectDir));
|
|
110
|
+
const dryRun = options.dryRun === true;
|
|
111
|
+
const reindex = options.reindex !== false;
|
|
112
|
+
const syncFortemi = options.syncFortemi !== false;
|
|
113
|
+
if (samePath(source, destination)) {
|
|
114
|
+
throw new Error(`Source and destination are the same directory: ${source}`);
|
|
115
|
+
}
|
|
116
|
+
if (!existsSync(source)) {
|
|
117
|
+
throw new Error(`Source AIWG artifact directory does not exist: ${source}`);
|
|
118
|
+
}
|
|
119
|
+
if (existsSync(destination) && !(await isEmptyDirectory(destination))) {
|
|
120
|
+
throw new Error(`Destination already exists and is not empty: ${destination}`);
|
|
121
|
+
}
|
|
122
|
+
const pointerValue = pointerValueFor(projectDir, destination);
|
|
123
|
+
const pointerPath = path.join(projectDir, PROJECT_AIWG_LOCATION_FILE);
|
|
124
|
+
const gitignoreUpdated = await ensureGitignorePointer(projectDir, dryRun);
|
|
125
|
+
if (!dryRun) {
|
|
126
|
+
await moveDirectory(source, destination);
|
|
127
|
+
}
|
|
128
|
+
await writePointer(projectDir, pointerValue, dryRun);
|
|
129
|
+
let reindexed = false;
|
|
130
|
+
let fortemiSynced = false;
|
|
131
|
+
if (reindex && !dryRun) {
|
|
132
|
+
await withTemporaryArtifactEnv(destination, async () => {
|
|
133
|
+
await buildIndex(projectDir, { force: true, graph: 'project' });
|
|
134
|
+
reindexed = true;
|
|
135
|
+
if (syncFortemi) {
|
|
136
|
+
syncFortemiCoreIndex(projectDir, { graph: 'project' });
|
|
137
|
+
fortemiSynced = true;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
projectDir,
|
|
143
|
+
from: source,
|
|
144
|
+
to: destination,
|
|
145
|
+
pointerPath,
|
|
146
|
+
pointerValue,
|
|
147
|
+
moved: !dryRun,
|
|
148
|
+
gitignoreUpdated,
|
|
149
|
+
reindexed,
|
|
150
|
+
fortemiSynced,
|
|
151
|
+
dryRun,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=move.js.map
|