@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,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Extension Loader
|
|
3
|
+
*
|
|
4
|
+
* Resolves addon-contributed CLI commands via `.aiwg/cli-extensions.json`.
|
|
5
|
+
* When an addon declares `cli_commands` in its manifest, `aiwg use <addon>`
|
|
6
|
+
* registers the namespace here. The router falls through to this loader
|
|
7
|
+
* when no built-in command matches.
|
|
8
|
+
*
|
|
9
|
+
* @implements #478
|
|
10
|
+
* @architecture Addon manifests → cli-extensions.json → dynamic import → execute
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'fs/promises';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import { pathToFileURL } from 'url';
|
|
15
|
+
import * as ui from './ui.js';
|
|
16
|
+
import { projectAiwgPath, resolveProjectAiwgDir } from '../config/project-artifacts.js';
|
|
17
|
+
/**
|
|
18
|
+
* Read the cli-extensions registry from the current project
|
|
19
|
+
*/
|
|
20
|
+
async function readRegistry(cwd) {
|
|
21
|
+
const registryPath = projectAiwgPath(cwd, 'cli-extensions.json');
|
|
22
|
+
try {
|
|
23
|
+
const content = await fs.readFile(registryPath, 'utf-8');
|
|
24
|
+
return JSON.parse(content);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Write the cli-extensions registry to the current project
|
|
32
|
+
*/
|
|
33
|
+
export async function writeRegistry(cwd, registry) {
|
|
34
|
+
const dir = resolveProjectAiwgDir(cwd);
|
|
35
|
+
await fs.mkdir(dir, { recursive: true });
|
|
36
|
+
await fs.writeFile(path.join(dir, 'cli-extensions.json'), JSON.stringify(registry, null, 2) + '\n');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Register an addon's CLI commands into the project's cli-extensions.json
|
|
40
|
+
*
|
|
41
|
+
* Called by `aiwg use <addon>` after reading the addon manifest.
|
|
42
|
+
*/
|
|
43
|
+
export async function registerCliCommands(cwd, namespace, description, source, subcommands) {
|
|
44
|
+
const existing = await readRegistry(cwd) ?? {};
|
|
45
|
+
existing[namespace] = { source, description, subcommands };
|
|
46
|
+
await writeRegistry(cwd, existing);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Try to execute an addon-contributed CLI command
|
|
50
|
+
*
|
|
51
|
+
* Returns null if the namespace is not registered (caller should show "unknown command").
|
|
52
|
+
* Returns a CliCommandResult if the namespace is found.
|
|
53
|
+
*/
|
|
54
|
+
export async function tryExecuteCliExtension(rawCommand, commandArgs, cwd, frameworkRoot) {
|
|
55
|
+
const registry = await readRegistry(cwd);
|
|
56
|
+
if (!registry || !registry[rawCommand]) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const ns = registry[rawCommand];
|
|
60
|
+
const subcommand = commandArgs[0];
|
|
61
|
+
// `aiwg <addon> --help` or `aiwg <addon>` with no subcommand
|
|
62
|
+
if (!subcommand || subcommand === '--help' || subcommand === '-h') {
|
|
63
|
+
printNamespaceHelp(rawCommand, ns);
|
|
64
|
+
return { exitCode: 0 };
|
|
65
|
+
}
|
|
66
|
+
// Look up subcommand
|
|
67
|
+
const sub = ns.subcommands[subcommand];
|
|
68
|
+
if (!sub) {
|
|
69
|
+
ui.error(`Unknown subcommand: ${rawCommand} ${subcommand}`);
|
|
70
|
+
printNamespaceHelp(rawCommand, ns);
|
|
71
|
+
return { exitCode: 1 };
|
|
72
|
+
}
|
|
73
|
+
// Resolve the mjs file path
|
|
74
|
+
const mjsPath = path.resolve(ns.source, path.basename(sub.file));
|
|
75
|
+
try {
|
|
76
|
+
await fs.access(mjsPath);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
ui.error(`CLI extension file not found: ${mjsPath}`);
|
|
80
|
+
return { exitCode: 1, message: `Missing: ${mjsPath}` };
|
|
81
|
+
}
|
|
82
|
+
// Dynamic import the mjs module
|
|
83
|
+
const moduleUrl = pathToFileURL(mjsPath).href;
|
|
84
|
+
const mod = await import(moduleUrl);
|
|
85
|
+
if (typeof mod.default !== 'function') {
|
|
86
|
+
ui.error(`CLI extension ${sub.file} does not export a default function`);
|
|
87
|
+
return { exitCode: 1 };
|
|
88
|
+
}
|
|
89
|
+
// Build context
|
|
90
|
+
const ctx = {
|
|
91
|
+
cwd,
|
|
92
|
+
frameworkRoot,
|
|
93
|
+
namespace: rawCommand,
|
|
94
|
+
subcommand,
|
|
95
|
+
};
|
|
96
|
+
// Execute
|
|
97
|
+
const result = await mod.default(commandArgs.slice(1), ctx);
|
|
98
|
+
// Normalize result
|
|
99
|
+
if (typeof result === 'object' && result !== null) {
|
|
100
|
+
return {
|
|
101
|
+
exitCode: result.exitCode ?? 0,
|
|
102
|
+
message: result.message,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return { exitCode: 0 };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Hook events that should be auto-registered.
|
|
109
|
+
* FeatureComplete is excluded — it's a deliberate user action, not a background event.
|
|
110
|
+
*/
|
|
111
|
+
const AUTO_HOOK_EVENTS = new Set(['Stop', 'SessionStart', 'SessionEnd', 'PreToolUse', 'PostToolUse']);
|
|
112
|
+
/**
|
|
113
|
+
* Migrate legacy array-shaped hooks to the object form Claude Code expects.
|
|
114
|
+
* See #107.
|
|
115
|
+
*/
|
|
116
|
+
function normalizeClaudeHooks(raw) {
|
|
117
|
+
if (Array.isArray(raw)) {
|
|
118
|
+
const out = {};
|
|
119
|
+
for (const m of raw) {
|
|
120
|
+
if (!m || typeof m.matcher !== 'string' || !Array.isArray(m.hooks))
|
|
121
|
+
continue;
|
|
122
|
+
if (!out[m.matcher])
|
|
123
|
+
out[m.matcher] = [];
|
|
124
|
+
out[m.matcher].push({ hooks: m.hooks });
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
if (raw && typeof raw === 'object')
|
|
129
|
+
return raw;
|
|
130
|
+
return {};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Register Claude Code hooks from addon manifest hook_event annotations.
|
|
134
|
+
*
|
|
135
|
+
* Reads .claude/settings.json, merges hook entries for subcommands that
|
|
136
|
+
* declare hook_event, and writes back. Idempotent — duplicate entries
|
|
137
|
+
* are skipped. Only registers events in AUTO_HOOK_EVENTS.
|
|
138
|
+
*
|
|
139
|
+
* Schema: writes the object-keyed form Claude Code requires (#107). If
|
|
140
|
+
* an existing settings.json has a legacy array-shaped `hooks` field, it
|
|
141
|
+
* is migrated to the object shape during this write.
|
|
142
|
+
*
|
|
143
|
+
* @implements #480
|
|
144
|
+
*/
|
|
145
|
+
export async function registerHooks(cwd, namespace, subcommands) {
|
|
146
|
+
const settingsPath = path.join(cwd, '.claude', 'settings.json');
|
|
147
|
+
let settings;
|
|
148
|
+
try {
|
|
149
|
+
const content = await fs.readFile(settingsPath, 'utf-8');
|
|
150
|
+
settings = JSON.parse(content);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// No settings file yet — start fresh
|
|
154
|
+
settings = {};
|
|
155
|
+
}
|
|
156
|
+
const wasLegacy = Array.isArray(settings.hooks);
|
|
157
|
+
const hooksObj = normalizeClaudeHooks(settings.hooks);
|
|
158
|
+
settings.hooks = hooksObj;
|
|
159
|
+
const registered = [];
|
|
160
|
+
for (const [name, sub] of Object.entries(subcommands)) {
|
|
161
|
+
if (!sub.hook_event || !AUTO_HOOK_EVENTS.has(sub.hook_event)) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const command = `aiwg ${namespace} ${name}`;
|
|
165
|
+
const event = sub.hook_event;
|
|
166
|
+
if (!hooksObj[event])
|
|
167
|
+
hooksObj[event] = [];
|
|
168
|
+
const groups = hooksObj[event];
|
|
169
|
+
// Skip if any existing group already has this command
|
|
170
|
+
const exists = groups.some((g) => Array.isArray(g.hooks) && g.hooks.some((h) => h.command === command));
|
|
171
|
+
if (exists)
|
|
172
|
+
continue;
|
|
173
|
+
groups.push({ hooks: [{ type: 'command', command }] });
|
|
174
|
+
registered.push(`${event} → ${command}`);
|
|
175
|
+
}
|
|
176
|
+
// Write if we registered anything OR migrated an existing legacy field.
|
|
177
|
+
if (registered.length > 0 || wasLegacy) {
|
|
178
|
+
await fs.mkdir(path.join(cwd, '.claude'), { recursive: true });
|
|
179
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
180
|
+
}
|
|
181
|
+
return registered;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Remove Claude Code hooks for a given namespace.
|
|
185
|
+
*
|
|
186
|
+
* Strips hook entries whose command matches `aiwg <namespace> *`.
|
|
187
|
+
* Removes empty groups. Writes back only if changes were made.
|
|
188
|
+
*
|
|
189
|
+
* Migrates legacy array-shaped `hooks` fields to object form on write
|
|
190
|
+
* (#107).
|
|
191
|
+
*/
|
|
192
|
+
export async function unregisterHooks(cwd, namespace) {
|
|
193
|
+
const settingsPath = path.join(cwd, '.claude', 'settings.json');
|
|
194
|
+
let settings;
|
|
195
|
+
try {
|
|
196
|
+
const content = await fs.readFile(settingsPath, 'utf-8');
|
|
197
|
+
settings = JSON.parse(content);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return 0;
|
|
201
|
+
}
|
|
202
|
+
if (!settings.hooks)
|
|
203
|
+
return 0;
|
|
204
|
+
const wasLegacy = Array.isArray(settings.hooks);
|
|
205
|
+
const hooksObj = normalizeClaudeHooks(settings.hooks);
|
|
206
|
+
settings.hooks = hooksObj;
|
|
207
|
+
const prefix = `aiwg ${namespace} `;
|
|
208
|
+
let removed = 0;
|
|
209
|
+
for (const event of Object.keys(hooksObj)) {
|
|
210
|
+
const groups = hooksObj[event];
|
|
211
|
+
for (const group of groups) {
|
|
212
|
+
const before = group.hooks.length;
|
|
213
|
+
group.hooks = group.hooks.filter((h) => !h.command.startsWith(prefix));
|
|
214
|
+
removed += before - group.hooks.length;
|
|
215
|
+
}
|
|
216
|
+
// Drop empty groups
|
|
217
|
+
hooksObj[event] = groups.filter((g) => g.hooks.length > 0);
|
|
218
|
+
// Drop the event entirely if no groups remain
|
|
219
|
+
if (hooksObj[event].length === 0)
|
|
220
|
+
delete hooksObj[event];
|
|
221
|
+
}
|
|
222
|
+
if (removed > 0 || wasLegacy) {
|
|
223
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n');
|
|
224
|
+
}
|
|
225
|
+
return removed;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Print help for a CLI extension namespace
|
|
229
|
+
*/
|
|
230
|
+
function printNamespaceHelp(namespace, ns) {
|
|
231
|
+
ui.blank();
|
|
232
|
+
console.log(` ${ui.bold(`aiwg ${namespace}`)} — ${ns.description}`);
|
|
233
|
+
ui.blank();
|
|
234
|
+
console.log(' Subcommands:');
|
|
235
|
+
ui.blank();
|
|
236
|
+
const entries = Object.entries(ns.subcommands);
|
|
237
|
+
const maxLen = Math.max(...entries.map(([name]) => name.length));
|
|
238
|
+
for (const [name, sub] of entries) {
|
|
239
|
+
console.log(` ${name.padEnd(maxLen + 2)} ${sub.description}`);
|
|
240
|
+
}
|
|
241
|
+
ui.blank();
|
|
242
|
+
console.log(` Usage: aiwg ${namespace} <subcommand> [args]`);
|
|
243
|
+
ui.blank();
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=cli-extension-loader.js.map
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, stat, writeFile, appendFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { createHash } from 'crypto';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
import { readAiwgConfig } from '../config/aiwg-config.js';
|
|
7
|
+
import { PROJECT_AIWG_LOCATION_FILE, projectAiwgPath } from '../config/project-artifacts.js';
|
|
8
|
+
const DEFAULT_MAX_BYTES = 1_048_576;
|
|
9
|
+
const DEFAULT_REPORT_LIMIT = 20;
|
|
10
|
+
export async function maybeAppendCommandLog(input) {
|
|
11
|
+
const env = input.env ?? process.env;
|
|
12
|
+
const resolved = await resolveCommandLogSettings(input.cwd, env);
|
|
13
|
+
if (!resolved.enabled || resolved.scopes.length === 0)
|
|
14
|
+
return;
|
|
15
|
+
const version = await readAiwgVersion(input.frameworkRoot);
|
|
16
|
+
const context = await resolvePathContext(input.cwd);
|
|
17
|
+
const shape = summarizeArgs(input.args);
|
|
18
|
+
for (const scope of resolved.scopes) {
|
|
19
|
+
const filePath = resolveLogPath(scope, context.projectRoot, env);
|
|
20
|
+
if (!filePath)
|
|
21
|
+
continue;
|
|
22
|
+
const event = {
|
|
23
|
+
schema_version: 1,
|
|
24
|
+
timestamp: new Date().toISOString(),
|
|
25
|
+
invocation_id: env.AIWG_INVOCATION_ID,
|
|
26
|
+
command: input.command,
|
|
27
|
+
flags: shape.flags,
|
|
28
|
+
positional_count: shape.positionalCount,
|
|
29
|
+
duration_ms: Math.max(0, Math.round(input.durationMs)),
|
|
30
|
+
exit_status: input.exitStatus,
|
|
31
|
+
aiwg_version: version,
|
|
32
|
+
provider: env.AIWG_PROVIDER || env.CLAUDE_CODE_ENTRYPOINT || undefined,
|
|
33
|
+
cwd_hash: hashPath(input.cwd),
|
|
34
|
+
scope,
|
|
35
|
+
};
|
|
36
|
+
if (context.projectRoot) {
|
|
37
|
+
event.project = {
|
|
38
|
+
root_hash: hashPath(context.projectRoot),
|
|
39
|
+
relative_path: context.relativePath,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
await appendBoundedJsonl(filePath, event, resolved.maxBytes);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function readCommandLogReport(options) {
|
|
46
|
+
const env = options.env ?? process.env;
|
|
47
|
+
const context = await resolvePathContext(options.cwd);
|
|
48
|
+
const scope = options.scope ?? 'all';
|
|
49
|
+
const scopes = scope === 'all' ? ['project', 'global'] : [scope];
|
|
50
|
+
const paths = scopes
|
|
51
|
+
.map(s => resolveLogPath(s, context.projectRoot, env))
|
|
52
|
+
.filter((p) => Boolean(p));
|
|
53
|
+
const events = [];
|
|
54
|
+
for (const filePath of paths) {
|
|
55
|
+
events.push(...await readJsonlEvents(filePath));
|
|
56
|
+
}
|
|
57
|
+
events.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
58
|
+
const limited = events.slice(0, options.limit ?? DEFAULT_REPORT_LIMIT);
|
|
59
|
+
return {
|
|
60
|
+
events: limited,
|
|
61
|
+
summary: summarizeEvents(events),
|
|
62
|
+
paths,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function printCommandLogReport(options) {
|
|
66
|
+
const report = await readCommandLogReport(options);
|
|
67
|
+
if (options.json) {
|
|
68
|
+
console.log(JSON.stringify(report, null, 2));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
console.log('AIWG command log');
|
|
72
|
+
console.log(`Events: ${report.summary.total}`);
|
|
73
|
+
if (report.paths.length > 0) {
|
|
74
|
+
console.log(`Stores: ${report.paths.join(', ')}`);
|
|
75
|
+
}
|
|
76
|
+
const commands = Object.entries(report.summary.by_command)
|
|
77
|
+
.sort((a, b) => b[1] - a[1])
|
|
78
|
+
.slice(0, 10);
|
|
79
|
+
if (commands.length > 0) {
|
|
80
|
+
console.log('');
|
|
81
|
+
console.log('Top commands');
|
|
82
|
+
for (const [command, count] of commands) {
|
|
83
|
+
const failures = report.summary.failures_by_command[command] ?? 0;
|
|
84
|
+
const failureText = failures > 0 ? `, ${failures} failed` : '';
|
|
85
|
+
console.log(` ${command}: ${count}${failureText}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (report.events.length > 0) {
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log('Recent invocations');
|
|
91
|
+
for (const event of report.events) {
|
|
92
|
+
const status = event.exit_status === 0 ? 'ok' : `exit ${event.exit_status}`;
|
|
93
|
+
const rel = event.project?.relative_path ? ` path=${event.project.relative_path}` : '';
|
|
94
|
+
console.log(` ${event.timestamp} ${event.scope} ${event.command} ${status} ${event.duration_ms}ms${rel}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function resolveCommandLogSettings(cwd, env) {
|
|
99
|
+
const envSetting = env.AIWG_COMMAND_LOG?.trim().toLowerCase();
|
|
100
|
+
const envMax = parsePositiveInt(env.AIWG_COMMAND_LOG_MAX_BYTES);
|
|
101
|
+
if (envSetting) {
|
|
102
|
+
const scopes = scopesFromString(envSetting);
|
|
103
|
+
return {
|
|
104
|
+
enabled: scopes.length > 0,
|
|
105
|
+
scopes,
|
|
106
|
+
maxBytes: envMax ?? DEFAULT_MAX_BYTES,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const config = await readNearestProjectConfig(cwd);
|
|
110
|
+
const commandLog = config?.command_log;
|
|
111
|
+
if (!commandLog?.enabled) {
|
|
112
|
+
return { enabled: false, scopes: [], maxBytes: envMax ?? DEFAULT_MAX_BYTES };
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
enabled: true,
|
|
116
|
+
scopes: normalizeScopes(commandLog.scopes ?? ['project']),
|
|
117
|
+
maxBytes: commandLog.max_bytes ?? envMax ?? DEFAULT_MAX_BYTES,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function scopesFromString(value) {
|
|
121
|
+
if (['0', 'false', 'off', 'none', 'disabled'].includes(value))
|
|
122
|
+
return [];
|
|
123
|
+
if (['1', 'true', 'on', 'project'].includes(value))
|
|
124
|
+
return ['project'];
|
|
125
|
+
if (value === 'global')
|
|
126
|
+
return ['global'];
|
|
127
|
+
if (['both', 'all'].includes(value))
|
|
128
|
+
return ['project', 'global'];
|
|
129
|
+
return normalizeScopes(value.split(','));
|
|
130
|
+
}
|
|
131
|
+
function normalizeScopes(values) {
|
|
132
|
+
const scopes = [];
|
|
133
|
+
for (const value of values) {
|
|
134
|
+
if (value === 'project' || value === 'global')
|
|
135
|
+
scopes.push(value);
|
|
136
|
+
}
|
|
137
|
+
return [...new Set(scopes)];
|
|
138
|
+
}
|
|
139
|
+
async function readNearestProjectConfig(cwd) {
|
|
140
|
+
const projectRoot = await findProjectRoot(cwd);
|
|
141
|
+
if (!projectRoot)
|
|
142
|
+
return null;
|
|
143
|
+
return readAiwgConfig(projectRoot);
|
|
144
|
+
}
|
|
145
|
+
async function resolvePathContext(cwd) {
|
|
146
|
+
const projectRoot = await findProjectRoot(cwd);
|
|
147
|
+
if (!projectRoot)
|
|
148
|
+
return { projectRoot: null, relativePath: '(no-project)' };
|
|
149
|
+
const rel = path.relative(projectRoot, cwd);
|
|
150
|
+
return {
|
|
151
|
+
projectRoot,
|
|
152
|
+
relativePath: rel === '' ? '.' : normalizeRelativePath(rel),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function findProjectRoot(startDir) {
|
|
156
|
+
let current = path.resolve(startDir);
|
|
157
|
+
while (current !== path.dirname(current)) {
|
|
158
|
+
if (existsSync(path.join(current, '.aiwg')) ||
|
|
159
|
+
existsSync(path.join(current, PROJECT_AIWG_LOCATION_FILE)) ||
|
|
160
|
+
existsSync(projectAiwgPath(current, 'aiwg.config'))) {
|
|
161
|
+
return current;
|
|
162
|
+
}
|
|
163
|
+
current = path.dirname(current);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
function resolveLogPath(scope, projectRoot, env) {
|
|
168
|
+
if (scope === 'project') {
|
|
169
|
+
if (!projectRoot)
|
|
170
|
+
return null;
|
|
171
|
+
return projectAiwgPath(projectRoot, 'telemetry', 'cli-commands.jsonl');
|
|
172
|
+
}
|
|
173
|
+
const stateHome = env.XDG_STATE_HOME || path.join(os.homedir(), '.local', 'state');
|
|
174
|
+
return path.join(stateHome, 'aiwg', 'cli-commands.jsonl');
|
|
175
|
+
}
|
|
176
|
+
async function appendBoundedJsonl(filePath, event, maxBytes) {
|
|
177
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
178
|
+
await rotateIfNeeded(filePath, maxBytes);
|
|
179
|
+
await appendFile(filePath, JSON.stringify(event) + '\n', 'utf8');
|
|
180
|
+
}
|
|
181
|
+
async function rotateIfNeeded(filePath, maxBytes) {
|
|
182
|
+
if (maxBytes <= 0)
|
|
183
|
+
return;
|
|
184
|
+
try {
|
|
185
|
+
const current = await stat(filePath);
|
|
186
|
+
if (current.size <= maxBytes)
|
|
187
|
+
return;
|
|
188
|
+
const rotated = `${filePath}.1`;
|
|
189
|
+
if (existsSync(rotated)) {
|
|
190
|
+
await writeFile(rotated, '', 'utf8');
|
|
191
|
+
}
|
|
192
|
+
await rename(filePath, rotated);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error.code !== 'ENOENT')
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function readJsonlEvents(filePath) {
|
|
200
|
+
try {
|
|
201
|
+
const raw = await readFile(filePath, 'utf8');
|
|
202
|
+
return raw
|
|
203
|
+
.split('\n')
|
|
204
|
+
.map(line => line.trim())
|
|
205
|
+
.filter(Boolean)
|
|
206
|
+
.map(line => JSON.parse(line));
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
if (error.code === 'ENOENT')
|
|
210
|
+
return [];
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function summarizeEvents(events) {
|
|
215
|
+
const by_command = {};
|
|
216
|
+
const failures_by_command = {};
|
|
217
|
+
const by_scope = {};
|
|
218
|
+
for (const event of events) {
|
|
219
|
+
by_command[event.command] = (by_command[event.command] ?? 0) + 1;
|
|
220
|
+
by_scope[event.scope] = (by_scope[event.scope] ?? 0) + 1;
|
|
221
|
+
if (event.exit_status !== 0) {
|
|
222
|
+
failures_by_command[event.command] = (failures_by_command[event.command] ?? 0) + 1;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
total: events.length,
|
|
227
|
+
by_command,
|
|
228
|
+
failures_by_command,
|
|
229
|
+
by_scope,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
function summarizeArgs(args) {
|
|
233
|
+
const flags = new Set();
|
|
234
|
+
let positionalCount = 0;
|
|
235
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
236
|
+
const arg = args[i];
|
|
237
|
+
if (arg === '--') {
|
|
238
|
+
positionalCount += Math.max(0, args.length - i - 1);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
if (arg.startsWith('--')) {
|
|
242
|
+
flags.add(arg.includes('=') ? arg.slice(0, arg.indexOf('=')) : arg);
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (arg.startsWith('-') && arg.length > 1) {
|
|
246
|
+
flags.add(arg);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
positionalCount += 1;
|
|
250
|
+
}
|
|
251
|
+
return { flags: [...flags].sort(), positionalCount };
|
|
252
|
+
}
|
|
253
|
+
async function readAiwgVersion(frameworkRoot) {
|
|
254
|
+
try {
|
|
255
|
+
const raw = await readFile(path.join(frameworkRoot, 'package.json'), 'utf8');
|
|
256
|
+
const parsed = JSON.parse(raw);
|
|
257
|
+
return typeof parsed.version === 'string' ? parsed.version : '(unknown)';
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return '(unknown)';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function hashPath(value) {
|
|
264
|
+
return createHash('sha256').update(path.resolve(value)).digest('hex').slice(0, 16);
|
|
265
|
+
}
|
|
266
|
+
function normalizeRelativePath(value) {
|
|
267
|
+
return value.split(path.sep).filter(Boolean).join('/');
|
|
268
|
+
}
|
|
269
|
+
function parsePositiveInt(value) {
|
|
270
|
+
if (!value)
|
|
271
|
+
return undefined;
|
|
272
|
+
const n = Number(value);
|
|
273
|
+
return Number.isInteger(n) && n > 0 ? n : undefined;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=command-log.js.map
|