akm-cli 0.9.0-rc.8 → 0.9.0
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/CHANGELOG.md +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -15,36 +15,53 @@
|
|
|
15
15
|
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
16
16
|
import { parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
17
17
|
import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
|
|
18
|
-
import {
|
|
18
|
+
import { parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
19
19
|
import { parseMetaRef } from "../../core/asset/stash-meta.js";
|
|
20
20
|
import { UsageError } from "../../core/errors.js";
|
|
21
21
|
import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
|
|
22
|
-
import {
|
|
22
|
+
import { getOutputMode } from "../../output/context.js";
|
|
23
23
|
import { akmCurate } from "./curate.js";
|
|
24
24
|
import { akmSearch, parseBeliefFilterMode, parseScopeFilterFlags, parseSearchSource } from "./search.js";
|
|
25
25
|
import { akmShowUnified } from "./show.js";
|
|
26
|
+
/**
|
|
27
|
+
* `--source` was renamed to `--from` on `search`/`curate` in 0.9 (S8). citty
|
|
28
|
+
* is non-strict, so the retired spelling is silently absorbed rather than
|
|
29
|
+
* rejected — the command then runs against the DEFAULT `--from` value
|
|
30
|
+
* (local) instead of the source the caller named, with exit 0 and no error.
|
|
31
|
+
* Reject it explicitly instead.
|
|
32
|
+
*/
|
|
33
|
+
function rejectRetiredSourceFlag() {
|
|
34
|
+
if (!getParsedInvocation().hasFlag("--source"))
|
|
35
|
+
return;
|
|
36
|
+
throw new UsageError("`--source` was renamed to `--from` in 0.9. Use `--from local|registry|all` instead.", "INVALID_FLAG_VALUE");
|
|
37
|
+
}
|
|
26
38
|
export const searchCommand = defineJsonCommand({
|
|
27
|
-
meta: { name: "search", description: "Search the
|
|
39
|
+
meta: { name: "search", description: "Search the bundle" },
|
|
28
40
|
args: {
|
|
29
41
|
query: {
|
|
30
42
|
type: "positional",
|
|
31
|
-
description: 'Search query (omit to list all assets). A
|
|
43
|
+
description: 'Search query (omit to list all assets). A conceptId-prefix query — "memories/projecta/", "bundle//", "bundle//skills/" — enumerates that subtree instead of keyword-matching; a trailing "/" is required, and an explicit --type wins over the prefix.',
|
|
32
44
|
required: false,
|
|
33
45
|
default: "",
|
|
34
46
|
},
|
|
35
47
|
type: {
|
|
36
48
|
type: "string",
|
|
37
|
-
description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret,
|
|
49
|
+
description: "Asset type filter — free-form, exact match, unvalidated; an unknown type returns no hits (default: any). Built-ins: skill, command, agent, knowledge, workflow, script, memory, lesson, task, session, fact, env, secret, instruction — plus any adapter-defined type (e.g. website, wiki-source, a wiki pageKind). Use workflow to find step-by-step task assets.",
|
|
38
50
|
},
|
|
39
51
|
limit: { type: "string", description: "Maximum number of results" },
|
|
40
|
-
|
|
52
|
+
from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
|
|
53
|
+
assets: {
|
|
54
|
+
type: "boolean",
|
|
55
|
+
description: "Include asset-level search results (only meaningful with --from registry|all)",
|
|
56
|
+
default: false,
|
|
57
|
+
},
|
|
41
58
|
filter: {
|
|
42
59
|
type: "string",
|
|
43
60
|
description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows results without changing ranking.",
|
|
44
61
|
},
|
|
45
62
|
"include-proposed": {
|
|
46
63
|
type: "boolean",
|
|
47
|
-
description: 'Include entries with quality:"proposed" in the result set. Excluded by default
|
|
64
|
+
description: 'Include entries with quality:"proposed" in the result set. Excluded by default.',
|
|
48
65
|
default: false,
|
|
49
66
|
},
|
|
50
67
|
belief: {
|
|
@@ -52,35 +69,54 @@ export const searchCommand = defineJsonCommand({
|
|
|
52
69
|
description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
|
|
53
70
|
default: "all",
|
|
54
71
|
},
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
72
|
+
// Declared as the POSITIVE name with `default: true` so citty's native
|
|
73
|
+
// `--no-<name>` negation (it strips a leading `--no-` from ANY token and
|
|
74
|
+
// negates the remainder BEFORE consulting the declared-args table — see
|
|
75
|
+
// node_modules/citty/dist/index.mjs) does the work, the same pattern
|
|
76
|
+
// `sync --push/--no-push` uses. A flag DECLARED as `no-project-context`
|
|
77
|
+
// can never be negated: `--no-project-context` parses as "negate
|
|
78
|
+
// `project-context`", a name nothing declared, leaving the real key at
|
|
79
|
+
// its default `false` forever (F1/A1).
|
|
80
|
+
"project-context": {
|
|
58
81
|
type: "boolean",
|
|
59
|
-
|
|
60
|
-
|
|
82
|
+
default: true,
|
|
83
|
+
description: "Automatic project-context ranking boost: assets whose name/tags/aliases match the current working " +
|
|
84
|
+
"directory's project get a small score boost, and this search's usage also feeds the scoped-utility " +
|
|
85
|
+
"ranking signal. Default: on. Use --no-project-context to disable BOTH the project-context boost and " +
|
|
86
|
+
"the scoped-utility signal for this search only.",
|
|
61
87
|
},
|
|
62
88
|
"include-sessions": {
|
|
63
89
|
type: "boolean",
|
|
64
90
|
description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
|
|
65
91
|
default: false,
|
|
66
92
|
},
|
|
93
|
+
// Declared as the POSITIVE name with `default: true` for the same reason
|
|
94
|
+
// as `project-context` above — never declare a flag whose NAME starts
|
|
95
|
+
// with `no-`.
|
|
96
|
+
"track-usage": {
|
|
97
|
+
type: "boolean",
|
|
98
|
+
default: true,
|
|
99
|
+
description: "A successful search updates ranking signals (usage-events telemetry and the MemRL utility-score bump " +
|
|
100
|
+
"used to prioritize future results). Default: on. Use --no-track-usage to run a read-only search that " +
|
|
101
|
+
"does not influence future ranking.",
|
|
102
|
+
},
|
|
67
103
|
},
|
|
68
104
|
async run({ args }) {
|
|
105
|
+
rejectRetiredSourceFlag();
|
|
69
106
|
const query = (args.query ?? "").trim();
|
|
70
|
-
if (!query) {
|
|
71
|
-
throw new UsageError('A search query is required. Usage: akm search "<query>" [--type <type>] [--limit <n>]', "MISSING_REQUIRED_ARGUMENT", 'Pass a query like `akm search "docker"` or `akm search "code review" --type skill`.');
|
|
72
|
-
}
|
|
73
107
|
const type = args.type;
|
|
74
108
|
const limit = parsePositiveIntFlag(args.limit ?? undefined);
|
|
75
|
-
const source = parseSearchSource(args.
|
|
109
|
+
const source = parseSearchSource(args.from);
|
|
76
110
|
// Repeatable; citty exposes only the last `--filter` value, so read all
|
|
77
111
|
// occurrences directly from argv (same pattern as `--tag`).
|
|
78
112
|
const filterTokens = parseAllFlagValues("--filter");
|
|
79
113
|
const filters = parseScopeFilterFlags(filterTokens, "--filter");
|
|
80
114
|
const includeProposed = args["include-proposed"] === true;
|
|
81
115
|
const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
|
|
82
|
-
const
|
|
116
|
+
const disableProjectContext = args["project-context"] === false;
|
|
117
|
+
const skipLogging = args["track-usage"] === false;
|
|
83
118
|
const includeSessions = args["include-sessions"];
|
|
119
|
+
const assets = args.assets === true;
|
|
84
120
|
const outputMode = getOutputMode();
|
|
85
121
|
const result = await akmSearch({
|
|
86
122
|
query,
|
|
@@ -91,8 +127,10 @@ export const searchCommand = defineJsonCommand({
|
|
|
91
127
|
includeProposed,
|
|
92
128
|
belief,
|
|
93
129
|
includeSessions,
|
|
94
|
-
disableProjectContext
|
|
95
|
-
disableScopedUtility:
|
|
130
|
+
disableProjectContext,
|
|
131
|
+
disableScopedUtility: disableProjectContext,
|
|
132
|
+
skipLogging,
|
|
133
|
+
assets,
|
|
96
134
|
eventSource: resolveUsageEventSource(),
|
|
97
135
|
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
98
136
|
});
|
|
@@ -100,7 +138,10 @@ export const searchCommand = defineJsonCommand({
|
|
|
100
138
|
},
|
|
101
139
|
});
|
|
102
140
|
export const curateCommand = defineJsonCommand({
|
|
103
|
-
meta: {
|
|
141
|
+
meta: {
|
|
142
|
+
name: "curate",
|
|
143
|
+
description: "Pick the assets worth loading for a task. Unlike `akm search`, this reranks by intent, attaches a preview and run details per hit, adds related support refs, and summarizes the set — the usual starting point for an agent.",
|
|
144
|
+
},
|
|
104
145
|
args: {
|
|
105
146
|
// Optional in citty so run() is invoked when omitted; we re-validate
|
|
106
147
|
// below to surface a structured UsageError (exit 2) instead of citty's
|
|
@@ -108,54 +149,126 @@ export const curateCommand = defineJsonCommand({
|
|
|
108
149
|
query: { type: "positional", description: "Task or prompt to curate assets for", required: false },
|
|
109
150
|
type: {
|
|
110
151
|
type: "string",
|
|
111
|
-
description: "Asset type filter (skill, command, agent, knowledge, workflow, script, memory, env, secret,
|
|
152
|
+
description: "Asset type filter — free-form, exact match, unvalidated; an unknown type returns no hits (default: any). Built-ins: skill, command, agent, knowledge, workflow, script, memory, lesson, task, session, fact, env, secret, instruction — plus any adapter-defined type (e.g. website, wiki-source, a wiki pageKind). Use workflow to curate step-by-step task assets.",
|
|
112
153
|
},
|
|
113
154
|
limit: { type: "string", description: "Maximum number of curated results", default: "4" },
|
|
114
|
-
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
155
|
+
from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
|
|
156
|
+
// Declared as the POSITIVE name with `default: true` — see the
|
|
157
|
+
// `project-context` comment on `searchCommand` above for why a flag NAME
|
|
158
|
+
// must never start with `no-`.
|
|
159
|
+
"track-usage": {
|
|
160
|
+
type: "boolean",
|
|
161
|
+
default: true,
|
|
162
|
+
description: "A successful curate updates ranking signals (usage-events telemetry for the curated items and the " +
|
|
163
|
+
"underlying search). Default: on. Use --no-track-usage to run a read-only curate that does not " +
|
|
164
|
+
"influence future ranking.",
|
|
165
|
+
},
|
|
121
166
|
},
|
|
122
167
|
async run({ args }) {
|
|
168
|
+
rejectRetiredSourceFlag();
|
|
123
169
|
if (!args.query || !String(args.query).trim()) {
|
|
124
170
|
throw new UsageError('A curate query is required. Usage: akm curate "<task or prompt>" [--type <type>] [--limit <n>]', "MISSING_REQUIRED_ARGUMENT", 'Describe the task you want assets for, e.g. `akm curate "deploy to prod"`.');
|
|
125
171
|
}
|
|
126
172
|
const type = args.type;
|
|
127
173
|
const limitParsed = parsePositiveIntFlag(args.limit ?? undefined);
|
|
128
174
|
const limit = limitParsed && limitParsed > 0 ? limitParsed : 4;
|
|
129
|
-
const source = parseSearchSource(args.
|
|
175
|
+
const source = parseSearchSource(args.from ?? "local");
|
|
176
|
+
const skipLogging = args["track-usage"] === false;
|
|
130
177
|
const outputMode = getOutputMode();
|
|
131
178
|
const curated = await akmCurate({
|
|
132
179
|
query: args.query,
|
|
133
180
|
type,
|
|
134
181
|
limit,
|
|
135
182
|
source,
|
|
183
|
+
skipLogging,
|
|
136
184
|
eventSource: resolveUsageEventSource(),
|
|
137
185
|
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
138
186
|
});
|
|
139
187
|
output("curate", curated);
|
|
140
188
|
},
|
|
141
189
|
});
|
|
190
|
+
/**
|
|
191
|
+
* Reject `--scope` (either spelling) on `akm show` (E-3). `--scope` was
|
|
192
|
+
* removed in favor of `--filter` (R-047, guardrail 6 — no alias, must keep
|
|
193
|
+
* failing loudly, not silently). It is deliberately NOT a declared flag on
|
|
194
|
+
* this command, which means citty's default behavior for an undeclared flag
|
|
195
|
+
* kicks in — and that default is silent acceptance:
|
|
196
|
+
*
|
|
197
|
+
* - `--scope=user=nobody` (equals form): citty consumes it as an unknown
|
|
198
|
+
* flag's own inline value. It never reaches `args._`, so nothing downstream
|
|
199
|
+
* ever notices — the command runs to completion and exits 0, having
|
|
200
|
+
* silently ignored the caller's (unsatisfied) scope request. This is the
|
|
201
|
+
* dangerous case: the caller believes a read was scoped when it was not,
|
|
202
|
+
* and it directly violates guardrail 6's "removed spelling must fail
|
|
203
|
+
* loudly, not silently".
|
|
204
|
+
* - `--scope user=nobody` (space form): citty treats `--scope` as boolean
|
|
205
|
+
* and pushes `user=nobody` into `args._` as a stray positional, which
|
|
206
|
+
* incidentally trips `rejectExtraShowPositionals`'s arity check below —
|
|
207
|
+
* but with the wrong diagnosis (it blames the unrelated retired
|
|
208
|
+
* `toc|section|lines|frontmatter|full` view-mode grammar).
|
|
209
|
+
*
|
|
210
|
+
* This check runs FIRST, before the positional check, so both spellings are
|
|
211
|
+
* caught by one explicit, correctly-worded error — it does NOT make `--scope`
|
|
212
|
+
* work, it only makes the failure loud and the diagnosis accurate.
|
|
213
|
+
*
|
|
214
|
+
* NOTE (general issue, out of scope here): citty silently accepts ANY
|
|
215
|
+
* undeclared flag on ANY command (e.g. `akm info --totallybogus` exits 0) —
|
|
216
|
+
* this same silent-ignore failure mode applies repo-wide, not just to
|
|
217
|
+
* `--scope` on `show`. Fixing that generally is a separate, wide-blast-radius
|
|
218
|
+
* owner decision (same family as E-2, `akm list --type skill`); this function
|
|
219
|
+
* only closes the `--scope`/`show` instance of it.
|
|
220
|
+
*/
|
|
221
|
+
function rejectRemovedScopeFlag(ref) {
|
|
222
|
+
const usedScopeFlag = getParsedInvocation().userArgs.some((token) => token === "--scope" || token.startsWith("--scope="));
|
|
223
|
+
if (!usedScopeFlag)
|
|
224
|
+
return;
|
|
225
|
+
throw new UsageError("akm show has no --scope flag — it was removed in 0.9.0. Use --filter instead: " +
|
|
226
|
+
"--filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>.", "INVALID_FLAG_VALUE", `\`akm show ${ref} --filter user=<id>\` narrows resolution to assets whose frontmatter scope matches.`);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Reject any positional after the ref. The
|
|
230
|
+
* `akm show <ref> toc|section "H"|lines A B|frontmatter|full` view grammar was
|
|
231
|
+
* removed in 0.9.0; its keywords used to be rewritten into hidden flags before
|
|
232
|
+
* citty saw argv, so without this guard a stale invocation would silently
|
|
233
|
+
* render the whole item instead of the view the caller asked for.
|
|
234
|
+
*
|
|
235
|
+
* `--scope` is handled separately, and earlier, by {@link rejectRemovedScopeFlag}
|
|
236
|
+
* — by the time this runs, a `--scope`-caused stray positional has already
|
|
237
|
+
* been intercepted with the correct diagnosis, so this function's generic
|
|
238
|
+
* message is reached only by genuine leftover view-grammar tokens.
|
|
239
|
+
*/
|
|
240
|
+
function rejectExtraShowPositionals(positionals, ref) {
|
|
241
|
+
const extra = (Array.isArray(positionals) ? positionals.map(String) : []).slice(1);
|
|
242
|
+
if (extra.length === 0)
|
|
243
|
+
return;
|
|
244
|
+
throw new UsageError(`akm show takes a single ref, but got ${extra.map((token) => `"${token}"`).join(" ")} after "${ref}". ` +
|
|
245
|
+
"The view-mode grammar (toc|section|lines|frontmatter|full) was removed in 0.9.0 — use " +
|
|
246
|
+
`\`akm show ${ref}#<heading-slug>\` to read one section, or \`akm show ${ref}\` for the whole item.`, "INVALID_FLAG_VALUE", "An unmatched #fragment lists the available slugs.");
|
|
247
|
+
}
|
|
142
248
|
export const showCommand = defineJsonCommand({
|
|
143
249
|
meta: {
|
|
144
250
|
name: "show",
|
|
145
|
-
description: "Show a
|
|
251
|
+
description: "Show a bundle asset by ref (e.g. akm show knowledge/guide.md, akm show knowledge/guide.md#auth)",
|
|
146
252
|
},
|
|
147
253
|
args: {
|
|
148
254
|
ref: {
|
|
149
255
|
type: "positional",
|
|
150
|
-
description:
|
|
256
|
+
description: "Asset ref ([bundle//]conceptId[#fragment]). On a markdown document `#fragment` selects one section by heading slug, and an unmatched fragment lists the available slugs. Example: `akm show knowledge/guide.md#auth`.",
|
|
151
257
|
required: true,
|
|
152
258
|
},
|
|
153
|
-
|
|
154
|
-
detail: { type: "string", description: "Detail level (brief|normal|full)" },
|
|
155
|
-
shape: { type: "string", description: "Output projection (human|agent|summary)" },
|
|
156
|
-
scope: {
|
|
259
|
+
filter: {
|
|
157
260
|
type: "string",
|
|
158
|
-
description: "Scope filter (repeatable): --
|
|
261
|
+
description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows resolution to assets whose frontmatter scope matches. Same axis as `akm search --filter`.",
|
|
262
|
+
},
|
|
263
|
+
// Declared as the POSITIVE name with `default: true` — see the
|
|
264
|
+
// `project-context` comment on `searchCommand` above for why a flag NAME
|
|
265
|
+
// must never start with `no-`.
|
|
266
|
+
"track-usage": {
|
|
267
|
+
type: "boolean",
|
|
268
|
+
default: true,
|
|
269
|
+
description: "A successful show updates ranking signals (usage-events telemetry, including the search-selection " +
|
|
270
|
+
"linkage when this show follows a recent search). Default: on. Use --no-track-usage to run a " +
|
|
271
|
+
"read-only show that does not influence future ranking.",
|
|
159
272
|
},
|
|
160
273
|
},
|
|
161
274
|
async run({ args }) {
|
|
@@ -163,55 +276,44 @@ export const showCommand = defineJsonCommand({
|
|
|
163
276
|
// not a typed asset ref — skip ref validation and let akmShowUnified
|
|
164
277
|
// direct-read it. (the ref parser would reject the non-type `meta`.)
|
|
165
278
|
if (!parseMetaRef(args.ref))
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
// by `normalizeShowArgv` before citty parses argv. We read those values
|
|
170
|
-
// directly via `getParsedInvocation()` so the flags don't surface as
|
|
171
|
-
// user-facing options in `akm show --help`.
|
|
279
|
+
parseBundleRef(args.ref);
|
|
280
|
+
rejectRemovedScopeFlag(args.ref);
|
|
281
|
+
rejectExtraShowPositionals(args._, args.ref);
|
|
172
282
|
const invocation = getParsedInvocation();
|
|
173
|
-
const akmView = invocation.getFlagValue("--akmView");
|
|
174
|
-
const akmHeading = invocation.getFlagValue("--akmHeading");
|
|
175
|
-
const akmStart = invocation.getFlagValue("--akmStart");
|
|
176
|
-
const akmEnd = invocation.getFlagValue("--akmEnd");
|
|
177
|
-
let view;
|
|
178
|
-
if (akmView) {
|
|
179
|
-
switch (akmView) {
|
|
180
|
-
case "section":
|
|
181
|
-
view = { mode: "section", heading: akmHeading ?? "" };
|
|
182
|
-
break;
|
|
183
|
-
case "lines":
|
|
184
|
-
view = {
|
|
185
|
-
mode: "lines",
|
|
186
|
-
start: Number(akmStart ?? "1"),
|
|
187
|
-
end: akmEnd ? parseInt(akmEnd, 10) : Number.MAX_SAFE_INTEGER,
|
|
188
|
-
};
|
|
189
|
-
break;
|
|
190
|
-
case "toc":
|
|
191
|
-
case "frontmatter":
|
|
192
|
-
case "full":
|
|
193
|
-
view = { mode: akmView };
|
|
194
|
-
break;
|
|
195
|
-
default:
|
|
196
|
-
throw new UsageError(`Unknown view mode: ${akmView}. Expected one of: full|toc|frontmatter|section|lines`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
283
|
const cliShape = getOutputMode().shape;
|
|
284
|
+
// F6/R-021 — `show` deliberately does NOT inherit `output.detail` from
|
|
285
|
+
// config the way `search`/`curate` do via `getOutputMode().detail`
|
|
286
|
+
// (which merges an explicit `--detail` flag with the config default,
|
|
287
|
+
// "brief" out of the box). A bare `akm show <ref>` must always return
|
|
288
|
+
// the FULL asset body regardless of `config.output.detail` — that is
|
|
289
|
+
// the point of the command. This is a deliberate, permanent exemption,
|
|
290
|
+
// not an oversight, so it is resolved through exactly one path here:
|
|
291
|
+
// read the raw `--detail` flag directly (bypassing the config-merged
|
|
292
|
+
// output mode on purpose) and only ever narrow the response when the
|
|
293
|
+
// caller EXPLICITLY passed `--detail brief` on this invocation.
|
|
294
|
+
// `--detail full` (explicit or, since it's also the implicit default,
|
|
295
|
+
// omitted) and any other value fall through to the full response.
|
|
200
296
|
const explicitDetail = invocation.getFlagValue("--detail");
|
|
201
|
-
// `--shape summary` selects the compact metadata projection for show
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
297
|
+
// `--shape summary` selects the compact metadata projection for show.
|
|
298
|
+
// `--detail brief` forces the brief response regardless of shape.
|
|
299
|
+
const showDetail = explicitDetail === "brief"
|
|
300
|
+
? "brief"
|
|
301
|
+
: explicitDetail === "full"
|
|
302
|
+
? "full"
|
|
303
|
+
: cliShape === "summary"
|
|
304
|
+
? "summary"
|
|
305
|
+
: undefined;
|
|
306
|
+
// `--filter` is repeatable — citty only exposes the last value, so read
|
|
307
|
+
// every occurrence directly from argv (same helper as `akm search`; the two
|
|
308
|
+
// commands share one spelling for the scope-narrowing axis).
|
|
309
|
+
const scopeTokens = parseAllFlagValues("--filter");
|
|
310
|
+
const scope = parseScopeFilterFlags(scopeTokens, "--filter");
|
|
311
|
+
const skipLogging = args["track-usage"] === false;
|
|
210
312
|
const result = await akmShowUnified({
|
|
211
313
|
ref: args.ref,
|
|
212
|
-
view,
|
|
213
314
|
detail: showDetail,
|
|
214
315
|
scope,
|
|
316
|
+
skipLogging,
|
|
215
317
|
eventSource: resolveUsageEventSource(),
|
|
216
318
|
});
|
|
217
319
|
output("show", result);
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* because there is one data store. Provider fan-out is gone.
|
|
9
9
|
*
|
|
10
10
|
* The orchestration here is thin: build the FTS query, optionally interleave
|
|
11
|
-
* a registry search behind `--
|
|
11
|
+
* a registry search behind `--from registry|all`, and log a usage event.
|
|
12
12
|
* Provider `search()` methods do not exist.
|
|
13
13
|
*/
|
|
14
14
|
import { getSources, loadConfig } from "../../core/config/config.js";
|
|
@@ -35,23 +35,31 @@ export async function akmSearch(input) {
|
|
|
35
35
|
const normalizedQuery = query.toLowerCase();
|
|
36
36
|
const searchType = input.type ?? "any";
|
|
37
37
|
const limit = normalizeLimit(input.limit);
|
|
38
|
-
const parsedSource = parseSearchSource(input.source ?? "
|
|
38
|
+
const parsedSource = parseSearchSource(input.source ?? "local");
|
|
39
39
|
const config = loadConfig();
|
|
40
|
-
// Named-source filter: when --
|
|
40
|
+
// Named-source filter: when --from is not a standard enum value, treat it
|
|
41
41
|
// as a named source (a `bundles` key). Validated early (before
|
|
42
42
|
// resolveSourceEntries, which can throw STASH_DIR_NOT_FOUND) so that a bad
|
|
43
|
-
// --
|
|
43
|
+
// --from name always produces INVALID_SOURCE_VALUE regardless of stash state.
|
|
44
44
|
let namedSourceName;
|
|
45
45
|
let source;
|
|
46
|
-
if (parsedSource !== "
|
|
46
|
+
if (parsedSource !== "local" && parsedSource !== "registry" && parsedSource !== "all") {
|
|
47
47
|
namedSourceName = parsedSource;
|
|
48
48
|
assertNamedSourceExists(config, namedSourceName);
|
|
49
|
-
source = "
|
|
49
|
+
source = "local";
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
52
52
|
source = parsedSource;
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
// A pure `--from registry` search needs no local stash at all (this is the
|
|
55
|
+
// one path folded in from the retired `akm registry search`, which never
|
|
56
|
+
// touched local source/stash resolution either) — only resolve local
|
|
57
|
+
// sources when local hits are actually needed, or a named source narrows
|
|
58
|
+
// to a local bundle. Without this, `resolveReadSources` (which can throw
|
|
59
|
+
// STASH_DIR_NOT_FOUND via `resolveStashDir()`) would make registry-only
|
|
60
|
+
// search fail on a machine with no stash ever configured.
|
|
61
|
+
const needsLocalSources = source !== "registry" || namedSourceName !== undefined;
|
|
62
|
+
let allSources = needsLocalSources ? resolveReadSources(undefined, config).sources : [];
|
|
55
63
|
// When a named source was requested, narrow the sources list to just that entry.
|
|
56
64
|
// `resolveSourceEntries` sets `registryId` to `entry.name` for each config source.
|
|
57
65
|
if (namedSourceName !== undefined) {
|
|
@@ -61,23 +69,24 @@ export async function akmSearch(input) {
|
|
|
61
69
|
// disk (resolveSourceEntries skips non-existent dirs). Fall through to the
|
|
62
70
|
// zero-sources guard below which emits a friendly warning.
|
|
63
71
|
}
|
|
64
|
-
if (allSources.length === 0) {
|
|
72
|
+
if (needsLocalSources && allSources.length === 0) {
|
|
65
73
|
// stashDir: "" is a safe sentinel here — the response carries zero hits
|
|
66
74
|
// and a warning, so no downstream code will try to use the empty path.
|
|
67
75
|
const response = {
|
|
68
76
|
schemaVersion: 1,
|
|
69
|
-
|
|
77
|
+
bundleDir: "",
|
|
70
78
|
source,
|
|
71
79
|
hits: [],
|
|
72
|
-
warnings: ["No
|
|
80
|
+
warnings: ["No bundles configured. Run `akm bundle create` to create your working bundle."],
|
|
73
81
|
timing: { totalMs: Date.now() - t0 },
|
|
74
82
|
};
|
|
75
83
|
maybeLogSearchEvent(input, query, response);
|
|
76
84
|
return response;
|
|
77
85
|
}
|
|
78
86
|
// Primary stash directory — used for DB path lookups and as the default
|
|
79
|
-
// stash root.
|
|
80
|
-
|
|
87
|
+
// stash root. Empty when a pure registry search skipped local resolution
|
|
88
|
+
// entirely (safe: registry-only responses never read `stashDir`).
|
|
89
|
+
const stashDir = allSources[0]?.path ?? "";
|
|
81
90
|
// Expose the filtered source list to downstream search calls.
|
|
82
91
|
const sources = allSources;
|
|
83
92
|
const filters = normalizeScopeFilters(input.filters);
|
|
@@ -95,7 +104,7 @@ export async function akmSearch(input) {
|
|
|
95
104
|
filters,
|
|
96
105
|
includeProposed,
|
|
97
106
|
beliefFilter: belief,
|
|
98
|
-
// When `--
|
|
107
|
+
// When `--from <name>` narrowed the source list above, propagate
|
|
99
108
|
// that intent down to the database layer so FTS/vector hits from
|
|
100
109
|
// sources outside the narrowed set are filtered out post-ranking.
|
|
101
110
|
// Without this, the index (which spans every configured source)
|
|
@@ -105,13 +114,15 @@ export async function akmSearch(input) {
|
|
|
105
114
|
disableProjectContext: input.disableProjectContext === true,
|
|
106
115
|
disableScopedUtility: input.disableScopedUtility === true,
|
|
107
116
|
});
|
|
108
|
-
const registryResult = source === "
|
|
109
|
-
|
|
117
|
+
const registryResult = source === "local"
|
|
118
|
+
? undefined
|
|
119
|
+
: await searchRegistry(query, { limit, includeAssets: input.assets === true, registries: config.registries });
|
|
120
|
+
if (source === "local") {
|
|
110
121
|
const localHits = localResult?.hits ?? [];
|
|
111
122
|
const hasResults = localHits.length > 0;
|
|
112
123
|
const response = {
|
|
113
124
|
schemaVersion: 1,
|
|
114
|
-
stashDir,
|
|
125
|
+
bundleDir: stashDir,
|
|
115
126
|
source,
|
|
116
127
|
hits: localHits,
|
|
117
128
|
tip: hasResults ? undefined : localResult?.tip,
|
|
@@ -122,18 +133,14 @@ export async function akmSearch(input) {
|
|
|
122
133
|
return response;
|
|
123
134
|
}
|
|
124
135
|
const registryHits = (registryResult?.hits ?? []).map((hit) => {
|
|
125
|
-
|
|
126
|
-
// prefixed), otherwise derive it from source + ref for backward compat.
|
|
127
|
-
const installRef = hit.installRef ??
|
|
128
|
-
(hit.source === "npm" ? `npm:${hit.ref}` : hit.source === "git" ? `git+${hit.ref}` : `github:${hit.ref}`);
|
|
129
|
-
// The legacy registry boolean `curated` was removed in v1 (spec §4.2).
|
|
136
|
+
const installRef = hit.installRef;
|
|
130
137
|
// Hit-level `warnings` are forwarded when the provider surfaced any.
|
|
131
138
|
return {
|
|
132
139
|
type: "registry",
|
|
133
140
|
name: hit.title,
|
|
134
141
|
id: hit.id,
|
|
135
142
|
description: hit.description,
|
|
136
|
-
action: `akm add ${installRef} -> then search again`,
|
|
143
|
+
action: `akm bundle add ${installRef} -> then search again`,
|
|
137
144
|
score: hit.score,
|
|
138
145
|
registryName: hit.registryName,
|
|
139
146
|
...(hit.warnings && hit.warnings.length > 0 ? { warnings: hit.warnings } : {}),
|
|
@@ -144,7 +151,7 @@ export async function akmSearch(input) {
|
|
|
144
151
|
const hasResults = slicedRegistryHits.length > 0;
|
|
145
152
|
const response = {
|
|
146
153
|
schemaVersion: 1,
|
|
147
|
-
stashDir,
|
|
154
|
+
bundleDir: stashDir,
|
|
148
155
|
source,
|
|
149
156
|
hits: [],
|
|
150
157
|
registryHits: slicedRegistryHits,
|
|
@@ -155,13 +162,13 @@ export async function akmSearch(input) {
|
|
|
155
162
|
maybeLogSearchEvent(input, query, response);
|
|
156
163
|
return response;
|
|
157
164
|
}
|
|
158
|
-
// source === "
|
|
165
|
+
// source === "all"
|
|
159
166
|
const allStashHits = (localResult?.hits ?? []).slice(0, limit);
|
|
160
167
|
const warnings = [...(localResult?.warnings ?? []), ...(registryResult?.warnings ?? [])];
|
|
161
168
|
const hasResults = allStashHits.length > 0 || registryHits.length > 0;
|
|
162
169
|
const response = {
|
|
163
170
|
schemaVersion: 1,
|
|
164
|
-
stashDir,
|
|
171
|
+
bundleDir: stashDir,
|
|
165
172
|
source,
|
|
166
173
|
hits: allStashHits,
|
|
167
174
|
registryHits,
|
|
@@ -209,7 +216,7 @@ function resolveEntryIds(db, hits) {
|
|
|
209
216
|
* - `stashHitCount`: number of local stash hits (response.hits, source-only
|
|
210
217
|
* entries). Always 0 for registry-only searches.
|
|
211
218
|
* - `registryHitCount`: number of registry hits (response.registryHits).
|
|
212
|
-
* Only non-zero when source is "registry" or "
|
|
219
|
+
* Only non-zero when source is "registry" or "all".
|
|
213
220
|
* - `resultCount`: total across both pools so telemetry reflects the actual
|
|
214
221
|
* number of results the user saw, regardless of source mode.
|
|
215
222
|
*
|
|
@@ -273,7 +280,7 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
|
|
|
273
280
|
if (resolvedIds.length > 0) {
|
|
274
281
|
let scopeKey;
|
|
275
282
|
try {
|
|
276
|
-
const stashPath = response.
|
|
283
|
+
const stashPath = response.bundleDir;
|
|
277
284
|
const disabled = disableScopedUtility || (stashPath && isTransientStashPath(stashPath));
|
|
278
285
|
scopeKey = disabled ? undefined : getCurrentWorkflowScopeKey();
|
|
279
286
|
}
|
|
@@ -291,7 +298,7 @@ function logSearchEvent(query, response, mode = "keyword", eventSource = "user",
|
|
|
291
298
|
}
|
|
292
299
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
293
300
|
/**
|
|
294
|
-
* Validate a named `--
|
|
301
|
+
* Validate a named `--from` against the bundle-derived source list (0.9.0
|
|
295
302
|
* spec §10.1: a named source is a `bundles` key, matched via its derived
|
|
296
303
|
* source entry's `name`, or an exact path). Throws INVALID_SOURCE_VALUE with
|
|
297
304
|
* the known names before any stash access can fail differently.
|
|
@@ -303,7 +310,7 @@ function assertNamedSourceExists(config, namedSourceName) {
|
|
|
303
310
|
const validNames = configSources.map((s) => s.name).filter((n) => Boolean(n));
|
|
304
311
|
const hint = validNames.length > 0
|
|
305
312
|
? `Known source names: ${validNames.join(", ")}`
|
|
306
|
-
: "No named sources are configured. Run `akm list` to see installed
|
|
313
|
+
: "No named sources are configured. Run `akm bundle list` to see installed bundles.";
|
|
307
314
|
throw new UsageError(`Unknown source name: "${namedSourceName}". ${hint}`, "INVALID_SOURCE_VALUE");
|
|
308
315
|
}
|
|
309
316
|
}
|
|
@@ -314,13 +321,12 @@ function normalizeLimit(limit) {
|
|
|
314
321
|
return Math.min(Math.floor(limit), 200);
|
|
315
322
|
}
|
|
316
323
|
/**
|
|
317
|
-
* Parse the `--
|
|
324
|
+
* Parse the `--from` flag value.
|
|
318
325
|
*
|
|
319
326
|
* Accepts:
|
|
320
|
-
* - `
|
|
327
|
+
* - `local` (default) — search the local stash index only
|
|
321
328
|
* - `registry` — search remote registries only
|
|
322
|
-
* - `
|
|
323
|
-
* - `local` — alias for `stash`
|
|
329
|
+
* - `all` — search local and registries
|
|
324
330
|
* - Any named source from `config.sources[].name` — filters stash results to
|
|
325
331
|
* that single source only. The named-source path is detected and resolved
|
|
326
332
|
* inside `akmSearch`; this function returns the raw name so the caller can
|
|
@@ -332,13 +338,21 @@ function normalizeLimit(limit) {
|
|
|
332
338
|
* at parse time.
|
|
333
339
|
*/
|
|
334
340
|
export function parseSearchSource(source) {
|
|
335
|
-
if (source === "
|
|
341
|
+
if (source === "local" || source === "registry" || source === "all")
|
|
336
342
|
return source;
|
|
337
|
-
// Accept "local" as alias for "stash"
|
|
338
|
-
if (source === "local")
|
|
339
|
-
return "stash";
|
|
340
343
|
if (typeof source === "undefined")
|
|
341
|
-
return "
|
|
344
|
+
return "local";
|
|
345
|
+
// 0.9.0 (S8): `--source stash`/`--source both` renamed to `--from
|
|
346
|
+
// local`/`--from all`. Reject the retired values explicitly — otherwise
|
|
347
|
+
// they fall through to the named-source lookup below and surface as a
|
|
348
|
+
// misleading "no source named stash/both" error instead of naming the
|
|
349
|
+
// rename.
|
|
350
|
+
if (source === "stash") {
|
|
351
|
+
throw new UsageError('"stash" was renamed to "local" in 0.9. Use `--from local` instead.', "INVALID_FLAG_VALUE");
|
|
352
|
+
}
|
|
353
|
+
if (source === "both") {
|
|
354
|
+
throw new UsageError('"both" was renamed to "all" in 0.9. Use `--from all` instead.', "INVALID_FLAG_VALUE");
|
|
355
|
+
}
|
|
342
356
|
// Pass through unknown strings — they may be valid named sources.
|
|
343
357
|
// `akmSearch` will validate against config.sources and throw a UsageError
|
|
344
358
|
// with a helpful message if the name isn't found.
|
|
@@ -369,11 +383,12 @@ function normalizeScopeFilters(raw) {
|
|
|
369
383
|
return Object.keys(out).length > 0 ? out : undefined;
|
|
370
384
|
}
|
|
371
385
|
/**
|
|
372
|
-
* Parse repeated `--filter k=v`
|
|
386
|
+
* Parse repeated `--filter k=v` argv tokens into a
|
|
373
387
|
* `StashEntryScope`. Throws a {@link UsageError} for malformed tokens
|
|
374
388
|
* (missing `=`, unknown key) so callers don't see ambiguous misses.
|
|
375
389
|
*
|
|
376
|
-
* Used by both `akm search --filter` and `akm show --
|
|
390
|
+
* Used by both `akm search --filter` and `akm show --filter` — the two
|
|
391
|
+
* commands share one spelling for the scope-narrowing axis.
|
|
377
392
|
*/
|
|
378
393
|
export function parseScopeFilterFlags(values, flagName = "--filter") {
|
|
379
394
|
if (values.length === 0)
|
|
@@ -398,11 +413,11 @@ export function parseScopeFilterFlags(values, flagName = "--filter") {
|
|
|
398
413
|
}
|
|
399
414
|
/**
|
|
400
415
|
* Returns true iff `entry.scope` (when present) satisfies every key in
|
|
401
|
-
* `filters`. A missing `entry.scope`
|
|
402
|
-
*
|
|
416
|
+
* `filters`. A missing `entry.scope` only matches when `filters` is empty or
|
|
417
|
+
* undefined.
|
|
403
418
|
*
|
|
404
419
|
* Filter semantics:
|
|
405
|
-
* - No filter passed → all entries match
|
|
420
|
+
* - No filter passed → all entries match.
|
|
406
421
|
* - `filters.user = "alice"` → entry must have `scope.user === "alice"`.
|
|
407
422
|
* - Multiple keys → AND-joined; every supplied key must match.
|
|
408
423
|
*/
|