akm-cli 0.9.0-rc.0 → 0.9.0-rc.13
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 +1283 -22
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -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 +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +232 -121
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -834
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/json-schema.js +142 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -34
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -56
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -279
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +11 -39
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -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 +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1164
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +3 -2
- package/dist/output/text.js +10 -19
- 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 +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- 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 +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +240 -19
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/schemas/akm-workflow.json +373 -0
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -259
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1413
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- 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/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
4
5
|
import { getStringArg } from "../../cli/parse-args.js";
|
|
5
6
|
import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
|
|
6
7
|
import { UsageError } from "../../core/errors.js";
|
|
7
8
|
import { appendEvent } from "../../core/events.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
9
|
+
import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
|
|
10
|
+
import { buildMemoryFrontmatter, parseDuration, readMemoryContent, runAutoHeuristics, runLlmEnrich } from "../remember.js";
|
|
11
|
+
import { assertFlatAssetName, inferAssetName, resolveSupersedesForWrite, resolveSupersedesWriteTarget, resolveXrefsForWrite, writeMarkdownAsset, } from "./knowledge.js";
|
|
10
12
|
import { akmSearch } from "./search.js";
|
|
11
13
|
// ── Helper: similar memory search ────────────────────────────────────────────
|
|
12
14
|
/**
|
|
13
15
|
* Best-effort top-3 similar memory search for `--show-similar`.
|
|
14
16
|
* Scoped to memory: type; excludes the just-written ref.
|
|
15
17
|
*/
|
|
16
|
-
async function fetchSimilarMemories(query, excludeRef) {
|
|
18
|
+
async function fetchSimilarMemories(query, excludeRef, eventSource) {
|
|
17
19
|
try {
|
|
18
|
-
const result = await akmSearch({
|
|
20
|
+
const result = await akmSearch({
|
|
21
|
+
query,
|
|
22
|
+
type: "memory",
|
|
23
|
+
limit: 4,
|
|
24
|
+
eventSource,
|
|
25
|
+
attributionProjection: "brief",
|
|
26
|
+
});
|
|
19
27
|
return (result.hits ?? [])
|
|
20
28
|
.filter((h) => "ref" in h && h.ref !== excludeRef)
|
|
21
29
|
.slice(0, 3)
|
|
@@ -25,11 +33,22 @@ async function fetchSimilarMemories(query, excludeRef) {
|
|
|
25
33
|
return [];
|
|
26
34
|
}
|
|
27
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* `--target` was renamed to `--bundle` on `remember` in 0.9 (S8). citty is
|
|
38
|
+
* non-strict, so the retired spelling is silently absorbed rather than
|
|
39
|
+
* rejected — the memory then lands in the default bundle instead of the one
|
|
40
|
+
* the caller named, with exit 0 and no error. Reject it explicitly instead.
|
|
41
|
+
*/
|
|
42
|
+
function rejectRetiredTargetFlag() {
|
|
43
|
+
if (!getParsedInvocation().hasFlag("--target"))
|
|
44
|
+
return;
|
|
45
|
+
throw new UsageError("`akm remember --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
|
|
46
|
+
}
|
|
28
47
|
// ── Command definition ────────────────────────────────────────────────────────
|
|
29
48
|
export const rememberCommand = defineJsonCommand({
|
|
30
49
|
meta: {
|
|
31
50
|
name: "remember",
|
|
32
|
-
description: "Record a memory in the default
|
|
51
|
+
description: "Record a memory in the default bundle",
|
|
33
52
|
},
|
|
34
53
|
args: {
|
|
35
54
|
content: {
|
|
@@ -66,6 +85,14 @@ export const rememberCommand = defineJsonCommand({
|
|
|
66
85
|
type: "string",
|
|
67
86
|
description: "Source reference (URL, asset ref, file path, or any free-form string)",
|
|
68
87
|
},
|
|
88
|
+
xref: {
|
|
89
|
+
type: "string",
|
|
90
|
+
description: "Cross-reference ref recorded in the memory's `xrefs:` frontmatter (repeatable: --xref knowledge/auth-flow --xref memories/vpn-note). Each ref must resolve in the write target or a configured source; an unresolvable ref aborts the write.",
|
|
91
|
+
},
|
|
92
|
+
supersedes: {
|
|
93
|
+
type: "string",
|
|
94
|
+
description: "Ref of an existing asset this memory corrects (repeatable: --supersedes memories/projectA/old-note). Writes the correction with an xref to the old asset AND demotes the old asset (`beliefState: superseded` + `supersededBy`, a metadata-only edit) so ranking prefers the correction and `--belief current` hides the stale version. An unresolvable or self-referencing ref aborts the write; a ref outside the write target and working bundle still writes the correction but skips the demotion (reported as applied: false).",
|
|
95
|
+
},
|
|
69
96
|
auto: {
|
|
70
97
|
type: "boolean",
|
|
71
98
|
description: "Apply heuristic tagging (code, subjective, source, observed_at) from the body",
|
|
@@ -76,9 +103,9 @@ export const rememberCommand = defineJsonCommand({
|
|
|
76
103
|
description: "Call the configured LLM to propose tags and description (requires LLM config)",
|
|
77
104
|
default: false,
|
|
78
105
|
},
|
|
79
|
-
|
|
106
|
+
bundle: {
|
|
80
107
|
type: "string",
|
|
81
|
-
description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working
|
|
108
|
+
description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working bundle.",
|
|
82
109
|
},
|
|
83
110
|
user: {
|
|
84
111
|
type: "string",
|
|
@@ -96,19 +123,50 @@ export const rememberCommand = defineJsonCommand({
|
|
|
96
123
|
type: "string",
|
|
97
124
|
description: "Scope this memory to a channel name (persisted as `scope_channel` frontmatter)",
|
|
98
125
|
},
|
|
99
|
-
|
|
126
|
+
"show-similar": {
|
|
100
127
|
type: "boolean",
|
|
101
|
-
|
|
128
|
+
// R-062: canonical spelling is kebab-case, matching every other
|
|
129
|
+
// multi-word flag in the CLI (--fail-on-flagged, --auto-fix, …).
|
|
130
|
+
// `--showSimilar` (the pre-rename spelling) is kept as an explicit,
|
|
131
|
+
// documented alias rather than a silent citty auto-alias — citty
|
|
132
|
+
// registers BOTH the camelCase and kebab-case spelling of any
|
|
133
|
+
// declared flag name automatically, so this is a rename, not a
|
|
134
|
+
// breaking change: both spellings already worked, and both keep
|
|
135
|
+
// working.
|
|
136
|
+
alias: "showSimilar",
|
|
137
|
+
description: "Return top-3 similar existing memories in output (opt-in). Alias: --showSimilar.",
|
|
102
138
|
},
|
|
103
139
|
},
|
|
104
140
|
async run({ args }) {
|
|
105
|
-
|
|
141
|
+
rejectRetiredTargetFlag();
|
|
142
|
+
const body = readMemoryContent(args.content);
|
|
143
|
+
const eventSource = resolveUsageEventSource();
|
|
106
144
|
// `--name` is a flat name; subdirectory placement is `--path`'s job.
|
|
107
145
|
assertFlatAssetName(args.name);
|
|
108
146
|
// Determine if the user has requested any structured metadata mode.
|
|
109
147
|
// Collect all --tag occurrences directly from process.argv because citty
|
|
110
148
|
// only exposes the last value for repeated string flags.
|
|
111
149
|
const rawTags = parseAllFlagValues("--tag");
|
|
150
|
+
// Collect and validate --xref occurrences (repeatable, same argv pattern
|
|
151
|
+
// as --tag). Validation happens BEFORE any write: an unresolvable ref is
|
|
152
|
+
// input validation (UsageError → exit 2) and must leave the stash
|
|
153
|
+
// untouched. Refs resolvable only in a configured extra stash source are
|
|
154
|
+
// accepted (cross-stash provenance).
|
|
155
|
+
const rawSupersedes = parseAllFlagValues("--supersedes");
|
|
156
|
+
const writeTarget = resolveSupersedesWriteTarget(rawSupersedes, args.bundle);
|
|
157
|
+
const xrefs = resolveXrefsForWrite(parseAllFlagValues("--xref"), writeTarget);
|
|
158
|
+
// Collect and validate --supersedes occurrences (repeatable). Same
|
|
159
|
+
// before-any-write validation contract: an unresolvable ref exits 2 with
|
|
160
|
+
// nothing written AND nothing demoted (no partial correction). The
|
|
161
|
+
// superseded refs fold into the new memory's xrefs automatically
|
|
162
|
+
// (correction provenance per the back-linking conventions); the demotion
|
|
163
|
+
// itself runs inside writeMarkdownAsset, ordered before the git boundary
|
|
164
|
+
// commit.
|
|
165
|
+
const supersedes = resolveSupersedesForWrite(rawSupersedes, writeTarget);
|
|
166
|
+
for (const s of supersedes) {
|
|
167
|
+
if (!xrefs.includes(s.ref))
|
|
168
|
+
xrefs.push(s.ref);
|
|
169
|
+
}
|
|
112
170
|
// Collect scope flags. Scope alone counts as structured metadata so we
|
|
113
171
|
// emit frontmatter, but it does NOT trigger the "tags required" check —
|
|
114
172
|
// memory + scope (no tags) is a valid combination for multi-tenant use.
|
|
@@ -120,7 +178,10 @@ export const rememberCommand = defineJsonCommand({
|
|
|
120
178
|
}
|
|
121
179
|
const hasScope = Object.keys(scopeFields).length > 0;
|
|
122
180
|
const hasTagRequiringArgs = rawTags.length > 0 || !!args.expires || !!args.source || !!args.description;
|
|
123
|
-
|
|
181
|
+
// --xref counts as structured metadata (it must land in frontmatter) but,
|
|
182
|
+
// like scope, does NOT trigger the tags-required check — provenance
|
|
183
|
+
// without tags is a valid write.
|
|
184
|
+
const hasStructuredArgs = hasTagRequiringArgs || hasScope || args.auto || xrefs.length > 0;
|
|
124
185
|
if (!hasStructuredArgs) {
|
|
125
186
|
// Phase 1B / Rec 7: even the zero-flag hot-path emits
|
|
126
187
|
// `captureMode: hot` + `beliefState: asserted` so user-supplied
|
|
@@ -139,8 +200,9 @@ export const rememberCommand = defineJsonCommand({
|
|
|
139
200
|
fallbackPrefix: "memory",
|
|
140
201
|
preferredName: inferAssetName(body, "memory"),
|
|
141
202
|
force: args.force,
|
|
142
|
-
target:
|
|
203
|
+
target: writeTarget,
|
|
143
204
|
path: args.path,
|
|
205
|
+
supersedes,
|
|
144
206
|
});
|
|
145
207
|
appendEvent({
|
|
146
208
|
eventType: "remember",
|
|
@@ -148,7 +210,7 @@ export const rememberCommand = defineJsonCommand({
|
|
|
148
210
|
metadata: { path: result.path, force: args.force === true },
|
|
149
211
|
});
|
|
150
212
|
if (args.showSimilar) {
|
|
151
|
-
const similar = await fetchSimilarMemories(body.slice(0, 500), result.ref);
|
|
213
|
+
const similar = await fetchSimilarMemories(body.slice(0, 500), result.ref, eventSource);
|
|
152
214
|
output("remember", { ok: true, ...result, similar });
|
|
153
215
|
}
|
|
154
216
|
else {
|
|
@@ -220,6 +282,7 @@ export const rememberCommand = defineJsonCommand({
|
|
|
220
282
|
description,
|
|
221
283
|
tags,
|
|
222
284
|
source,
|
|
285
|
+
xrefs,
|
|
223
286
|
observed_at,
|
|
224
287
|
expires,
|
|
225
288
|
subjective,
|
|
@@ -228,14 +291,20 @@ export const rememberCommand = defineJsonCommand({
|
|
|
228
291
|
...(hasScope ? { scope: scopeFields } : {}),
|
|
229
292
|
});
|
|
230
293
|
const contentWithFrontmatter = `${frontmatterBlock}\n${body}`;
|
|
294
|
+
// Derive the asset slug from the body, exactly like the hot path above:
|
|
295
|
+
// `contentWithFrontmatter` starts with the `---` fence, which
|
|
296
|
+
// inferAssetName would slugify to "" and fall back to a random
|
|
297
|
+
// memory-<epoch>-<rand> name.
|
|
231
298
|
const result = await writeMarkdownAsset({
|
|
232
299
|
type: "memory",
|
|
233
300
|
content: contentWithFrontmatter,
|
|
234
301
|
name: args.name,
|
|
235
302
|
fallbackPrefix: "memory",
|
|
303
|
+
preferredName: inferAssetName(body, "memory"),
|
|
236
304
|
force: args.force,
|
|
237
|
-
target:
|
|
305
|
+
target: writeTarget,
|
|
238
306
|
path: args.path,
|
|
307
|
+
supersedes,
|
|
239
308
|
});
|
|
240
309
|
appendEvent({
|
|
241
310
|
eventType: "remember",
|
|
@@ -250,7 +319,7 @@ export const rememberCommand = defineJsonCommand({
|
|
|
250
319
|
},
|
|
251
320
|
});
|
|
252
321
|
if (args.showSimilar) {
|
|
253
|
-
const similar = await fetchSimilarMemories((body ?? args.content ?? "").slice(0, 500), result.ref);
|
|
322
|
+
const similar = await fetchSimilarMemories((body ?? args.content ?? "").slice(0, 500), result.ref, eventSource);
|
|
254
323
|
output("remember", { ok: true, ...result, similar });
|
|
255
324
|
}
|
|
256
325
|
else {
|
|
@@ -6,51 +6,62 @@
|
|
|
6
6
|
* from src/cli.ts (WS6) so the God Module shrinks; the `main.subCommands.search`,
|
|
7
7
|
* `.curate`, and `.show` keys and every command's args/output shape are
|
|
8
8
|
* byte-identical. The three commands form a clean cluster: they share the
|
|
9
|
-
*
|
|
9
|
+
* usage-event provenance and the `parseScopeFilterFlags`
|
|
10
10
|
* search-source parsers. Handlers whose body is a plain
|
|
11
11
|
* `runWithJsonErrors(async () => { … })` are migrated to `defineJsonCommand`,
|
|
12
12
|
* which emits the same JSON envelope (stdout/stderr/exit-code) as the inline
|
|
13
13
|
* form.
|
|
14
14
|
*/
|
|
15
|
+
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
15
16
|
import { parsePositiveIntFlag } from "../../cli/parse-args.js";
|
|
16
17
|
import { defineJsonCommand, output, parseAllFlagValues } from "../../cli/shared.js";
|
|
17
|
-
import {
|
|
18
|
+
import { parseBundleRef } from "../../core/asset/asset-ref.js";
|
|
18
19
|
import { parseMetaRef } from "../../core/asset/stash-meta.js";
|
|
19
20
|
import { UsageError } from "../../core/errors.js";
|
|
20
|
-
import {
|
|
21
|
+
import { resolveUsageEventSource } from "../../indexer/usage/usage-events.js";
|
|
22
|
+
import { getOutputMode } from "../../output/context.js";
|
|
21
23
|
import { akmCurate } from "./curate.js";
|
|
22
24
|
import { akmSearch, parseBeliefFilterMode, parseScopeFilterFlags, parseSearchSource } from "./search.js";
|
|
23
25
|
import { akmShowUnified } from "./show.js";
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return undefined;
|
|
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");
|
|
36
37
|
}
|
|
37
38
|
export const searchCommand = defineJsonCommand({
|
|
38
|
-
meta: { name: "search", description: "Search the
|
|
39
|
+
meta: { name: "search", description: "Search the bundle" },
|
|
39
40
|
args: {
|
|
40
|
-
query: {
|
|
41
|
+
query: {
|
|
42
|
+
type: "positional",
|
|
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.',
|
|
44
|
+
required: false,
|
|
45
|
+
default: "",
|
|
46
|
+
},
|
|
41
47
|
type: {
|
|
42
48
|
type: "string",
|
|
43
|
-
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.",
|
|
44
50
|
},
|
|
45
51
|
limit: { type: "string", description: "Maximum number of results" },
|
|
46
|
-
|
|
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
|
+
},
|
|
47
58
|
filter: {
|
|
48
59
|
type: "string",
|
|
49
60
|
description: "Scope filter (repeatable): --filter user=<id> --filter agent=<id> --filter run=<id> --filter channel=<name>. Narrows results without changing ranking.",
|
|
50
61
|
},
|
|
51
62
|
"include-proposed": {
|
|
52
63
|
type: "boolean",
|
|
53
|
-
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.',
|
|
54
65
|
default: false,
|
|
55
66
|
},
|
|
56
67
|
belief: {
|
|
@@ -58,35 +69,55 @@ export const searchCommand = defineJsonCommand({
|
|
|
58
69
|
description: "Memory belief filter: all|current|historical. current keeps active memory beliefs; historical keeps contradicted/superseded/archived memory beliefs.",
|
|
59
70
|
default: "all",
|
|
60
71
|
},
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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": {
|
|
64
81
|
type: "boolean",
|
|
65
|
-
|
|
66
|
-
|
|
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.",
|
|
67
87
|
},
|
|
68
88
|
"include-sessions": {
|
|
69
89
|
type: "boolean",
|
|
70
90
|
description: "Include session assets (excluded from default search results via config.search.defaultExcludeTypes).",
|
|
71
91
|
default: false,
|
|
72
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
|
+
},
|
|
73
103
|
},
|
|
74
104
|
async run({ args }) {
|
|
105
|
+
rejectRetiredSourceFlag();
|
|
75
106
|
const query = (args.query ?? "").trim();
|
|
76
|
-
if (!query) {
|
|
77
|
-
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`.');
|
|
78
|
-
}
|
|
79
107
|
const type = args.type;
|
|
80
108
|
const limit = parsePositiveIntFlag(args.limit ?? undefined);
|
|
81
|
-
const source = parseSearchSource(args.
|
|
109
|
+
const source = parseSearchSource(args.from);
|
|
82
110
|
// Repeatable; citty exposes only the last `--filter` value, so read all
|
|
83
111
|
// occurrences directly from argv (same pattern as `--tag`).
|
|
84
112
|
const filterTokens = parseAllFlagValues("--filter");
|
|
85
113
|
const filters = parseScopeFilterFlags(filterTokens, "--filter");
|
|
86
114
|
const includeProposed = args["include-proposed"] === true;
|
|
87
115
|
const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
|
|
88
|
-
const
|
|
116
|
+
const disableProjectContext = args["project-context"] === false;
|
|
117
|
+
const skipLogging = args["track-usage"] === false;
|
|
89
118
|
const includeSessions = args["include-sessions"];
|
|
119
|
+
const assets = args.assets === true;
|
|
120
|
+
const outputMode = getOutputMode();
|
|
90
121
|
const result = await akmSearch({
|
|
91
122
|
query,
|
|
92
123
|
type,
|
|
@@ -96,15 +127,21 @@ export const searchCommand = defineJsonCommand({
|
|
|
96
127
|
includeProposed,
|
|
97
128
|
belief,
|
|
98
129
|
includeSessions,
|
|
99
|
-
disableProjectContext
|
|
100
|
-
disableScopedUtility:
|
|
101
|
-
|
|
130
|
+
disableProjectContext,
|
|
131
|
+
disableScopedUtility: disableProjectContext,
|
|
132
|
+
skipLogging,
|
|
133
|
+
assets,
|
|
134
|
+
eventSource: resolveUsageEventSource(),
|
|
135
|
+
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
102
136
|
});
|
|
103
137
|
output("search", result);
|
|
104
138
|
},
|
|
105
139
|
});
|
|
106
140
|
export const curateCommand = defineJsonCommand({
|
|
107
|
-
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
|
+
},
|
|
108
145
|
args: {
|
|
109
146
|
// Optional in citty so run() is invoked when omitted; we re-validate
|
|
110
147
|
// below to surface a structured UsageError (exit 2) instead of citty's
|
|
@@ -112,102 +149,172 @@ export const curateCommand = defineJsonCommand({
|
|
|
112
149
|
query: { type: "positional", description: "Task or prompt to curate assets for", required: false },
|
|
113
150
|
type: {
|
|
114
151
|
type: "string",
|
|
115
|
-
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.",
|
|
116
153
|
},
|
|
117
154
|
limit: { type: "string", description: "Maximum number of curated results", default: "4" },
|
|
118
|
-
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
+
},
|
|
125
166
|
},
|
|
126
167
|
async run({ args }) {
|
|
168
|
+
rejectRetiredSourceFlag();
|
|
127
169
|
if (!args.query || !String(args.query).trim()) {
|
|
128
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"`.');
|
|
129
171
|
}
|
|
130
172
|
const type = args.type;
|
|
131
173
|
const limitParsed = parsePositiveIntFlag(args.limit ?? undefined);
|
|
132
174
|
const limit = limitParsed && limitParsed > 0 ? limitParsed : 4;
|
|
133
|
-
const source = parseSearchSource(args.
|
|
134
|
-
const
|
|
175
|
+
const source = parseSearchSource(args.from ?? "local");
|
|
176
|
+
const skipLogging = args["track-usage"] === false;
|
|
177
|
+
const outputMode = getOutputMode();
|
|
178
|
+
const curated = await akmCurate({
|
|
179
|
+
query: args.query,
|
|
180
|
+
type,
|
|
181
|
+
limit,
|
|
182
|
+
source,
|
|
183
|
+
skipLogging,
|
|
184
|
+
eventSource: resolveUsageEventSource(),
|
|
185
|
+
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
186
|
+
});
|
|
135
187
|
output("curate", curated);
|
|
136
188
|
},
|
|
137
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
|
+
}
|
|
138
248
|
export const showCommand = defineJsonCommand({
|
|
139
249
|
meta: {
|
|
140
250
|
name: "show",
|
|
141
|
-
description: "Show a
|
|
251
|
+
description: "Show a bundle asset by ref (e.g. akm show knowledge/guide.md, akm show knowledge/guide.md#auth)",
|
|
142
252
|
},
|
|
143
253
|
args: {
|
|
144
254
|
ref: {
|
|
145
255
|
type: "positional",
|
|
146
|
-
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`.",
|
|
147
257
|
required: true,
|
|
148
258
|
},
|
|
149
|
-
|
|
150
|
-
detail: { type: "string", description: "Detail level (brief|normal|full)" },
|
|
151
|
-
shape: { type: "string", description: "Output projection (human|agent|summary)" },
|
|
152
|
-
scope: {
|
|
259
|
+
filter: {
|
|
153
260
|
type: "string",
|
|
154
|
-
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.",
|
|
155
272
|
},
|
|
156
273
|
},
|
|
157
274
|
async run({ args }) {
|
|
158
275
|
// `[origin//]meta[:name]` targets the stash `.meta/` convention, which is
|
|
159
276
|
// not a typed asset ref — skip ref validation and let akmShowUnified
|
|
160
|
-
// direct-read it. (
|
|
277
|
+
// direct-read it. (the ref parser would reject the non-type `meta`.)
|
|
161
278
|
if (!parseMetaRef(args.ref))
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// directly via `parseFlagValue` so the flags don't surface as user-facing
|
|
167
|
-
// options in `akm show --help`.
|
|
168
|
-
const akmView = parseFlagValue(process.argv, "--akmView");
|
|
169
|
-
const akmHeading = parseFlagValue(process.argv, "--akmHeading");
|
|
170
|
-
const akmStart = parseFlagValue(process.argv, "--akmStart");
|
|
171
|
-
const akmEnd = parseFlagValue(process.argv, "--akmEnd");
|
|
172
|
-
let view;
|
|
173
|
-
if (akmView) {
|
|
174
|
-
switch (akmView) {
|
|
175
|
-
case "section":
|
|
176
|
-
view = { mode: "section", heading: akmHeading ?? "" };
|
|
177
|
-
break;
|
|
178
|
-
case "lines":
|
|
179
|
-
view = {
|
|
180
|
-
mode: "lines",
|
|
181
|
-
start: Number(akmStart ?? "1"),
|
|
182
|
-
end: akmEnd ? parseInt(akmEnd, 10) : Number.MAX_SAFE_INTEGER,
|
|
183
|
-
};
|
|
184
|
-
break;
|
|
185
|
-
case "toc":
|
|
186
|
-
case "frontmatter":
|
|
187
|
-
case "full":
|
|
188
|
-
view = { mode: akmView };
|
|
189
|
-
break;
|
|
190
|
-
default:
|
|
191
|
-
throw new UsageError(`Unknown view mode: ${akmView}. Expected one of: full|toc|frontmatter|section|lines`);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
279
|
+
parseBundleRef(args.ref);
|
|
280
|
+
rejectRemovedScopeFlag(args.ref);
|
|
281
|
+
rejectExtraShowPositionals(args._, args.ref);
|
|
282
|
+
const invocation = getParsedInvocation();
|
|
194
283
|
const cliShape = getOutputMode().shape;
|
|
195
|
-
|
|
196
|
-
//
|
|
197
|
-
// (
|
|
198
|
-
//
|
|
199
|
-
//
|
|
200
|
-
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
|
|
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.
|
|
296
|
+
const explicitDetail = invocation.getFlagValue("--detail");
|
|
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;
|
|
205
312
|
const result = await akmShowUnified({
|
|
206
313
|
ref: args.ref,
|
|
207
|
-
view,
|
|
208
314
|
detail: showDetail,
|
|
209
315
|
scope,
|
|
210
|
-
|
|
316
|
+
skipLogging,
|
|
317
|
+
eventSource: resolveUsageEventSource(),
|
|
211
318
|
});
|
|
212
319
|
output("show", result);
|
|
213
320
|
},
|