@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,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-Local Doctor Section
|
|
3
|
+
*
|
|
4
|
+
* Builds the "Project-local artifacts" section for `aiwg doctor` output
|
|
5
|
+
* per the spec at @.aiwg/architecture/design-doctor-log-promote.md (#1049).
|
|
6
|
+
*
|
|
7
|
+
* Pure function over (projectDir, frameworkRoot) — returns a string. The
|
|
8
|
+
* doctor handler in src/cli/handlers/utilities.ts is responsible for
|
|
9
|
+
* printing it. Section is fully suppressed when no project-local dirs
|
|
10
|
+
* are present.
|
|
11
|
+
*
|
|
12
|
+
* @design @.aiwg/architecture/design-doctor-log-promote.md
|
|
13
|
+
* @implements #1037
|
|
14
|
+
*/
|
|
15
|
+
import { join, resolve } from 'path';
|
|
16
|
+
import { homedir } from 'os';
|
|
17
|
+
import { discoverProjectLocalBundles } from './project-local-discovery.js';
|
|
18
|
+
import { buildUpstreamRegistry } from './upstream-registry.js';
|
|
19
|
+
import { resolveShadows } from './shadow-resolver.js';
|
|
20
|
+
import { checkBundleManifestIgnored } from './project-local-gitignore.js';
|
|
21
|
+
import { sha256OfFileRawAndNormalized } from './managed-marker.js';
|
|
22
|
+
import { projectAiwgPath } from '../config/project-artifacts.js';
|
|
23
|
+
import { projectRelativePathIfInside } from './project-local-paths.js';
|
|
24
|
+
import { auditProjectQuickref } from './project-quickref.js';
|
|
25
|
+
/**
|
|
26
|
+
* Hash a deployed file in raw and managed-marker-normalized forms. Returns
|
|
27
|
+
* null on read errors (e.g., file missing — caller treats as
|
|
28
|
+
* deploy-not-present).
|
|
29
|
+
*
|
|
30
|
+
* Source files are recorded via the same normalization in
|
|
31
|
+
* `hashBundleArtifacts()`, so the equivalence relation is symmetric.
|
|
32
|
+
*
|
|
33
|
+
* @implements #1086
|
|
34
|
+
*/
|
|
35
|
+
async function hashDeployed(absPath) {
|
|
36
|
+
try {
|
|
37
|
+
return await sha256OfFileRawAndNormalized(absPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const TYPES = ['extension', 'addon', 'framework', 'plugin', 'provider'];
|
|
44
|
+
const TYPE_DIR = {
|
|
45
|
+
extension: 'extensions',
|
|
46
|
+
addon: 'addons',
|
|
47
|
+
framework: 'frameworks',
|
|
48
|
+
plugin: 'plugins',
|
|
49
|
+
provider: 'providers',
|
|
50
|
+
};
|
|
51
|
+
// Per PUW-026 (#1127): home-deploying providers get absolute prefixes so
|
|
52
|
+
// `resolve(projectDir, prefix)` correctly produces the home-rooted path
|
|
53
|
+
// (resolve treats absolute paths as authoritative). Previously these were
|
|
54
|
+
// `null`, which silently skipped lifecycle operations against home-deployed
|
|
55
|
+
// project-local bundles.
|
|
56
|
+
const PROVIDER_PREFIX = {
|
|
57
|
+
claude: '.claude',
|
|
58
|
+
cursor: '.cursor',
|
|
59
|
+
factory: '.factory',
|
|
60
|
+
opencode: '.opencode',
|
|
61
|
+
windsurf: '.windsurf',
|
|
62
|
+
warp: '.warp',
|
|
63
|
+
codex: '.codex',
|
|
64
|
+
copilot: '.github',
|
|
65
|
+
openclaw: resolve(homedir(), '.openclaw'),
|
|
66
|
+
hermes: resolve(homedir(), '.hermes'),
|
|
67
|
+
};
|
|
68
|
+
export async function buildProjectLocalDoctorSection(opts) {
|
|
69
|
+
const { projectDir, frameworkRoot, config, quiet = false } = opts;
|
|
70
|
+
const discovery = await discoverProjectLocalBundles(projectDir);
|
|
71
|
+
const quickrefAudit = await auditProjectQuickref(projectDir, config?.providers ?? []);
|
|
72
|
+
const quickrefErrors = [...quickrefAudit.errors];
|
|
73
|
+
if (quickrefAudit.exists) {
|
|
74
|
+
const quickrefRelPath = projectRelativePathIfInside(projectDir, projectAiwgPath(projectDir, 'quickref.json'));
|
|
75
|
+
const ignored = quickrefRelPath
|
|
76
|
+
? await checkBundleManifestIgnored(projectDir, quickrefRelPath)
|
|
77
|
+
: null;
|
|
78
|
+
if (ignored === true && quickrefRelPath) {
|
|
79
|
+
quickrefErrors.push(`${quickrefRelPath} is ignored by git; canonical project quickref source must be committed`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// No project-local content → no section at all
|
|
83
|
+
if (discovery.isEmpty && discovery.errors.length === 0 && !quickrefAudit.exists && quickrefErrors.length === 0) {
|
|
84
|
+
return { output: '', validationErrors: 0, denylistViolations: 0, driftCount: 0, hasFailures: false };
|
|
85
|
+
}
|
|
86
|
+
const lines = ['', '── Project-local artifacts ────────────────────────────────────'];
|
|
87
|
+
// Counts
|
|
88
|
+
if (!quiet) {
|
|
89
|
+
lines.push(` Discovered: ${discovery.bundles.length} bundle${discovery.bundles.length === 1 ? '' : 's'}`);
|
|
90
|
+
for (const t of TYPES) {
|
|
91
|
+
const dirName = TYPE_DIR[t];
|
|
92
|
+
const ofType = discovery.bundles.filter(b => b.type === t);
|
|
93
|
+
if (ofType.length === 0 && discovery.bundles.length > 0)
|
|
94
|
+
continue;
|
|
95
|
+
const idList = ofType.length > 0 ? ` (${ofType.map(b => b.id).join(', ')})` : '';
|
|
96
|
+
lines.push(` ${dirName.padEnd(11)} ${ofType.length}${idList}`);
|
|
97
|
+
}
|
|
98
|
+
lines.push('');
|
|
99
|
+
if (quickrefAudit.exists) {
|
|
100
|
+
lines.push(` Project quickref: ${quickrefAudit.skillName ?? 'invalid source'}`);
|
|
101
|
+
lines.push('');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Validation
|
|
105
|
+
const validationErrors = discovery.errors.length + quickrefErrors.length;
|
|
106
|
+
if (validationErrors === 0) {
|
|
107
|
+
if (!quiet)
|
|
108
|
+
lines.push(` Validation: ✓ all manifests${quickrefAudit.exists ? ' and project quickref source' : ''} valid`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
lines.push(` Validation: ✗ ${validationErrors} error${validationErrors === 1 ? '' : 's'}`);
|
|
112
|
+
for (const e of discovery.errors.slice(0, 10)) {
|
|
113
|
+
lines.push(` ✗ ${e.path}: ${e.field} — ${e.actual}`);
|
|
114
|
+
}
|
|
115
|
+
for (const error of quickrefErrors.slice(0, Math.max(0, 10 - discovery.errors.length))) {
|
|
116
|
+
lines.push(` ✗ ${error}`);
|
|
117
|
+
}
|
|
118
|
+
if (validationErrors > 10) {
|
|
119
|
+
lines.push(` + ${validationErrors - 10} more (run 'aiwg list --project-local' for full list)`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
lines.push('');
|
|
123
|
+
// Shadows + denylist
|
|
124
|
+
let denylistViolations = 0;
|
|
125
|
+
if (discovery.bundles.length > 0) {
|
|
126
|
+
try {
|
|
127
|
+
const upstream = await buildUpstreamRegistry({ frameworkRoot });
|
|
128
|
+
const shadowResult = await resolveShadows(discovery.bundles, upstream);
|
|
129
|
+
const refusals = shadowResult.resolutions.filter(r => r.verdict === 'refuse-unsafe' || r.verdict === 'refuse-phantom' || r.verdict === 'refuse-duplicate');
|
|
130
|
+
denylistViolations = refusals.length;
|
|
131
|
+
if (!quiet) {
|
|
132
|
+
const informational = shadowResult.shadows.filter(s => s.verdict === 'deploy-with-warning' || s.verdict === 'deploy-acknowledged');
|
|
133
|
+
if (informational.length > 0) {
|
|
134
|
+
lines.push(` Shadows (${informational.length}):`);
|
|
135
|
+
for (const s of informational) {
|
|
136
|
+
const marker = s.verdict === 'deploy-acknowledged' ? '!!' : '⚠';
|
|
137
|
+
const note = s.verdict === 'deploy-acknowledged' ? ' overrides safety-critical (acknowledged)' : ` overrides ${s.upstream?.source ?? 'upstream'}`;
|
|
138
|
+
lines.push(` ${marker} ${s.bundleId} :: ${s.artifactType}/${s.artifactId}${note}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push('');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (refusals.length > 0) {
|
|
144
|
+
lines.push(` Denylist violations (${refusals.length}):`);
|
|
145
|
+
for (const r of refusals) {
|
|
146
|
+
lines.push(` ✗ ${r.bundleId} :: ${r.artifactType}/${r.artifactId} [${r.verdict}]`);
|
|
147
|
+
}
|
|
148
|
+
lines.push('');
|
|
149
|
+
}
|
|
150
|
+
else if (!quiet) {
|
|
151
|
+
lines.push(' Denylist violations: 0');
|
|
152
|
+
lines.push('');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Shadow resolution failure is non-fatal for doctor
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Drift detection (requires config and artifactHashes)
|
|
160
|
+
let driftCount = quickrefAudit.drift.length;
|
|
161
|
+
const driftLines = quickrefAudit.drift.map(message => ` ✗ project quickref :: ${message}`);
|
|
162
|
+
let unhashedSeen = false;
|
|
163
|
+
if (config) {
|
|
164
|
+
for (const bundle of discovery.bundles) {
|
|
165
|
+
const entry = config.installed[bundle.id];
|
|
166
|
+
if (!entry || entry.source !== 'project-local')
|
|
167
|
+
continue;
|
|
168
|
+
const hashes = entry.artifactHashes;
|
|
169
|
+
if (!hashes) {
|
|
170
|
+
unhashedSeen = true;
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
for (const provider of Object.keys(entry.deployedTo)) {
|
|
174
|
+
const prefix = PROVIDER_PREFIX[provider];
|
|
175
|
+
if (!prefix)
|
|
176
|
+
continue;
|
|
177
|
+
for (const [sourceRel, expectedHash] of Object.entries(hashes)) {
|
|
178
|
+
const deployedAbs = resolve(projectDir, `${prefix}/${sourceRel}`);
|
|
179
|
+
const actualHash = await hashDeployed(deployedAbs);
|
|
180
|
+
if (actualHash === null) {
|
|
181
|
+
// Missing — not drift, deploy is just absent
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (actualHash.normalized !== expectedHash && actualHash.raw !== expectedHash) {
|
|
185
|
+
driftCount++;
|
|
186
|
+
driftLines.push(` ✗ ${bundle.id} :: ${sourceRel} @ ${provider} (deployed file differs from source)`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (driftCount > 0) {
|
|
193
|
+
lines.push(` Drift (${driftCount}):`);
|
|
194
|
+
lines.push(...driftLines);
|
|
195
|
+
lines.push('');
|
|
196
|
+
}
|
|
197
|
+
else if (!quiet) {
|
|
198
|
+
lines.push(' Drift: 0');
|
|
199
|
+
if (unhashedSeen) {
|
|
200
|
+
lines.push(' (some entries lack artifactHashes — re-run `aiwg use <bundle>` to record)');
|
|
201
|
+
}
|
|
202
|
+
lines.push('');
|
|
203
|
+
}
|
|
204
|
+
// Provider deployment matrix
|
|
205
|
+
if (!quiet && config) {
|
|
206
|
+
const projectLocalEntries = Object.entries(config.installed).filter(([, e]) => e.source === 'project-local');
|
|
207
|
+
if (projectLocalEntries.length > 0) {
|
|
208
|
+
const allProviders = new Set();
|
|
209
|
+
for (const [, entry] of projectLocalEntries) {
|
|
210
|
+
for (const p of Object.keys(entry.deployedTo))
|
|
211
|
+
allProviders.add(p);
|
|
212
|
+
}
|
|
213
|
+
const provList = [...allProviders].sort();
|
|
214
|
+
if (provList.length > 0) {
|
|
215
|
+
lines.push(' Provider deployment matrix:');
|
|
216
|
+
lines.push(` ${'bundle'.padEnd(20)}${provList.map(p => p.padEnd(8)).join('')}`);
|
|
217
|
+
for (const [name, entry] of projectLocalEntries) {
|
|
218
|
+
const cells = provList.map(p => {
|
|
219
|
+
const c = entry.deployedTo[p];
|
|
220
|
+
if (!c)
|
|
221
|
+
return '-'.padEnd(8);
|
|
222
|
+
const total = c.agents + c.commands + c.skills + c.rules;
|
|
223
|
+
return `✓ ${total}`.padEnd(8);
|
|
224
|
+
}).join('');
|
|
225
|
+
lines.push(` ${name.padEnd(20)}${cells}`);
|
|
226
|
+
}
|
|
227
|
+
lines.push('');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// #1085 — flag bundles whose source is silently git-ignored. Best-effort
|
|
232
|
+
// (uses `git check-ignore`); skipped silently outside git repos.
|
|
233
|
+
let gitignoredCount = 0;
|
|
234
|
+
if (discovery.bundles.length > 0) {
|
|
235
|
+
const ignored = [];
|
|
236
|
+
for (const b of discovery.bundles) {
|
|
237
|
+
const manifestRelPath = projectRelativePathIfInside(projectDir, join(b.bundlePath, 'manifest.json'));
|
|
238
|
+
const isIgnored = manifestRelPath
|
|
239
|
+
? await checkBundleManifestIgnored(projectDir, manifestRelPath)
|
|
240
|
+
: null;
|
|
241
|
+
if (isIgnored === true)
|
|
242
|
+
ignored.push(`${b.type}/${b.id} (${manifestRelPath})`);
|
|
243
|
+
}
|
|
244
|
+
gitignoredCount = ignored.length;
|
|
245
|
+
if (ignored.length > 0) {
|
|
246
|
+
lines.push(` Git tracking: ✗ ${ignored.length} bundle${ignored.length === 1 ? '' : 's'} silently ignored`);
|
|
247
|
+
for (const i of ignored.slice(0, 5)) {
|
|
248
|
+
lines.push(` ✗ ${i}`);
|
|
249
|
+
}
|
|
250
|
+
if (ignored.length > 5) {
|
|
251
|
+
lines.push(` + ${ignored.length - 5} more`);
|
|
252
|
+
}
|
|
253
|
+
lines.push(' Project-local bundle source should be tracked. Add to .gitignore:');
|
|
254
|
+
lines.push(' !.aiwg/quickref.json');
|
|
255
|
+
lines.push(' !.aiwg/addons/');
|
|
256
|
+
lines.push(' !.aiwg/extensions/');
|
|
257
|
+
lines.push(' !.aiwg/frameworks/');
|
|
258
|
+
lines.push(' !.aiwg/plugins/');
|
|
259
|
+
lines.push(' Or run `aiwg new-bundle <name>` to have AIWG add this block automatically.');
|
|
260
|
+
lines.push('');
|
|
261
|
+
}
|
|
262
|
+
else if (!quiet) {
|
|
263
|
+
lines.push(' Git tracking: ✓ all bundle manifests visible to git');
|
|
264
|
+
lines.push('');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const hasFailures = validationErrors > 0 || denylistViolations > 0 || driftCount > 0 || gitignoredCount > 0;
|
|
268
|
+
return {
|
|
269
|
+
output: lines.join('\n'),
|
|
270
|
+
validationErrors,
|
|
271
|
+
denylistViolations,
|
|
272
|
+
driftCount,
|
|
273
|
+
hasFailures,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/** Convenience accessor: just the section text. */
|
|
277
|
+
export async function projectLocalDoctorSection(projectDir, frameworkRoot, config, quiet = false) {
|
|
278
|
+
const r = await buildProjectLocalDoctorSection({ projectDir, frameworkRoot, config, quiet });
|
|
279
|
+
return r.output;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=project-local-doctor.js.map
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-local .gitignore management.
|
|
3
|
+
*
|
|
4
|
+
* AIWG-managed projects historically `.gitignore` the whole `.aiwg/` tree
|
|
5
|
+
* because most of it is generated state (working scratch, ralph state,
|
|
6
|
+
* research corpora, etc.). With #1033's project-local artifact lifecycle,
|
|
7
|
+
* `.aiwg/{addons,extensions,frameworks,plugins,providers}/` is now also operator-
|
|
8
|
+
* authored source — and a blanket ignore silently drops it from version
|
|
9
|
+
* control.
|
|
10
|
+
*
|
|
11
|
+
* This module provides:
|
|
12
|
+
*
|
|
13
|
+
* - `detectAiwgBlanketIgnore()` — read .gitignore, classify the rules
|
|
14
|
+
* - `appendAiwgSourceTrackBlock()` — append the canonical un-ignore
|
|
15
|
+
* block (sentinel-marked, idempotent)
|
|
16
|
+
* - `checkBundleManifestIgnored()` — per-bundle: is its manifest.json
|
|
17
|
+
* git-ignored right now?
|
|
18
|
+
*
|
|
19
|
+
* @implements #1085
|
|
20
|
+
*/
|
|
21
|
+
import { readFile, writeFile, access } from 'fs/promises';
|
|
22
|
+
import { join } from 'path';
|
|
23
|
+
import { execFile } from 'child_process';
|
|
24
|
+
import { promisify } from 'util';
|
|
25
|
+
const execFileP = promisify(execFile);
|
|
26
|
+
/**
|
|
27
|
+
* Sentinel comment that marks the AIWG-managed un-ignore block.
|
|
28
|
+
*
|
|
29
|
+
* We detect existing blocks by this exact line so re-running new-bundle
|
|
30
|
+
* never produces duplicate blocks.
|
|
31
|
+
*/
|
|
32
|
+
export const AIWG_GITIGNORE_SENTINEL = '# AIWG project-local bundle source — track these (managed by AIWG)';
|
|
33
|
+
/**
|
|
34
|
+
* The canonical block we append when a project blanket-ignores `.aiwg/`
|
|
35
|
+
* but doesn't yet un-ignore the source directories.
|
|
36
|
+
*/
|
|
37
|
+
export const AIWG_GITIGNORE_BLOCK = [
|
|
38
|
+
'',
|
|
39
|
+
AIWG_GITIGNORE_SENTINEL,
|
|
40
|
+
'!.aiwg/aiwg.config',
|
|
41
|
+
'!.aiwg/quickref.json',
|
|
42
|
+
'!.aiwg/addons/',
|
|
43
|
+
'!.aiwg/extensions/',
|
|
44
|
+
'!.aiwg/frameworks/',
|
|
45
|
+
'!.aiwg/plugins/',
|
|
46
|
+
'!.aiwg/providers/',
|
|
47
|
+
'',
|
|
48
|
+
].join('\n');
|
|
49
|
+
/**
|
|
50
|
+
* Inspect a project's `.gitignore` and classify it for our purposes.
|
|
51
|
+
*
|
|
52
|
+
* Detection rules — only the patterns we actually need:
|
|
53
|
+
*
|
|
54
|
+
* blanket ignore: a non-negation, non-comment line that matches the
|
|
55
|
+
* `.aiwg/` directory directly. Specifically: `.aiwg`, `.aiwg/`,
|
|
56
|
+
* `.aiwg/*`, `.aiwg/**`, or path-anchored variants thereof.
|
|
57
|
+
*
|
|
58
|
+
* existing negation: a line beginning with `!` that points into one of
|
|
59
|
+
* our four source directories. e.g. `!.aiwg/addons/` or
|
|
60
|
+
* `!.aiwg/extensions/foo/`.
|
|
61
|
+
*/
|
|
62
|
+
export async function detectAiwgBlanketIgnore(projectDir) {
|
|
63
|
+
const path = join(projectDir, '.gitignore');
|
|
64
|
+
let raw;
|
|
65
|
+
try {
|
|
66
|
+
raw = await readFile(path, 'utf8');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return {
|
|
70
|
+
blanketIgnore: false,
|
|
71
|
+
hasExistingNegation: false,
|
|
72
|
+
hasManagedBlock: false,
|
|
73
|
+
gitignoreExists: false,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const lines = raw.split(/\r?\n/);
|
|
77
|
+
const stripped = lines.map(l => l.trim()).filter(l => l.length > 0 && !l.startsWith('#'));
|
|
78
|
+
const isBlanket = (l) => {
|
|
79
|
+
if (l.startsWith('!'))
|
|
80
|
+
return false;
|
|
81
|
+
// Strip a leading slash so `/.aiwg/` and `.aiwg/` are equivalent.
|
|
82
|
+
const norm = l.replace(/^\//, '');
|
|
83
|
+
return norm === '.aiwg' || norm === '.aiwg/' || norm === '.aiwg/*' || norm === '.aiwg/**';
|
|
84
|
+
};
|
|
85
|
+
const isSourceNegation = (l) => {
|
|
86
|
+
if (!l.startsWith('!'))
|
|
87
|
+
return false;
|
|
88
|
+
// `.aiwg/addons/`, `.aiwg/extensions/foo`, `/.aiwg/providers/**`, etc.
|
|
89
|
+
const body = l.slice(1).replace(/^\//, '');
|
|
90
|
+
return /^\.aiwg\/(addons|extensions|frameworks|plugins|providers)(\/.*)?$/.test(body);
|
|
91
|
+
};
|
|
92
|
+
const blanketIgnore = stripped.some(isBlanket);
|
|
93
|
+
const hasExistingNegation = stripped.some(isSourceNegation);
|
|
94
|
+
const hasManagedBlock = lines.some(l => l.trim() === AIWG_GITIGNORE_SENTINEL);
|
|
95
|
+
return { blanketIgnore, hasExistingNegation, hasManagedBlock, gitignoreExists: true };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Append the canonical un-ignore block to `.gitignore` if and only if:
|
|
99
|
+
*
|
|
100
|
+
* - `.gitignore` exists, AND
|
|
101
|
+
* - it blanket-ignores `.aiwg/`, AND
|
|
102
|
+
* - it does NOT already have any source-directory negation, AND
|
|
103
|
+
* - it does NOT already have our sentinel-marked block.
|
|
104
|
+
*
|
|
105
|
+
* The function is idempotent in all four conditions. No-op when the
|
|
106
|
+
* project doesn't blanket-ignore (operator has presumably configured a
|
|
107
|
+
* selective ignore already).
|
|
108
|
+
*/
|
|
109
|
+
export async function appendAiwgSourceTrackBlock(projectDir) {
|
|
110
|
+
const report = await detectAiwgBlanketIgnore(projectDir);
|
|
111
|
+
if (!report.gitignoreExists) {
|
|
112
|
+
return { added: false, reason: 'no .gitignore — skipped' };
|
|
113
|
+
}
|
|
114
|
+
if (!report.blanketIgnore) {
|
|
115
|
+
return { added: false, reason: 'no blanket .aiwg ignore — already tracking sources' };
|
|
116
|
+
}
|
|
117
|
+
// Check managed-block presence BEFORE generic negation detection — once
|
|
118
|
+
// we've added our block, it itself contains source-directory negations,
|
|
119
|
+
// so the existing-negation check would otherwise mis-fire on subsequent
|
|
120
|
+
// runs.
|
|
121
|
+
if (report.hasManagedBlock) {
|
|
122
|
+
const path = join(projectDir, '.gitignore');
|
|
123
|
+
const existing = await readFile(path, 'utf8');
|
|
124
|
+
if (!existing.split(/\r?\n/).some(line => line.trim() === '!.aiwg/quickref.json')) {
|
|
125
|
+
const sep = existing.endsWith('\n') ? '' : '\n';
|
|
126
|
+
await writeFile(path, `${existing}${sep}!.aiwg/quickref.json\n`, 'utf8');
|
|
127
|
+
return { added: true, reason: 'updated managed block to track .aiwg/quickref.json' };
|
|
128
|
+
}
|
|
129
|
+
return { added: false, reason: 'block already present — no change' };
|
|
130
|
+
}
|
|
131
|
+
if (report.hasExistingNegation) {
|
|
132
|
+
return { added: false, reason: 'operator has explicit !.aiwg negation — no change' };
|
|
133
|
+
}
|
|
134
|
+
const path = join(projectDir, '.gitignore');
|
|
135
|
+
const existing = await readFile(path, 'utf8');
|
|
136
|
+
const sep = existing.endsWith('\n') ? '' : '\n';
|
|
137
|
+
await writeFile(path, existing + sep + AIWG_GITIGNORE_BLOCK, 'utf8');
|
|
138
|
+
return { added: true, reason: 'appended project-local source un-ignore block (bundles, config, and quickref)' };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Per-bundle: is its `manifest.json` currently ignored by git?
|
|
142
|
+
*
|
|
143
|
+
* Uses `git check-ignore` which is authoritative — it reflects every
|
|
144
|
+
* `.gitignore` precedence rule, including negations and core.excludesFile.
|
|
145
|
+
*
|
|
146
|
+
* Returns `null` when git isn't installed or the project isn't a git
|
|
147
|
+
* repo. Caller should treat null as "skip the check".
|
|
148
|
+
*/
|
|
149
|
+
export async function checkBundleManifestIgnored(projectDir, manifestRelPath) {
|
|
150
|
+
// Quick sanity: ensure path doesn't try to escape projectDir
|
|
151
|
+
if (manifestRelPath.startsWith('/') || manifestRelPath.includes('..')) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
await access(join(projectDir, '.git'));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
// `git check-ignore -q <path>` returns exit 0 if path is ignored,
|
|
162
|
+
// 1 if not ignored, 128 on error. We want a tristate.
|
|
163
|
+
await execFileP('git', ['check-ignore', '-q', manifestRelPath], {
|
|
164
|
+
cwd: projectDir,
|
|
165
|
+
});
|
|
166
|
+
// exit 0 → ignored
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const code = err.code;
|
|
171
|
+
if (code === 1)
|
|
172
|
+
return false; // not ignored
|
|
173
|
+
return null; // 128 or other — skip the check
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=project-local-gitignore.js.map
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project-local bundle search root resolution.
|
|
3
|
+
*
|
|
4
|
+
* The canonical project-local source tree lives under the configured AIWG
|
|
5
|
+
* artifact root, not necessarily `<project>/.aiwg`. Operators may also add
|
|
6
|
+
* extra roots for team/private bundles without moving the project corpus.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { delimiter, isAbsolute, join, relative, resolve, sep } from 'path';
|
|
10
|
+
import { DEFAULT_PROJECT_AIWG_DIR, expandProjectArtifactPath, resolveProjectAiwgDir, } from '../config/project-artifacts.js';
|
|
11
|
+
export const PROJECT_LOCAL_SEARCH_PATHS_ENV = 'AIWG_PROJECT_LOCAL_PATHS';
|
|
12
|
+
export const PROJECT_LOCAL_TYPE_TO_DIR = {
|
|
13
|
+
extension: 'extensions',
|
|
14
|
+
addon: 'addons',
|
|
15
|
+
framework: 'frameworks',
|
|
16
|
+
plugin: 'plugins',
|
|
17
|
+
provider: 'providers',
|
|
18
|
+
};
|
|
19
|
+
export const PROJECT_LOCAL_DIR_TO_TYPE = Object.fromEntries(Object.entries(PROJECT_LOCAL_TYPE_TO_DIR).map(([type, dirName]) => [dirName, type]));
|
|
20
|
+
export const PROJECT_LOCAL_SCAN_DIRS = Object.values(PROJECT_LOCAL_TYPE_TO_DIR);
|
|
21
|
+
function toPortablePath(pathValue) {
|
|
22
|
+
return pathValue.split(sep).join('/');
|
|
23
|
+
}
|
|
24
|
+
export function isPathInside(parentPath, candidatePath) {
|
|
25
|
+
const parent = resolve(parentPath);
|
|
26
|
+
const candidate = resolve(candidatePath);
|
|
27
|
+
const rel = relative(parent, candidate);
|
|
28
|
+
return rel === '' || (rel.length > 0 && !rel.startsWith('..') && !isAbsolute(rel));
|
|
29
|
+
}
|
|
30
|
+
export function projectRelativePathIfInside(projectDir, absPath) {
|
|
31
|
+
if (!isPathInside(projectDir, absPath))
|
|
32
|
+
return null;
|
|
33
|
+
const rel = toPortablePath(relative(resolve(projectDir), resolve(absPath)));
|
|
34
|
+
return rel.length > 0 ? rel : '.';
|
|
35
|
+
}
|
|
36
|
+
function displayPrefixForAdditionalRoot(projectDir, rootPath) {
|
|
37
|
+
const rel = projectRelativePathIfInside(projectDir, rootPath);
|
|
38
|
+
return rel ?? resolve(rootPath);
|
|
39
|
+
}
|
|
40
|
+
function readConfiguredSearchPaths(projectDir, env) {
|
|
41
|
+
const configPath = join(resolveProjectAiwgDir(projectDir, env), 'aiwg.config');
|
|
42
|
+
if (!existsSync(configPath))
|
|
43
|
+
return [];
|
|
44
|
+
let parsed;
|
|
45
|
+
try {
|
|
46
|
+
parsed = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
if (!parsed || typeof parsed !== 'object')
|
|
52
|
+
return [];
|
|
53
|
+
const record = parsed;
|
|
54
|
+
const projectLocal = record.projectLocal ?? record.project_local;
|
|
55
|
+
if (!projectLocal || typeof projectLocal !== 'object')
|
|
56
|
+
return [];
|
|
57
|
+
const projectLocalRecord = projectLocal;
|
|
58
|
+
const rawPaths = projectLocalRecord.searchPaths ?? projectLocalRecord.search_paths;
|
|
59
|
+
if (!Array.isArray(rawPaths))
|
|
60
|
+
return [];
|
|
61
|
+
return rawPaths
|
|
62
|
+
.filter((value) => typeof value === 'string')
|
|
63
|
+
.map(value => value.trim())
|
|
64
|
+
.filter(value => value.length > 0);
|
|
65
|
+
}
|
|
66
|
+
export function parseProjectLocalSearchPaths(value) {
|
|
67
|
+
if (!value)
|
|
68
|
+
return [];
|
|
69
|
+
return value
|
|
70
|
+
.split(delimiter)
|
|
71
|
+
.map(part => part.trim())
|
|
72
|
+
.filter(part => part.length > 0);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve project-local bundle roots in scan order.
|
|
76
|
+
*
|
|
77
|
+
* The configured project AIWG artifact root is always first and keeps the
|
|
78
|
+
* virtual `.aiwg/...` display prefix so registry bindings survive a move or
|
|
79
|
+
* rename. Additional roots are then loaded from `aiwg.config` and finally
|
|
80
|
+
* `AIWG_PROJECT_LOCAL_PATHS`.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveProjectLocalSearchRoots(projectDir, env = process.env) {
|
|
83
|
+
const roots = [];
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
const addRoot = (rootPath, source, displayPrefix) => {
|
|
86
|
+
const absoluteRoot = resolve(rootPath);
|
|
87
|
+
const key = process.platform === 'win32' ? absoluteRoot.toLowerCase() : absoluteRoot;
|
|
88
|
+
if (seen.has(key))
|
|
89
|
+
return;
|
|
90
|
+
seen.add(key);
|
|
91
|
+
roots.push({ rootPath: absoluteRoot, source, displayPrefix });
|
|
92
|
+
};
|
|
93
|
+
addRoot(resolveProjectAiwgDir(projectDir, env), 'artifact-root', DEFAULT_PROJECT_AIWG_DIR);
|
|
94
|
+
for (const rawPath of readConfiguredSearchPaths(projectDir, env)) {
|
|
95
|
+
const rootPath = expandProjectArtifactPath(rawPath, projectDir);
|
|
96
|
+
addRoot(rootPath, 'config', displayPrefixForAdditionalRoot(projectDir, rootPath));
|
|
97
|
+
}
|
|
98
|
+
for (const rawPath of parseProjectLocalSearchPaths(env[PROJECT_LOCAL_SEARCH_PATHS_ENV])) {
|
|
99
|
+
const rootPath = expandProjectArtifactPath(rawPath, projectDir);
|
|
100
|
+
addRoot(rootPath, 'env', displayPrefixForAdditionalRoot(projectDir, rootPath));
|
|
101
|
+
}
|
|
102
|
+
return roots;
|
|
103
|
+
}
|
|
104
|
+
export function projectLocalDisplayPath(projectDir, absPath, searchRoot) {
|
|
105
|
+
const absolutePath = resolve(absPath);
|
|
106
|
+
if (searchRoot && isPathInside(searchRoot.rootPath, absolutePath)) {
|
|
107
|
+
const rel = toPortablePath(relative(searchRoot.rootPath, absolutePath));
|
|
108
|
+
const prefix = searchRoot.displayPrefix.replace(/\/+$/, '');
|
|
109
|
+
if (rel.length === 0)
|
|
110
|
+
return prefix || '.';
|
|
111
|
+
return prefix.length > 0 && prefix !== '.'
|
|
112
|
+
? `${prefix}/${rel}`
|
|
113
|
+
: rel;
|
|
114
|
+
}
|
|
115
|
+
const projectRel = projectRelativePathIfInside(projectDir, absolutePath);
|
|
116
|
+
return projectRel ?? absolutePath;
|
|
117
|
+
}
|
|
118
|
+
export function ensureTrailingSlash(pathValue) {
|
|
119
|
+
return pathValue.endsWith('/') ? pathValue : `${pathValue}/`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=project-local-paths.js.map
|