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
|
@@ -5,58 +5,22 @@
|
|
|
5
5
|
* Plain-text renderers for `akm workflow *` commands.
|
|
6
6
|
*
|
|
7
7
|
* Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
|
|
8
|
-
* sibling module: the workflow run/
|
|
8
|
+
* sibling module: the workflow list/status/run/create/resume renderers form a
|
|
9
9
|
* cohesive, self-contained cluster (they call only each other, never
|
|
10
10
|
* formatters from other domains).
|
|
11
11
|
*/
|
|
12
|
-
export function formatWorkflowValidatePlain(r) {
|
|
13
|
-
const ok = r.ok !== false;
|
|
14
|
-
const pathValue = String(r.path ?? "?");
|
|
15
|
-
if (!ok)
|
|
16
|
-
return `workflow validate: failed (${pathValue})`;
|
|
17
|
-
const title = typeof r.title === "string" ? r.title : "";
|
|
18
|
-
const stepCount = typeof r.stepCount === "number" ? r.stepCount : 0;
|
|
19
|
-
const lines = [`workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`];
|
|
20
|
-
// Non-fatal advisories: clearly marked, printed after the ok line so `ok`
|
|
21
|
-
// is never in doubt. Absent/empty for markdown and fully-typed programs.
|
|
22
|
-
const warnings = Array.isArray(r.warnings) ? r.warnings : [];
|
|
23
|
-
if (warnings.length > 0) {
|
|
24
|
-
lines.push(` ${warnings.length} warning(s):`);
|
|
25
|
-
for (const w of warnings) {
|
|
26
|
-
const line = typeof w.line === "number" ? w.line : "?";
|
|
27
|
-
lines.push(` warning: ${pathValue}:${line} — ${String(w.message ?? "")}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return lines.join("\n");
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Plain-text rendering for a step-completion that was rejected by the
|
|
34
|
-
* summary-validation gate (#506): the step stays pending and the agent gets
|
|
35
|
-
* corrective feedback on what to finish/fix.
|
|
36
|
-
*/
|
|
37
|
-
export function formatWorkflowCompleteRejectedPlain(r) {
|
|
38
|
-
const stepId = String(r.stepId ?? "?");
|
|
39
|
-
const feedback = typeof r.feedback === "string" ? r.feedback : "";
|
|
40
|
-
const missing = Array.isArray(r.missing) ? r.missing.map((m) => String(m)) : [];
|
|
41
|
-
const lines = [`workflow complete: rejected — step "${stepId}" does not meet its completion criteria`];
|
|
42
|
-
if (feedback)
|
|
43
|
-
lines.push(` feedback: ${feedback}`);
|
|
44
|
-
if (missing.length > 0) {
|
|
45
|
-
lines.push(" outstanding:");
|
|
46
|
-
for (const m of missing)
|
|
47
|
-
lines.push(` - ${m}`);
|
|
48
|
-
}
|
|
49
|
-
return lines.join("\n");
|
|
50
|
-
}
|
|
51
12
|
export function formatWorkflowListPlain(result) {
|
|
52
13
|
const runs = Array.isArray(result.runs) ? result.runs : [];
|
|
53
14
|
if (runs.length === 0) {
|
|
54
|
-
return "No workflow runs in the current working scope. Start one with `akm workflow
|
|
15
|
+
return "No workflow runs in the current working scope. Start one with `akm workflow run workflows/<name>` or author one with `akm workflow create <name>`.";
|
|
55
16
|
}
|
|
56
17
|
return runs
|
|
57
18
|
.map((run) => {
|
|
58
19
|
const id = typeof run.id === "string" ? run.id : "unknown";
|
|
59
|
-
|
|
20
|
+
// Fallback matches the `id`/`status` convention just below (plain
|
|
21
|
+
// "unknown", not a `type:name`-shaped placeholder — that shape reads as
|
|
22
|
+
// a ref in the dead colon grammar, which this fallback must not model).
|
|
23
|
+
const ref = typeof run.workflowRef === "string" ? run.workflowRef : "unknown";
|
|
60
24
|
const status = typeof run.status === "string" ? run.status : "unknown";
|
|
61
25
|
const currentStep = typeof run.currentStepId === "string" ? ` (current: ${run.currentStepId})` : "";
|
|
62
26
|
return `${id} ${ref} [${status}]${currentStep}`;
|
|
@@ -71,7 +35,7 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
71
35
|
if (!run || !workflow)
|
|
72
36
|
return null;
|
|
73
37
|
const lines = [
|
|
74
|
-
`workflow: ${String(workflow.ref ?? "
|
|
38
|
+
`workflow: ${String(workflow.ref ?? "unknown")}`,
|
|
75
39
|
`run: ${String(run.id ?? "unknown")}`,
|
|
76
40
|
`title: ${String(run.workflowTitle ?? workflow.title ?? "Workflow")}`,
|
|
77
41
|
`status: ${String(run.status ?? "unknown")}`,
|
|
@@ -106,8 +70,8 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
106
70
|
const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
|
|
107
71
|
lines.push(` - ${id} [${node}] (${status}${suffix})`);
|
|
108
72
|
// Codex round-3 finding B: a `running` claim gone silent past the check-in
|
|
109
|
-
// window — the
|
|
110
|
-
// human can reclaim/re-run the unit
|
|
73
|
+
// window — the process holding it likely died. Surface it (with the claim
|
|
74
|
+
// holder) so a human can reclaim/re-run the unit.
|
|
111
75
|
if (unit.stale === true) {
|
|
112
76
|
const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
|
|
113
77
|
lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
|
|
@@ -134,7 +98,7 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
134
98
|
}
|
|
135
99
|
/**
|
|
136
100
|
* Render the stalled-run check-in directive (#506) when present on a
|
|
137
|
-
* workflow-
|
|
101
|
+
* workflow-status result. Returns null when the run is healthy.
|
|
138
102
|
*/
|
|
139
103
|
function formatWorkflowCheckinLine(result) {
|
|
140
104
|
const checkin = typeof result.checkin === "object" && result.checkin !== null
|
|
@@ -144,52 +108,16 @@ function formatWorkflowCheckinLine(result) {
|
|
|
144
108
|
return null;
|
|
145
109
|
return checkin.directive.trim();
|
|
146
110
|
}
|
|
147
|
-
export function formatWorkflowNextPlain(result) {
|
|
148
|
-
const base = formatWorkflowStatusPlain(result);
|
|
149
|
-
const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
|
|
150
|
-
if (!step)
|
|
151
|
-
return base;
|
|
152
|
-
const lines = base ? [base, "", "next:"] : ["next:"];
|
|
153
|
-
lines.push(` ${String(step.title ?? "Untitled step")} [${String(step.id ?? "unknown")}]`);
|
|
154
|
-
if (typeof step.instructions === "string" && step.instructions.trim()) {
|
|
155
|
-
const instrLines = step.instructions.trim().split("\n");
|
|
156
|
-
lines.push(` instructions: ${instrLines[0]}`);
|
|
157
|
-
for (const instrLine of instrLines.slice(1))
|
|
158
|
-
lines.push(` ${instrLine}`);
|
|
159
|
-
}
|
|
160
|
-
const completion = Array.isArray(step.completionCriteria) ? step.completionCriteria : [];
|
|
161
|
-
if (completion.length > 0) {
|
|
162
|
-
lines.push(" completion:");
|
|
163
|
-
for (const criterion of completion) {
|
|
164
|
-
lines.push(` - ${String(criterion)}`);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// T2-3: surface run-id as labeled field
|
|
168
|
-
const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
|
|
169
|
-
const runId = typeof run?.id === "string" ? run.id : null;
|
|
170
|
-
const stepId = typeof step?.id === "string" ? step.id : null;
|
|
171
|
-
if (runId) {
|
|
172
|
-
lines.push("");
|
|
173
|
-
lines.push(`runId: ${runId}`);
|
|
174
|
-
}
|
|
175
|
-
// T1-6: complete command
|
|
176
|
-
if (runId && stepId) {
|
|
177
|
-
lines.push("");
|
|
178
|
-
lines.push("COMPLETE THIS STEP:");
|
|
179
|
-
lines.push(` akm workflow complete '${runId}' --step '${stepId}'`);
|
|
180
|
-
}
|
|
181
|
-
else if (runId) {
|
|
182
|
-
lines.push("");
|
|
183
|
-
lines.push("COMPLETE THIS STEP:");
|
|
184
|
-
lines.push(` akm workflow complete '${runId}' --step '<step-id>'`);
|
|
185
|
-
}
|
|
186
|
-
return lines.join("\n");
|
|
187
|
-
}
|
|
188
111
|
export function formatWorkflowRunPlain(result) {
|
|
189
112
|
const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
|
|
190
113
|
if (!run)
|
|
191
114
|
return null;
|
|
192
115
|
const lines = [`run: ${String(run.id ?? "unknown")}`, `status: ${String(run.status ?? "unknown")}`];
|
|
116
|
+
// Creation-time notices (e.g. the implicit engine fallback) must survive the
|
|
117
|
+
// text renderer: JSON/YAML pass them through, and dropping them here would
|
|
118
|
+
// hide the announcement from the DEFAULT output mode — where it matters most.
|
|
119
|
+
for (const warning of Array.isArray(result.warnings) ? result.warnings : [])
|
|
120
|
+
lines.push(`! ${String(warning)}`);
|
|
193
121
|
const executed = Array.isArray(result.executed) ? result.executed : [];
|
|
194
122
|
if (executed.length === 0) {
|
|
195
123
|
lines.push("executed: (no steps — run was already done or blocked)");
|
|
@@ -214,127 +142,20 @@ export function formatWorkflowRunPlain(result) {
|
|
|
214
142
|
for (const item of missing)
|
|
215
143
|
lines.push(` missing: ${String(item)}`);
|
|
216
144
|
}
|
|
145
|
+
if (result.aborted === true) {
|
|
146
|
+
lines.push(result.timedOut === true
|
|
147
|
+
? "workflow timed out; the run remains resumable."
|
|
148
|
+
: "workflow interrupted; the run remains resumable.");
|
|
149
|
+
}
|
|
217
150
|
if (result.done === true)
|
|
218
151
|
lines.push("workflow completed.");
|
|
219
152
|
return lines.join("\n");
|
|
220
153
|
}
|
|
221
|
-
export function formatWorkflowBriefPlain(result) {
|
|
222
|
-
const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
|
|
223
|
-
if (!run)
|
|
224
|
-
return null;
|
|
225
|
-
const lines = [];
|
|
226
|
-
lines.push(`# Workflow brief: ${String(run.id ?? "unknown")}`);
|
|
227
|
-
lines.push(`workflow: ${String(run.workflowRef ?? "?")} (${String(run.workflowTitle ?? "")})`);
|
|
228
|
-
lines.push(`status: ${String(run.status ?? "?")}`);
|
|
229
|
-
if (typeof result.message === "string")
|
|
230
|
-
lines.push(result.message);
|
|
231
|
-
const lease = typeof result.engineLease === "object" && result.engineLease !== null
|
|
232
|
-
? result.engineLease
|
|
233
|
-
: undefined;
|
|
234
|
-
if (lease) {
|
|
235
|
-
const live = lease.live === true ? "LIVE" : "expired";
|
|
236
|
-
lines.push(`engine lease: ${String(lease.holder ?? "?")} (until ${String(lease.until ?? "?")}) [${live}]`);
|
|
237
|
-
}
|
|
238
|
-
const warnings = Array.isArray(result.warnings) ? result.warnings : [];
|
|
239
|
-
for (const w of warnings)
|
|
240
|
-
lines.push(`! ${String(w)}`);
|
|
241
|
-
if (result.done === true) {
|
|
242
|
-
lines.push("");
|
|
243
|
-
lines.push("This run is completed — no work remains.");
|
|
244
|
-
return lines.join("\n");
|
|
245
|
-
}
|
|
246
|
-
const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
|
|
247
|
-
if (!step) {
|
|
248
|
-
return lines.join("\n");
|
|
249
|
-
}
|
|
250
|
-
const gate = typeof step.gate === "object" && step.gate !== null ? step.gate : undefined;
|
|
251
|
-
lines.push("");
|
|
252
|
-
lines.push(`## Active step: ${String(step.stepId ?? "?")} — ${String(step.title ?? "")} [${String(step.kind ?? "execute")}]`);
|
|
253
|
-
if (gate) {
|
|
254
|
-
const criteria = Array.isArray(gate.criteria) ? gate.criteria : [];
|
|
255
|
-
lines.push(`gate: loop ${String(gate.currentLoop ?? 1)} of max ${String(gate.maxLoops ?? 1)}` +
|
|
256
|
-
(criteria.length > 0 ? `; criteria: ${criteria.map(String).join("; ")}` : "; no completion criteria") +
|
|
257
|
-
(gate.judgesArtifact === true ? " (artifact-judged)" : ""));
|
|
258
|
-
}
|
|
259
|
-
if (step.outputSchema !== undefined)
|
|
260
|
-
lines.push("outputSchema: declared (see JSON output)");
|
|
261
|
-
const feedback = typeof result.gateFeedback === "object" && result.gateFeedback !== null
|
|
262
|
-
? result.gateFeedback
|
|
263
|
-
: undefined;
|
|
264
|
-
if (feedback) {
|
|
265
|
-
lines.push(`gate feedback (previous loop rejected): ${String(feedback.feedback ?? "")}`);
|
|
266
|
-
const missing = Array.isArray(feedback.missing) ? feedback.missing : [];
|
|
267
|
-
for (const m of missing)
|
|
268
|
-
lines.push(` - missing: ${String(m)}`);
|
|
269
|
-
}
|
|
270
|
-
const route = typeof result.route === "object" && result.route !== null ? result.route : undefined;
|
|
271
|
-
if (route) {
|
|
272
|
-
lines.push("");
|
|
273
|
-
lines.push(`## Route contract on ${String(route.input ?? "?")}`);
|
|
274
|
-
const when = typeof route.when === "object" && route.when !== null ? route.when : {};
|
|
275
|
-
for (const [value, target] of Object.entries(when))
|
|
276
|
-
lines.push(` when "${value}" → ${String(target)}`);
|
|
277
|
-
if (route.defaultStepId !== undefined)
|
|
278
|
-
lines.push(` default → ${String(route.defaultStepId)}`);
|
|
279
|
-
const decision = typeof route.decision === "object" && route.decision !== null
|
|
280
|
-
? route.decision
|
|
281
|
-
: undefined;
|
|
282
|
-
if (decision)
|
|
283
|
-
lines.push(` decision NOW: value "${String(decision.value)}" → ${String(decision.selected)}`);
|
|
284
|
-
else if (typeof route.decisionError === "string")
|
|
285
|
-
lines.push(` decision error: ${route.decisionError}`);
|
|
286
|
-
else
|
|
287
|
-
lines.push(" decision: pending this step's output (evaluated after units complete)");
|
|
288
|
-
}
|
|
289
|
-
const workList = typeof result.workList === "object" && result.workList !== null
|
|
290
|
-
? result.workList
|
|
291
|
-
: undefined;
|
|
292
|
-
const units = workList && Array.isArray(workList.units) ? workList.units : [];
|
|
293
|
-
if (workList?.error) {
|
|
294
|
-
lines.push("");
|
|
295
|
-
lines.push(`work-list error: ${String(workList.error)}`);
|
|
296
|
-
}
|
|
297
|
-
else if (units.length > 0) {
|
|
298
|
-
lines.push("");
|
|
299
|
-
lines.push(`## Units (${units.length})`);
|
|
300
|
-
for (const u of units) {
|
|
301
|
-
const model = u.model ? ` model=${String(u.model)}` : "";
|
|
302
|
-
const journaled = typeof u.journaled === "object" && u.journaled !== null ? u.journaled : undefined;
|
|
303
|
-
const jstatus = journaled ? ` [journaled: ${String(journaled.status)}]` : "";
|
|
304
|
-
lines.push(`- ${String(u.unitId)} (runner=${String(u.runner)}${model})${jstatus}`);
|
|
305
|
-
const env = Array.isArray(u.env) ? u.env : [];
|
|
306
|
-
if (env.length > 0)
|
|
307
|
-
lines.push(` env (names): ${env.map(String).join(", ")}`);
|
|
308
|
-
if (u.outputSchema !== undefined)
|
|
309
|
-
lines.push(" outputSchema: declared (see JSON output)");
|
|
310
|
-
const resolved = typeof u.resolved === "object" && u.resolved !== null ? u.resolved : undefined;
|
|
311
|
-
if (resolved && resolved.ok === false)
|
|
312
|
-
lines.push(` RESOLUTION ERROR: ${String(resolved.error)}`);
|
|
313
|
-
if (typeof u.report === "string")
|
|
314
|
-
lines.push(` report: ${u.report}`);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
// Finding D: a non-dispatching step (route-only / empty / all-unresolvable)
|
|
318
|
-
// advances via the `--settle` verb, surfaced so a driver can advance the spine.
|
|
319
|
-
if (typeof result.settleCommand === "string") {
|
|
320
|
-
lines.push("");
|
|
321
|
-
lines.push("## Advance (no reportable units)");
|
|
322
|
-
lines.push(`settle: ${result.settleCommand}`);
|
|
323
|
-
}
|
|
324
|
-
const guidance = typeof result.reportGuidance === "object" && result.reportGuidance !== null
|
|
325
|
-
? result.reportGuidance
|
|
326
|
-
: undefined;
|
|
327
|
-
if (guidance) {
|
|
328
|
-
lines.push("");
|
|
329
|
-
lines.push("## Reporting");
|
|
330
|
-
if (typeof guidance.checkin === "string")
|
|
331
|
-
lines.push(`heartbeat: ${guidance.checkin}`);
|
|
332
|
-
if (typeof guidance.failure === "string")
|
|
333
|
-
lines.push(`on failure: ${guidance.failure}`);
|
|
334
|
-
}
|
|
335
|
-
return lines.join("\n");
|
|
336
|
-
}
|
|
337
154
|
export function formatWorkflowCreatePlain(r) {
|
|
155
|
+
// `workflow create --print`: no file is written, just the template text
|
|
156
|
+
// (dropped `workflow template`'s output, moved onto this shape).
|
|
157
|
+
if (typeof r.template === "string")
|
|
158
|
+
return r.template;
|
|
338
159
|
if (r.ref && r.path) {
|
|
339
160
|
return `Created ${String(r.ref)} at ${String(r.path)}`;
|
|
340
161
|
}
|
|
@@ -2,18 +2,12 @@
|
|
|
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
|
// Output text formatters for all `akm workflow *` commands.
|
|
5
|
-
import {
|
|
5
|
+
import { formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowResumePlain, formatWorkflowRunPlain, formatWorkflowStatusPlain, } from "./helpers.js";
|
|
6
6
|
export const workflowFormatters = [
|
|
7
|
-
{ command: "workflow-start", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
8
7
|
{ command: "workflow-status", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
9
|
-
{ command: "workflow-complete", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
10
|
-
{ command: "workflow-complete-rejected", handler: (r) => formatWorkflowCompleteRejectedPlain(r) },
|
|
11
|
-
{ command: "workflow-next", handler: (r) => formatWorkflowNextPlain(r) },
|
|
12
8
|
{ command: "workflow-list", handler: (r) => formatWorkflowListPlain(r) },
|
|
13
9
|
{ command: "workflow-create", handler: (r) => formatWorkflowCreatePlain(r) },
|
|
14
|
-
{ command: "workflow-validate", handler: (r) => formatWorkflowValidatePlain(r) },
|
|
15
10
|
{ command: "workflow-resume", handler: (r) => formatWorkflowResumePlain(r) },
|
|
16
11
|
{ command: "workflow-abandon", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
17
12
|
{ command: "workflow-run", handler: (r) => formatWorkflowRunPlain(r) },
|
|
18
|
-
{ command: "workflow-brief", handler: (r) => formatWorkflowBriefPlain(r) },
|
|
19
13
|
];
|
package/dist/output/text.js
CHANGED
|
@@ -2,37 +2,33 @@
|
|
|
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
|
import { addFormatters } from "./text/add.js";
|
|
5
|
+
import { bundleCreateFormatters } from "./text/bundle-create.js";
|
|
6
|
+
import { bundleShowFormatters } from "./text/bundle-show.js";
|
|
5
7
|
import { cloneFormatters } from "./text/clone.js";
|
|
6
8
|
import { configFormatters } from "./text/config.js";
|
|
7
9
|
import { curateFormatters } from "./text/curate.js";
|
|
8
|
-
import { distillFormatters } from "./text/distill.js";
|
|
9
|
-
import { enableDisableFormatters } from "./text/enable-disable.js";
|
|
10
10
|
import { envFormatters } from "./text/env.js";
|
|
11
11
|
import { eventsFormatters } from "./text/events.js";
|
|
12
12
|
import { feedbackFormatters } from "./text/feedback.js";
|
|
13
|
-
import {
|
|
13
|
+
import { healthFormatters } from "./text/health.js";
|
|
14
14
|
import { importFormatters } from "./text/import.js";
|
|
15
15
|
import { indexFormatters } from "./text/index.js";
|
|
16
16
|
import { infoFormatters } from "./text/info.js";
|
|
17
|
-
import {
|
|
17
|
+
import { lintFormatters } from "./text/lint.js";
|
|
18
18
|
import { listFormatters } from "./text/list.js";
|
|
19
|
+
import { migrateFormatters } from "./text/migrate.js";
|
|
19
20
|
import { proposalProducerFormatters } from "./text/proposal/producer.js";
|
|
20
21
|
import { proposalFormatters } from "./text/proposal/proposal.js";
|
|
21
22
|
import { getTextFormatterHandler, registerTextFormatters } from "./text/registry.js";
|
|
22
23
|
import { registryCommandFormatters } from "./text/registry-commands.js";
|
|
23
24
|
import { rememberFormatters } from "./text/remember.js";
|
|
24
25
|
import { removeFormatters } from "./text/remove.js";
|
|
25
|
-
import { saveFormatters } from "./text/save.js";
|
|
26
26
|
import { searchFormatters } from "./text/search.js";
|
|
27
27
|
import { showFormatters } from "./text/show.js";
|
|
28
|
+
import { syncFormatters } from "./text/sync.js";
|
|
28
29
|
import { updateFormatters } from "./text/update.js";
|
|
29
30
|
import { upgradeFormatters } from "./text/upgrade.js";
|
|
30
31
|
import { workflowFormatters } from "./text/workflow.js";
|
|
31
|
-
// Re-export helpers so existing imports from `text.ts` keep working.
|
|
32
|
-
export { formatAddPlain, formatClonePlain, formatConfigPlain, formatCuratePlain, formatDistillPlain, formatEventLine, formatEventsPlain, formatFeedbackPlain, formatHistoryPlain, formatImportPlain, formatIndexPlain, formatInfoPlain, formatInitPlain, formatListPlain, formatProposalAcceptPlain, formatProposalDiffPlain, formatProposalListPlain, formatProposalProducerPlain, formatProposalRejectPlain, formatProposalShowPlain, formatRegistryAddPlain, formatRegistryBuildIndexPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, formatRememberPlain, formatRemovePlain, formatSavePlain, formatSearchPlain, formatShowPlain, formatToggleComponentPlain, formatUpdatePlain, formatUpgradePlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./text/helpers.js";
|
|
33
|
-
// Re-export registry API so callers can use this module as the single entry
|
|
34
|
-
// point (backward compat).
|
|
35
|
-
export { deregisterTextFormatter, registerTextFormatter } from "./text/registry.js";
|
|
36
32
|
// ── Explicit built-in formatter assembly ──────────────────────────────────────
|
|
37
33
|
// Each entry below is a pure exported `TextFormatterEntry[]` from a per-command
|
|
38
34
|
// module. The set is registered ONCE, deterministically, with no reliance on
|
|
@@ -40,7 +36,8 @@ export { deregisterTextFormatter, registerTextFormatter } from "./text/registry.
|
|
|
40
36
|
// and because each name is referenced statically, a deleted export fails to
|
|
41
37
|
// compile instead of silently disappearing at runtime.
|
|
42
38
|
const BUILT_IN_TEXT_FORMATTERS = [
|
|
43
|
-
...
|
|
39
|
+
...bundleCreateFormatters,
|
|
40
|
+
...bundleShowFormatters,
|
|
44
41
|
...indexFormatters,
|
|
45
42
|
...showFormatters,
|
|
46
43
|
...searchFormatters,
|
|
@@ -52,20 +49,20 @@ const BUILT_IN_TEXT_FORMATTERS = [
|
|
|
52
49
|
...updateFormatters,
|
|
53
50
|
...upgradeFormatters,
|
|
54
51
|
...cloneFormatters,
|
|
55
|
-
...historyFormatters,
|
|
56
52
|
...eventsFormatters,
|
|
57
53
|
...proposalFormatters,
|
|
58
54
|
...proposalProducerFormatters,
|
|
59
|
-
...distillFormatters,
|
|
60
55
|
...infoFormatters,
|
|
56
|
+
...healthFormatters,
|
|
57
|
+
...lintFormatters,
|
|
61
58
|
...configFormatters,
|
|
62
59
|
...feedbackFormatters,
|
|
63
60
|
...rememberFormatters,
|
|
64
61
|
...importFormatters,
|
|
65
|
-
...
|
|
66
|
-
...enableDisableFormatters,
|
|
62
|
+
...syncFormatters,
|
|
67
63
|
...registryCommandFormatters,
|
|
68
64
|
...envFormatters,
|
|
65
|
+
...migrateFormatters,
|
|
69
66
|
];
|
|
70
67
|
registerTextFormatters(BUILT_IN_TEXT_FORMATTERS);
|
|
71
68
|
// ── JSONL output (unchanged — not part of the formatPlain dispatch) ───────────
|
|
@@ -88,12 +85,14 @@ export function outputJsonl(command, shaped) {
|
|
|
88
85
|
// ── Dispatcher ────────────────────────────────────────────────────────────────
|
|
89
86
|
/**
|
|
90
87
|
* Return a plain-text string for commands that are better as short messages,
|
|
91
|
-
* or null to fall through to
|
|
88
|
+
* or null to fall through to the generic text rendering of the shaped
|
|
89
|
+
* envelope (`renderGenericText`, applied in `output()` in
|
|
90
|
+
* `src/cli/shared.ts` — this module stays dependency-free of that renderer).
|
|
92
91
|
*/
|
|
93
92
|
export function formatPlain(command, result, detail) {
|
|
94
93
|
const handler = getTextFormatterHandler(command);
|
|
95
94
|
if (handler) {
|
|
96
95
|
return handler(result, detail);
|
|
97
96
|
}
|
|
98
|
-
return null; // fall through to YAML
|
|
97
|
+
return null; // fall through to the generic text renderer, not YAML
|
|
99
98
|
}
|
package/dist/registry/factory.js
CHANGED
|
@@ -12,17 +12,15 @@
|
|
|
12
12
|
* `sources/provider-factory.ts` or the installed-source operations in
|
|
13
13
|
* `installed-stashes.ts`.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
* `
|
|
17
|
-
* The legacy alias in `src/registry-provider.ts` is kept as a thin re-export
|
|
18
|
-
* for transitional callers and will be removed after the dust settles.
|
|
15
|
+
* Factories use the `RegistryProviderFactory` type owned by
|
|
16
|
+
* `src/registry/providers/types.ts`.
|
|
19
17
|
*/
|
|
20
18
|
import { createProviderRegistry } from "./create-provider-registry.js";
|
|
21
19
|
// ── Factory map ─────────────────────────────────────────────────────────────
|
|
22
20
|
const registry = createProviderRegistry();
|
|
23
|
-
export function
|
|
21
|
+
export function registerRegistryProvider(type, factory) {
|
|
24
22
|
registry.register(type, factory);
|
|
25
23
|
}
|
|
26
|
-
export function
|
|
24
|
+
export function resolveRegistryProviderFactory(type) {
|
|
27
25
|
return registry.resolve(type);
|
|
28
26
|
}
|
|
@@ -2,56 +2,45 @@
|
|
|
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
|
import path from "node:path";
|
|
5
|
+
import { isBundleSlug } from "../core/asset/asset-ref.js";
|
|
6
|
+
import { deriveInstallations } from "../indexer/installations.js";
|
|
5
7
|
import { parseRegistryRef } from "./resolve.js";
|
|
6
8
|
/**
|
|
7
9
|
* Given an origin string (from an AssetRef) and the full list of stash
|
|
8
10
|
* sources, return the subset of sources to search.
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* 2. "local" → primary stash only (first entry)
|
|
13
|
-
* 3. exact match → source whose registryId matches verbatim
|
|
14
|
-
* 4. parsed match → parse origin as a registry ref, match by parsed ID
|
|
15
|
-
* 5. path match → source whose resolved path matches the origin
|
|
16
|
-
* 6. empty → indicates a remote/uninstalled origin (caller decides)
|
|
12
|
+
* Qualified asset refs use bundle identity only. Install locators and paths are
|
|
13
|
+
* a separate grammar handled by {@link resolveSourcesForLocator}.
|
|
17
14
|
*/
|
|
18
15
|
export function resolveSourcesForOrigin(origin, allSources) {
|
|
19
16
|
if (!origin)
|
|
20
17
|
return allSources;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const byExactId = allSources.filter((
|
|
18
|
+
const installations = deriveInstallations(allSources);
|
|
19
|
+
return allSources.filter((_, index) => installations[index]?.id === origin);
|
|
20
|
+
}
|
|
21
|
+
/** Resolve the non-asset source locator grammar used by `akm clone`. */
|
|
22
|
+
export function resolveSourcesForLocator(locator, allSources) {
|
|
23
|
+
const byExactId = allSources.filter((source) => source.registryId === locator);
|
|
27
24
|
if (byExactId.length > 0)
|
|
28
25
|
return byExactId;
|
|
29
|
-
// Parse origin as a registry ref and match by parsed ID.
|
|
30
|
-
// Allows shorthand: "owner/repo" matches "github:owner/repo",
|
|
31
|
-
// "@scope/pkg" matches "npm:@scope/pkg".
|
|
32
26
|
try {
|
|
33
|
-
const parsed = parseRegistryRef(
|
|
27
|
+
const parsed = parseRegistryRef(locator);
|
|
34
28
|
const byParsedId = allSources.filter((s) => s.registryId !== undefined && s.registryId === parsed.id);
|
|
35
29
|
if (byParsedId.length > 0)
|
|
36
30
|
return byParsedId;
|
|
37
31
|
}
|
|
38
32
|
catch {
|
|
39
|
-
// Not a
|
|
33
|
+
// Not a registry locator; continue to path matching.
|
|
40
34
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const byPath = allSources.filter((s) => path.resolve(s.path) === resolvedOrigin);
|
|
44
|
-
if (byPath.length > 0)
|
|
45
|
-
return byPath;
|
|
46
|
-
// No match — origin may be remote/uninstalled
|
|
47
|
-
return [];
|
|
35
|
+
const resolvedLocator = path.resolve(locator);
|
|
36
|
+
return allSources.filter((source) => path.resolve(source.path) === resolvedLocator);
|
|
48
37
|
}
|
|
49
38
|
/**
|
|
50
39
|
* Check whether an origin refers to something that could be fetched remotely
|
|
51
40
|
* (i.e. it looks like a registry ref but isn't installed locally).
|
|
52
41
|
*/
|
|
53
42
|
export function isRemoteOrigin(origin, allSources) {
|
|
54
|
-
if (origin
|
|
43
|
+
if (isBundleSlug(origin))
|
|
55
44
|
return false;
|
|
56
|
-
return
|
|
45
|
+
return resolveSourcesForLocator(origin, allSources).length === 0;
|
|
57
46
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { fetchWithRetry } from "../../core/common.js";
|
|
5
5
|
import { md5Hex } from "../../runtime.js";
|
|
6
6
|
import { fetchCachedJson } from "../../storage/repositories/registry-cache.js";
|
|
7
|
-
import {
|
|
7
|
+
import { registerRegistryProvider } from "../factory.js";
|
|
8
8
|
// ── Constants ───────────────────────────────────────────────────────────────
|
|
9
9
|
/** Per-query cache TTL in milliseconds (15 minutes). */
|
|
10
10
|
const QUERY_CACHE_TTL_MS = 15 * 60 * 1000;
|
|
@@ -112,7 +112,7 @@ class SkillsShProvider {
|
|
|
112
112
|
assetName: entry.name,
|
|
113
113
|
stash: { id: `skills-sh:${entry.id}`, name: entry.name },
|
|
114
114
|
registryName,
|
|
115
|
-
action: `akm add github:${ownerRepo}`,
|
|
115
|
+
action: `akm bundle add github:${ownerRepo}`,
|
|
116
116
|
score: Math.round((entry.installs / maxInstalls) * 1000) / 1000,
|
|
117
117
|
};
|
|
118
118
|
});
|
|
@@ -125,7 +125,7 @@ class SkillsShProvider {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
// ── Self-register ───────────────────────────────────────────────────────────
|
|
128
|
-
|
|
128
|
+
registerRegistryProvider("skills-sh", (config) => new SkillsShProvider(config));
|
|
129
129
|
// ── Response parsing ────────────────────────────────────────────────────────
|
|
130
130
|
function parseSkillsResponse(data) {
|
|
131
131
|
if (typeof data !== "object" || data === null || Array.isArray(data))
|
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
import { fetchWithRetry, jsonWithByteCap, toErrorMessage } from "../../core/common.js";
|
|
5
5
|
import { asString } from "../../integrations/github.js";
|
|
6
6
|
import { fetchCachedJson } from "../../storage/repositories/registry-cache.js";
|
|
7
|
-
import {
|
|
7
|
+
import { registerRegistryProvider } from "../factory.js";
|
|
8
8
|
import { buildInstallRef } from "../resolve.js";
|
|
9
9
|
// ── Constants ───────────────────────────────────────────────────────────────
|
|
10
10
|
/** Cache TTL in milliseconds (1 hour). */
|
|
11
11
|
const CACHE_TTL_MS = 60 * 60 * 1000;
|
|
12
|
-
/** Maximum age before cache is considered stale but still usable as fallback (7 days). */
|
|
13
|
-
const CACHE_STALE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
14
12
|
// ── Provider class ──────────────────────────────────────────────────────────
|
|
15
13
|
class StaticIndexProvider {
|
|
16
14
|
type = "static-index";
|
|
@@ -20,25 +18,25 @@ class StaticIndexProvider {
|
|
|
20
18
|
}
|
|
21
19
|
async search(options) {
|
|
22
20
|
const warnings = [];
|
|
23
|
-
const
|
|
24
|
-
const hits =
|
|
21
|
+
const bundles = await this.loadBundles(warnings);
|
|
22
|
+
const hits = scoreBundles(bundles, options.query, options.limit);
|
|
25
23
|
let assetHits;
|
|
26
24
|
if (options.includeAssets) {
|
|
27
|
-
const scored = scoreAssets(
|
|
25
|
+
const scored = scoreAssets(bundles, options.query, options.limit);
|
|
28
26
|
if (scored.length > 0)
|
|
29
27
|
assetHits = scored;
|
|
30
28
|
}
|
|
31
29
|
return { hits, assetHits, warnings: warnings.length > 0 ? warnings : undefined };
|
|
32
30
|
}
|
|
33
31
|
// ── Internals ───────────────────────────────────────────────────────────
|
|
34
|
-
async
|
|
35
|
-
const
|
|
32
|
+
async loadBundles(warnings) {
|
|
33
|
+
const bundles = [];
|
|
36
34
|
try {
|
|
37
35
|
const index = await loadIndex(this.config);
|
|
38
36
|
if (index) {
|
|
39
37
|
const regName = this.config.name;
|
|
40
38
|
for (const stash of index.stashes) {
|
|
41
|
-
|
|
39
|
+
bundles.push({ stash, registryName: regName });
|
|
42
40
|
}
|
|
43
41
|
}
|
|
44
42
|
}
|
|
@@ -46,18 +44,18 @@ class StaticIndexProvider {
|
|
|
46
44
|
const label = this.config.name ? `${this.config.name} (${this.config.url})` : this.config.url;
|
|
47
45
|
warnings.push(`Registry ${label}: ${toErrorMessage(err)}`);
|
|
48
46
|
}
|
|
49
|
-
return
|
|
47
|
+
return bundles;
|
|
50
48
|
}
|
|
51
49
|
}
|
|
52
50
|
// ── Self-register ───────────────────────────────────────────────────────────
|
|
53
|
-
|
|
51
|
+
registerRegistryProvider("static-index", (config) => new StaticIndexProvider(config));
|
|
54
52
|
// ── Index loading with cache ────────────────────────────────────────────────
|
|
55
53
|
async function loadIndex(entry) {
|
|
56
54
|
return fetchCachedJson({
|
|
57
55
|
cacheKey: entry.url,
|
|
58
56
|
ttlMs: CACHE_TTL_MS,
|
|
59
57
|
// Both the fresh hit and the stale fallback parse identically; a corrupt
|
|
60
|
-
// cache row lets JSON.parse throw out of the load
|
|
58
|
+
// cache row lets JSON.parse throw out of the load.
|
|
61
59
|
parseCache: (json) => parseRegistryIndex(JSON.parse(json)) ?? undefined,
|
|
62
60
|
fetchFresh: async () => {
|
|
63
61
|
const response = await fetchWithRetry(entry.url, undefined, { timeout: 10_000 });
|
|
@@ -77,12 +75,6 @@ async function loadIndex(entry) {
|
|
|
77
75
|
},
|
|
78
76
|
});
|
|
79
77
|
}
|
|
80
|
-
export function isCacheExpired(mtimeMs) {
|
|
81
|
-
return Date.now() - mtimeMs > CACHE_TTL_MS;
|
|
82
|
-
}
|
|
83
|
-
export function isCacheStale(mtimeMs) {
|
|
84
|
-
return Date.now() - mtimeMs > CACHE_STALE_MS;
|
|
85
|
-
}
|
|
86
78
|
// ── Index parsing (exported for reuse) ──────────────────────────────────────
|
|
87
79
|
export function parseRegistryIndex(data) {
|
|
88
80
|
if (typeof data !== "object" || data === null || Array.isArray(data))
|
|
@@ -113,9 +105,7 @@ function parseBundleEntry(raw) {
|
|
|
113
105
|
const source = asSource(obj.source);
|
|
114
106
|
if (!id || !name || !ref || !source)
|
|
115
107
|
return null;
|
|
116
|
-
//
|
|
117
|
-
// containing a `curated` key parses normally; the key is silently ignored
|
|
118
|
-
// (v1 spec §4.2, docs/migration/v1.md).
|
|
108
|
+
// Some published indexes include `curated`; it is intentionally ignored.
|
|
119
109
|
return {
|
|
120
110
|
id,
|
|
121
111
|
name,
|
|
@@ -132,7 +122,7 @@ function parseBundleEntry(raw) {
|
|
|
132
122
|
};
|
|
133
123
|
}
|
|
134
124
|
// ── Scoring ─────────────────────────────────────────────────────────────────
|
|
135
|
-
function
|
|
125
|
+
function scoreBundles(stashes, query, limit) {
|
|
136
126
|
const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
137
127
|
const scored = [];
|
|
138
128
|
for (const { stash, registryName } of stashes) {
|
|
@@ -247,7 +237,7 @@ function scoreAssets(stashes, query, limit) {
|
|
|
247
237
|
estimatedTokens: asset.estimatedTokens,
|
|
248
238
|
stash: { id: stash.id, name: stash.name },
|
|
249
239
|
registryName,
|
|
250
|
-
action: `akm add ${installRef}`,
|
|
240
|
+
action: `akm bundle add ${installRef}`,
|
|
251
241
|
score: Math.round(score * 1000) / 1000,
|
|
252
242
|
},
|
|
253
243
|
score,
|