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
|
@@ -2,117 +2,44 @@
|
|
|
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
4
|
/**
|
|
5
|
-
* Source-management CLI commands — `akm
|
|
5
|
+
* Source-management CLI commands — `akm upgrade/sync/clone`.
|
|
6
6
|
*
|
|
7
7
|
* Extracted verbatim from src/cli.ts (WS6). Each `main.subCommands.<key>`
|
|
8
8
|
* registration line stays byte-identical; the args/output shape of every
|
|
9
|
-
* subcommand is unchanged. The
|
|
10
|
-
*
|
|
11
|
-
* `wasFormatValueConsumedAsName` citty-mis-parse workaround are used ONLY by
|
|
12
|
-
* this cluster, so they move with it.
|
|
9
|
+
* subcommand is unchanged. The `runSyncBody` git-commit/push body is used
|
|
10
|
+
* ONLY by this cluster, so it moves with it.
|
|
13
11
|
*
|
|
14
12
|
* Leaf handlers whose body is a plain `runWithJsonErrors(async () => { … })`
|
|
15
13
|
* are migrated to `defineJsonCommand`, which emits the same JSON envelope
|
|
16
14
|
* (stdout/stderr/exit-code) as the inline form. `sync` keeps `defineCommand`
|
|
17
15
|
* because its `run` delegates to `runSyncBody` (which owns the
|
|
18
16
|
* `runWithJsonErrors` wrapper) rather than wrapping inline.
|
|
17
|
+
*
|
|
18
|
+
* 0.9.0 CLI overhaul (S3): top-level `history` was dropped; its
|
|
19
|
+
* `--accept-rate-by-source` metric was folded into `akm health --report`
|
|
20
|
+
* (src/commands/health/accept-rate.ts).
|
|
21
|
+
*
|
|
22
|
+
* 0.9 CLI overhaul (S7): `list`/`remove`/`update` moved out of this cluster
|
|
23
|
+
* into the new `akm bundle` group (src/commands/sources/bundle-cli.ts) — no
|
|
24
|
+
* top-level `list`/`remove`/`update` remains. Root `sync` and this file's
|
|
25
|
+
* `clone`/`upgrade` stay top-level (the shipped `core/sync.yml` task calls
|
|
26
|
+
* `akm sync` directly).
|
|
19
27
|
*/
|
|
20
28
|
import { defineCommand } from "citty";
|
|
21
29
|
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
22
|
-
import { defineJsonCommand, output, runWithJsonErrors } from "../../cli/shared.js";
|
|
30
|
+
import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, runWithJsonErrors } from "../../cli/shared.js";
|
|
23
31
|
import { loadConfig } from "../../core/config/config.js";
|
|
24
32
|
import { UsageError } from "../../core/errors.js";
|
|
25
33
|
import { appendEvent } from "../../core/events.js";
|
|
26
|
-
import { resolveSourceEntries } from "../../indexer/search/search-source.js";
|
|
27
34
|
import { resolveWritableOverride, saveGitStash } from "../../sources/providers/git.js";
|
|
28
35
|
import { pkgVersion } from "../../version.js";
|
|
29
|
-
import { akmHistory } from "./history.js";
|
|
30
|
-
import { akmListSources, akmRemove, akmUpdate } from "./installed-stashes.js";
|
|
31
36
|
import { checkForUpdate, performUpgrade } from "./self-update.js";
|
|
32
37
|
import { akmClone } from "./source-clone.js";
|
|
33
|
-
const VALID_SOURCE_KINDS = new Set(["local", "managed", "remote"]);
|
|
34
|
-
function parseKindFilter(raw) {
|
|
35
|
-
if (!raw)
|
|
36
|
-
return undefined;
|
|
37
|
-
const kinds = raw.split(",").map((s) => s.trim());
|
|
38
|
-
for (const k of kinds) {
|
|
39
|
-
if (!VALID_SOURCE_KINDS.has(k)) {
|
|
40
|
-
throw new UsageError(`Invalid --kind value: "${k}". Expected one of: local, managed, remote`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return kinds;
|
|
44
|
-
}
|
|
45
|
-
export const listCommand = defineJsonCommand({
|
|
46
|
-
meta: { name: "list", description: "List all sources (local directories, managed packages, remote providers)" },
|
|
47
|
-
args: {
|
|
48
|
-
kind: { type: "string", description: "Filter by source kind (local, managed, remote). Comma-separated." },
|
|
49
|
-
},
|
|
50
|
-
async run({ args }) {
|
|
51
|
-
const kind = parseKindFilter(args.kind);
|
|
52
|
-
const result = await akmListSources({ kind });
|
|
53
|
-
output("list", result);
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
export const removeCommand = defineJsonCommand({
|
|
57
|
-
meta: { name: "remove", description: "Remove a source by id, ref, path, URL, or name" },
|
|
58
|
-
args: {
|
|
59
|
-
target: { type: "positional", description: "Source to remove (id, ref, path, URL, or name)", required: true },
|
|
60
|
-
yes: { type: "boolean", alias: "y", description: "Skip confirmation prompt", default: false },
|
|
61
|
-
},
|
|
62
|
-
async run({ args }) {
|
|
63
|
-
const { confirmDestructive } = await import("../../cli/confirm.js");
|
|
64
|
-
const confirmed = await confirmDestructive(`Remove source "${args.target}"? This cannot be undone.`, {
|
|
65
|
-
yes: args.yes === true,
|
|
66
|
-
});
|
|
67
|
-
if (!confirmed) {
|
|
68
|
-
process.stderr.write("Aborted.\n");
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const result = await akmRemove({ target: args.target });
|
|
72
|
-
appendEvent({
|
|
73
|
-
eventType: "remove",
|
|
74
|
-
metadata: {
|
|
75
|
-
target: args.target,
|
|
76
|
-
ref: typeof result.removed?.ref === "string" ? result.removed.ref : null,
|
|
77
|
-
id: typeof result.removed?.id === "string" ? result.removed.id : null,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
output("remove", result);
|
|
81
|
-
},
|
|
82
|
-
});
|
|
83
|
-
export const updateCommand = defineJsonCommand({
|
|
84
|
-
meta: { name: "update", description: "Update one or all managed sources" },
|
|
85
|
-
args: {
|
|
86
|
-
target: { type: "positional", description: "Source to update (id or ref)", required: false },
|
|
87
|
-
all: { type: "boolean", description: "Update all installed entries", default: false },
|
|
88
|
-
force: { type: "boolean", description: "Force fresh download even if version is unchanged", default: false },
|
|
89
|
-
},
|
|
90
|
-
async run({ args }) {
|
|
91
|
-
const result = await akmUpdate({ target: args.target, all: args.all, force: args.force });
|
|
92
|
-
appendEvent({
|
|
93
|
-
eventType: "update",
|
|
94
|
-
metadata: {
|
|
95
|
-
target: args.target ?? null,
|
|
96
|
-
all: args.all === true,
|
|
97
|
-
force: args.force === true,
|
|
98
|
-
processed: Array.isArray(result.processed)
|
|
99
|
-
? result.processed.length
|
|
100
|
-
: 0,
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
output("update", result);
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
38
|
export const upgradeCommand = defineJsonCommand({
|
|
107
39
|
meta: { name: "upgrade", description: "Upgrade akm to the latest release" },
|
|
108
40
|
args: {
|
|
109
41
|
check: { type: "boolean", description: "Check for updates without installing", default: false },
|
|
110
42
|
force: { type: "boolean", description: "Force upgrade even if on latest", default: false },
|
|
111
|
-
"skip-checksum": {
|
|
112
|
-
type: "boolean",
|
|
113
|
-
description: "Skip checksum verification (not recommended)",
|
|
114
|
-
default: false,
|
|
115
|
-
},
|
|
116
43
|
"skip-post-upgrade": {
|
|
117
44
|
type: "boolean",
|
|
118
45
|
description: "Skip the post-upgrade index rebuild (migration preflight and apply still run)",
|
|
@@ -129,57 +56,57 @@ export const upgradeCommand = defineJsonCommand({
|
|
|
129
56
|
output("upgrade", check);
|
|
130
57
|
return;
|
|
131
58
|
}
|
|
132
|
-
const skipChecksum = args["skip-checksum"];
|
|
133
59
|
const skipPostUpgrade = args["skip-post-upgrade"];
|
|
134
60
|
const migrationConfig = args["migration-config"];
|
|
135
|
-
const result = await performUpgrade(check, { force: args.force,
|
|
61
|
+
const result = await performUpgrade(check, { force: args.force, skipPostUpgrade, migrationConfig });
|
|
136
62
|
output("upgrade", result);
|
|
137
63
|
},
|
|
138
64
|
});
|
|
139
|
-
// `sync` body
|
|
140
|
-
|
|
141
|
-
async function runSyncBody(args, verb) {
|
|
65
|
+
// `sync` body, standalone so the git-commit/push logic stays in one place.
|
|
66
|
+
async function runSyncBody(args) {
|
|
142
67
|
await runWithJsonErrors(async () => {
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
// before any standalone occurrence of the same value in the sync
|
|
148
|
-
// subcommand's argv slice. This preserves legitimate invocations
|
|
149
|
-
// like `akm sync json --format json`.
|
|
150
|
-
const parsedFormat = getParsedInvocation().getFlagValue("--format");
|
|
151
|
-
const effectiveName = args.name !== undefined &&
|
|
152
|
-
parsedFormat !== undefined &&
|
|
153
|
-
args.name === parsedFormat &&
|
|
154
|
-
wasFormatValueConsumedAsName(args.name, parsedFormat, verb)
|
|
155
|
-
? undefined
|
|
156
|
-
: args.name;
|
|
68
|
+
// The optional `name` positional is safe to trust: the global output flags
|
|
69
|
+
// are declared on the command (GLOBAL_OUTPUT_ARGS), so `akm sync --format
|
|
70
|
+
// json` parses `json` as the flag's value, never as a stash name.
|
|
71
|
+
const effectiveName = args.name;
|
|
157
72
|
let writable;
|
|
158
73
|
if (effectiveName === undefined) {
|
|
159
|
-
// Primary stash — honour the
|
|
74
|
+
// Primary stash — honour the configured default bundle's writable flag.
|
|
160
75
|
writable = resolveWritableOverride(loadConfig());
|
|
161
76
|
}
|
|
162
77
|
const result = saveGitStash(effectiveName, args.message, writable, { push: args.push !== false });
|
|
78
|
+
// 0.9.0 breaking change: both "save" holdovers from the command's
|
|
79
|
+
// pre-rename name are now "sync" — the persisted eventType below and the
|
|
80
|
+
// envelope shape emitted at the end of this function. Historical state.db
|
|
81
|
+
// rows still carry "save" — `readEvents`/`tailEvents` (src/core/events.ts)
|
|
82
|
+
// treat "save" and "sync" as synonyms on READ so `akm log --type save`
|
|
83
|
+
// keeps returning both old and new rows. Only the WRITE side changes here.
|
|
84
|
+
// The envelope shape needs no such synonym: it is per-invocation, never
|
|
85
|
+
// persisted, so nothing can be holding an old value.
|
|
163
86
|
appendEvent({
|
|
164
|
-
eventType: "
|
|
87
|
+
eventType: "sync",
|
|
165
88
|
metadata: {
|
|
166
89
|
name: effectiveName ?? null,
|
|
167
90
|
message: args.message ?? null,
|
|
168
91
|
ok: result.ok !== false,
|
|
169
92
|
},
|
|
170
93
|
});
|
|
171
|
-
output("
|
|
94
|
+
output("sync", result);
|
|
172
95
|
});
|
|
173
96
|
}
|
|
174
97
|
export const syncCommand = defineCommand({
|
|
175
98
|
meta: {
|
|
176
99
|
name: "sync",
|
|
177
|
-
description: "Sync changes in a git-backed
|
|
100
|
+
description: "Sync changes in a git-backed bundle: commits (and pushes when writable + remote is configured). No-op for non-git bundles.",
|
|
178
101
|
},
|
|
102
|
+
// Raw defineCommand (not defineJsonCommand), so the global output flags are
|
|
103
|
+
// spread in explicitly — without them the optional `name` positional would
|
|
104
|
+
// swallow a space-separated global flag's value.
|
|
179
105
|
args: {
|
|
106
|
+
...GLOBAL_OUTPUT_ARGS,
|
|
180
107
|
name: {
|
|
181
108
|
type: "positional",
|
|
182
|
-
description: "Name of the git
|
|
109
|
+
description: "Name of the git bundle to sync (default: primary bundle directory)",
|
|
183
110
|
required: false,
|
|
184
111
|
},
|
|
185
112
|
message: {
|
|
@@ -194,122 +121,44 @@ export const syncCommand = defineCommand({
|
|
|
194
121
|
},
|
|
195
122
|
},
|
|
196
123
|
async run({ args }) {
|
|
197
|
-
await runSyncBody(args
|
|
124
|
+
await runSyncBody(args);
|
|
198
125
|
},
|
|
199
126
|
});
|
|
200
127
|
/**
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* This keeps `akm sync json --format json` routing `json` as the stash name,
|
|
207
|
-
* while `akm sync --format json` (no separate positional) is treated as a
|
|
208
|
-
* primary-stash sync. `verb` is the subcommand token to anchor on.
|
|
128
|
+
* `--target` was renamed to `--bundle` on `clone` in 0.9 (S8). citty is
|
|
129
|
+
* non-strict, so the retired spelling is silently absorbed rather than
|
|
130
|
+
* rejected — the asset then lands in the default bundle instead of the one
|
|
131
|
+
* the caller named, with exit 0 and no error. Reject it explicitly instead.
|
|
209
132
|
*/
|
|
210
|
-
function
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
let formatIndex = -1;
|
|
215
|
-
let formatConsumesNextToken = false;
|
|
216
|
-
for (let i = 0; i < tokens.length; i += 1) {
|
|
217
|
-
const token = tokens[i];
|
|
218
|
-
if (token === "--format") {
|
|
219
|
-
formatIndex = i;
|
|
220
|
-
formatConsumesNextToken = true;
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
if (token === `--format=${formatValue}`) {
|
|
224
|
-
formatIndex = i;
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (formatIndex === -1)
|
|
229
|
-
return false;
|
|
230
|
-
// If the name appears as a standalone token before --format, it's the
|
|
231
|
-
// real positional and --format did not consume it.
|
|
232
|
-
if (tokens.slice(0, formatIndex).includes(name))
|
|
233
|
-
return false;
|
|
234
|
-
// If --format has a space-separated value, skip past the value token
|
|
235
|
-
// when scanning after the flag; otherwise start right after the flag.
|
|
236
|
-
const firstTokenAfterFormat = formatIndex + (formatConsumesNextToken ? 2 : 1);
|
|
237
|
-
if (tokens.slice(firstTokenAfterFormat).includes(name))
|
|
238
|
-
return false;
|
|
239
|
-
return true;
|
|
133
|
+
function rejectRetiredCloneTargetFlag() {
|
|
134
|
+
if (!getParsedInvocation().hasFlag("--target"))
|
|
135
|
+
return;
|
|
136
|
+
throw new UsageError("`akm clone --target` was renamed to `--bundle` in 0.9. Use `--bundle <name>` instead.", "INVALID_FLAG_VALUE");
|
|
240
137
|
}
|
|
241
138
|
export const cloneCommand = defineJsonCommand({
|
|
242
139
|
meta: {
|
|
243
140
|
name: "clone",
|
|
244
|
-
description: "Clone an asset from any source into
|
|
141
|
+
description: "Clone an asset from any source into a managed bundle or an unmanaged custom destination",
|
|
245
142
|
},
|
|
246
143
|
args: {
|
|
247
|
-
ref: { type: "positional", description: "Asset ref (e.g. npm:@scope/pkg//
|
|
144
|
+
ref: { type: "positional", description: "Asset ref (e.g. npm:@scope/pkg//scripts/deploy.sh)", required: true },
|
|
248
145
|
name: { type: "string", description: "New name for the cloned asset" },
|
|
249
|
-
force: { type: "boolean", description: "Overwrite if asset already exists
|
|
250
|
-
|
|
146
|
+
force: { type: "boolean", description: "Overwrite if the asset already exists at the destination", default: false },
|
|
147
|
+
bundle: {
|
|
148
|
+
type: "string",
|
|
149
|
+
description: "Override the managed destination. Accepts a bundle name from config; falls back to defaultWriteTarget then the working bundle.",
|
|
150
|
+
},
|
|
151
|
+
dest: { type: "string", description: "Unmanaged destination directory (cannot be combined with --bundle)" },
|
|
251
152
|
},
|
|
252
153
|
async run({ args }) {
|
|
154
|
+
rejectRetiredCloneTargetFlag();
|
|
253
155
|
const result = await akmClone({
|
|
254
156
|
sourceRef: args.ref,
|
|
255
157
|
newName: args.name,
|
|
256
158
|
force: args.force,
|
|
257
159
|
dest: args.dest,
|
|
160
|
+
target: args.bundle,
|
|
258
161
|
});
|
|
259
162
|
output("clone", result);
|
|
260
163
|
},
|
|
261
164
|
});
|
|
262
|
-
export const historyCommand = defineJsonCommand({
|
|
263
|
-
meta: {
|
|
264
|
-
name: "history",
|
|
265
|
-
description: "Show mutation/usage history for a single asset (--ref) or stash-wide.\n\n" +
|
|
266
|
-
"Event sources:\n" +
|
|
267
|
-
" usage_events (default): search, show, and feedback events from the local index.\n" +
|
|
268
|
-
" state.db events (--include-proposals): proposal lifecycle events (promoted, rejected)\n" +
|
|
269
|
-
" emitted by `akm accept` / `akm reject`.\n\n" +
|
|
270
|
-
"Results from all active sources are merged and sorted chronologically.",
|
|
271
|
-
},
|
|
272
|
-
args: {
|
|
273
|
-
ref: { type: "string", description: "Asset ref ([bundle//]conceptId). Omit for stash-wide history." },
|
|
274
|
-
since: { type: "string", description: "ISO timestamp or epoch ms — only events on/after this time" },
|
|
275
|
-
generator: {
|
|
276
|
-
type: "string",
|
|
277
|
-
description: "Filter by event generator: user, improve, task, audit, or unknown.",
|
|
278
|
-
},
|
|
279
|
-
"include-proposals": {
|
|
280
|
-
type: "boolean",
|
|
281
|
-
description: "Also include proposal lifecycle events (promoted, rejected) from state.db events. " +
|
|
282
|
-
"Default: false (usage_events only).",
|
|
283
|
-
default: false,
|
|
284
|
-
},
|
|
285
|
-
"accept-rate-by-source": {
|
|
286
|
-
type: "boolean",
|
|
287
|
-
description: "Compute accept-rate-per-source metrics from the proposal store and include them in the output (F-4 / #385). " +
|
|
288
|
-
"Useful for measuring which generators (reflect, distill, …) produce the most accepted proposals.",
|
|
289
|
-
default: false,
|
|
290
|
-
},
|
|
291
|
-
format: { type: "string", description: "Output format (json|jsonl|text|yaml)" },
|
|
292
|
-
},
|
|
293
|
-
async run({ args }) {
|
|
294
|
-
const generatorFlag = args.generator;
|
|
295
|
-
if (generatorFlag !== undefined &&
|
|
296
|
-
generatorFlag !== "user" &&
|
|
297
|
-
generatorFlag !== "improve" &&
|
|
298
|
-
generatorFlag !== "task" &&
|
|
299
|
-
generatorFlag !== "audit" &&
|
|
300
|
-
generatorFlag !== "unknown") {
|
|
301
|
-
throw new UsageError(`Invalid --generator value: "${generatorFlag}". Must be user, improve, task, audit, or unknown.`, "INVALID_FLAG_VALUE");
|
|
302
|
-
}
|
|
303
|
-
const sources = resolveSourceEntries();
|
|
304
|
-
const stashDir = sources[0]?.path;
|
|
305
|
-
const result = await akmHistory({
|
|
306
|
-
ref: args.ref,
|
|
307
|
-
since: args.since,
|
|
308
|
-
source: generatorFlag,
|
|
309
|
-
includeProposals: args["include-proposals"],
|
|
310
|
-
acceptRateBySource: args["accept-rate-by-source"],
|
|
311
|
-
stashDir,
|
|
312
|
-
});
|
|
313
|
-
output("history", result);
|
|
314
|
-
},
|
|
315
|
-
});
|
|
@@ -2,15 +2,18 @@
|
|
|
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
4
|
/**
|
|
5
|
-
* Stash-lifecycle command cluster — the
|
|
6
|
-
* the working stash and its index database: `akm
|
|
7
|
-
*
|
|
8
|
-
* (
|
|
9
|
-
* stats).
|
|
5
|
+
* Stash-lifecycle command cluster — the index/ingest/inspect verbs for
|
|
6
|
+
* the working stash and its index database: `akm index` (build/refresh the
|
|
7
|
+
* search index), `akm import` (ingest a knowledge doc/URL), and `akm info`
|
|
8
|
+
* (system capabilities + index stats).
|
|
10
9
|
* Extracted verbatim from src/cli.ts (WS6) so the God Module shrinks; the
|
|
11
|
-
* `main.subCommands.{
|
|
10
|
+
* `main.subCommands.{index,import,info}` keys and every subcommand's
|
|
12
11
|
* args/output shape stay byte-identical.
|
|
13
12
|
*
|
|
13
|
+
* 0.9 CLI overhaul (S7): `init` moved out of this cluster into the new
|
|
14
|
+
* `akm bundle create` (src/commands/sources/bundle-cli.ts) — no top-level
|
|
15
|
+
* `init` remains.
|
|
16
|
+
*
|
|
14
17
|
* These share no private helper with any command still inline in cli.ts — every
|
|
15
18
|
* dependency is already exported from a shared module (core/paths, core/warn,
|
|
16
19
|
* core/errors, core/events, output/context, cli/shared, cli/parse-args, plus the
|
|
@@ -18,7 +21,7 @@
|
|
|
18
21
|
* ./core/asset-create, ./core/common), so the cluster moves with zero hoisting.
|
|
19
22
|
*
|
|
20
23
|
* The leaf handlers whose body is a plain `runWithJsonErrors(...) + output(...)`
|
|
21
|
-
* (`
|
|
24
|
+
* (`import`, `info`) are migrated onto
|
|
22
25
|
* `defineJsonCommand`, which emits the same JSON envelope (stdout/stderr/
|
|
23
26
|
* exit-code) as the inline form. `index` keeps a plain `defineCommand` wrapping
|
|
24
27
|
* `runWithJsonErrors` because its body owns a spinner, an AbortController, and
|
|
@@ -28,49 +31,30 @@ import path from "node:path";
|
|
|
28
31
|
import { defineCommand } from "citty";
|
|
29
32
|
import * as p from "../../cli/clack.js";
|
|
30
33
|
import { getParsedInvocation } from "../../cli/invocation.js";
|
|
31
|
-
import { defineJsonCommand, output, parseAllFlagValues, runWithJsonErrors } from "../../cli/shared.js";
|
|
34
|
+
import { defineJsonCommand, GLOBAL_OUTPUT_ARGS, output, parseAllFlagValues, runWithJsonErrors } from "../../cli/shared.js";
|
|
32
35
|
import { assertFlatAssetName } from "../../core/asset/asset-create.js";
|
|
33
36
|
import { parseFrontmatter } from "../../core/asset/frontmatter.js";
|
|
34
37
|
import { isHttpUrl, resolveStashDir } from "../../core/common.js";
|
|
35
38
|
import { loadConfig } from "../../core/config/config.js";
|
|
36
39
|
import { UsageError } from "../../core/errors.js";
|
|
37
40
|
import { appendEvent } from "../../core/events.js";
|
|
41
|
+
import { resolveBundleWriteTarget } from "../../core/mutation-target.js";
|
|
38
42
|
import { getCacheDir } from "../../core/paths.js";
|
|
39
43
|
import { clearLogFile, info, isVerbose, setLogFile } from "../../core/warn.js";
|
|
40
44
|
import { resolveWriteTarget } from "../../core/write-source.js";
|
|
41
45
|
import { akmIndex } from "../../indexer/indexer.js";
|
|
42
46
|
import { getHyphenatedBoolean, getOutputMode } from "../../output/context.js";
|
|
43
|
-
import { inferAssetName, mergeXrefsIntoContent, readKnowledgeInput, resolveSupersedesForWrite, resolveXrefsForWrite, writeMarkdownAsset, } from "../read/knowledge.js";
|
|
47
|
+
import { inferAssetName, mergeXrefsIntoContent, readKnowledgeInput, resolveSupersedesForWrite, resolveSupersedesWriteTarget, resolveXrefsForWrite, writeMarkdownAsset, } from "../read/knowledge.js";
|
|
44
48
|
import { assembleInfo } from "./info.js";
|
|
45
|
-
import { akmInit } from "./init.js";
|
|
46
|
-
export const initCommand = defineJsonCommand({
|
|
47
|
-
meta: {
|
|
48
|
-
name: "init",
|
|
49
|
-
description: "Initialize akm's working stash directory and persist stashDir in config",
|
|
50
|
-
},
|
|
51
|
-
args: {
|
|
52
|
-
dir: { type: "string", description: "Custom stash directory path (default: ~/akm)" },
|
|
53
|
-
"set-default": {
|
|
54
|
-
type: "boolean",
|
|
55
|
-
description: "Make --dir the default stash (write stashDir to config.json). Without this, `akm init --dir X` scaffolds X but leaves your existing default stash unchanged.",
|
|
56
|
-
default: false,
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
async run({ args }) {
|
|
60
|
-
// Accept both historical spellings for backwards compatibility with
|
|
61
|
-
// older docs/scripts that used `--stashDir`.
|
|
62
|
-
const invocation = getParsedInvocation();
|
|
63
|
-
const legacyDir = invocation.getFlagValue("--stashDir") ?? invocation.getFlagValue("--stash-dir");
|
|
64
|
-
const result = await akmInit({
|
|
65
|
-
dir: args.dir ?? legacyDir,
|
|
66
|
-
setDefault: args["set-default"],
|
|
67
|
-
});
|
|
68
|
-
output("init", result);
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
49
|
export const indexCommand = defineCommand({
|
|
72
50
|
meta: { name: "index", description: "Build search index (incremental by default; --full forces full reindex)" },
|
|
73
51
|
args: {
|
|
52
|
+
// R-051: `index` is a raw `defineCommand` (not `defineJsonCommand`), so it
|
|
53
|
+
// does not get `GLOBAL_OUTPUT_ARGS` for free. `--format`/`--detail`/
|
|
54
|
+
// `--shape`/`--output` already parsed correctly here (this command has no
|
|
55
|
+
// extra positional for a stray value to fall into), so this is purely a
|
|
56
|
+
// `--help` visibility / consistency fix, not a behavior change.
|
|
57
|
+
...GLOBAL_OUTPUT_ARGS,
|
|
74
58
|
full: { type: "boolean", description: "Force full reindex", default: false },
|
|
75
59
|
clean: {
|
|
76
60
|
type: "boolean",
|
|
@@ -82,11 +66,6 @@ export const indexCommand = defineCommand({
|
|
|
82
66
|
description: "When combined with --clean, report stale entries without deleting them.",
|
|
83
67
|
default: false,
|
|
84
68
|
},
|
|
85
|
-
background: {
|
|
86
|
-
type: "boolean",
|
|
87
|
-
description: "Run as a background process (suppresses interactive output, manages PID file).",
|
|
88
|
-
default: false,
|
|
89
|
-
},
|
|
90
69
|
},
|
|
91
70
|
async run({ args }) {
|
|
92
71
|
await runWithJsonErrors(async () => {
|
|
@@ -96,7 +75,6 @@ export const indexCommand = defineCommand({
|
|
|
96
75
|
if (getHyphenatedBoolean(args, "re-enrich") || getParsedInvocation().getFlagValue("--re-enrich") !== undefined) {
|
|
97
76
|
throw new UsageError("`akm index --re-enrich` has been removed. Re-enrichment of index-time LLM passes is not exposed in this slice.");
|
|
98
77
|
}
|
|
99
|
-
const isBackground = args.background === true;
|
|
100
78
|
const outputMode = getOutputMode();
|
|
101
79
|
const controller = new AbortController();
|
|
102
80
|
const abort = () => controller.abort(new Error("index interrupted"));
|
|
@@ -105,7 +83,7 @@ export const indexCommand = defineCommand({
|
|
|
105
83
|
const indexLogFile = path.join(getCacheDir(), "logs", "index", `${new Date().toISOString().replace(/[:.]/g, "-")}.log`);
|
|
106
84
|
setLogFile(indexLogFile);
|
|
107
85
|
const verbose = isVerbose();
|
|
108
|
-
const spin = !verbose &&
|
|
86
|
+
const spin = !verbose && outputMode.format === "text" ? p.spinner() : null;
|
|
109
87
|
if (spin) {
|
|
110
88
|
spin.start(`Building search index${args.full ? " (full rebuild)" : ""}...`);
|
|
111
89
|
}
|
|
@@ -136,9 +114,7 @@ export const indexCommand = defineCommand({
|
|
|
136
114
|
if (spin) {
|
|
137
115
|
spin.stop(`Indexed ${result.totalEntries} assets.`);
|
|
138
116
|
}
|
|
139
|
-
|
|
140
|
-
output("index", result);
|
|
141
|
-
}
|
|
117
|
+
output("index", result);
|
|
142
118
|
}
|
|
143
119
|
catch (error) {
|
|
144
120
|
if (spin) {
|
|
@@ -164,7 +140,7 @@ export const infoCommand = defineJsonCommand({
|
|
|
164
140
|
export const importKnowledgeCommand = defineJsonCommand({
|
|
165
141
|
meta: {
|
|
166
142
|
name: "import",
|
|
167
|
-
description: "Import a knowledge document or URL into the default
|
|
143
|
+
description: "Import a knowledge document or URL into the default bundle",
|
|
168
144
|
},
|
|
169
145
|
args: {
|
|
170
146
|
source: {
|
|
@@ -187,15 +163,15 @@ export const importKnowledgeCommand = defineJsonCommand({
|
|
|
187
163
|
},
|
|
188
164
|
target: {
|
|
189
165
|
type: "string",
|
|
190
|
-
description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working
|
|
166
|
+
description: "Override the write destination. Accepts a source name from your config; falls back to defaultWriteTarget then the working bundle.",
|
|
191
167
|
},
|
|
192
168
|
xref: {
|
|
193
169
|
type: "string",
|
|
194
|
-
description: "Cross-reference ref merged into the document's `xrefs:` frontmatter (repeatable: --xref knowledge
|
|
170
|
+
description: "Cross-reference ref merged into the document's `xrefs:` frontmatter (repeatable: --xref knowledge/auth-flow). Existing frontmatter is preserved (dedupe-append, never a nested block); a document whose frontmatter is not parseable YAML aborts the import rather than being rewritten lossily. Each ref must resolve in the write target or a configured source; an unresolvable ref aborts the import.",
|
|
195
171
|
},
|
|
196
172
|
supersedes: {
|
|
197
173
|
type: "string",
|
|
198
|
-
description: "Ref of an existing asset this document corrects (repeatable: --supersedes knowledge
|
|
174
|
+
description: "Ref of an existing asset this document corrects (repeatable: --supersedes knowledge/legacy-guide). Imports 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 import; a ref outside the write target and working bundle still imports the correction but skips the demotion (reported as applied: false).",
|
|
199
175
|
},
|
|
200
176
|
},
|
|
201
177
|
async run({ args }) {
|
|
@@ -205,18 +181,35 @@ export const importKnowledgeCommand = defineJsonCommand({
|
|
|
205
181
|
// the last value, so read argv directly). Validation happens BEFORE any
|
|
206
182
|
// read/write so an unresolvable ref (UsageError → exit 2) leaves the
|
|
207
183
|
// stash untouched.
|
|
208
|
-
const
|
|
184
|
+
const rawSupersedes = parseAllFlagValues("--supersedes");
|
|
185
|
+
const writeTarget = resolveSupersedesWriteTarget(rawSupersedes, args.target);
|
|
186
|
+
const xrefs = resolveXrefsForWrite(parseAllFlagValues("--xref"), writeTarget);
|
|
209
187
|
// Collect and validate --supersedes occurrences (repeatable). Same
|
|
210
188
|
// before-any-read/write contract: an unresolvable ref exits 2 with nothing
|
|
211
189
|
// imported AND nothing demoted. The superseded refs fold into the imported
|
|
212
190
|
// doc's xrefs automatically (correction provenance); the demotion runs
|
|
213
191
|
// inside writeMarkdownAsset, ordered before the git boundary commit.
|
|
214
|
-
const supersedes = resolveSupersedesForWrite(
|
|
192
|
+
const supersedes = resolveSupersedesForWrite(rawSupersedes, writeTarget);
|
|
215
193
|
for (const s of supersedes) {
|
|
216
194
|
if (!xrefs.includes(s.ref))
|
|
217
195
|
xrefs.push(s.ref);
|
|
218
196
|
}
|
|
219
|
-
const
|
|
197
|
+
const config = loadConfig();
|
|
198
|
+
const stashDir = (() => {
|
|
199
|
+
try {
|
|
200
|
+
return resolveWriteTarget(config, writeTarget).source.path;
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (!writeTarget)
|
|
204
|
+
throw error;
|
|
205
|
+
try {
|
|
206
|
+
return resolveBundleWriteTarget(config, writeTarget).source.path;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
})();
|
|
220
213
|
const { content, preferredName } = await readKnowledgeInput(args.source, { stashDir });
|
|
221
214
|
// Imported docs may carry their own frontmatter: merge (dedupe-append)
|
|
222
215
|
// BEFORE the write so write-path indexing sees the final content and no
|
|
@@ -237,7 +230,7 @@ export const importKnowledgeCommand = defineJsonCommand({
|
|
|
237
230
|
fallbackPrefix: "knowledge",
|
|
238
231
|
preferredName: preferredName ?? inferAssetName(parseFrontmatter(content).content, "knowledge"),
|
|
239
232
|
force: args.force,
|
|
240
|
-
target:
|
|
233
|
+
target: writeTarget,
|
|
241
234
|
path: args.path,
|
|
242
235
|
supersedes,
|
|
243
236
|
});
|