@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,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gitignore Helper
|
|
3
|
+
*
|
|
4
|
+
* Shared module for checking and updating .gitignore files with recommended
|
|
5
|
+
* AIWG runtime and provider directory patterns.
|
|
6
|
+
*
|
|
7
|
+
* @implements #553
|
|
8
|
+
* @module src/config/gitignore
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs/promises';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
// ===========================
|
|
13
|
+
// Recommended Patterns
|
|
14
|
+
// ===========================
|
|
15
|
+
/**
|
|
16
|
+
* AIWG runtime subdirectories that should be gitignored.
|
|
17
|
+
* NOTE: .aiwg/ itself is intentionally NOT included — it contains
|
|
18
|
+
* project artifacts (requirements, architecture, etc.) that should be versioned.
|
|
19
|
+
* Only the high-churn runtime subdirectories are ignored.
|
|
20
|
+
*/
|
|
21
|
+
export const AIWG_RUNTIME_PATTERNS = [
|
|
22
|
+
'.aiwg/working/',
|
|
23
|
+
// .aiwg/.index/ is the artifact graph index (JSON nodes/edges + checksum
|
|
24
|
+
// manifest). It is a pure build artifact, fully regenerable from corpus
|
|
25
|
+
// content via `aiwg index build --all`, so it is ignored rather than committed.
|
|
26
|
+
'.aiwg/.index/',
|
|
27
|
+
'.aiwg/ralph/',
|
|
28
|
+
'.aiwg/ralph-external/',
|
|
29
|
+
'.aiwg/security-engineering/reviews/disclosures/',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Provider conventional directories for non-native deployments.
|
|
33
|
+
* These are generated by `aiwg use` and should not be version-controlled.
|
|
34
|
+
* Claude Code native dirs (.claude/agents/, .claude/skills/, etc.) are intentionally
|
|
35
|
+
* excluded from this list — they are authored artifacts worth versioning.
|
|
36
|
+
*/
|
|
37
|
+
export const PROVIDER_CONVENTIONAL_PATTERNS = [
|
|
38
|
+
'.codex/',
|
|
39
|
+
'.cursor/agents/',
|
|
40
|
+
'.cursor/commands/',
|
|
41
|
+
'.cursor/skills/',
|
|
42
|
+
'.factory/skills/',
|
|
43
|
+
'.factory/rules/',
|
|
44
|
+
'.warp/',
|
|
45
|
+
'.windsurf/agents/',
|
|
46
|
+
'.windsurf/skills/',
|
|
47
|
+
'.windsurf/rules/',
|
|
48
|
+
];
|
|
49
|
+
/**
|
|
50
|
+
* Claude Code session state patterns (machine-local, should not be versioned).
|
|
51
|
+
*/
|
|
52
|
+
export const CLAUDE_SESSION_PATTERNS = [
|
|
53
|
+
'.claude/settings.local.json',
|
|
54
|
+
];
|
|
55
|
+
/** All recommended patterns combined */
|
|
56
|
+
export const ALL_RECOMMENDED_PATTERNS = [
|
|
57
|
+
...AIWG_RUNTIME_PATTERNS,
|
|
58
|
+
...CLAUDE_SESSION_PATTERNS,
|
|
59
|
+
...PROVIDER_CONVENTIONAL_PATTERNS,
|
|
60
|
+
];
|
|
61
|
+
// ===========================
|
|
62
|
+
// Core Functions
|
|
63
|
+
// ===========================
|
|
64
|
+
/**
|
|
65
|
+
* Check which recommended patterns are missing from the project's .gitignore.
|
|
66
|
+
*/
|
|
67
|
+
export async function checkGitignore(projectRoot) {
|
|
68
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
69
|
+
let content = '';
|
|
70
|
+
let exists = false;
|
|
71
|
+
try {
|
|
72
|
+
content = await fs.readFile(gitignorePath, 'utf-8');
|
|
73
|
+
exists = true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// File doesn't exist — all patterns are missing
|
|
77
|
+
}
|
|
78
|
+
const lines = content.split('\n').map(l => l.trim());
|
|
79
|
+
const isCovered = (pattern) => {
|
|
80
|
+
// Exact match
|
|
81
|
+
if (lines.includes(pattern))
|
|
82
|
+
return true;
|
|
83
|
+
// Pattern without trailing slash is also sufficient
|
|
84
|
+
if (lines.includes(pattern.replace(/\/$/, '')))
|
|
85
|
+
return true;
|
|
86
|
+
// Parent directory is ignored (covers all children)
|
|
87
|
+
const parts = pattern.split('/').filter(Boolean);
|
|
88
|
+
for (let i = 1; i < parts.length; i++) {
|
|
89
|
+
const parent = parts.slice(0, i).join('/') + '/';
|
|
90
|
+
if (lines.includes(parent) || lines.includes(parent.replace(/\/$/, ''))) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
};
|
|
96
|
+
const missingRuntime = AIWG_RUNTIME_PATTERNS.filter(p => !isCovered(p));
|
|
97
|
+
const missingSession = CLAUDE_SESSION_PATTERNS.filter(p => !isCovered(p));
|
|
98
|
+
const missingProvider = PROVIDER_CONVENTIONAL_PATTERNS.filter(p => !isCovered(p));
|
|
99
|
+
const missing = [...missingRuntime, ...missingSession, ...missingProvider];
|
|
100
|
+
return { exists, missing, missingRuntime, missingSession, missingProvider };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Append missing patterns to .gitignore, creating the file if it doesn't exist.
|
|
104
|
+
* Patterns are grouped with comments.
|
|
105
|
+
*/
|
|
106
|
+
export async function appendGitignore(projectRoot, patterns) {
|
|
107
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
108
|
+
let existing = '';
|
|
109
|
+
let fileExists = false;
|
|
110
|
+
try {
|
|
111
|
+
existing = await fs.readFile(gitignorePath, 'utf-8');
|
|
112
|
+
fileExists = true;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// File doesn't exist, will create
|
|
116
|
+
}
|
|
117
|
+
const existingLines = existing.split('\n').map(l => l.trim());
|
|
118
|
+
const toAdd = [];
|
|
119
|
+
const alreadyPresent = [];
|
|
120
|
+
for (const pattern of patterns) {
|
|
121
|
+
if (existingLines.includes(pattern) || existingLines.includes(pattern.replace(/\/$/, ''))) {
|
|
122
|
+
alreadyPresent.push(pattern);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
toAdd.push(pattern);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (toAdd.length > 0) {
|
|
129
|
+
const runtimeToAdd = toAdd.filter(p => AIWG_RUNTIME_PATTERNS.includes(p));
|
|
130
|
+
const sessionToAdd = toAdd.filter(p => CLAUDE_SESSION_PATTERNS.includes(p));
|
|
131
|
+
const providerToAdd = toAdd.filter(p => PROVIDER_CONVENTIONAL_PATTERNS.includes(p));
|
|
132
|
+
let block = '';
|
|
133
|
+
if (runtimeToAdd.length > 0) {
|
|
134
|
+
block += '\n# AIWG — ignore only high-churn runtime subdirs, NOT .aiwg/ itself\n';
|
|
135
|
+
block += runtimeToAdd.join('\n') + '\n';
|
|
136
|
+
}
|
|
137
|
+
if (sessionToAdd.length > 0) {
|
|
138
|
+
block += '\n# Claude Code local session state\n';
|
|
139
|
+
block += sessionToAdd.join('\n') + '\n';
|
|
140
|
+
}
|
|
141
|
+
if (providerToAdd.length > 0) {
|
|
142
|
+
block += '\n# Agentic provider conventional dirs (generated by aiwg use, not authored)\n';
|
|
143
|
+
block += providerToAdd.join('\n') + '\n';
|
|
144
|
+
}
|
|
145
|
+
const newContent = existing.endsWith('\n') || existing === ''
|
|
146
|
+
? existing + block
|
|
147
|
+
: existing + '\n' + block;
|
|
148
|
+
await fs.writeFile(gitignorePath, newContent, 'utf-8');
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
added: toAdd,
|
|
152
|
+
alreadyPresent,
|
|
153
|
+
created: !fileExists && toAdd.length > 0,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project AIWG artifact directory resolution.
|
|
3
|
+
*
|
|
4
|
+
* The public contract has long documented `AIWG_ARTIFACTS_PATH` as the
|
|
5
|
+
* override for the project-local `.aiwg/` artifact root. Keep that contract
|
|
6
|
+
* centralized so callers do not hardcode `<project>/.aiwg`.
|
|
7
|
+
*/
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
import { existsSync, readFileSync } from 'fs';
|
|
10
|
+
import { isAbsolute, join, resolve } from 'path';
|
|
11
|
+
export const DEFAULT_PROJECT_AIWG_DIR = '.aiwg';
|
|
12
|
+
export const AIWG_ARTIFACTS_PATH_ENV = 'AIWG_ARTIFACTS_PATH';
|
|
13
|
+
export const PROJECT_AIWG_LOCATION_FILE = '.aiwg-location';
|
|
14
|
+
const ARTIFACT_PATH_ENV_ALIASES = [
|
|
15
|
+
AIWG_ARTIFACTS_PATH_ENV,
|
|
16
|
+
'AIWG_PROJECT_ARTIFACTS_PATH',
|
|
17
|
+
'AIWG_PROJECT_AIWG_DIR',
|
|
18
|
+
];
|
|
19
|
+
export function expandProjectArtifactPath(pathValue, projectDir) {
|
|
20
|
+
const trimmed = pathValue.trim();
|
|
21
|
+
if (trimmed === '~')
|
|
22
|
+
return homedir();
|
|
23
|
+
if (trimmed.startsWith('~/'))
|
|
24
|
+
return resolve(homedir(), trimmed.slice(2));
|
|
25
|
+
if (isAbsolute(trimmed))
|
|
26
|
+
return trimmed;
|
|
27
|
+
return resolve(projectDir, trimmed);
|
|
28
|
+
}
|
|
29
|
+
export function parseProjectArtifactLocation(contents) {
|
|
30
|
+
for (const rawLine of contents.split(/\r?\n/)) {
|
|
31
|
+
let line = rawLine.trim();
|
|
32
|
+
if (line.length === 0 || line.startsWith('#'))
|
|
33
|
+
continue;
|
|
34
|
+
if (line.startsWith('export '))
|
|
35
|
+
line = line.slice('export '.length).trim();
|
|
36
|
+
const assignment = line.match(/^AIWG_ARTIFACTS_PATH\s*=\s*(.+)$/);
|
|
37
|
+
if (assignment)
|
|
38
|
+
line = assignment[1].trim();
|
|
39
|
+
if ((line.startsWith('"') && line.endsWith('"')) ||
|
|
40
|
+
(line.startsWith("'") && line.endsWith("'"))) {
|
|
41
|
+
line = line.slice(1, -1);
|
|
42
|
+
}
|
|
43
|
+
return line.length > 0 ? line : null;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
export function readProjectArtifactLocation(projectDir) {
|
|
48
|
+
const pointerPath = resolve(projectDir, PROJECT_AIWG_LOCATION_FILE);
|
|
49
|
+
if (!existsSync(pointerPath))
|
|
50
|
+
return null;
|
|
51
|
+
return parseProjectArtifactLocation(readFileSync(pointerPath, 'utf-8'));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the directory that contains AIWG project artifacts.
|
|
55
|
+
*
|
|
56
|
+
* Defaults to `<projectDir>/.aiwg`. When `AIWG_ARTIFACTS_PATH` is set, the
|
|
57
|
+
* override may be absolute, project-relative, or `~/`-relative. The override
|
|
58
|
+
* intentionally points at the artifact directory itself, not its parent, so
|
|
59
|
+
* callers can rename `.aiwg` or place it outside the checkout.
|
|
60
|
+
*/
|
|
61
|
+
export function resolveProjectAiwgDir(projectDir, env = process.env) {
|
|
62
|
+
for (const key of ARTIFACT_PATH_ENV_ALIASES) {
|
|
63
|
+
const value = env[key];
|
|
64
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
65
|
+
return expandProjectArtifactPath(value, projectDir);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const configuredLocation = readProjectArtifactLocation(projectDir);
|
|
69
|
+
if (configuredLocation)
|
|
70
|
+
return expandProjectArtifactPath(configuredLocation, projectDir);
|
|
71
|
+
return resolve(projectDir, DEFAULT_PROJECT_AIWG_DIR);
|
|
72
|
+
}
|
|
73
|
+
export function projectAiwgPath(projectDir, ...segments) {
|
|
74
|
+
return join(resolveProjectAiwgDir(projectDir), ...segments);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=project-artifacts.js.map
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-Level Configuration Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the ~/.aiwg/ (or ~/.config/aiwg/) user configuration directory.
|
|
5
|
+
* Provides get/set/list/validate/reset/path operations for all config files.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order:
|
|
8
|
+
* 1. AIWG_CONFIG env var (explicit override)
|
|
9
|
+
* 2. --config-dir CLI flag (explicit override)
|
|
10
|
+
* 3. ~/.aiwg (primary — simple, discoverable)
|
|
11
|
+
* 4. ~/.config/aiwg (fallback — XDG-compliant)
|
|
12
|
+
*
|
|
13
|
+
* New config files are created in whichever path already exists,
|
|
14
|
+
* defaulting to ~/.aiwg if neither exists.
|
|
15
|
+
*
|
|
16
|
+
* @implements #545
|
|
17
|
+
*/
|
|
18
|
+
import { readFile, writeFile, mkdir, access } from 'fs/promises';
|
|
19
|
+
import { resolve } from 'path';
|
|
20
|
+
import { homedir } from 'os';
|
|
21
|
+
import { existsSync } from 'fs';
|
|
22
|
+
/**
|
|
23
|
+
* Known config files in the user config directory
|
|
24
|
+
*/
|
|
25
|
+
export const KNOWN_CONFIG_FILES = [
|
|
26
|
+
{ filename: 'config.yaml', description: 'Global AIWG user preferences' },
|
|
27
|
+
{ filename: 'models.json', description: 'Model tier and provider overrides' },
|
|
28
|
+
{ filename: 'ops.json', description: 'Ops workspace registry' },
|
|
29
|
+
{ filename: 'mcp-servers.json', description: 'MCP server registry (single source of truth)' },
|
|
30
|
+
{ filename: 'packages.yaml', description: 'Installed remote packages (aiwg install)' },
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Default user config values
|
|
34
|
+
*/
|
|
35
|
+
export const DEFAULT_USER_CONFIG = {
|
|
36
|
+
apiVersion: 'aiwg.io/v1',
|
|
37
|
+
kind: 'UserConfig',
|
|
38
|
+
defaults: {
|
|
39
|
+
provider: 'claude',
|
|
40
|
+
verbosity: 'normal',
|
|
41
|
+
},
|
|
42
|
+
telemetry: {
|
|
43
|
+
enabled: false,
|
|
44
|
+
},
|
|
45
|
+
updates: {
|
|
46
|
+
channel: 'stable',
|
|
47
|
+
checkOnStartup: true,
|
|
48
|
+
},
|
|
49
|
+
community: {
|
|
50
|
+
nudges: true,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the active user config directory
|
|
55
|
+
*
|
|
56
|
+
* Resolution order:
|
|
57
|
+
* 1. Explicit override (AIWG_CONFIG env or --config-dir)
|
|
58
|
+
* 2. ~/.aiwg (primary)
|
|
59
|
+
* 3. ~/.config/aiwg (fallback)
|
|
60
|
+
* 4. ~/.aiwg (default if neither exists)
|
|
61
|
+
*/
|
|
62
|
+
export function resolveConfigDir(overridePath) {
|
|
63
|
+
// 1. Explicit override from env or CLI flag
|
|
64
|
+
const envOverride = process.env.AIWG_CONFIG;
|
|
65
|
+
if (overridePath) {
|
|
66
|
+
return resolve(overridePath);
|
|
67
|
+
}
|
|
68
|
+
if (envOverride) {
|
|
69
|
+
return resolve(envOverride);
|
|
70
|
+
}
|
|
71
|
+
// 2. Check primary path: ~/.aiwg
|
|
72
|
+
const primaryPath = resolve(homedir(), '.aiwg');
|
|
73
|
+
if (existsSync(primaryPath)) {
|
|
74
|
+
return primaryPath;
|
|
75
|
+
}
|
|
76
|
+
// 3. Check fallback path: ~/.config/aiwg
|
|
77
|
+
const fallbackPath = resolve(homedir(), '.config/aiwg');
|
|
78
|
+
if (existsSync(fallbackPath)) {
|
|
79
|
+
return fallbackPath;
|
|
80
|
+
}
|
|
81
|
+
// 4. Default to primary if neither exists
|
|
82
|
+
return primaryPath;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* User-level configuration manager
|
|
86
|
+
*/
|
|
87
|
+
export class UserConfig {
|
|
88
|
+
configDir;
|
|
89
|
+
configCache = null;
|
|
90
|
+
constructor(overridePath) {
|
|
91
|
+
this.configDir = resolveConfigDir(overridePath);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the resolved config directory path
|
|
95
|
+
*/
|
|
96
|
+
getPath() {
|
|
97
|
+
return this.configDir;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Ensure the config directory exists
|
|
101
|
+
*/
|
|
102
|
+
async ensureDir() {
|
|
103
|
+
await mkdir(this.configDir, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get a config value by dot-notation key
|
|
107
|
+
*
|
|
108
|
+
* Supports keys like:
|
|
109
|
+
* - "defaults.provider"
|
|
110
|
+
* - "telemetry.enabled"
|
|
111
|
+
* - "updates.channel"
|
|
112
|
+
*/
|
|
113
|
+
async get(key) {
|
|
114
|
+
const config = await this.loadConfig();
|
|
115
|
+
return getNestedValue(config, key);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Set a config value by dot-notation key
|
|
119
|
+
*/
|
|
120
|
+
async set(key, value) {
|
|
121
|
+
const config = await this.loadConfig();
|
|
122
|
+
const parsed = parseValue(value);
|
|
123
|
+
setNestedValue(config, key, parsed);
|
|
124
|
+
await this.saveConfig(config);
|
|
125
|
+
this.configCache = config;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* List all config values (merged view across all files)
|
|
129
|
+
*/
|
|
130
|
+
async list() {
|
|
131
|
+
const result = {};
|
|
132
|
+
// Load config.yaml (or defaults)
|
|
133
|
+
const config = await this.loadConfig();
|
|
134
|
+
result['config.yaml'] = config;
|
|
135
|
+
// Check for other known files
|
|
136
|
+
for (const spec of KNOWN_CONFIG_FILES) {
|
|
137
|
+
if (spec.filename === 'config.yaml')
|
|
138
|
+
continue;
|
|
139
|
+
const filePath = resolve(this.configDir, spec.filename);
|
|
140
|
+
try {
|
|
141
|
+
await access(filePath);
|
|
142
|
+
const content = await readFile(filePath, 'utf-8');
|
|
143
|
+
if (spec.filename.endsWith('.json')) {
|
|
144
|
+
result[spec.filename] = JSON.parse(content);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
result[spec.filename] = content;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// File doesn't exist, skip
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Validate all config files
|
|
158
|
+
*
|
|
159
|
+
* Returns array of validation issues (empty = all valid)
|
|
160
|
+
*/
|
|
161
|
+
async validate() {
|
|
162
|
+
const issues = [];
|
|
163
|
+
// Check config directory exists
|
|
164
|
+
if (!existsSync(this.configDir)) {
|
|
165
|
+
issues.push({
|
|
166
|
+
file: this.configDir,
|
|
167
|
+
severity: 'info',
|
|
168
|
+
message: 'Config directory does not exist (will be created on first use)',
|
|
169
|
+
});
|
|
170
|
+
return issues;
|
|
171
|
+
}
|
|
172
|
+
// Validate config.yaml
|
|
173
|
+
const configPath = resolve(this.configDir, 'config.yaml');
|
|
174
|
+
if (existsSync(configPath)) {
|
|
175
|
+
try {
|
|
176
|
+
const content = await readFile(configPath, 'utf-8');
|
|
177
|
+
const parsed = parseYamlSimple(content);
|
|
178
|
+
if (!parsed.apiVersion) {
|
|
179
|
+
issues.push({
|
|
180
|
+
file: 'config.yaml',
|
|
181
|
+
severity: 'warning',
|
|
182
|
+
message: 'Missing apiVersion field',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (!parsed.kind) {
|
|
186
|
+
issues.push({
|
|
187
|
+
file: 'config.yaml',
|
|
188
|
+
severity: 'warning',
|
|
189
|
+
message: 'Missing kind field',
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
issues.push({
|
|
195
|
+
file: 'config.yaml',
|
|
196
|
+
severity: 'error',
|
|
197
|
+
message: `Failed to parse: ${err instanceof Error ? err.message : String(err)}`,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Validate models.json
|
|
202
|
+
const modelsPath = resolve(this.configDir, 'models.json');
|
|
203
|
+
if (existsSync(modelsPath)) {
|
|
204
|
+
try {
|
|
205
|
+
const content = await readFile(modelsPath, 'utf-8');
|
|
206
|
+
JSON.parse(content);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
issues.push({
|
|
210
|
+
file: 'models.json',
|
|
211
|
+
severity: 'error',
|
|
212
|
+
message: `Invalid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Validate ops.json if present
|
|
217
|
+
const opsPath = resolve(this.configDir, 'ops.json');
|
|
218
|
+
if (existsSync(opsPath)) {
|
|
219
|
+
try {
|
|
220
|
+
const content = await readFile(opsPath, 'utf-8');
|
|
221
|
+
const parsed = JSON.parse(content);
|
|
222
|
+
if (parsed.apiVersion && parsed.apiVersion !== 'aiwg.io/v1') {
|
|
223
|
+
issues.push({
|
|
224
|
+
file: 'ops.json',
|
|
225
|
+
severity: 'warning',
|
|
226
|
+
message: `Unknown apiVersion: ${parsed.apiVersion}`,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
issues.push({
|
|
232
|
+
file: 'ops.json',
|
|
233
|
+
severity: 'error',
|
|
234
|
+
message: `Failed to parse: ${err instanceof Error ? err.message : String(err)}`,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return issues;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Reset a key to its default value, or reset all config
|
|
242
|
+
*/
|
|
243
|
+
async reset(key) {
|
|
244
|
+
if (!key) {
|
|
245
|
+
// Reset entire config to defaults
|
|
246
|
+
await this.saveConfig({ ...DEFAULT_USER_CONFIG });
|
|
247
|
+
this.configCache = null;
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// Reset specific key
|
|
251
|
+
const config = await this.loadConfig();
|
|
252
|
+
const defaultValue = getNestedValue(DEFAULT_USER_CONFIG, key);
|
|
253
|
+
if (defaultValue !== undefined) {
|
|
254
|
+
setNestedValue(config, key, defaultValue);
|
|
255
|
+
await this.saveConfig(config);
|
|
256
|
+
this.configCache = config;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Load config.yaml, creating defaults if it doesn't exist
|
|
261
|
+
*/
|
|
262
|
+
async loadConfig() {
|
|
263
|
+
if (this.configCache) {
|
|
264
|
+
return this.configCache;
|
|
265
|
+
}
|
|
266
|
+
const configPath = resolve(this.configDir, 'config.yaml');
|
|
267
|
+
try {
|
|
268
|
+
const content = await readFile(configPath, 'utf-8');
|
|
269
|
+
const parsed = parseYamlSimple(content);
|
|
270
|
+
this.configCache = {
|
|
271
|
+
...DEFAULT_USER_CONFIG,
|
|
272
|
+
...parsed,
|
|
273
|
+
defaults: { ...DEFAULT_USER_CONFIG.defaults, ...parsed.defaults },
|
|
274
|
+
telemetry: { ...DEFAULT_USER_CONFIG.telemetry, ...parsed.telemetry },
|
|
275
|
+
updates: { ...DEFAULT_USER_CONFIG.updates, ...parsed.updates },
|
|
276
|
+
community: { ...DEFAULT_USER_CONFIG.community, ...parsed.community },
|
|
277
|
+
};
|
|
278
|
+
return this.configCache;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// File doesn't exist — return defaults (don't create file yet)
|
|
282
|
+
this.configCache = {
|
|
283
|
+
...DEFAULT_USER_CONFIG,
|
|
284
|
+
defaults: { ...DEFAULT_USER_CONFIG.defaults },
|
|
285
|
+
telemetry: { ...DEFAULT_USER_CONFIG.telemetry },
|
|
286
|
+
updates: { ...DEFAULT_USER_CONFIG.updates },
|
|
287
|
+
community: { ...DEFAULT_USER_CONFIG.community },
|
|
288
|
+
};
|
|
289
|
+
return this.configCache;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Save config.yaml
|
|
294
|
+
*/
|
|
295
|
+
async saveConfig(config) {
|
|
296
|
+
await this.ensureDir();
|
|
297
|
+
const configPath = resolve(this.configDir, 'config.yaml');
|
|
298
|
+
const yaml = serializeYamlSimple(config);
|
|
299
|
+
await writeFile(configPath, yaml, 'utf-8');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// ============================================
|
|
303
|
+
// Simple YAML helpers (no dependency needed for flat configs)
|
|
304
|
+
// ============================================
|
|
305
|
+
/**
|
|
306
|
+
* Minimal YAML parser for flat/nested config files.
|
|
307
|
+
* Handles the subset we use: scalars, nested objects (2 levels).
|
|
308
|
+
* For complex YAML, users should use a full parser.
|
|
309
|
+
*/
|
|
310
|
+
export function parseYamlSimple(content) {
|
|
311
|
+
const result = {};
|
|
312
|
+
let currentSection = null;
|
|
313
|
+
for (const line of content.split('\n')) {
|
|
314
|
+
// Skip comments and empty lines
|
|
315
|
+
if (line.trim().startsWith('#') || line.trim() === '')
|
|
316
|
+
continue;
|
|
317
|
+
const indent = line.length - line.trimStart().length;
|
|
318
|
+
const trimmed = line.trim();
|
|
319
|
+
// Key: value pair
|
|
320
|
+
const match = trimmed.match(/^([^:]+):\s*(.*)$/);
|
|
321
|
+
if (!match)
|
|
322
|
+
continue;
|
|
323
|
+
const key = match[1].trim();
|
|
324
|
+
const rawValue = match[2].trim();
|
|
325
|
+
if (indent === 0) {
|
|
326
|
+
if (rawValue === '' || rawValue === undefined) {
|
|
327
|
+
// Section header
|
|
328
|
+
currentSection = key;
|
|
329
|
+
if (!(key in result)) {
|
|
330
|
+
result[key] = {};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
// Top-level key-value
|
|
335
|
+
currentSection = null;
|
|
336
|
+
result[key] = parseScalar(rawValue);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else if (currentSection && indent >= 2) {
|
|
340
|
+
// Nested key under current section
|
|
341
|
+
const section = result[currentSection];
|
|
342
|
+
section[key] = parseScalar(rawValue);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return result;
|
|
346
|
+
}
|
|
347
|
+
function parseScalar(value) {
|
|
348
|
+
if (value === 'true')
|
|
349
|
+
return true;
|
|
350
|
+
if (value === 'false')
|
|
351
|
+
return false;
|
|
352
|
+
if (value === 'null' || value === '~')
|
|
353
|
+
return null;
|
|
354
|
+
if (/^-?\d+$/.test(value))
|
|
355
|
+
return parseInt(value, 10);
|
|
356
|
+
if (/^-?\d+\.\d+$/.test(value))
|
|
357
|
+
return parseFloat(value);
|
|
358
|
+
// Strip quotes
|
|
359
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
360
|
+
return value.slice(1, -1);
|
|
361
|
+
}
|
|
362
|
+
return value;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Minimal YAML serializer for our config format
|
|
366
|
+
*/
|
|
367
|
+
export function serializeYamlSimple(obj, indent = 0) {
|
|
368
|
+
const lines = [];
|
|
369
|
+
const pad = ' '.repeat(indent);
|
|
370
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
371
|
+
if (value === null || value === undefined) {
|
|
372
|
+
lines.push(`${pad}${key}:`);
|
|
373
|
+
}
|
|
374
|
+
else if (typeof value === 'object' && !Array.isArray(value)) {
|
|
375
|
+
lines.push(`${pad}${key}:`);
|
|
376
|
+
lines.push(serializeYamlSimple(value, indent + 2));
|
|
377
|
+
}
|
|
378
|
+
else if (typeof value === 'string') {
|
|
379
|
+
// Quote strings that could be misinterpreted
|
|
380
|
+
const needsQuote = /[:#{}[\],&*?|>!%@`]/.test(value) || value === '';
|
|
381
|
+
lines.push(`${pad}${key}: ${needsQuote ? `"${value}"` : value}`);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
lines.push(`${pad}${key}: ${String(value)}`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return lines.join('\n');
|
|
388
|
+
}
|
|
389
|
+
// ============================================
|
|
390
|
+
// Dot-notation helpers
|
|
391
|
+
// ============================================
|
|
392
|
+
function getNestedValue(obj, path) {
|
|
393
|
+
const parts = path.split('.');
|
|
394
|
+
let current = obj;
|
|
395
|
+
for (const part of parts) {
|
|
396
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
397
|
+
return undefined;
|
|
398
|
+
}
|
|
399
|
+
current = current[part];
|
|
400
|
+
}
|
|
401
|
+
return current;
|
|
402
|
+
}
|
|
403
|
+
function setNestedValue(obj, path, value) {
|
|
404
|
+
const parts = path.split('.');
|
|
405
|
+
let current = obj;
|
|
406
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
407
|
+
const part = parts[i];
|
|
408
|
+
if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {
|
|
409
|
+
current[part] = {};
|
|
410
|
+
}
|
|
411
|
+
current = current[part];
|
|
412
|
+
}
|
|
413
|
+
current[parts[parts.length - 1]] = value;
|
|
414
|
+
}
|
|
415
|
+
function parseValue(value) {
|
|
416
|
+
if (value === 'true')
|
|
417
|
+
return true;
|
|
418
|
+
if (value === 'false')
|
|
419
|
+
return false;
|
|
420
|
+
if (value === 'null')
|
|
421
|
+
return null;
|
|
422
|
+
if (/^-?\d+$/.test(value))
|
|
423
|
+
return parseInt(value, 10);
|
|
424
|
+
if (/^-?\d+\.\d+$/.test(value))
|
|
425
|
+
return parseFloat(value);
|
|
426
|
+
return value;
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=user-config.js.map
|