@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export function attachExternalIssueSource(issue, source) {
|
|
2
|
+
return {
|
|
3
|
+
...issue,
|
|
4
|
+
fields: {
|
|
5
|
+
...issue.fields,
|
|
6
|
+
source: {
|
|
7
|
+
provider: source.provider,
|
|
8
|
+
external_id: source.external_id,
|
|
9
|
+
external_url: source.external_url ?? null,
|
|
10
|
+
},
|
|
11
|
+
links: {
|
|
12
|
+
...issue.fields.links,
|
|
13
|
+
external: source.external_url ? uniqueStrings([...issue.fields.links.external, source.external_url]) : issue.fields.links.external,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function buildLocalIssueConflictReport(localIssue, externalIssue) {
|
|
19
|
+
const conflicts = [];
|
|
20
|
+
compareField(conflicts, 'title', localIssue.fields.title, externalIssue.title, localIssue.fields.updated_at, externalIssue.updated_at);
|
|
21
|
+
compareField(conflicts, 'body', localIssue.body, externalIssue.body, localIssue.fields.updated_at, externalIssue.updated_at);
|
|
22
|
+
compareField(conflicts, 'status', localIssue.fields.status, normalizeExternalStatus(externalIssue.status), localIssue.fields.updated_at, externalIssue.updated_at);
|
|
23
|
+
compareField(conflicts, 'labels', [...localIssue.fields.labels].sort(), [...externalIssue.labels].sort(), localIssue.fields.updated_at, externalIssue.updated_at);
|
|
24
|
+
const commentConflicts = buildCommentConflictReport(localIssue.events ?? [], externalIssue.comments ?? [], localIssue.fields.updated_at, externalIssue.updated_at);
|
|
25
|
+
conflicts.push(...commentConflicts);
|
|
26
|
+
return {
|
|
27
|
+
issue_id: localIssue.fields.id,
|
|
28
|
+
provider: externalIssue.provider,
|
|
29
|
+
external_id: externalIssue.external_id,
|
|
30
|
+
external_url: externalIssue.external_url ?? null,
|
|
31
|
+
conflicts,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function buildExternalIssueSnapshotFromLocal(localIssue, provider) {
|
|
35
|
+
const comments = (localIssue.events ?? [])
|
|
36
|
+
.filter((event) => (event.type === 'comment' || event.type === 'cycle_status') && event.body)
|
|
37
|
+
.map((event) => ({
|
|
38
|
+
local_event_id: event.event_id,
|
|
39
|
+
external_id: externalCommentId(event),
|
|
40
|
+
author: event.author,
|
|
41
|
+
body: event.body ?? '',
|
|
42
|
+
created_at: event.created_at,
|
|
43
|
+
updated_at: typeof event.data?.external_updated_at === 'string' ? event.data.external_updated_at : event.created_at,
|
|
44
|
+
}));
|
|
45
|
+
return {
|
|
46
|
+
provider,
|
|
47
|
+
local_issue_id: localIssue.fields.id,
|
|
48
|
+
external_id: localIssue.fields.source.provider === provider && localIssue.fields.source.external_id ? localIssue.fields.source.external_id : '',
|
|
49
|
+
external_url: localIssue.fields.source.provider === provider ? localIssue.fields.source.external_url ?? null : null,
|
|
50
|
+
title: localIssue.fields.title,
|
|
51
|
+
body: localIssue.body,
|
|
52
|
+
status: localIssue.fields.status === 'closed' ? 'closed' : 'open',
|
|
53
|
+
labels: [...localIssue.fields.labels],
|
|
54
|
+
created_at: localIssue.fields.created_at,
|
|
55
|
+
updated_at: localIssue.fields.updated_at,
|
|
56
|
+
comments,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function parseExternalIssueSnapshot(value) {
|
|
60
|
+
if (!value || typeof value !== 'object')
|
|
61
|
+
throw new Error('external issue snapshot must be an object');
|
|
62
|
+
const candidate = value;
|
|
63
|
+
if (candidate.provider !== 'gitea' && candidate.provider !== 'github')
|
|
64
|
+
throw new Error('snapshot provider must be gitea or github');
|
|
65
|
+
const externalId = requireString(candidate.external_id, 'external_id');
|
|
66
|
+
const title = requireString(candidate.title, 'title');
|
|
67
|
+
const body = requireString(candidate.body, 'body');
|
|
68
|
+
const status = requireString(candidate.status, 'status');
|
|
69
|
+
const updatedAt = requireString(candidate.updated_at, 'updated_at');
|
|
70
|
+
if (!Array.isArray(candidate.labels) || !candidate.labels.every((label) => typeof label === 'string')) {
|
|
71
|
+
throw new Error('snapshot labels must be a string array');
|
|
72
|
+
}
|
|
73
|
+
if (candidate.comments !== undefined && (!Array.isArray(candidate.comments) || !candidate.comments.every(isExternalComment))) {
|
|
74
|
+
throw new Error('snapshot comments must be an array of comment snapshots');
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
provider: candidate.provider,
|
|
78
|
+
external_id: externalId,
|
|
79
|
+
external_url: candidate.external_url ?? null,
|
|
80
|
+
title,
|
|
81
|
+
body,
|
|
82
|
+
status,
|
|
83
|
+
labels: candidate.labels,
|
|
84
|
+
created_at: candidate.created_at,
|
|
85
|
+
updated_at: updatedAt,
|
|
86
|
+
comments: candidate.comments ?? [],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function parseCommentIdMappings(value) {
|
|
90
|
+
if (!Array.isArray(value))
|
|
91
|
+
throw new Error('comment mapping file must contain an array');
|
|
92
|
+
return value.map((item, index) => {
|
|
93
|
+
if (!item || typeof item !== 'object')
|
|
94
|
+
throw new Error(`comment mapping at index ${index} must be an object`);
|
|
95
|
+
const mapping = item;
|
|
96
|
+
return {
|
|
97
|
+
local_event_id: requireString(mapping.local_event_id, `comment mapping ${index}.local_event_id`),
|
|
98
|
+
external_comment_id: requireString(mapping.external_comment_id, `comment mapping ${index}.external_comment_id`),
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
function buildCommentConflictReport(localEvents, externalComments, localUpdatedAt, externalUpdatedAt) {
|
|
103
|
+
const conflicts = [];
|
|
104
|
+
const localByExternalId = new Map(localEvents
|
|
105
|
+
.map((event) => [externalCommentId(event), event])
|
|
106
|
+
.filter(([externalId]) => externalId));
|
|
107
|
+
for (const externalComment of externalComments) {
|
|
108
|
+
if (!externalComment.external_id)
|
|
109
|
+
continue;
|
|
110
|
+
const local = localByExternalId.get(externalComment.external_id);
|
|
111
|
+
if (!local)
|
|
112
|
+
continue;
|
|
113
|
+
compareField(conflicts, `comment:${externalComment.external_id}:body`, local.body ?? '', externalComment.body, typeof local.data?.external_updated_at === 'string' ? local.data.external_updated_at : localUpdatedAt, externalComment.updated_at ?? externalUpdatedAt);
|
|
114
|
+
}
|
|
115
|
+
return conflicts;
|
|
116
|
+
}
|
|
117
|
+
function compareField(conflicts, field, local, external, localUpdatedAt, externalUpdatedAt) {
|
|
118
|
+
if (JSON.stringify(local) === JSON.stringify(external))
|
|
119
|
+
return;
|
|
120
|
+
conflicts.push({ field, local, external, localUpdatedAt, externalUpdatedAt });
|
|
121
|
+
}
|
|
122
|
+
function normalizeExternalStatus(status) {
|
|
123
|
+
return status === 'closed' ? 'closed' : 'open';
|
|
124
|
+
}
|
|
125
|
+
function externalCommentId(event) {
|
|
126
|
+
const value = event.data?.external_comment_id;
|
|
127
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
128
|
+
}
|
|
129
|
+
function requireString(value, field) {
|
|
130
|
+
if (typeof value !== 'string')
|
|
131
|
+
throw new Error(`snapshot ${field} must be a string`);
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
function isExternalComment(value) {
|
|
135
|
+
if (!value || typeof value !== 'object')
|
|
136
|
+
return false;
|
|
137
|
+
const comment = value;
|
|
138
|
+
return typeof comment.author === 'string' && typeof comment.body === 'string' && typeof comment.created_at === 'string';
|
|
139
|
+
}
|
|
140
|
+
function uniqueStrings(values) {
|
|
141
|
+
return [...new Set(values)];
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { LocalIssueProviderCore, localIssueRoot } from './index.js';
|
|
2
|
+
export const QUESTION_LABEL = 'question';
|
|
3
|
+
function hasLabel(labels, name) {
|
|
4
|
+
return labels.some((label) => label.toLowerCase() === name.toLowerCase());
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Plan the tracker label mutation for address-issues open questions (#1726).
|
|
8
|
+
*
|
|
9
|
+
* The caller owns provider-specific API calls; this function keeps the state
|
|
10
|
+
* transition deterministic and idempotent across Gitea/GitHub/local stores.
|
|
11
|
+
*/
|
|
12
|
+
export function planQuestionLabelUpdate(input) {
|
|
13
|
+
const issueHasQuestion = hasLabel(input.issueLabels, QUESTION_LABEL);
|
|
14
|
+
const repoHasQuestion = hasLabel(input.repositoryLabels, QUESTION_LABEL);
|
|
15
|
+
const hasOpenQuestions = input.unresolvedQuestionCount > 0;
|
|
16
|
+
if (hasOpenQuestions) {
|
|
17
|
+
return {
|
|
18
|
+
label: QUESTION_LABEL,
|
|
19
|
+
createLabel: !repoHasQuestion,
|
|
20
|
+
addLabel: !issueHasQuestion,
|
|
21
|
+
removeLabel: false,
|
|
22
|
+
keepLabel: issueHasQuestion,
|
|
23
|
+
reason: 'open-questions',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (issueHasQuestion) {
|
|
27
|
+
return {
|
|
28
|
+
label: QUESTION_LABEL,
|
|
29
|
+
createLabel: false,
|
|
30
|
+
addLabel: false,
|
|
31
|
+
removeLabel: true,
|
|
32
|
+
keepLabel: false,
|
|
33
|
+
reason: 'answered',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
label: QUESTION_LABEL,
|
|
38
|
+
createLabel: false,
|
|
39
|
+
addLabel: false,
|
|
40
|
+
removeLabel: false,
|
|
41
|
+
keepLabel: false,
|
|
42
|
+
reason: 'already-clear',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export async function auditLocalIssuesCli(args, cwd = process.cwd()) {
|
|
46
|
+
const parsed = parseArgs(args);
|
|
47
|
+
requireLocalProvider(parsed, 'issue-audit');
|
|
48
|
+
const issues = new LocalIssueProviderCore(localIssueRoot(cwd));
|
|
49
|
+
const limit = numberFlag(parsed, 'limit') ?? 50;
|
|
50
|
+
const result = await issues.listIssues({
|
|
51
|
+
limit,
|
|
52
|
+
cursor: stringFlag(parsed, 'cursor'),
|
|
53
|
+
filter: buildFilter(parsed),
|
|
54
|
+
});
|
|
55
|
+
const counts = {
|
|
56
|
+
open: result.issues.filter((issue) => issue.status === 'open').length,
|
|
57
|
+
closed: result.issues.filter((issue) => issue.status === 'closed').length,
|
|
58
|
+
archived: result.issues.filter((issue) => issue.status === 'archived').length,
|
|
59
|
+
};
|
|
60
|
+
if (parsed.flags.has('json')) {
|
|
61
|
+
console.log(JSON.stringify({ provider: 'local', limit, nextCursor: result.nextCursor, counts, issues: result.issues }, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.log('# Issue Audit');
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log('Scope: local .aiwg/issues/');
|
|
67
|
+
console.log(`Mode: ${parsed.flags.has('apply') ? 'apply requested, local audit is read-only' : 'read-only'}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
console.log('## Counts');
|
|
70
|
+
console.log(`- Issues audited: ${result.issues.length}`);
|
|
71
|
+
console.log(`- Open: ${counts.open}`);
|
|
72
|
+
console.log(`- Closed: ${counts.closed}`);
|
|
73
|
+
console.log(`- Archived: ${counts.archived}`);
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log('## Findings');
|
|
76
|
+
for (const issue of result.issues) {
|
|
77
|
+
console.log(`- ${issue.id} [${issue.status}/${issue.priority}] ${issue.title}`);
|
|
78
|
+
}
|
|
79
|
+
if (result.nextCursor)
|
|
80
|
+
console.log(`\nNext cursor: ${result.nextCursor}`);
|
|
81
|
+
}
|
|
82
|
+
function buildFilter(args) {
|
|
83
|
+
const expression = stringFlag(args, 'filter');
|
|
84
|
+
const filter = {};
|
|
85
|
+
if (expression) {
|
|
86
|
+
for (const token of expression.split(/\s+/).filter(Boolean)) {
|
|
87
|
+
const [key, value] = token.split(/:(.*)/s);
|
|
88
|
+
if (!value)
|
|
89
|
+
continue;
|
|
90
|
+
if (key === 'status')
|
|
91
|
+
filter.status = value;
|
|
92
|
+
else if (key === 'label')
|
|
93
|
+
filter.labels = [...(filter.labels ?? []), value];
|
|
94
|
+
else if (key === 'type')
|
|
95
|
+
filter.type = value;
|
|
96
|
+
else if (key === 'priority')
|
|
97
|
+
filter.priority = value;
|
|
98
|
+
else if (key === 'assignee')
|
|
99
|
+
filter.assignee = value;
|
|
100
|
+
else if (key === 'search')
|
|
101
|
+
filter.search = value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
filter.status = stringFlag(args, 'status') ?? filter.status;
|
|
105
|
+
const labels = csvFlag(args, 'label');
|
|
106
|
+
if (labels.length > 0)
|
|
107
|
+
filter.labels = [...(filter.labels ?? []), ...labels];
|
|
108
|
+
filter.type = stringFlag(args, 'type') ?? filter.type;
|
|
109
|
+
filter.priority = stringFlag(args, 'priority') ?? filter.priority;
|
|
110
|
+
filter.assignee = stringFlag(args, 'assignee') ?? filter.assignee;
|
|
111
|
+
filter.search = stringFlag(args, 'search') ?? filter.search;
|
|
112
|
+
return filter;
|
|
113
|
+
}
|
|
114
|
+
function requireLocalProvider(args, command) {
|
|
115
|
+
const provider = stringFlag(args, 'provider');
|
|
116
|
+
if (provider !== 'local') {
|
|
117
|
+
throw new Error(`${command} CLI workflow support is currently local-only; pass --provider local or use the configured external tracker workflow`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function parseArgs(args) {
|
|
121
|
+
const positional = [];
|
|
122
|
+
const flags = new Map();
|
|
123
|
+
for (let i = 0; i < args.length; i++) {
|
|
124
|
+
const arg = args[i];
|
|
125
|
+
if (!arg.startsWith('--')) {
|
|
126
|
+
positional.push(arg);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const [rawKey, inline] = arg.slice(2).split(/=(.*)/s).filter((part) => part !== undefined);
|
|
130
|
+
if (inline !== undefined && inline !== '') {
|
|
131
|
+
flags.set(rawKey, inline);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const next = args[i + 1];
|
|
135
|
+
if (next && !next.startsWith('--')) {
|
|
136
|
+
flags.set(rawKey, next);
|
|
137
|
+
i++;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
flags.set(rawKey, true);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { positional, flags };
|
|
144
|
+
}
|
|
145
|
+
function stringFlag(args, name) {
|
|
146
|
+
const value = args.flags.get(name);
|
|
147
|
+
if (value === undefined || value === true)
|
|
148
|
+
return undefined;
|
|
149
|
+
return String(value);
|
|
150
|
+
}
|
|
151
|
+
function numberFlag(args, name) {
|
|
152
|
+
const value = stringFlag(args, name);
|
|
153
|
+
if (!value)
|
|
154
|
+
return undefined;
|
|
155
|
+
const parsed = Number.parseInt(value, 10);
|
|
156
|
+
if (!Number.isInteger(parsed) || parsed < 1)
|
|
157
|
+
throw new Error(`--${name} must be a positive integer`);
|
|
158
|
+
return parsed;
|
|
159
|
+
}
|
|
160
|
+
function csvFlag(args, name) {
|
|
161
|
+
const value = stringFlag(args, name);
|
|
162
|
+
return value ? value.split(',').map((item) => item.trim()).filter(Boolean) : [];
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Base CLI — `aiwg kb <subcommand>`
|
|
3
|
+
*
|
|
4
|
+
* Thin storage wrapper for the knowledge-base subsystem. Routes all
|
|
5
|
+
* persistence through `resolveStorage('kb')` so the KB honors
|
|
6
|
+
* `.aiwg/storage.config` redirection (Obsidian vault, Logseq graph, S3
|
|
7
|
+
* prefix, etc.) without each kb skill hardcoding `.aiwg/kb/`.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* path [<subpath>] Print resolved physical path to the KB root or a sub-entry
|
|
11
|
+
* list [--prefix p] List entries, optionally filtered
|
|
12
|
+
* get <path> Read an entry's content to stdout
|
|
13
|
+
* put <path> Write stdin contents to an entry (creates parents)
|
|
14
|
+
* delete <path> Delete an entry (no-op if missing)
|
|
15
|
+
*
|
|
16
|
+
* @design @.aiwg/architecture/storage-design.md (§4, §5)
|
|
17
|
+
* @issue #934
|
|
18
|
+
* @issue #965
|
|
19
|
+
*/
|
|
20
|
+
import { getLoadedConfig, resolveStorage } from '../storage/index.js';
|
|
21
|
+
import { resolveSubsystemRoot } from '../storage/config.js';
|
|
22
|
+
export async function main(args) {
|
|
23
|
+
const subcommand = args[0];
|
|
24
|
+
const subArgs = args.slice(1);
|
|
25
|
+
switch (subcommand) {
|
|
26
|
+
case 'path':
|
|
27
|
+
await handlePath(subArgs);
|
|
28
|
+
break;
|
|
29
|
+
case 'list':
|
|
30
|
+
await handleList(subArgs);
|
|
31
|
+
break;
|
|
32
|
+
case 'get':
|
|
33
|
+
await handleGet(subArgs);
|
|
34
|
+
break;
|
|
35
|
+
case 'put':
|
|
36
|
+
await handlePut(subArgs);
|
|
37
|
+
break;
|
|
38
|
+
case 'delete':
|
|
39
|
+
await handleDelete(subArgs);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
printUsage();
|
|
43
|
+
if (subcommand) {
|
|
44
|
+
throw new Error(`Unknown kb subcommand: ${subcommand}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function handlePath(args) {
|
|
49
|
+
const subpath = args.find((a) => !a.startsWith('--'));
|
|
50
|
+
const json = args.includes('--json');
|
|
51
|
+
const projectRoot = process.cwd();
|
|
52
|
+
const config = await getLoadedConfig(projectRoot);
|
|
53
|
+
// For non-fs backends, "path" is meaningless in the filesystem sense —
|
|
54
|
+
// tell the user, but still report the configured backend.
|
|
55
|
+
const backend = config?.backends?.['kb']?.type ?? 'fs';
|
|
56
|
+
if (backend !== 'fs') {
|
|
57
|
+
if (json) {
|
|
58
|
+
console.log(JSON.stringify({
|
|
59
|
+
backend,
|
|
60
|
+
note: `kb subsystem uses backend "${backend}" — physical filesystem path is not applicable. Use "aiwg kb get/list" instead.`,
|
|
61
|
+
}, null, 2));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(`kb backend: ${backend}`);
|
|
65
|
+
console.log(` (filesystem path not applicable for this backend; use \`aiwg kb get/list\`)`);
|
|
66
|
+
}
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const root = resolveSubsystemRoot('kb', projectRoot, config);
|
|
70
|
+
const fullPath = subpath ? `${root}/${subpath}` : root;
|
|
71
|
+
if (json) {
|
|
72
|
+
console.log(JSON.stringify({ backend, root, path: fullPath }, null, 2));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log(fullPath);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function handleList(args) {
|
|
79
|
+
let prefix = '';
|
|
80
|
+
let json = false;
|
|
81
|
+
for (let i = 0; i < args.length; i++) {
|
|
82
|
+
if (args[i] === '--prefix') {
|
|
83
|
+
prefix = args[++i] ?? '';
|
|
84
|
+
}
|
|
85
|
+
else if (args[i] === '--json') {
|
|
86
|
+
json = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const adapter = await resolveStorage('kb');
|
|
90
|
+
const entries = await adapter.list(prefix);
|
|
91
|
+
if (json) {
|
|
92
|
+
console.log(JSON.stringify(entries.map((e) => ({
|
|
93
|
+
path: e.path,
|
|
94
|
+
size: e.size,
|
|
95
|
+
modifiedAt: e.modifiedAt?.toISOString(),
|
|
96
|
+
})), null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (entries.length === 0) {
|
|
100
|
+
console.log(`No entries${prefix ? ` matching prefix "${prefix}"` : ''}.`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
for (const e of entries) {
|
|
104
|
+
console.log(e.path);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async function handleGet(args) {
|
|
108
|
+
const path = args[0];
|
|
109
|
+
if (!path) {
|
|
110
|
+
throw new Error('Usage: aiwg kb get <path>');
|
|
111
|
+
}
|
|
112
|
+
const adapter = await resolveStorage('kb');
|
|
113
|
+
const content = await adapter.read(path);
|
|
114
|
+
if (content === null) {
|
|
115
|
+
throw new Error(`KB entry not found: ${path}`);
|
|
116
|
+
}
|
|
117
|
+
process.stdout.write(content);
|
|
118
|
+
}
|
|
119
|
+
async function handlePut(args) {
|
|
120
|
+
const path = args[0];
|
|
121
|
+
if (!path) {
|
|
122
|
+
throw new Error(`Usage: aiwg kb put <path>\n` +
|
|
123
|
+
` Reads content from stdin. Creates parent directories. Overwrites existing.\n` +
|
|
124
|
+
` Examples:\n` +
|
|
125
|
+
` echo "# foo" | aiwg kb put entities/foo.md\n` +
|
|
126
|
+
` cat draft.md | aiwg kb put concepts/bar.md`);
|
|
127
|
+
}
|
|
128
|
+
// Read stdin
|
|
129
|
+
const chunks = [];
|
|
130
|
+
for await (const chunk of process.stdin) {
|
|
131
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
132
|
+
}
|
|
133
|
+
const content = Buffer.concat(chunks).toString('utf-8');
|
|
134
|
+
const adapter = await resolveStorage('kb');
|
|
135
|
+
await adapter.write(path, content);
|
|
136
|
+
console.log(`Wrote ${content.length} bytes to kb:${path}`);
|
|
137
|
+
}
|
|
138
|
+
async function handleDelete(args) {
|
|
139
|
+
const path = args[0];
|
|
140
|
+
if (!path) {
|
|
141
|
+
throw new Error('Usage: aiwg kb delete <path>');
|
|
142
|
+
}
|
|
143
|
+
const adapter = await resolveStorage('kb');
|
|
144
|
+
await adapter.delete(path);
|
|
145
|
+
console.log(`Deleted kb:${path} (no-op if missing)`);
|
|
146
|
+
}
|
|
147
|
+
function printUsage() {
|
|
148
|
+
console.log(`Usage: aiwg kb <subcommand>
|
|
149
|
+
|
|
150
|
+
Subcommands:
|
|
151
|
+
path [<subpath>] Print resolved physical path (fs backend only)
|
|
152
|
+
list [--prefix <p>] List entries (optionally filtered by prefix)
|
|
153
|
+
get <path> Read an entry's content to stdout
|
|
154
|
+
put <path> Write stdin contents to an entry
|
|
155
|
+
delete <path> Delete an entry (no-op if missing)
|
|
156
|
+
|
|
157
|
+
Flags:
|
|
158
|
+
--json Machine-readable output (path, list)
|
|
159
|
+
|
|
160
|
+
Examples:
|
|
161
|
+
aiwg kb path # /home/user/proj/.aiwg/kb
|
|
162
|
+
aiwg kb path entities/foo.md # ...absolute path
|
|
163
|
+
aiwg kb list --prefix entities/
|
|
164
|
+
aiwg kb get entities/foo.md
|
|
165
|
+
echo "# foo" | aiwg kb put entities/foo.md
|
|
166
|
+
aiwg kb delete entities/old.md
|
|
167
|
+
|
|
168
|
+
The KB persists at .aiwg/kb/ on the default fs backend. Configure
|
|
169
|
+
.aiwg/storage.config to redirect (#934). For non-fs backends (obsidian,
|
|
170
|
+
logseq, etc.), \`aiwg kb path\` reports the backend rather than a
|
|
171
|
+
filesystem path — use \`get\`/\`list\` to interact through the adapter.`);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lint CLI Entry Point
|
|
3
|
+
*
|
|
4
|
+
* Parses CLI arguments and dispatches to the lint runner.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* aiwg lint .aiwg/research/
|
|
8
|
+
* aiwg lint .aiwg/research/ --ruleset research
|
|
9
|
+
* aiwg lint --list-rulesets
|
|
10
|
+
* aiwg lint --list-rules research
|
|
11
|
+
* aiwg lint .aiwg/ --format json --ci --fail-on warn
|
|
12
|
+
*
|
|
13
|
+
* @issue #810
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'fs';
|
|
16
|
+
import path from 'path';
|
|
17
|
+
import { fileURLToPath } from 'url';
|
|
18
|
+
import { discoverRulesets } from './loader.js';
|
|
19
|
+
import { autoDetectRulesets, runLint } from './runner.js';
|
|
20
|
+
import { formatResult, formatRulesetList, formatRuleList } from './reporters.js';
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the AIWG install root — the directory containing `agentic/code/frameworks/`.
|
|
23
|
+
* Walks up from the running script's location so it works at any compiled depth
|
|
24
|
+
* (dev source vs `dist/src/lint/` vs an npm install path) without per-location math.
|
|
25
|
+
* Honors `AIWG_ROOT` env override first. Fixes #1515 (lint couldn't find rulesets
|
|
26
|
+
* when run outside the AIWG repo).
|
|
27
|
+
*
|
|
28
|
+
* Both markers (`agentic/code/frameworks/` AND `package.json`) must be present at
|
|
29
|
+
* the same level — that excludes stale `dist/agentic/` partials from prior builds
|
|
30
|
+
* (which exist without a sibling `package.json`).
|
|
31
|
+
*/
|
|
32
|
+
function findAiwgRoot() {
|
|
33
|
+
if (process.env.AIWG_ROOT)
|
|
34
|
+
return process.env.AIWG_ROOT;
|
|
35
|
+
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
36
|
+
while (dir !== path.dirname(dir)) {
|
|
37
|
+
if (fs.existsSync(path.join(dir, 'agentic', 'code', 'frameworks')) &&
|
|
38
|
+
fs.existsSync(path.join(dir, 'package.json'))) {
|
|
39
|
+
return dir;
|
|
40
|
+
}
|
|
41
|
+
dir = path.dirname(dir);
|
|
42
|
+
}
|
|
43
|
+
return process.cwd(); // last-resort fallback
|
|
44
|
+
}
|
|
45
|
+
const AIWG_ROOT = findAiwgRoot();
|
|
46
|
+
/**
|
|
47
|
+
* Parse CLI arguments into LintOptions
|
|
48
|
+
*/
|
|
49
|
+
function parseArgs(args) {
|
|
50
|
+
const options = {
|
|
51
|
+
target: '',
|
|
52
|
+
recursive: true,
|
|
53
|
+
format: 'full',
|
|
54
|
+
ci: false,
|
|
55
|
+
failOn: 'error',
|
|
56
|
+
dryRun: false,
|
|
57
|
+
listRulesets: false,
|
|
58
|
+
};
|
|
59
|
+
let i = 0;
|
|
60
|
+
while (i < args.length) {
|
|
61
|
+
const arg = args[i];
|
|
62
|
+
if (arg === '--list-rulesets') {
|
|
63
|
+
options.listRulesets = true;
|
|
64
|
+
}
|
|
65
|
+
else if (arg === '--list-rules' && i + 1 < args.length) {
|
|
66
|
+
options.listRules = args[++i];
|
|
67
|
+
}
|
|
68
|
+
else if (arg === '--ruleset' && i + 1 < args.length) {
|
|
69
|
+
options.rulesets = args[++i].split(',').map(s => s.trim());
|
|
70
|
+
}
|
|
71
|
+
else if (arg === '--format' && i + 1 < args.length) {
|
|
72
|
+
options.format = args[++i];
|
|
73
|
+
}
|
|
74
|
+
else if (arg === '--ci') {
|
|
75
|
+
options.ci = true;
|
|
76
|
+
}
|
|
77
|
+
else if (arg === '--fail-on' && i + 1 < args.length) {
|
|
78
|
+
options.failOn = args[++i];
|
|
79
|
+
}
|
|
80
|
+
else if (arg === '--dry-run') {
|
|
81
|
+
options.dryRun = true;
|
|
82
|
+
}
|
|
83
|
+
else if (arg === '--recursive' || arg === '-r') {
|
|
84
|
+
options.recursive = true;
|
|
85
|
+
}
|
|
86
|
+
else if (arg === '--no-recursive') {
|
|
87
|
+
options.recursive = false;
|
|
88
|
+
}
|
|
89
|
+
else if (!arg.startsWith('-') && !options.target) {
|
|
90
|
+
options.target = arg;
|
|
91
|
+
}
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
return options;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Main lint CLI entry point
|
|
98
|
+
*/
|
|
99
|
+
export async function main(args) {
|
|
100
|
+
const options = parseArgs(args);
|
|
101
|
+
const cwd = process.cwd();
|
|
102
|
+
// Discover available rulesets. `cwd` is where the user runs the lint (used
|
|
103
|
+
// to find deployed `.aiwg/frameworks/*/lint/` overlays); `AIWG_ROOT` is the
|
|
104
|
+
// AIWG install (used to find shipped `agentic/code/frameworks/*/lint/`).
|
|
105
|
+
// Prior to #1515 this hardcoded both to `cwd`, which only worked inside the
|
|
106
|
+
// AIWG repo itself — user projects got an empty "Available:" list.
|
|
107
|
+
const allRulesets = await discoverRulesets(cwd, AIWG_ROOT);
|
|
108
|
+
// Handle --list-rulesets
|
|
109
|
+
if (options.listRulesets) {
|
|
110
|
+
console.log(formatRulesetList(allRulesets));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Handle --list-rules
|
|
114
|
+
if (options.listRules) {
|
|
115
|
+
const ruleset = allRulesets.find(r => r.id === options.listRules || r.framework === options.listRules);
|
|
116
|
+
if (!ruleset) {
|
|
117
|
+
console.error(`Ruleset '${options.listRules}' not found. Run 'aiwg lint --list-rulesets' to see available sets.`);
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
console.log(formatRuleList(ruleset));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Require a target for actual linting
|
|
125
|
+
if (!options.target) {
|
|
126
|
+
console.error('Usage: aiwg lint <target> [--ruleset <name>] [--format full|summary|json] [--ci] [--fail-on error|warn|info]');
|
|
127
|
+
console.error(' aiwg lint --list-rulesets');
|
|
128
|
+
console.error(' aiwg lint --list-rules <ruleset>');
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Resolve target path
|
|
133
|
+
const targetDir = path.resolve(cwd, options.target);
|
|
134
|
+
// Select rulesets
|
|
135
|
+
let selectedRulesets = allRulesets;
|
|
136
|
+
if (options.rulesets && options.rulesets.length > 0) {
|
|
137
|
+
selectedRulesets = allRulesets.filter(r => options.rulesets.includes(r.id) || options.rulesets.includes(r.framework));
|
|
138
|
+
if (selectedRulesets.length === 0) {
|
|
139
|
+
console.error(`No matching rulesets for: ${options.rulesets.join(', ')}`);
|
|
140
|
+
console.error('Available: ' + allRulesets.map(r => r.id).join(', '));
|
|
141
|
+
process.exitCode = 1;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
selectedRulesets = autoDetectRulesets(options.target, allRulesets);
|
|
147
|
+
}
|
|
148
|
+
// Dry run
|
|
149
|
+
if (options.dryRun) {
|
|
150
|
+
console.log(`Dry run: would lint '${options.target}' with rulesets: ${selectedRulesets.map(r => r.id).join(', ')}`);
|
|
151
|
+
for (const rs of selectedRulesets) {
|
|
152
|
+
console.log(` ${rs.id}: ${rs.rules.length} rules`);
|
|
153
|
+
for (const rule of rs.rules) {
|
|
154
|
+
console.log(` - ${rule.id} [${rule.severity}]: ${rule.description}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Run lint
|
|
160
|
+
const result = await runLint(targetDir, selectedRulesets, {
|
|
161
|
+
recursive: options.recursive,
|
|
162
|
+
failOn: options.failOn,
|
|
163
|
+
});
|
|
164
|
+
// Output results
|
|
165
|
+
console.log(formatResult(result, options.format || 'full'));
|
|
166
|
+
// Set exit code in CI mode
|
|
167
|
+
if (options.ci && !result.summary.passed) {
|
|
168
|
+
process.exitCode = 1;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=cli.js.map
|