@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,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIWG CLI Structured Logger
|
|
3
|
+
*
|
|
4
|
+
* Two public surfaces:
|
|
5
|
+
*
|
|
6
|
+
* debug(scope, msg, ...args) — cheap, env-gated, stderr-only diagnostic log.
|
|
7
|
+
* Unchanged from Phase 4 (#921). Use this for
|
|
8
|
+
* ad-hoc troubleshooting prints that no-op
|
|
9
|
+
* unless AIWG_DEBUG is set.
|
|
10
|
+
*
|
|
11
|
+
* getLogger(scope) — structured Logger (this file's main surface).
|
|
12
|
+
* Every record carries full provenance
|
|
13
|
+
* metadata (ts, invocation_id, command, user,
|
|
14
|
+
* cwd, aiwg_version, git_sha, channel, node,
|
|
15
|
+
* platform, tty, ci) and is written to both
|
|
16
|
+
* stderr (pretty) and ~/.aiwg/logs/aiwg-YYYY-
|
|
17
|
+
* MM-DD.jsonl (structured).
|
|
18
|
+
*
|
|
19
|
+
* Phase 4.5 of the CLI Stabilization Epic (#925) extends the Phase 4 debug()
|
|
20
|
+
* helper into a full structured-logging stack.
|
|
21
|
+
*
|
|
22
|
+
* To enable debug-level output:
|
|
23
|
+
* AIWG_DEBUG=1 aiwg use all # enable everything (debug)
|
|
24
|
+
* AIWG_LOG_LEVEL=debug aiwg use all # same
|
|
25
|
+
* AIWG_LOG_LEVEL=info aiwg use all # info and above
|
|
26
|
+
* aiwg use all -v # info (verbose)
|
|
27
|
+
* aiwg use all -vv # debug
|
|
28
|
+
* aiwg use all --quiet # error only
|
|
29
|
+
* AIWG_LOG_FILE=/tmp/aiwg.jsonl aiwg use all # override JSONL path
|
|
30
|
+
* AIWG_LOG_DISABLE=1 aiwg --version # skip all logging
|
|
31
|
+
*
|
|
32
|
+
* Scope syntax (passed to both the debug() filter AND the Logger):
|
|
33
|
+
* 'cli:*' — any cli:* scope
|
|
34
|
+
* 'cli:use:*,net:*' — multiple globs
|
|
35
|
+
* 'cli:*,-cli:use:deploy' — include/exclude
|
|
36
|
+
*/
|
|
37
|
+
import { hostname, platform, arch, userInfo, homedir, release } from 'os';
|
|
38
|
+
import { appendFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from 'fs';
|
|
39
|
+
import path from 'path';
|
|
40
|
+
const LEVEL_ORDER = {
|
|
41
|
+
debug: 10,
|
|
42
|
+
info: 20,
|
|
43
|
+
warn: 30,
|
|
44
|
+
error: 40,
|
|
45
|
+
silent: 50,
|
|
46
|
+
};
|
|
47
|
+
function coerceLevel(raw) {
|
|
48
|
+
if (!raw)
|
|
49
|
+
return null;
|
|
50
|
+
const lower = raw.toLowerCase();
|
|
51
|
+
if (lower === 'debug' || lower === 'info' || lower === 'warn' || lower === 'error' || lower === 'silent') {
|
|
52
|
+
return lower;
|
|
53
|
+
}
|
|
54
|
+
if (lower === '1' || lower === 'true' || lower === 'all')
|
|
55
|
+
return 'debug';
|
|
56
|
+
if (lower === '0' || lower === 'false' || lower === 'off')
|
|
57
|
+
return 'silent';
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
function compileScopeFilter(raw) {
|
|
61
|
+
if (!raw || raw === '0' || raw.toLowerCase() === 'false') {
|
|
62
|
+
return { includes: [], excludes: [], any: false };
|
|
63
|
+
}
|
|
64
|
+
if (raw === '1' || raw.toLowerCase() === 'true' || raw === '*') {
|
|
65
|
+
return { includes: [/.*/], excludes: [], any: true };
|
|
66
|
+
}
|
|
67
|
+
const parts = raw.split(',').map(s => s.trim()).filter(Boolean);
|
|
68
|
+
const includes = [];
|
|
69
|
+
const excludes = [];
|
|
70
|
+
for (const part of parts) {
|
|
71
|
+
const negated = part.startsWith('-');
|
|
72
|
+
const pattern = negated ? part.slice(1) : part;
|
|
73
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
74
|
+
const regex = new RegExp('^' + escaped.replace(/\*/g, '[^:]*') + '$');
|
|
75
|
+
(negated ? excludes : includes).push(regex);
|
|
76
|
+
}
|
|
77
|
+
return { includes, excludes, any: includes.length > 0 };
|
|
78
|
+
}
|
|
79
|
+
function scopeMatches(filter, scope) {
|
|
80
|
+
if (!filter.any)
|
|
81
|
+
return false;
|
|
82
|
+
for (const ex of filter.excludes) {
|
|
83
|
+
if (ex.test(scope))
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
for (const inc of filter.includes) {
|
|
87
|
+
if (inc.test(scope))
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
let cachedProvenance = null;
|
|
93
|
+
let invocationIdOverride = null;
|
|
94
|
+
/**
|
|
95
|
+
* Override the invocation ID discovered by the logger. Called from the
|
|
96
|
+
* top-level entry (bin/aiwg.mjs) once the ID has been minted or inherited
|
|
97
|
+
* from `AIWG_INVOCATION_ID`. Safe to call before the logger is used.
|
|
98
|
+
*/
|
|
99
|
+
export function setInvocationId(id) {
|
|
100
|
+
invocationIdOverride = id;
|
|
101
|
+
if (cachedProvenance)
|
|
102
|
+
cachedProvenance.invocation_id = id;
|
|
103
|
+
}
|
|
104
|
+
export function getInvocationId() {
|
|
105
|
+
if (invocationIdOverride)
|
|
106
|
+
return invocationIdOverride;
|
|
107
|
+
if (cachedProvenance)
|
|
108
|
+
return cachedProvenance.invocation_id;
|
|
109
|
+
// Fallback: a synthesized id if the entry never called setInvocationId
|
|
110
|
+
// (typically only happens in unit tests that import the logger directly).
|
|
111
|
+
return process.env['AIWG_INVOCATION_ID'] ?? 'unknown';
|
|
112
|
+
}
|
|
113
|
+
function detectCI() {
|
|
114
|
+
for (const k of ['CI', 'CONTINUOUS_INTEGRATION', 'GITHUB_ACTIONS', 'GITLAB_CI', 'CIRCLECI', 'TRAVIS', 'BUILDKITE', 'JENKINS_URL', 'TF_BUILD', 'TEAMCITY_VERSION']) {
|
|
115
|
+
const v = process.env[k];
|
|
116
|
+
if (v && v !== '0' && v.toLowerCase() !== 'false')
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
function detectVersion() {
|
|
122
|
+
try {
|
|
123
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
124
|
+
const require = (0, eval)('require');
|
|
125
|
+
const fs = require('fs');
|
|
126
|
+
let dir = __dirname;
|
|
127
|
+
for (let i = 0; i < 10; i++) {
|
|
128
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
129
|
+
if (fs.existsSync(pkgPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
132
|
+
if (pkg.name === 'aiwg')
|
|
133
|
+
return pkg.version;
|
|
134
|
+
}
|
|
135
|
+
catch { /* keep walking */ }
|
|
136
|
+
}
|
|
137
|
+
const parent = path.dirname(dir);
|
|
138
|
+
if (parent === dir)
|
|
139
|
+
break;
|
|
140
|
+
dir = parent;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch { /* fall through */ }
|
|
144
|
+
return 'unknown';
|
|
145
|
+
}
|
|
146
|
+
function detectGitSha() {
|
|
147
|
+
// Lightweight git detection: look for aiwg repo's .git/HEAD. No git CLI spawn.
|
|
148
|
+
try {
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
150
|
+
const require = (0, eval)('require');
|
|
151
|
+
const fs = require('fs');
|
|
152
|
+
let dir = __dirname;
|
|
153
|
+
for (let i = 0; i < 10; i++) {
|
|
154
|
+
const gitDir = path.join(dir, '.git');
|
|
155
|
+
if (fs.existsSync(gitDir)) {
|
|
156
|
+
const head = fs.readFileSync(path.join(gitDir, 'HEAD'), 'utf-8').trim();
|
|
157
|
+
if (head.startsWith('ref:')) {
|
|
158
|
+
const refPath = path.join(gitDir, head.slice(5).trim());
|
|
159
|
+
if (fs.existsSync(refPath)) {
|
|
160
|
+
return fs.readFileSync(refPath, 'utf-8').trim().slice(0, 8);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return head.slice(0, 8);
|
|
164
|
+
}
|
|
165
|
+
const parent = path.dirname(dir);
|
|
166
|
+
if (parent === dir)
|
|
167
|
+
break;
|
|
168
|
+
dir = parent;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch { /* non-git installs are fine */ }
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
function detectChannel() {
|
|
175
|
+
// Minimal detection without loading the full channel manager (circular risk).
|
|
176
|
+
try {
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
178
|
+
const require = (0, eval)('require');
|
|
179
|
+
const fs = require('fs');
|
|
180
|
+
const channelFile = path.join(homedir(), '.aiwg', 'channel.json');
|
|
181
|
+
if (fs.existsSync(channelFile)) {
|
|
182
|
+
const json = JSON.parse(fs.readFileSync(channelFile, 'utf-8'));
|
|
183
|
+
if (json.devMode)
|
|
184
|
+
return 'dev';
|
|
185
|
+
if (json.channel)
|
|
186
|
+
return json.channel;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch { /* ignore */ }
|
|
190
|
+
return 'stable';
|
|
191
|
+
}
|
|
192
|
+
function getProvenance() {
|
|
193
|
+
if (cachedProvenance)
|
|
194
|
+
return cachedProvenance;
|
|
195
|
+
const id = invocationIdOverride ?? process.env['AIWG_INVOCATION_ID'] ?? 'unknown';
|
|
196
|
+
cachedProvenance = {
|
|
197
|
+
pid: process.pid,
|
|
198
|
+
ppid: process.ppid,
|
|
199
|
+
user: userInfo().username,
|
|
200
|
+
host: hostname(),
|
|
201
|
+
cwd: process.cwd(),
|
|
202
|
+
aiwg_version: detectVersion(),
|
|
203
|
+
git_sha: detectGitSha(),
|
|
204
|
+
channel: detectChannel(),
|
|
205
|
+
node_version: process.version,
|
|
206
|
+
platform: platform(),
|
|
207
|
+
arch: arch(),
|
|
208
|
+
os_release: release(),
|
|
209
|
+
tty: process.stderr.isTTY ?? false,
|
|
210
|
+
ci: detectCI(),
|
|
211
|
+
invocation_id: id,
|
|
212
|
+
};
|
|
213
|
+
return cachedProvenance;
|
|
214
|
+
}
|
|
215
|
+
let cachedConfig = null;
|
|
216
|
+
let currentLevelOverride = null;
|
|
217
|
+
function resolveConfig() {
|
|
218
|
+
if (cachedConfig)
|
|
219
|
+
return cachedConfig;
|
|
220
|
+
const disabled = process.env['AIWG_LOG_DISABLE'] === '1' ||
|
|
221
|
+
process.env['AIWG_LOG_DISABLE']?.toLowerCase() === 'true';
|
|
222
|
+
// Precedence: AIWG_LOG_LEVEL > AIWG_DEBUG (implies debug) > default info.
|
|
223
|
+
// When AIWG_LOG_DISABLE is set, silent wins.
|
|
224
|
+
let level = 'info';
|
|
225
|
+
if (disabled) {
|
|
226
|
+
level = 'silent';
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const envLevel = coerceLevel(process.env['AIWG_LOG_LEVEL']);
|
|
230
|
+
if (envLevel)
|
|
231
|
+
level = envLevel;
|
|
232
|
+
else if (process.env['AIWG_DEBUG'])
|
|
233
|
+
level = 'debug';
|
|
234
|
+
}
|
|
235
|
+
// AIWG_LOG_LEVEL may carry either a bare level ('debug') or a scope filter
|
|
236
|
+
// ('cli:use:*=debug,net:*=info'). The scope-level form is richer; keep both
|
|
237
|
+
// paths for backward compat. Today the simple form is supported.
|
|
238
|
+
const scopeFilter = compileScopeFilter(process.env['AIWG_DEBUG']);
|
|
239
|
+
// Log file: env override wins; default is ~/.aiwg/logs/aiwg-YYYY-MM-DD.jsonl.
|
|
240
|
+
let logFile = null;
|
|
241
|
+
if (!disabled) {
|
|
242
|
+
if (process.env['AIWG_LOG_FILE']) {
|
|
243
|
+
logFile = process.env['AIWG_LOG_FILE'];
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
247
|
+
logFile = path.join(homedir(), '.aiwg', 'logs', `aiwg-${today}.jsonl`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const retentionDays = (() => {
|
|
251
|
+
const raw = process.env['AIWG_LOG_RETENTION_DAYS'];
|
|
252
|
+
const n = raw ? parseInt(raw, 10) : NaN;
|
|
253
|
+
return Number.isFinite(n) && n > 0 ? n : 30;
|
|
254
|
+
})();
|
|
255
|
+
cachedConfig = { level, scopeFilter, logFile, disabled, retentionDays };
|
|
256
|
+
return cachedConfig;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Override the log level from code (typically from bin/aiwg.mjs after
|
|
260
|
+
* parsing -v / -vv / --quiet flags). Must be called before the first
|
|
261
|
+
* Logger method to affect records.
|
|
262
|
+
*/
|
|
263
|
+
export function setLogLevel(level) {
|
|
264
|
+
currentLevelOverride = level;
|
|
265
|
+
if (cachedConfig)
|
|
266
|
+
cachedConfig.level = level;
|
|
267
|
+
}
|
|
268
|
+
function effectiveLevel() {
|
|
269
|
+
if (currentLevelOverride)
|
|
270
|
+
return currentLevelOverride;
|
|
271
|
+
return resolveConfig().level;
|
|
272
|
+
}
|
|
273
|
+
// ── JSONL sink ────────────────────────────────────────────────────────────────
|
|
274
|
+
let logFileEnsured = false;
|
|
275
|
+
function ensureLogDir(logFile) {
|
|
276
|
+
if (logFileEnsured)
|
|
277
|
+
return;
|
|
278
|
+
try {
|
|
279
|
+
mkdirSync(path.dirname(logFile), { recursive: true });
|
|
280
|
+
logFileEnsured = true;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
// Disk full / permission denied — downgrade to stderr-only silently.
|
|
284
|
+
logFileEnsured = true; // don't retry per-record
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Prune daily log files older than `retentionDays`. Run once at startup
|
|
289
|
+
* (bounded work: one directory listing). Silent on failure.
|
|
290
|
+
*/
|
|
291
|
+
export function pruneOldLogs() {
|
|
292
|
+
const cfg = resolveConfig();
|
|
293
|
+
if (cfg.disabled || !cfg.logFile)
|
|
294
|
+
return;
|
|
295
|
+
const dir = path.dirname(cfg.logFile);
|
|
296
|
+
if (!existsSync(dir))
|
|
297
|
+
return;
|
|
298
|
+
const cutoff = Date.now() - cfg.retentionDays * 24 * 60 * 60 * 1000;
|
|
299
|
+
try {
|
|
300
|
+
const entries = readdirSync(dir);
|
|
301
|
+
for (const name of entries) {
|
|
302
|
+
if (!/^aiwg-\d{4}-\d{2}-\d{2}\.jsonl$/.test(name))
|
|
303
|
+
continue;
|
|
304
|
+
const full = path.join(dir, name);
|
|
305
|
+
try {
|
|
306
|
+
const s = statSync(full);
|
|
307
|
+
if (s.mtimeMs < cutoff)
|
|
308
|
+
unlinkSync(full);
|
|
309
|
+
}
|
|
310
|
+
catch { /* ignore per-file errors */ }
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch { /* ignore listing errors */ }
|
|
314
|
+
}
|
|
315
|
+
function writeJsonl(record) {
|
|
316
|
+
const cfg = resolveConfig();
|
|
317
|
+
if (cfg.disabled || !cfg.logFile)
|
|
318
|
+
return;
|
|
319
|
+
try {
|
|
320
|
+
ensureLogDir(cfg.logFile);
|
|
321
|
+
// Sync append — cheap for typical record sizes, simpler than backpressure
|
|
322
|
+
// management. Can move to async append with a tiny queue if we see perf
|
|
323
|
+
// impact on hot paths.
|
|
324
|
+
appendFileSync(cfg.logFile, JSON.stringify(record) + '\n', 'utf-8');
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// Never fail the command because logging failed.
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ── Span support ──────────────────────────────────────────────────────────────
|
|
331
|
+
function shortSpanId() {
|
|
332
|
+
// 6 base32 chars = ~30 bits of entropy — enough for per-invocation uniqueness.
|
|
333
|
+
const buf = new Uint8Array(4);
|
|
334
|
+
if (typeof globalThis.crypto?.getRandomValues === 'function') {
|
|
335
|
+
globalThis.crypto.getRandomValues(buf);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
for (let i = 0; i < 4; i++)
|
|
339
|
+
buf[i] = Math.floor(Math.random() * 256);
|
|
340
|
+
}
|
|
341
|
+
const base32 = '0123456789abcdefghjkmnpqrstvwxyz';
|
|
342
|
+
let out = '';
|
|
343
|
+
let acc = 0;
|
|
344
|
+
let bits = 0;
|
|
345
|
+
for (const byte of buf) {
|
|
346
|
+
acc = (acc << 8) | byte;
|
|
347
|
+
bits += 8;
|
|
348
|
+
while (bits >= 5) {
|
|
349
|
+
out += base32[(acc >> (bits - 5)) & 0x1f];
|
|
350
|
+
bits -= 5;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return out.slice(0, 6);
|
|
354
|
+
}
|
|
355
|
+
function shouldLog(level, scope) {
|
|
356
|
+
const cfg = resolveConfig();
|
|
357
|
+
if (cfg.disabled)
|
|
358
|
+
return false;
|
|
359
|
+
if (LEVEL_ORDER[level] < LEVEL_ORDER[effectiveLevel()])
|
|
360
|
+
return false;
|
|
361
|
+
// AIWG_DEBUG scope filter, when set, acts as an allow-list for debug-level
|
|
362
|
+
// records only. Higher levels always pass.
|
|
363
|
+
if (level === 'debug' && cfg.scopeFilter.any) {
|
|
364
|
+
return scopeMatches(cfg.scopeFilter, scope);
|
|
365
|
+
}
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
function emit(level, scope, msg, ctx, spanId, extraFields) {
|
|
369
|
+
if (!shouldLog(level, scope))
|
|
370
|
+
return;
|
|
371
|
+
const now = new Date();
|
|
372
|
+
const prov = getProvenance();
|
|
373
|
+
const record = {
|
|
374
|
+
ts: now.toISOString(),
|
|
375
|
+
ts_unix_ms: now.getTime(),
|
|
376
|
+
invocation_id: prov.invocation_id,
|
|
377
|
+
span_id: spanId,
|
|
378
|
+
parent_span_id: ctx.parentSpanId,
|
|
379
|
+
scope,
|
|
380
|
+
level,
|
|
381
|
+
msg,
|
|
382
|
+
pid: prov.pid,
|
|
383
|
+
ppid: prov.ppid,
|
|
384
|
+
user: prov.user,
|
|
385
|
+
host: prov.host,
|
|
386
|
+
cwd: prov.cwd,
|
|
387
|
+
aiwg_version: prov.aiwg_version,
|
|
388
|
+
channel: prov.channel,
|
|
389
|
+
node_version: prov.node_version,
|
|
390
|
+
platform: prov.platform,
|
|
391
|
+
arch: prov.arch,
|
|
392
|
+
os_release: prov.os_release,
|
|
393
|
+
tty: prov.tty,
|
|
394
|
+
ci: prov.ci,
|
|
395
|
+
...(prov.git_sha ? { git_sha: prov.git_sha } : {}),
|
|
396
|
+
...ctx.fields,
|
|
397
|
+
...(extraFields ?? {}),
|
|
398
|
+
};
|
|
399
|
+
// Pretty output to stderr (human-readable). Gated by effective level.
|
|
400
|
+
// File records always carry full provenance; terminal output is condensed
|
|
401
|
+
// so operators aren't drowned in metadata.
|
|
402
|
+
const colorReset = '\x1b[0m';
|
|
403
|
+
const color = level === 'error' ? '\x1b[31m' :
|
|
404
|
+
level === 'warn' ? '\x1b[33m' :
|
|
405
|
+
level === 'info' ? '\x1b[36m' :
|
|
406
|
+
'\x1b[2m';
|
|
407
|
+
const useColor = prov.tty && !process.env['NO_COLOR'];
|
|
408
|
+
const prefix = useColor ? `${color}[${level}]${colorReset}` : `[${level}]`;
|
|
409
|
+
const line = `${prefix} ${scope ? scope + ' ' : ''}${msg}`;
|
|
410
|
+
// eslint-disable-next-line no-console
|
|
411
|
+
console.error(line);
|
|
412
|
+
// JSONL sink (structured, always full provenance).
|
|
413
|
+
writeJsonl(record);
|
|
414
|
+
}
|
|
415
|
+
export function getLogger(scope = 'cli', extraFields = {}) {
|
|
416
|
+
return makeLogger({ scope, parentSpanId: '0', fields: extraFields });
|
|
417
|
+
}
|
|
418
|
+
function makeLogger(ctx) {
|
|
419
|
+
const currentSpanId = ctx.parentSpanId === '0' ? '0' : ctx.parentSpanId;
|
|
420
|
+
return {
|
|
421
|
+
debug(msg, fields) { emit('debug', ctx.scope, msg, ctx, currentSpanId, fields); },
|
|
422
|
+
info(msg, fields) { emit('info', ctx.scope, msg, ctx, currentSpanId, fields); },
|
|
423
|
+
warn(msg, fields) { emit('warn', ctx.scope, msg, ctx, currentSpanId, fields); },
|
|
424
|
+
error(msg, fields) { emit('error', ctx.scope, msg, ctx, currentSpanId, fields); },
|
|
425
|
+
child(opts) {
|
|
426
|
+
return makeLogger({
|
|
427
|
+
scope: opts.scope ?? ctx.scope,
|
|
428
|
+
parentSpanId: ctx.parentSpanId,
|
|
429
|
+
fields: { ...ctx.fields, ...(opts.fields ?? {}) },
|
|
430
|
+
});
|
|
431
|
+
},
|
|
432
|
+
span(name, fields) {
|
|
433
|
+
const spanId = shortSpanId();
|
|
434
|
+
const started = Date.now();
|
|
435
|
+
const spanCtx = {
|
|
436
|
+
scope: ctx.scope,
|
|
437
|
+
parentSpanId: spanId,
|
|
438
|
+
fields: { ...ctx.fields, ...(fields ?? {}) },
|
|
439
|
+
};
|
|
440
|
+
emit('debug', ctx.scope, `span:begin:${name}`, spanCtx, spanId, { span_name: name });
|
|
441
|
+
return {
|
|
442
|
+
end(endMsg, endFields) {
|
|
443
|
+
const duration_ms = Date.now() - started;
|
|
444
|
+
emit('debug', ctx.scope, endMsg ?? `span:end:${name}`, spanCtx, spanId, {
|
|
445
|
+
span_name: name,
|
|
446
|
+
duration_ms,
|
|
447
|
+
...(endFields ?? {}),
|
|
448
|
+
});
|
|
449
|
+
},
|
|
450
|
+
debug(msg, f) { emit('debug', ctx.scope, msg, spanCtx, spanId, f); },
|
|
451
|
+
info(msg, f) { emit('info', ctx.scope, msg, spanCtx, spanId, f); },
|
|
452
|
+
warn(msg, f) { emit('warn', ctx.scope, msg, spanCtx, spanId, f); },
|
|
453
|
+
error(msg, f) { emit('error', ctx.scope, msg, spanCtx, spanId, f); },
|
|
454
|
+
};
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
// ── Phase 4 debug() helper (unchanged, kept for backward compat) ──────────────
|
|
459
|
+
const DEBUG_FILTER = compileScopeFilter(process.env['AIWG_DEBUG']);
|
|
460
|
+
/**
|
|
461
|
+
* Emit a debug log record to stderr. No-op when AIWG_DEBUG is unset or
|
|
462
|
+
* the scope does not match.
|
|
463
|
+
*
|
|
464
|
+
* Backward-compatible with the Phase 4 API. New code should prefer
|
|
465
|
+
* getLogger(scope).debug() which also writes to the JSONL sink.
|
|
466
|
+
*/
|
|
467
|
+
export function debug(scope, ...args) {
|
|
468
|
+
if (!scopeMatches(DEBUG_FILTER, scope))
|
|
469
|
+
return;
|
|
470
|
+
const ts = new Date().toISOString();
|
|
471
|
+
// eslint-disable-next-line no-console
|
|
472
|
+
console.error(`[${ts}] [${scope}]`, ...args);
|
|
473
|
+
}
|
|
474
|
+
export function isDebugEnabled(scope) {
|
|
475
|
+
return scopeMatches(DEBUG_FILTER, scope);
|
|
476
|
+
}
|
|
477
|
+
// ── Diagnostic helpers for 'aiwg diagnose' ────────────────────────────────────
|
|
478
|
+
/**
|
|
479
|
+
* Return the effective logger configuration — used by `aiwg version --verbose`
|
|
480
|
+
* and `aiwg diagnose` to surface where logs go and what level is in effect.
|
|
481
|
+
*/
|
|
482
|
+
export function getLoggerInfo() {
|
|
483
|
+
const cfg = resolveConfig();
|
|
484
|
+
return {
|
|
485
|
+
level: effectiveLevel(),
|
|
486
|
+
disabled: cfg.disabled,
|
|
487
|
+
logFile: cfg.logFile,
|
|
488
|
+
retentionDays: cfg.retentionDays,
|
|
489
|
+
provenance: getProvenance(),
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Stat-only signal-walk used by warning.ts to decide whether the cwd looks
|
|
2
|
+
// like a project. Stat-only is required so detection stays under 50ms even
|
|
3
|
+
// in deep directories (NFR-PERF-01). Walk depth is bounded by
|
|
4
|
+
// MAX_PARENT_DEPTH (NFR-PERF-02).
|
|
5
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
6
|
+
import { join, parse } from 'node:path';
|
|
7
|
+
import { PROJECT_SIGNALS, CSPROJ_PATTERN, MAX_PARENT_DEPTH } from './signals.js';
|
|
8
|
+
// Walk `start` and up to MAX_PARENT_DEPTH parents looking for any entry in
|
|
9
|
+
// PROJECT_SIGNALS, or any file matching CSPROJ_PATTERN. Returns on first
|
|
10
|
+
// hit so a project root in cwd short-circuits the walk.
|
|
11
|
+
export function detectProjectSignal(start) {
|
|
12
|
+
let dir = start;
|
|
13
|
+
for (let depth = 0; depth <= MAX_PARENT_DEPTH; depth++) {
|
|
14
|
+
for (const signal of PROJECT_SIGNALS) {
|
|
15
|
+
if (existsSync(join(dir, signal))) {
|
|
16
|
+
return { found: true, signal, foundAt: dir };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (hasCsprojFile(dir)) {
|
|
20
|
+
return { found: true, signal: '*.csproj', foundAt: dir };
|
|
21
|
+
}
|
|
22
|
+
const parent = parse(dir).dir;
|
|
23
|
+
if (parent === dir)
|
|
24
|
+
break;
|
|
25
|
+
dir = parent;
|
|
26
|
+
}
|
|
27
|
+
return { found: false, signal: null, foundAt: null };
|
|
28
|
+
}
|
|
29
|
+
// True when `dir` directly contains at least one *.csproj file.
|
|
30
|
+
function hasCsprojFile(dir) {
|
|
31
|
+
try {
|
|
32
|
+
const entries = readdirSync(dir);
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (CSPROJ_PATTERN.test(entry)) {
|
|
35
|
+
const full = join(dir, entry);
|
|
36
|
+
try {
|
|
37
|
+
if (statSync(full).isFile())
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Ignore stat failures for individual entries — keep walking.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Unreadable dir is treated as "no signal here." Walk continues.
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// True when `cwd` is one of the directories where we should prompt the
|
|
52
|
+
// user. $HOME, /, and /tmp are the canonical surprise-deploy locations.
|
|
53
|
+
// The check tolerates trailing separators on Windows.
|
|
54
|
+
export function isUnsuitableCwd(cwd, home) {
|
|
55
|
+
const normalized = stripTrailingSep(cwd);
|
|
56
|
+
if (normalized === stripTrailingSep(home))
|
|
57
|
+
return true;
|
|
58
|
+
if (normalized === '/')
|
|
59
|
+
return true;
|
|
60
|
+
if (normalized === '/tmp')
|
|
61
|
+
return true;
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
function stripTrailingSep(p) {
|
|
65
|
+
if (p.length > 1 && (p.endsWith('/') || p.endsWith('\\'))) {
|
|
66
|
+
return p.slice(0, -1);
|
|
67
|
+
}
|
|
68
|
+
return p;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Public API for the project-isolation module. Consumers (use.ts) should
|
|
2
|
+
// import from here, not from internal files, so the module shape can evolve
|
|
3
|
+
// without rippling.
|
|
4
|
+
export { maybeWarnProjectIsolation, WARNING_TEXT, GLOBAL_INSTALL_INFO, DEFAULT_DELAY_MS } from './warning.js';
|
|
5
|
+
export { detectProjectSignal, isUnsuitableCwd } from './detect.js';
|
|
6
|
+
export { PROJECT_SIGNALS, CSPROJ_PATTERN, MAX_PARENT_DEPTH } from './signals.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Single source of truth for project-signal filenames used by detect.ts.
|
|
2
|
+
// Adding a new ecosystem means adding one entry here; nothing else changes (NFR-MAINT-01).
|
|
3
|
+
export const PROJECT_SIGNALS = [
|
|
4
|
+
'.git',
|
|
5
|
+
'package.json',
|
|
6
|
+
'pyproject.toml',
|
|
7
|
+
'Cargo.toml',
|
|
8
|
+
'go.mod',
|
|
9
|
+
'pom.xml',
|
|
10
|
+
'Gemfile',
|
|
11
|
+
'build.gradle',
|
|
12
|
+
];
|
|
13
|
+
// .csproj is matched separately via glob in detect.ts because the filename
|
|
14
|
+
// varies by project name.
|
|
15
|
+
export const CSPROJ_PATTERN = /\.csproj$/i;
|
|
16
|
+
export const MAX_PARENT_DEPTH = 3;
|
|
17
|
+
//# sourceMappingURL=signals.js.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// Warning emission + 3-second cancellable delay used by the `aiwg use`
|
|
2
|
+
// invocation path. Wraps detect.ts to enforce the trigger contract defined
|
|
3
|
+
// in UC-NUA-002 / SAD §5.1.2.
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { detectProjectSignal, isUnsuitableCwd } from './detect.js';
|
|
6
|
+
// Verbatim warning text from UC-NUA-002. Tests assert string equality so
|
|
7
|
+
// any wording change here breaks the build deliberately (NFR-USE-01).
|
|
8
|
+
export const WARNING_TEXT = 'No project detected here. AIWG will deploy to the current directory. To associate AIWG with a specific project, run this from your project root. Continuing in 3 seconds — press Ctrl-C to cancel.';
|
|
9
|
+
export const GLOBAL_INSTALL_INFO = 'AIWG_GLOBAL_INSTALL=1 set — deploying to current directory without project check.';
|
|
10
|
+
export const DEFAULT_DELAY_MS = 3000;
|
|
11
|
+
// The entrypoint called early in `aiwg use`. Returns synchronously when no
|
|
12
|
+
// warning is needed; awaits the delay when the warning fires.
|
|
13
|
+
export async function maybeWarnProjectIsolation(opts = { cwd: process.cwd() }) {
|
|
14
|
+
const cwd = opts.cwd;
|
|
15
|
+
const home = opts.home ?? homedir();
|
|
16
|
+
const env = opts.env ?? process.env;
|
|
17
|
+
const writer = opts.writer ?? defaultStderrWriter;
|
|
18
|
+
const logActivity = opts.logActivity ?? defaultActivityLogger;
|
|
19
|
+
const delayMs = opts.delayMs ?? DEFAULT_DELAY_MS;
|
|
20
|
+
const delayWithCancel = opts.delayWithCancel ?? defaultDelayWithCancel;
|
|
21
|
+
// Env-var opt-out is checked first so detection work is skipped entirely
|
|
22
|
+
// (NFR-REL-02, NFR-PERF-01).
|
|
23
|
+
if (env.AIWG_GLOBAL_INSTALL === '1') {
|
|
24
|
+
writer(GLOBAL_INSTALL_INFO);
|
|
25
|
+
return { cancelled: false, outcome: 'global-install' };
|
|
26
|
+
}
|
|
27
|
+
// If we find a signal anywhere on the walk, the cwd is part of a project.
|
|
28
|
+
// We continue silently — no warning, no info line — to keep the
|
|
29
|
+
// default UX unchanged (NFR-COMPAT-02).
|
|
30
|
+
const detection = detectProjectSignal(cwd);
|
|
31
|
+
if (detection.found) {
|
|
32
|
+
return { cancelled: false, outcome: 'project-signal-found' };
|
|
33
|
+
}
|
|
34
|
+
// No signal AND the cwd isn't a recognized surprise location. We assume
|
|
35
|
+
// the user knows what they're doing and continue silently.
|
|
36
|
+
if (!isUnsuitableCwd(cwd, home)) {
|
|
37
|
+
return { cancelled: false, outcome: 'cwd-ok' };
|
|
38
|
+
}
|
|
39
|
+
writer(WARNING_TEXT);
|
|
40
|
+
const result = await delayWithCancel(delayMs);
|
|
41
|
+
if (result.cancelled) {
|
|
42
|
+
return { cancelled: true, outcome: 'cancelled' };
|
|
43
|
+
}
|
|
44
|
+
// Activity-log write happens AFTER a non-cancelled emission so cancelled
|
|
45
|
+
// runs leave no on-disk evidence (NFR-OBS-01 + UC-NUA-002 A2 postcondition).
|
|
46
|
+
try {
|
|
47
|
+
await logActivity('warn', `no-project-signal: ${cwd}`);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Activity-log failure must not block deployment — it's observability,
|
|
51
|
+
// not control flow. Swallow and continue.
|
|
52
|
+
}
|
|
53
|
+
return { cancelled: false, outcome: 'warned' };
|
|
54
|
+
}
|
|
55
|
+
function defaultStderrWriter(msg) {
|
|
56
|
+
process.stderr.write(msg + '\n');
|
|
57
|
+
}
|
|
58
|
+
// Wait `ms` milliseconds OR until the user sends SIGINT. Either branch
|
|
59
|
+
// removes the listener so the rest of the process stays responsive.
|
|
60
|
+
function defaultDelayWithCancel(ms) {
|
|
61
|
+
return new Promise((resolve) => {
|
|
62
|
+
const onSigint = () => {
|
|
63
|
+
cleanup();
|
|
64
|
+
resolve({ cancelled: true });
|
|
65
|
+
};
|
|
66
|
+
const timer = setTimeout(() => {
|
|
67
|
+
cleanup();
|
|
68
|
+
resolve({ cancelled: false });
|
|
69
|
+
}, ms);
|
|
70
|
+
const cleanup = () => {
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
process.removeListener('SIGINT', onSigint);
|
|
73
|
+
};
|
|
74
|
+
process.on('SIGINT', onSigint);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Lazy-imported activity-log writer so a missing storage adapter at startup
|
|
78
|
+
// (e.g. in tests that don't touch the filesystem) doesn't crash the load.
|
|
79
|
+
async function defaultActivityLogger(operation, summary) {
|
|
80
|
+
const { resolveStorage } = await import('../../storage/index.js');
|
|
81
|
+
const { formatEntry } = await import('../../activity-log/types.js');
|
|
82
|
+
const adapter = await resolveStorage('activity_log');
|
|
83
|
+
const line = formatEntry({
|
|
84
|
+
timestamp: new Date(),
|
|
85
|
+
operation: operation,
|
|
86
|
+
summary,
|
|
87
|
+
});
|
|
88
|
+
const path = 'activity.log';
|
|
89
|
+
if (typeof adapter.append === 'function') {
|
|
90
|
+
const existing = (await adapter.read(path)) ?? '';
|
|
91
|
+
if (existing.length > 0 && !existing.endsWith('\n')) {
|
|
92
|
+
await adapter.append(path, '\n');
|
|
93
|
+
}
|
|
94
|
+
await adapter.append(path, line + '\n');
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const existing = (await adapter.read(path)) ?? '';
|
|
98
|
+
const trailing = existing.length === 0 || existing.endsWith('\n') ? '' : '\n';
|
|
99
|
+
await adapter.write(path, existing + trailing + line + '\n');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=warning.js.map
|