@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,650 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RLM Agentic Tools CLI — Subcommand router for RLM support tools
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* chunk <file> — Split file into overlapping chunks for fanout
|
|
6
|
+
* fanout <query> — Dispatch parallel subagent queries across chunks
|
|
7
|
+
* rlm-prep <file|dir> — Prepare source content (chunk + index + manifest)
|
|
8
|
+
* rlm-search <query> — Full recursive search pipeline
|
|
9
|
+
* rlm-status — Show active task tree, progress, and cost
|
|
10
|
+
*
|
|
11
|
+
* These tools are designed for agentic sessions implementing the RLM pattern
|
|
12
|
+
* (recursive decomposition + programmatic environment interaction). They are
|
|
13
|
+
* also directly invocable by users.
|
|
14
|
+
*
|
|
15
|
+
* Research foundation: REF-089 (Zhang et al., 2026)
|
|
16
|
+
*
|
|
17
|
+
* @implements #559
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { projectAiwgPath } from '../config/project-artifacts.js';
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the effective `--parallel` / `--max-parallel` value for RLM CLI
|
|
24
|
+
* commands, composing all applicable caps. Returns:
|
|
25
|
+
* { effective, source, clamped, hardCapHit }
|
|
26
|
+
*
|
|
27
|
+
* Precedence (smallest wins):
|
|
28
|
+
* 1. `parallelism.max_parallel_subagents` from `.aiwg/aiwg.config` (#1359)
|
|
29
|
+
* 2. The RLM Rule 8 hard cap of 7
|
|
30
|
+
* 3. The user-supplied flag value (or hardcoded fallback when unset)
|
|
31
|
+
*
|
|
32
|
+
* When the user passes a value above the cap, we warn and clamp. When no
|
|
33
|
+
* flag is passed, we use the resolved cap directly as the default — that is
|
|
34
|
+
* the whole point of the project-level config.
|
|
35
|
+
*
|
|
36
|
+
* @implements #1360
|
|
37
|
+
*/
|
|
38
|
+
export async function resolveRlmParallel(userValue, fallbackDefault, projectDir = process.cwd()) {
|
|
39
|
+
const RLM_HARD_CAP = 7;
|
|
40
|
+
try {
|
|
41
|
+
const { readAiwgConfig, resolveParallelism } = await import('../config/aiwg-config.js');
|
|
42
|
+
const cfg = await readAiwgConfig(projectDir);
|
|
43
|
+
if (!cfg) {
|
|
44
|
+
// No config — fall back to user value or fallback default, still clamped to RLM hard cap
|
|
45
|
+
const intended = userValue ?? fallbackDefault;
|
|
46
|
+
if (intended > RLM_HARD_CAP) {
|
|
47
|
+
return {
|
|
48
|
+
effective: RLM_HARD_CAP,
|
|
49
|
+
source: 'rlm-hard-cap',
|
|
50
|
+
warning: `--parallel=${intended} clamped to ${RLM_HARD_CAP} (RLM Rule 8 hard cap)`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return { effective: intended, source: userValue !== undefined ? 'user-flag' : 'fallback-default' };
|
|
54
|
+
}
|
|
55
|
+
const resolved = resolveParallelism(cfg.parallelism, cfg.providers[0]);
|
|
56
|
+
const providerCap = resolved.max_parallel_subagents;
|
|
57
|
+
const effectiveCap = Math.min(providerCap, RLM_HARD_CAP);
|
|
58
|
+
if (userValue === undefined) {
|
|
59
|
+
// No flag — use the resolved cap as the default
|
|
60
|
+
return { effective: effectiveCap, source: providerCap <= RLM_HARD_CAP ? 'provider-default' : 'rlm-hard-cap' };
|
|
61
|
+
}
|
|
62
|
+
if (userValue > effectiveCap) {
|
|
63
|
+
const reason = providerCap < RLM_HARD_CAP
|
|
64
|
+
? `parallelism.max_parallel_subagents=${providerCap}`
|
|
65
|
+
: `RLM Rule 8 hard cap of ${RLM_HARD_CAP}`;
|
|
66
|
+
return {
|
|
67
|
+
effective: effectiveCap,
|
|
68
|
+
source: providerCap < RLM_HARD_CAP ? 'provider-cap-clamp' : 'rlm-hard-cap',
|
|
69
|
+
warning: `--parallel=${userValue} clamped to ${effectiveCap} (${reason})`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { effective: userValue, source: 'user-flag' };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Config read failed — fall back to user value or fallback default
|
|
76
|
+
const intended = userValue ?? fallbackDefault;
|
|
77
|
+
return { effective: Math.min(intended, RLM_HARD_CAP), source: 'fallback' };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Main CLI entry point for RLM agentic tool subcommands
|
|
82
|
+
*/
|
|
83
|
+
export async function main(args) {
|
|
84
|
+
const subcommand = args[0];
|
|
85
|
+
const subArgs = args.slice(1);
|
|
86
|
+
switch (subcommand) {
|
|
87
|
+
case 'chunk':
|
|
88
|
+
await handleChunk(subArgs);
|
|
89
|
+
break;
|
|
90
|
+
case 'fanout':
|
|
91
|
+
await handleFanout(subArgs);
|
|
92
|
+
break;
|
|
93
|
+
case 'rlm-prep':
|
|
94
|
+
await handleRlmPrep(subArgs);
|
|
95
|
+
break;
|
|
96
|
+
case 'rlm-search':
|
|
97
|
+
await handleRlmSearch(subArgs);
|
|
98
|
+
break;
|
|
99
|
+
case 'rlm-status':
|
|
100
|
+
await handleRlmStatus(subArgs);
|
|
101
|
+
break;
|
|
102
|
+
case 'rlm-cache': {
|
|
103
|
+
const { main: cacheMain } = await import('./cache/cli.js');
|
|
104
|
+
await cacheMain(subArgs);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
printUsage();
|
|
109
|
+
if (subcommand) {
|
|
110
|
+
throw new Error(`Unknown RLM subcommand: ${subcommand}`);
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ============================================================
|
|
116
|
+
// chunk
|
|
117
|
+
// ============================================================
|
|
118
|
+
async function handleChunk(args) {
|
|
119
|
+
let file;
|
|
120
|
+
let chunkSize = 2000; // lines per chunk
|
|
121
|
+
let overlapArg; // resolved after chunkSize is known
|
|
122
|
+
let format = 'json';
|
|
123
|
+
let outputDir;
|
|
124
|
+
for (let i = 0; i < args.length; i++) {
|
|
125
|
+
switch (args[i]) {
|
|
126
|
+
case '--size':
|
|
127
|
+
chunkSize = parseInt(args[++i], 10);
|
|
128
|
+
break;
|
|
129
|
+
case '--overlap':
|
|
130
|
+
overlapArg = parseInt(args[++i], 10);
|
|
131
|
+
break;
|
|
132
|
+
case '--format':
|
|
133
|
+
format = args[++i];
|
|
134
|
+
break;
|
|
135
|
+
case '--output':
|
|
136
|
+
outputDir = args[++i];
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
if (!args[i].startsWith('--'))
|
|
140
|
+
file = args[i];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (!file) {
|
|
144
|
+
throw new Error('Usage: aiwg chunk <file> [--size N] [--overlap N] [--format json|text] [--output <dir>]');
|
|
145
|
+
}
|
|
146
|
+
// Default overlap is 5% of chunkSize, clamped to [0, chunkSize-1] so stride is always ≥ 1.
|
|
147
|
+
const overlap = overlapArg !== undefined
|
|
148
|
+
? Math.min(overlapArg, chunkSize - 1)
|
|
149
|
+
: Math.min(Math.floor(chunkSize * 0.05), chunkSize - 1);
|
|
150
|
+
const absoluteFile = path.resolve(file);
|
|
151
|
+
if (!fs.existsSync(absoluteFile)) {
|
|
152
|
+
throw new Error(`File not found: ${absoluteFile}`);
|
|
153
|
+
}
|
|
154
|
+
const content = fs.readFileSync(absoluteFile, 'utf-8');
|
|
155
|
+
const rawLines = content.split('\n');
|
|
156
|
+
// Remove trailing empty line produced by files ending with \n
|
|
157
|
+
const lines = rawLines[rawLines.length - 1] === '' ? rawLines.slice(0, -1) : rawLines;
|
|
158
|
+
const totalLines = lines.length;
|
|
159
|
+
if (totalLines <= chunkSize) {
|
|
160
|
+
const chunkFile = outputDir ? path.join(outputDir, 'chunk-0000.txt') : absoluteFile;
|
|
161
|
+
const manifestFile = outputDir ? path.join(outputDir, 'manifest.json') : undefined;
|
|
162
|
+
const chunks = [{ index: 0, start: 0, end: totalLines - 1, file: chunkFile, lines: totalLines }];
|
|
163
|
+
const result = {
|
|
164
|
+
source: absoluteFile,
|
|
165
|
+
totalLines,
|
|
166
|
+
chunkSize,
|
|
167
|
+
overlap: 0,
|
|
168
|
+
chunkDir: outputDir,
|
|
169
|
+
chunks,
|
|
170
|
+
message: 'File fits in a single chunk, no splitting required',
|
|
171
|
+
};
|
|
172
|
+
if (outputDir) {
|
|
173
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
174
|
+
fs.writeFileSync(chunkFile, lines.join('\n'), 'utf-8');
|
|
175
|
+
fs.writeFileSync(manifestFile, JSON.stringify(result, null, 2), 'utf-8');
|
|
176
|
+
}
|
|
177
|
+
// File fits in one chunk — no splitting needed
|
|
178
|
+
console.log(JSON.stringify(result, null, 2));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const chunkDir = outputDir ?? path.join(path.dirname(absoluteFile), `.rlm-chunks-${path.basename(absoluteFile)}`);
|
|
182
|
+
fs.mkdirSync(chunkDir, { recursive: true });
|
|
183
|
+
const chunks = [];
|
|
184
|
+
let chunkIndex = 0;
|
|
185
|
+
let start = 0;
|
|
186
|
+
while (start < totalLines) {
|
|
187
|
+
const end = Math.min(start + chunkSize - 1, totalLines - 1);
|
|
188
|
+
const chunkLines = lines.slice(start, end + 1);
|
|
189
|
+
const chunkFile = path.join(chunkDir, `chunk-${String(chunkIndex).padStart(4, '0')}.txt`);
|
|
190
|
+
fs.writeFileSync(chunkFile, chunkLines.join('\n'), 'utf-8');
|
|
191
|
+
chunks.push({ index: chunkIndex, start, end, file: chunkFile, lines: chunkLines.length });
|
|
192
|
+
chunkIndex++;
|
|
193
|
+
// Advance with overlap: next chunk starts (chunkSize - overlap) lines ahead.
|
|
194
|
+
// Clamp stride to at least 1 to prevent infinite loop when overlap >= chunkSize.
|
|
195
|
+
const stride = Math.max(1, chunkSize - overlap);
|
|
196
|
+
start += stride;
|
|
197
|
+
if (start >= totalLines)
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
const manifest = {
|
|
201
|
+
source: absoluteFile,
|
|
202
|
+
totalLines,
|
|
203
|
+
chunkSize,
|
|
204
|
+
overlap,
|
|
205
|
+
chunkDir,
|
|
206
|
+
chunks,
|
|
207
|
+
createdAt: new Date().toISOString(),
|
|
208
|
+
};
|
|
209
|
+
const manifestFile = path.join(chunkDir, 'manifest.json');
|
|
210
|
+
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 2), 'utf-8');
|
|
211
|
+
if (format === 'json') {
|
|
212
|
+
console.log(JSON.stringify(manifest, null, 2));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.log(`Chunked ${absoluteFile} into ${chunks.length} chunks`);
|
|
216
|
+
console.log(`Chunk directory: ${chunkDir}`);
|
|
217
|
+
console.log(`Manifest: ${manifestFile}`);
|
|
218
|
+
for (const chunk of chunks) {
|
|
219
|
+
console.log(` chunk-${String(chunk.index).padStart(4, '0')}: lines ${chunk.start}-${chunk.end} (${chunk.lines} lines)`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ============================================================
|
|
224
|
+
// fanout
|
|
225
|
+
// ============================================================
|
|
226
|
+
async function handleFanout(args) {
|
|
227
|
+
let query;
|
|
228
|
+
let chunksPath;
|
|
229
|
+
let userParallel;
|
|
230
|
+
let model = 'sonnet';
|
|
231
|
+
for (let i = 0; i < args.length; i++) {
|
|
232
|
+
switch (args[i]) {
|
|
233
|
+
case '--chunks':
|
|
234
|
+
chunksPath = args[++i];
|
|
235
|
+
break;
|
|
236
|
+
case '--parallel':
|
|
237
|
+
case '--max-parallel':
|
|
238
|
+
userParallel = parseInt(args[++i], 10);
|
|
239
|
+
break;
|
|
240
|
+
case '--model':
|
|
241
|
+
model = args[++i];
|
|
242
|
+
break;
|
|
243
|
+
default:
|
|
244
|
+
if (!args[i].startsWith('--'))
|
|
245
|
+
query = args[i];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!query || !chunksPath) {
|
|
249
|
+
throw new Error('Usage: aiwg fanout <query> --chunks <dir|manifest.json> [--parallel N] [--model haiku|sonnet|opus]');
|
|
250
|
+
}
|
|
251
|
+
// #1360: Resolve --parallel against aiwg.config parallelism cap (warn + clamp).
|
|
252
|
+
const resolved = await resolveRlmParallel(userParallel, 5);
|
|
253
|
+
const parallel = resolved.effective;
|
|
254
|
+
if (resolved.warning)
|
|
255
|
+
console.warn(`⚠ ${resolved.warning}`);
|
|
256
|
+
// Resolve manifest
|
|
257
|
+
let manifestFile;
|
|
258
|
+
const absoluteChunks = path.resolve(chunksPath);
|
|
259
|
+
if (!fs.existsSync(absoluteChunks)) {
|
|
260
|
+
throw new Error(`Manifest not found: ${absoluteChunks}. Run 'aiwg chunk' first.`);
|
|
261
|
+
}
|
|
262
|
+
if (fs.statSync(absoluteChunks).isDirectory()) {
|
|
263
|
+
manifestFile = path.join(absoluteChunks, 'manifest.json');
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
manifestFile = absoluteChunks;
|
|
267
|
+
}
|
|
268
|
+
if (!fs.existsSync(manifestFile)) {
|
|
269
|
+
throw new Error(`Manifest not found: ${manifestFile}. Run 'aiwg chunk' first.`);
|
|
270
|
+
}
|
|
271
|
+
const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf-8'));
|
|
272
|
+
const chunks = manifest.chunks;
|
|
273
|
+
console.log(`Fanout: "${query}" across ${chunks.length} chunks`);
|
|
274
|
+
console.log(`Model: ${model}, Max parallel: ${parallel}`);
|
|
275
|
+
console.log('');
|
|
276
|
+
console.log('NOTE: This command produces a dispatch plan for the RLM agent to execute.');
|
|
277
|
+
console.log('The RLM agent spawns subagents for each chunk using the Task tool.');
|
|
278
|
+
console.log('');
|
|
279
|
+
console.log('Dispatch plan:');
|
|
280
|
+
// Output structured dispatch plan for the RLM agent
|
|
281
|
+
const dispatchPlan = {
|
|
282
|
+
query,
|
|
283
|
+
model,
|
|
284
|
+
maxParallel: parallel,
|
|
285
|
+
totalChunks: chunks.length,
|
|
286
|
+
waves: [],
|
|
287
|
+
};
|
|
288
|
+
for (let i = 0; i < chunks.length; i += parallel) {
|
|
289
|
+
const wave = chunks.slice(i, i + parallel);
|
|
290
|
+
dispatchPlan.waves.push({ wave: Math.floor(i / parallel), chunks: wave });
|
|
291
|
+
}
|
|
292
|
+
console.log(JSON.stringify(dispatchPlan, null, 2));
|
|
293
|
+
}
|
|
294
|
+
// ============================================================
|
|
295
|
+
// rlm-prep
|
|
296
|
+
// ============================================================
|
|
297
|
+
async function handleRlmPrep(args) {
|
|
298
|
+
let source;
|
|
299
|
+
let outputDir;
|
|
300
|
+
let strategy = 'adaptive';
|
|
301
|
+
let chunkSize = 2000;
|
|
302
|
+
for (let i = 0; i < args.length; i++) {
|
|
303
|
+
switch (args[i]) {
|
|
304
|
+
case '--output':
|
|
305
|
+
outputDir = args[++i];
|
|
306
|
+
break;
|
|
307
|
+
case '--strategy':
|
|
308
|
+
strategy = args[++i];
|
|
309
|
+
break;
|
|
310
|
+
case '--size':
|
|
311
|
+
chunkSize = parseInt(args[++i], 10);
|
|
312
|
+
break;
|
|
313
|
+
default:
|
|
314
|
+
if (!args[i].startsWith('--'))
|
|
315
|
+
source = args[i];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (!source) {
|
|
319
|
+
throw new Error('Usage: aiwg rlm-prep <file|dir> [--output <dir>] [--strategy semantic-boundary|fixed-count|adaptive] [--size N]');
|
|
320
|
+
}
|
|
321
|
+
const absoluteSource = path.resolve(source);
|
|
322
|
+
if (!fs.existsSync(absoluteSource)) {
|
|
323
|
+
throw new Error(`Source not found: ${absoluteSource}`);
|
|
324
|
+
}
|
|
325
|
+
const prepDir = outputDir ?? path.join(process.cwd(), '.rlm-prep');
|
|
326
|
+
fs.mkdirSync(prepDir, { recursive: true });
|
|
327
|
+
const stat = fs.statSync(absoluteSource);
|
|
328
|
+
const files = [];
|
|
329
|
+
if (stat.isFile()) {
|
|
330
|
+
files.push(absoluteSource);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Recursively collect text files from directory
|
|
334
|
+
collectFiles(absoluteSource, files);
|
|
335
|
+
}
|
|
336
|
+
console.log(`RLM Prep: ${files.length} file(s) from ${absoluteSource}`);
|
|
337
|
+
console.log(`Strategy: ${strategy}, Chunk size: ${chunkSize} lines`);
|
|
338
|
+
console.log(`Output: ${prepDir}`);
|
|
339
|
+
console.log('');
|
|
340
|
+
const index = {
|
|
341
|
+
source: absoluteSource,
|
|
342
|
+
prepDir,
|
|
343
|
+
strategy,
|
|
344
|
+
chunkSize,
|
|
345
|
+
files: [],
|
|
346
|
+
createdAt: new Date().toISOString(),
|
|
347
|
+
};
|
|
348
|
+
for (const file of files) {
|
|
349
|
+
const relRoot = stat.isFile() ? path.dirname(absoluteSource) : absoluteSource;
|
|
350
|
+
const relPath = path.relative(relRoot, file);
|
|
351
|
+
const fileOutputDir = path.join(prepDir, relPath + '.chunks');
|
|
352
|
+
fs.mkdirSync(fileOutputDir, { recursive: true });
|
|
353
|
+
// Chunk this file
|
|
354
|
+
await handleChunk([file, '--size', String(chunkSize), '--output', fileOutputDir, '--format', 'json']);
|
|
355
|
+
const manifestFile = path.join(fileOutputDir, 'manifest.json');
|
|
356
|
+
if (fs.existsSync(manifestFile)) {
|
|
357
|
+
const manifest = JSON.parse(fs.readFileSync(manifestFile, 'utf-8'));
|
|
358
|
+
index.files.push({ path: file, manifest: manifestFile, chunks: manifest.chunks.length });
|
|
359
|
+
console.log(` ✓ ${relPath || path.basename(file)}: ${manifest.chunks.length} chunk(s)`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const indexFile = path.join(prepDir, 'index.json');
|
|
363
|
+
fs.writeFileSync(indexFile, JSON.stringify(index, null, 2), 'utf-8');
|
|
364
|
+
console.log('');
|
|
365
|
+
console.log(`Index written: ${indexFile}`);
|
|
366
|
+
console.log(`Total files: ${index.files.length}`);
|
|
367
|
+
console.log(`Total chunks: ${index.files.reduce((sum, f) => sum + f.chunks, 0)}`);
|
|
368
|
+
}
|
|
369
|
+
function collectFiles(dir, results) {
|
|
370
|
+
const SKIP_DIRS = new Set(['.git', 'node_modules', '.rlm-prep', '.rlm-chunks']);
|
|
371
|
+
const TEXT_EXTENSIONS = new Set(['.ts', '.js', '.mjs', '.cjs', '.md', '.txt', '.json', '.yaml', '.yml', '.toml', '.sh']);
|
|
372
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
373
|
+
if (SKIP_DIRS.has(entry))
|
|
374
|
+
continue;
|
|
375
|
+
const full = path.join(dir, entry);
|
|
376
|
+
const stat = fs.statSync(full);
|
|
377
|
+
if (stat.isDirectory()) {
|
|
378
|
+
collectFiles(full, results);
|
|
379
|
+
}
|
|
380
|
+
else if (TEXT_EXTENSIONS.has(path.extname(entry).toLowerCase())) {
|
|
381
|
+
results.push(full);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// ============================================================
|
|
386
|
+
// rlm-search
|
|
387
|
+
// ============================================================
|
|
388
|
+
async function handleRlmSearch(args) {
|
|
389
|
+
let query;
|
|
390
|
+
let sourceArg;
|
|
391
|
+
let depth = 3;
|
|
392
|
+
let userParallel;
|
|
393
|
+
let budget = 500000;
|
|
394
|
+
for (let i = 0; i < args.length; i++) {
|
|
395
|
+
switch (args[i]) {
|
|
396
|
+
case '--source':
|
|
397
|
+
sourceArg = args[++i];
|
|
398
|
+
break;
|
|
399
|
+
case '--depth':
|
|
400
|
+
depth = parseInt(args[++i], 10);
|
|
401
|
+
break;
|
|
402
|
+
case '--parallel':
|
|
403
|
+
case '--max-parallel':
|
|
404
|
+
userParallel = parseInt(args[++i], 10);
|
|
405
|
+
break;
|
|
406
|
+
case '--budget':
|
|
407
|
+
budget = parseInt(args[++i], 10);
|
|
408
|
+
break;
|
|
409
|
+
case '--help':
|
|
410
|
+
case '-h':
|
|
411
|
+
throw new Error('Usage: aiwg rlm-search <query> --source <file|dir> [--depth N] [--parallel N|--max-parallel N] [--budget N]');
|
|
412
|
+
default:
|
|
413
|
+
if (args[i].startsWith('--')) {
|
|
414
|
+
throw new Error(`Unknown rlm-search option: ${args[i]}`);
|
|
415
|
+
}
|
|
416
|
+
if (!query)
|
|
417
|
+
query = args[i];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (!query || !sourceArg) {
|
|
421
|
+
throw new Error('Usage: aiwg rlm-search <query> --source <file|dir> [--depth N] [--parallel N|--max-parallel N] [--budget N]');
|
|
422
|
+
}
|
|
423
|
+
// #1360: Resolve --parallel against aiwg.config parallelism cap (warn + clamp).
|
|
424
|
+
const resolvedParallel = await resolveRlmParallel(userParallel, 5);
|
|
425
|
+
const parallel = resolvedParallel.effective;
|
|
426
|
+
if (resolvedParallel.warning)
|
|
427
|
+
console.warn(`⚠ ${resolvedParallel.warning}`);
|
|
428
|
+
const absoluteSource = path.resolve(sourceArg);
|
|
429
|
+
const prepDir = path.join(process.cwd(), '.rlm-prep');
|
|
430
|
+
const indexFile = path.join(prepDir, 'index.json');
|
|
431
|
+
console.log(`RLM Search: "${query}"`);
|
|
432
|
+
console.log(`Source: ${absoluteSource}`);
|
|
433
|
+
console.log(`Max depth: ${depth}, Max parallel: ${parallel}, Token budget: ${budget}`);
|
|
434
|
+
console.log('');
|
|
435
|
+
// Check if source is already prepped for this source. Older prep indexes may
|
|
436
|
+
// have omitted single-chunk files, so validate file coverage before reuse.
|
|
437
|
+
if (!isPrepIndexUsable(indexFile, absoluteSource)) {
|
|
438
|
+
console.log('Source not prepped — running rlm-prep first...');
|
|
439
|
+
await handleRlmPrep(['--output', prepDir, absoluteSource]);
|
|
440
|
+
console.log('');
|
|
441
|
+
}
|
|
442
|
+
const index = JSON.parse(fs.readFileSync(indexFile, 'utf-8'));
|
|
443
|
+
console.log(`Search plan (${index.files.length} file(s), ${index.files.reduce((s, f) => s + f.chunks, 0)} chunks total):`);
|
|
444
|
+
console.log('');
|
|
445
|
+
console.log('Phase 1 — Fan out query across all chunks');
|
|
446
|
+
console.log(` Dispatch ${Math.ceil(index.files.reduce((s, f) => s + f.chunks, 0) / parallel)} wave(s) of up to ${parallel} parallel subagents`);
|
|
447
|
+
console.log(' Each subagent: grep chunk for query, extract relevant passages');
|
|
448
|
+
console.log('');
|
|
449
|
+
console.log('Phase 2 — Synthesize results');
|
|
450
|
+
console.log(' Collect all relevant passages from Phase 1');
|
|
451
|
+
console.log(' If synthesis exceeds context: chunk passages and recurse (Phase 1 again)');
|
|
452
|
+
console.log(' When fits in one context: produce final answer');
|
|
453
|
+
console.log('');
|
|
454
|
+
console.log('Execution plan (JSON for RLM agent):');
|
|
455
|
+
const executionPlan = {
|
|
456
|
+
query,
|
|
457
|
+
source: absoluteSource,
|
|
458
|
+
indexFile,
|
|
459
|
+
maxDepth: depth,
|
|
460
|
+
maxParallel: parallel,
|
|
461
|
+
tokenBudget: budget,
|
|
462
|
+
phases: [
|
|
463
|
+
{
|
|
464
|
+
phase: 1,
|
|
465
|
+
name: 'fanout',
|
|
466
|
+
files: index.files.map((f) => ({
|
|
467
|
+
path: f.path,
|
|
468
|
+
manifest: f.manifest,
|
|
469
|
+
chunks: f.chunks,
|
|
470
|
+
})),
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
phase: 2,
|
|
474
|
+
name: 'synthesize',
|
|
475
|
+
description: 'Collect Phase 1 results, synthesize answer, recurse if needed',
|
|
476
|
+
},
|
|
477
|
+
],
|
|
478
|
+
estimatedSubAgents: index.files.reduce((s, f) => s + f.chunks, 0),
|
|
479
|
+
};
|
|
480
|
+
console.log(JSON.stringify(executionPlan, null, 2));
|
|
481
|
+
}
|
|
482
|
+
function isPrepIndexUsable(indexFile, absoluteSource) {
|
|
483
|
+
if (!fs.existsSync(indexFile))
|
|
484
|
+
return false;
|
|
485
|
+
try {
|
|
486
|
+
const index = JSON.parse(fs.readFileSync(indexFile, 'utf-8'));
|
|
487
|
+
if (index.source !== absoluteSource)
|
|
488
|
+
return false;
|
|
489
|
+
if (!Array.isArray(index.files))
|
|
490
|
+
return false;
|
|
491
|
+
const stat = fs.statSync(absoluteSource);
|
|
492
|
+
const expectedFiles = [];
|
|
493
|
+
if (stat.isFile()) {
|
|
494
|
+
expectedFiles.push(absoluteSource);
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
collectFiles(absoluteSource, expectedFiles);
|
|
498
|
+
}
|
|
499
|
+
if (index.files.length !== expectedFiles.length)
|
|
500
|
+
return false;
|
|
501
|
+
const indexed = new Set(index.files.map((f) => f.path));
|
|
502
|
+
for (const file of expectedFiles) {
|
|
503
|
+
if (!indexed.has(file))
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
506
|
+
for (const entry of index.files) {
|
|
507
|
+
if (!fs.existsSync(entry.manifest))
|
|
508
|
+
return false;
|
|
509
|
+
const manifest = JSON.parse(fs.readFileSync(entry.manifest, 'utf-8'));
|
|
510
|
+
if (!Array.isArray(manifest.chunks) || manifest.chunks.length !== entry.chunks)
|
|
511
|
+
return false;
|
|
512
|
+
if (manifest.chunks.some((chunk) => !chunk.file || !fs.existsSync(chunk.file)))
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
// ============================================================
|
|
522
|
+
// rlm-status
|
|
523
|
+
// ============================================================
|
|
524
|
+
async function handleRlmStatus(args) {
|
|
525
|
+
const showCost = args.includes('--cost');
|
|
526
|
+
const showTree = args.includes('--tree');
|
|
527
|
+
const asJson = args.includes('--json');
|
|
528
|
+
let taskId;
|
|
529
|
+
const taskIdIndex = args.indexOf('--task-id');
|
|
530
|
+
if (taskIdIndex !== -1)
|
|
531
|
+
taskId = args[taskIdIndex + 1];
|
|
532
|
+
// Look for RLM state files
|
|
533
|
+
const statePaths = [
|
|
534
|
+
projectAiwgPath(process.cwd(), 'ralph', 'rlm-state.json'),
|
|
535
|
+
path.join(process.cwd(), '.rlm-prep', 'index.json'),
|
|
536
|
+
];
|
|
537
|
+
const stateFile = statePaths.find((p) => fs.existsSync(p));
|
|
538
|
+
if (!stateFile) {
|
|
539
|
+
const status = {
|
|
540
|
+
status: 'idle',
|
|
541
|
+
message: 'No active RLM task found. Start a task with `aiwg rlm-search` or `/rlm-query`.',
|
|
542
|
+
checkedPaths: statePaths,
|
|
543
|
+
};
|
|
544
|
+
if (asJson) {
|
|
545
|
+
console.log(JSON.stringify(status, null, 2));
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
console.log('RLM Status: Idle');
|
|
549
|
+
console.log('No active RLM task found.');
|
|
550
|
+
console.log('Start a task with `aiwg rlm-search` or `/rlm-query`.');
|
|
551
|
+
}
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
const state = JSON.parse(fs.readFileSync(stateFile, 'utf-8'));
|
|
555
|
+
if (asJson) {
|
|
556
|
+
console.log(JSON.stringify({ stateFile, taskId, state }, null, 2));
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
console.log('RLM Status');
|
|
560
|
+
console.log('══════════');
|
|
561
|
+
console.log(`State file: ${stateFile}`);
|
|
562
|
+
if (state.source) {
|
|
563
|
+
console.log(`Source: ${state.source}`);
|
|
564
|
+
}
|
|
565
|
+
if (state.createdAt) {
|
|
566
|
+
console.log(`Created: ${state.createdAt}`);
|
|
567
|
+
}
|
|
568
|
+
if (state.files) {
|
|
569
|
+
console.log(`Files indexed: ${state.files.length}`);
|
|
570
|
+
const totalChunks = state.files.reduce((s, f) => s + f.chunks, 0);
|
|
571
|
+
console.log(`Total chunks: ${totalChunks}`);
|
|
572
|
+
}
|
|
573
|
+
if (showCost) {
|
|
574
|
+
const costFile = projectAiwgPath(process.cwd(), 'ralph', 'rlm-cost.json');
|
|
575
|
+
if (fs.existsSync(costFile)) {
|
|
576
|
+
const cost = JSON.parse(fs.readFileSync(costFile, 'utf-8'));
|
|
577
|
+
console.log('');
|
|
578
|
+
console.log('Cost breakdown:');
|
|
579
|
+
console.log(JSON.stringify(cost, null, 2));
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
console.log('');
|
|
583
|
+
console.log('Cost tracking: No cost data available yet.');
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
if (showTree && state.taskTree) {
|
|
587
|
+
console.log('');
|
|
588
|
+
console.log('Task tree:');
|
|
589
|
+
printTaskTree(state.taskTree, 0);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
function printTaskTree(node, depth) {
|
|
593
|
+
const indent = ' '.repeat(depth);
|
|
594
|
+
const status = node.status ?? 'unknown';
|
|
595
|
+
const icon = status === 'complete' ? '✓' : status === 'running' ? '⏳' : status === 'failed' ? '✗' : '○';
|
|
596
|
+
console.log(`${indent}${icon} ${node.id ?? 'root'} [${status}]`);
|
|
597
|
+
if (Array.isArray(node.children)) {
|
|
598
|
+
for (const child of node.children) {
|
|
599
|
+
printTaskTree(child, depth + 1);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
// ============================================================
|
|
604
|
+
// Usage
|
|
605
|
+
// ============================================================
|
|
606
|
+
function printUsage() {
|
|
607
|
+
console.log(`AIWG Agentic Tools — Support tools for RLM sessions
|
|
608
|
+
|
|
609
|
+
Usage: aiwg <tool> [options]
|
|
610
|
+
|
|
611
|
+
Tools:
|
|
612
|
+
chunk <file> Split a file into overlapping chunks for fanout
|
|
613
|
+
fanout <query> Dispatch parallel subagent queries across chunks
|
|
614
|
+
rlm-prep <file|dir> Prepare source content (chunk + index + manifest)
|
|
615
|
+
rlm-search <query> Full recursive search pipeline
|
|
616
|
+
rlm-status Show active RLM task tree, progress, and cost
|
|
617
|
+
|
|
618
|
+
chunk options:
|
|
619
|
+
--size N Lines per chunk (default: 2000)
|
|
620
|
+
--overlap N Overlap lines between chunks (default: 100)
|
|
621
|
+
--format json|text Output format (default: json)
|
|
622
|
+
--output <dir> Output directory for chunks
|
|
623
|
+
|
|
624
|
+
fanout options:
|
|
625
|
+
--chunks <dir|manifest> Chunk directory or manifest.json (required)
|
|
626
|
+
--parallel N Max parallel subagents (default: 5)
|
|
627
|
+
--model haiku|sonnet|opus Model tier for subagents (default: sonnet)
|
|
628
|
+
|
|
629
|
+
rlm-prep options:
|
|
630
|
+
--output <dir> Output directory (default: .rlm-prep)
|
|
631
|
+
--strategy <s> semantic-boundary | fixed-count | adaptive (default: adaptive)
|
|
632
|
+
--size N Lines per chunk (default: 2000)
|
|
633
|
+
|
|
634
|
+
rlm-search options:
|
|
635
|
+
--source <file|dir> Source to search (required)
|
|
636
|
+
--depth N Max recursion depth (default: 3)
|
|
637
|
+
--parallel N Max parallel subagents per wave (default: 5)
|
|
638
|
+
--max-parallel N Alias for --parallel
|
|
639
|
+
--budget N Token budget (default: 500000)
|
|
640
|
+
|
|
641
|
+
rlm-status options:
|
|
642
|
+
--cost Show cost breakdown
|
|
643
|
+
--tree Show task tree
|
|
644
|
+
--json Output as JSON
|
|
645
|
+
--task-id <id> Show specific task
|
|
646
|
+
|
|
647
|
+
Research foundation: REF-089 (Zhang et al., 2026)
|
|
648
|
+
Documentation: agentic/code/addons/rlm/README.md`);
|
|
649
|
+
}
|
|
650
|
+
//# sourceMappingURL=cli.js.map
|