akm-cli 0.10.261012-beta → 0.10.261014-beta
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 +710 -3
- package/README.md +15 -0
- package/SECURITY.md +11 -10
- package/STABILITY.md +47 -51
- package/dist/assets/hints/cli-hints-full.md +21 -19
- package/dist/assets/hints/cli-hints-short.md +3 -4
- package/dist/assets/opencode/akm-plugin.js +177 -0
- package/dist/assets/stash-skeleton/README.md +1 -1
- package/dist/assets/tasks/core/improve.yml +1 -1
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +1 -1
- package/dist/assets/ui/config.js +27 -10
- package/dist/assets/workflows/workflow-template.md +2 -2
- package/dist/cli/clack.js +3 -1
- package/dist/cli/selection.js +33 -0
- package/dist/cli/shared.js +14 -1
- package/dist/cli/unknown-flags.js +6 -37
- package/dist/cli.js +69 -48
- package/dist/commands/agent/agent-dispatch.js +17 -25
- package/dist/commands/agent/contribute-cli.js +9 -8
- package/dist/commands/command/command-cli.js +4 -8
- package/dist/commands/command/command-execution.js +25 -39
- package/dist/commands/command/execution-source-loader.js +10 -14
- package/dist/commands/completions.js +1 -1
- package/dist/commands/config-cli.js +14 -5
- package/dist/commands/env/child-env.js +12 -14
- package/dist/commands/env/env-binding.js +47 -58
- package/dist/commands/env/env-cli.js +22 -24
- package/dist/commands/env/env.js +10 -58
- package/dist/commands/env/secret-cli.js +11 -29
- package/dist/commands/env/secret.js +3 -10
- package/dist/commands/health/checks.js +10 -849
- package/dist/commands/health/connections-and-harnesses-check.js +109 -0
- package/dist/commands/health/egress.js +3 -3
- package/dist/commands/health/html-report.js +9 -10
- package/dist/commands/health/plugin-staleness.js +18 -11
- package/dist/commands/health/report-view-model.js +16 -12
- package/dist/commands/health/scheduler-binary.js +1 -1
- package/dist/commands/health/semantic-search-check.js +85 -0
- package/dist/commands/health/type-directory-check.js +0 -3
- package/dist/commands/health.js +30 -42
- package/dist/commands/improve/consolidate/pair-pass.js +10 -25
- package/dist/commands/improve/consolidate.js +10 -15
- package/dist/commands/improve/distill.js +5 -17
- package/dist/commands/improve/eligibility.js +1 -3
- package/dist/commands/improve/execution.js +37 -40
- package/dist/commands/improve/extract-cli.js +6 -11
- package/dist/commands/improve/extract-prompt.js +2 -2
- package/dist/commands/improve/extract.js +67 -97
- package/dist/commands/improve/improve-cli.js +22 -128
- package/dist/commands/improve/improve-report.js +1 -1
- package/dist/commands/improve/improve-strategies.js +25 -108
- package/dist/commands/improve/improve.js +10 -14
- package/dist/commands/improve/loop-stages.js +3 -0
- package/dist/commands/improve/memory/memory-improve.js +1 -1
- package/dist/commands/improve/preparation.js +8 -13
- package/dist/commands/improve/reflect.js +203 -332
- package/dist/commands/improve/retrieval-scope.js +1 -1
- package/dist/commands/improve/session-asset.js +3 -2
- package/dist/commands/improve/stage.js +87 -115
- package/dist/commands/lint/base-linter.js +3 -3
- package/dist/commands/lint/env-key-rules.js +7 -6
- package/dist/commands/lint/index.js +3 -3
- package/dist/commands/models-cli.js +103 -63
- package/dist/commands/proposal/drain.js +26 -39
- package/dist/commands/proposal/proposal-cli.js +14 -18
- package/dist/commands/proposal/propose-cli.js +4 -2
- package/dist/commands/proposal/propose.js +37 -64
- package/dist/commands/proposal/repository.js +17 -17
- package/dist/commands/proposal/validators/proposal-validators.js +3 -6
- package/dist/commands/read/curate.js +10 -6
- package/dist/commands/read/registry-search.js +2 -48
- package/dist/commands/read/search-cli.js +1 -8
- package/dist/commands/read/search.js +5 -6
- package/dist/commands/read/show.js +6 -29
- package/dist/commands/remember.js +25 -40
- package/dist/commands/sources/add-cli.js +8 -63
- package/dist/commands/sources/bundle-cli.js +8 -9
- package/dist/commands/sources/bundle-config-ops.js +2 -2
- package/dist/commands/sources/info.js +12 -1
- package/dist/commands/sources/init.js +1 -1
- package/dist/commands/sources/installed-stashes.js +119 -63
- package/dist/commands/sources/migration-help.js +1 -1
- package/dist/commands/sources/plugin-upgrade.js +8 -15
- package/dist/commands/sources/schema-repair.js +4 -10
- package/dist/commands/sources/source-add.js +2 -2
- package/dist/commands/sources/source-clone.js +31 -7
- package/dist/commands/sources/source-manage.js +4 -4
- package/dist/commands/targets.js +175 -0
- package/dist/commands/tasks/explain.js +104 -69
- package/dist/commands/tasks/tasks-cli.js +9 -11
- package/dist/commands/tasks/tasks.js +75 -97
- package/dist/commands/ui/api.js +11 -3
- package/dist/commands/ui/redact.js +5 -31
- package/dist/commands/ui/workspace-actions.js +1 -1
- package/dist/commands/workflow/plan.js +48 -9
- package/dist/commands/workflow-cli.js +40 -45
- package/dist/core/adapter/adapters/agent-skills-adapter.js +10 -11
- package/dist/core/adapter/adapters/akm-adapter.js +36 -41
- package/dist/core/adapter/adapters/akm-lint.js +10 -12
- package/dist/core/adapter/adapters/akm-metadata.js +2 -2
- package/dist/core/adapter/adapters/akm-task-adapter.js +8 -9
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +5 -5
- package/dist/core/adapter/adapters/claude-adapter.js +1 -1
- package/dist/core/adapter/adapters/dotenv-adapter.js +7 -6
- package/dist/core/adapter/adapters/generic-files-adapter.js +5 -5
- package/dist/core/adapter/adapters/index.js +3 -4
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +12 -14
- package/dist/core/adapter/adapters/okf-adapter.js +8 -10
- package/dist/core/adapter/adapters/opencode-adapter.js +1 -1
- package/dist/core/adapter/adapters/shared.js +3 -3
- package/dist/core/adapter/adapters/tool-dir-shared.js +7 -25
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +3 -3
- package/dist/core/adapter/detect-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +13 -35
- package/dist/core/adapter/registry.js +1 -1
- package/dist/core/adapter/validate-context.js +2 -4
- package/dist/core/asset/asset-placement.js +1 -1
- package/dist/core/asset/asset-ref.js +3 -3
- package/dist/core/asset/resolve-ref.js +5 -0
- package/dist/core/bundle-rename.js +12 -4
- package/dist/core/closest-match.js +37 -0
- package/dist/core/common.js +37 -57
- package/dist/core/config/config-io.js +26 -18
- package/dist/core/config/config-schema.js +19 -106
- package/dist/core/config/config-sources.js +3 -3
- package/dist/core/config/config-types.js +4 -4
- package/dist/core/config/config-walker.js +50 -77
- package/dist/core/config/config.js +438 -109
- package/dist/core/config/convert-engine-references.js +114 -0
- package/dist/core/config/convert-engines-shared.js +40 -0
- package/dist/core/config/convert-engines.js +300 -0
- package/dist/core/config/convert-models-overlay.js +137 -0
- package/dist/core/config/credentials.js +304 -0
- package/dist/core/config/engine-semantics.js +3 -3
- package/dist/core/config/migrate-keys.js +222 -0
- package/dist/core/config/model-aliases.js +37 -0
- package/dist/core/config/models-file.js +34 -0
- package/dist/core/config/retired-engines.js +53 -0
- package/dist/core/config/schema/connections.js +41 -0
- package/dist/core/config/schema/embedding.js +2 -2
- package/dist/core/config/schema/harnesses.js +41 -0
- package/dist/core/config/schema/improve-processes.js +9 -28
- package/dist/core/config/schema/improve.js +36 -1
- package/dist/core/config/schema/index-config.js +18 -20
- package/dist/core/config/schema/primitives.js +42 -17
- package/dist/core/config/schema/search.js +6 -11
- package/dist/core/config/schema/sources-bundles.js +9 -9
- package/dist/core/config/schema/workflow.js +2 -6
- package/dist/core/config/unusable-entries.js +66 -0
- package/dist/core/content-safety.js +3 -6
- package/dist/core/endpoint-url.js +47 -0
- package/dist/core/env-secret-ref.js +84 -73
- package/dist/core/errors.js +10 -16
- package/dist/core/extra-params.js +3 -3
- package/dist/core/improve-result.js +8 -9
- package/dist/core/json-schema.js +1 -1
- package/dist/core/lesson-lint.js +1 -1
- package/dist/core/llm-inference.js +80 -0
- package/dist/core/parse.js +2 -2
- package/dist/core/paths.js +33 -10
- package/dist/core/recognition-util.js +8 -10
- package/dist/core/redaction.js +94 -55
- package/dist/core/ref-token.js +82 -0
- package/dist/core/secret-value.js +14 -0
- package/dist/core/state/migrations.js +17 -22
- package/dist/core/structured.js +2 -68
- package/dist/core/subprocess.js +63 -22
- package/dist/core/type-presentation.js +10 -14
- package/dist/core/write-source.js +20 -4
- package/dist/execution/input-contract.js +3 -6
- package/dist/execution/notices.js +49 -0
- package/dist/execution/resolved-request.js +24 -40
- package/dist/execution/source.js +21 -45
- package/dist/execution/target-ref.js +2 -2
- package/dist/indexer/bundle-identity-guard.js +6 -5
- package/dist/indexer/ensure-index.js +1 -1
- package/dist/indexer/index-writer-lock.js +1 -1
- package/dist/indexer/indexer.js +46 -42
- package/dist/indexer/installations.js +12 -22
- package/dist/indexer/lookup/adapter-concept-owner.js +40 -14
- package/dist/indexer/materialize-embeddings.js +20 -16
- package/dist/indexer/passes/memory-inference.js +21 -50
- package/dist/indexer/passes/metadata.js +5 -5
- package/dist/indexer/scan/doc-to-entry.js +1 -1
- package/dist/indexer/scan/drain-dir.js +9 -11
- package/dist/indexer/search/db-search.js +9 -7
- package/dist/indexer/search/search-source.js +42 -22
- package/dist/indexer/usage/usage-events.js +2 -3
- package/dist/indexer/walk/index-context.js +2 -1
- package/dist/indexer/walk/matchers.js +3 -11
- package/dist/indexer/walk/path-resolver.js +13 -68
- package/dist/indexer/walk/walker.js +32 -26
- package/dist/integrations/agent/akm-read-tools.js +81 -0
- package/dist/integrations/agent/config.js +1 -1
- package/dist/integrations/agent/detect.js +32 -36
- package/dist/integrations/agent/execution.js +130 -428
- package/dist/integrations/agent/index.js +1 -1
- package/dist/integrations/agent/profiles.js +24 -28
- package/dist/integrations/agent/prompts.js +17 -30
- package/dist/integrations/agent/request-lowering.js +67 -101
- package/dist/integrations/agent/resolution.js +332 -0
- package/dist/integrations/agent/runner-dispatch.js +156 -181
- package/dist/integrations/agent/runner.js +20 -70
- package/dist/integrations/agent/runtime-port.js +4 -0
- package/dist/integrations/agent/runtime.js +10 -0
- package/dist/integrations/agent/spawn.js +65 -190
- package/dist/integrations/harnesses/aider/index.js +19 -39
- package/dist/integrations/harnesses/amazonq/index.js +17 -32
- package/dist/integrations/harnesses/claude/index.js +59 -28
- package/dist/integrations/harnesses/claude/session-log.js +7 -5
- package/dist/integrations/harnesses/codex/index.js +19 -31
- package/dist/integrations/harnesses/copilot/index.js +17 -35
- package/dist/integrations/harnesses/gemini/index.js +18 -34
- package/dist/integrations/harnesses/harness.js +36 -0
- package/dist/integrations/harnesses/index.js +20 -51
- package/dist/integrations/harnesses/opencode/agent-builder.js +132 -100
- package/dist/integrations/harnesses/opencode/index.js +11 -33
- package/dist/integrations/harnesses/opencode/roots.js +50 -0
- package/dist/integrations/harnesses/opencode/runtime/binary.js +206 -0
- package/dist/integrations/harnesses/opencode/runtime/command.js +152 -0
- package/dist/integrations/harnesses/opencode/runtime/index.js +177 -0
- package/dist/integrations/harnesses/opencode/runtime/tar.js +107 -0
- package/dist/integrations/harnesses/opencode/session-log-v1.js +15 -7
- package/dist/integrations/harnesses/opencode/session-log-v2.js +72 -48
- package/dist/integrations/harnesses/opencode/session-log.js +58 -137
- package/dist/integrations/harnesses/opencode/version.js +34 -53
- package/dist/integrations/harnesses/openhands/index.js +13 -37
- package/dist/integrations/harnesses/pi/index.js +21 -32
- package/dist/integrations/lockfile.js +1 -1
- package/dist/integrations/session-logs/index.js +11 -31
- package/dist/llm/client.js +93 -111
- package/dist/llm/embedder.js +19 -34
- package/dist/llm/embedders/connection.js +31 -0
- package/dist/llm/embedders/local-model-files.js +56 -0
- package/dist/llm/embedders/local.js +146 -115
- package/dist/llm/embedders/remote.js +26 -23
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/index-passes.js +33 -39
- package/dist/llm/memory-infer.js +67 -77
- package/dist/llm/model-list.js +35 -0
- package/dist/llm/rerank-client.js +8 -14
- package/dist/llm/structured-call.js +45 -99
- package/dist/llm/structured.js +60 -0
- package/dist/output/renderers.js +2 -8
- package/dist/output/shapes/helpers.js +18 -44
- package/dist/output/shapes/passthrough.js +1 -0
- package/dist/output/shapes.js +1 -7
- package/dist/output/text/command-format.js +41 -39
- package/dist/output/text/health-format.js +8 -2
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +12 -0
- package/dist/output/text/models.js +3 -2
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +16 -28
- package/dist/output/text/show-format.js +0 -2
- package/dist/output/text/targets-table.js +70 -0
- package/dist/output/text/workflow-format.js +44 -15
- package/dist/output/text.js +1 -1
- package/dist/registry/providers/skills-sh.js +1 -28
- package/dist/registry/providers/static-index.js +1 -71
- package/dist/runtime.js +6 -2
- package/dist/scripts/akm-migrate-node.js +47095 -44905
- package/dist/scripts/akm-migrate.js +46946 -44755
- package/dist/setup/detect.js +28 -273
- package/dist/setup/endpoint.js +36 -0
- package/dist/setup/semantic-assets.js +13 -19
- package/dist/setup/setup-flags.js +77 -0
- package/dist/setup/setup-plan.js +144 -0
- package/dist/setup/setup.js +134 -358
- package/dist/setup/steps/connection-shared.js +49 -101
- package/dist/setup/steps/connection.js +121 -524
- package/dist/setup/steps/embeddings.js +151 -0
- package/dist/setup/steps/harnesses.js +118 -0
- package/dist/setup/steps/platforms.js +2 -81
- package/dist/setup/steps/tasks.js +1 -2
- package/dist/setup/steps.js +10 -0
- package/dist/setup/summary.js +67 -0
- package/dist/sources/freshness.js +16 -21
- package/dist/sources/providers/git-provider.js +2 -9
- package/dist/sources/providers/provider-utils.js +13 -5
- package/dist/sources/resolve.js +12 -16
- package/dist/sources/snapshot-fetchers/robots.js +11 -12
- package/dist/sources/snapshot-fetchers/secret-seam.js +2 -4
- package/dist/sources/snapshot-fetchers/website-ingest.js +8 -15
- package/dist/sources/snapshot-fetchers/x.js +1 -1
- package/dist/standalone/onnxruntime-library.js +52 -0
- package/dist/storage/repositories/improve-ledger-repository.js +1 -1
- package/dist/storage/repositories/improve-runs-repository.js +0 -13
- package/dist/storage/repositories/index-entries-repository.js +2 -2
- package/dist/storage/repositories/proposals-repository.js +2 -2
- package/dist/storage/repositories/task-history-repository.js +2 -2
- package/dist/storage/repositories/workflow-runs-repository.js +44 -129
- package/dist/storage/sqlite-read-snapshot.js +33 -29
- package/dist/tasks/embedded.js +1 -1
- package/dist/tasks/log-redaction.js +7 -119
- package/dist/tasks/prepare/prepare-support.js +8 -7
- package/dist/tasks/prepare/prepare.js +8 -9
- package/dist/tasks/prepare/script-capture.js +9 -25
- package/dist/tasks/run/attempt-lifecycle.js +17 -35
- package/dist/tasks/run/load-task.js +54 -27
- package/dist/tasks/run/run-command-task.js +15 -10
- package/dist/tasks/run/run-native-task.js +8 -21
- package/dist/tasks/run/run-task.js +5 -8
- package/dist/tasks/run/run-workflow-task.js +14 -21
- package/dist/tasks/run/task-history.js +9 -17
- package/dist/tasks/run/task-log.js +1 -5
- package/dist/tasks/scheduler-invocation.js +13 -18
- package/dist/tasks/scheduler-sync.js +0 -1
- package/dist/tasks/source/bounded-document.js +31 -117
- package/dist/tasks/source/parse-task-source.js +0 -1
- package/dist/tasks/source/project-v4.js +5 -3
- package/dist/tasks/source/task-input-diagnostics.js +3 -4
- package/dist/tasks/source/task-source-v4.js +48 -72
- package/dist/tasks/source-v3.js +2 -5
- package/dist/tasks/task-run-reserved-flags.js +1 -2
- package/dist/workflows/authoring/authoring.js +2 -7
- package/dist/workflows/compile.js +1 -15
- package/dist/workflows/concurrency-policy.js +4 -4
- package/dist/workflows/exec/child-workflow.js +1 -4
- package/dist/workflows/exec/dispatch-redaction.js +35 -86
- package/dist/workflows/exec/environment.js +13 -77
- package/dist/workflows/exec/exec-unit.js +14 -55
- package/dist/workflows/exec/frozen-judge.js +26 -28
- package/dist/workflows/exec/native-executor.js +126 -71
- package/dist/workflows/exec/run-workflow.js +38 -42
- package/dist/workflows/exec/step-work.js +13 -17
- package/dist/workflows/exec/unit-dispatch.js +7 -21
- package/dist/workflows/freeze/environment.js +14 -119
- package/dist/workflows/freeze/freeze.js +14 -33
- package/dist/workflows/freeze/step-values.js +6 -13
- package/dist/workflows/freeze/targets/child-workflow.js +3 -5
- package/dist/workflows/freeze/targets/command.js +9 -15
- package/dist/workflows/freeze/targets/shell.js +0 -3
- package/dist/workflows/freeze/task-bindings.js +0 -1
- package/dist/workflows/parser.js +50 -59
- package/dist/workflows/plan.js +8 -2
- package/dist/workflows/renderer.js +83 -9
- package/dist/workflows/resource-limits.js +2 -2
- package/dist/workflows/runtime/run-plan.js +38 -23
- package/dist/workflows/runtime/runs.js +55 -93
- package/dist/workflows/runtime/workflow-asset-loader.js +55 -86
- package/dist/workflows/source-files.js +7 -19
- package/docs/README.md +10 -16
- package/docs/architecture/README.md +2 -37
- package/docs/architecture/adapters.md +2 -2
- package/docs/architecture/akm-core-principles.md +256 -118
- package/docs/architecture/architecture.md +283 -99
- package/docs/architecture/improvement.md +8 -2
- package/docs/architecture/internals/classification.md +1 -3
- package/docs/architecture/internals/fresh-host-rebuild-runbook.md +7 -6
- package/docs/architecture/internals/health-advisories.md +35 -74
- package/docs/architecture/internals/improve-workflow.md +27 -26
- package/docs/architecture/internals/indexing.md +3 -3
- package/docs/architecture/internals/storage-locations.md +48 -15
- package/docs/architecture/persisted-data-compat.md +10 -6
- package/docs/architecture/specs/okf-support.md +9 -11
- package/docs/architecture/specs/ref.md +7 -9
- package/docs/architecture/testing/testing-workflow.md +172 -52
- package/docs/architecture/workflow-engine.md +51 -34
- package/docs/guides/README.md +0 -1
- package/docs/guides/author-bundles.md +15 -20
- package/docs/guides/author-workflows.md +93 -71
- package/docs/guides/bundles.md +20 -16
- package/docs/guides/discover-and-load.md +1 -1
- package/docs/guides/getting-started.md +49 -3
- package/docs/guides/improve-the-library.md +10 -4
- package/docs/guides/recipes/headless-install.md +11 -16
- package/docs/guides/run-workflows.md +29 -20
- package/docs/guides/scheduling.md +2 -2
- package/docs/guides/use-with-any-agent.md +20 -22
- package/docs/integration/bundling-akm.md +19 -9
- package/docs/maintainers/README.md +2 -6
- package/docs/maintainers/release-checklist.md +73 -126
- package/docs/migration/README.md +10 -3
- package/docs/migration/release-notes/0.10.0.md +81 -16
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0.md +1 -1
- package/docs/migration/release-notes/README.md +1 -1
- package/docs/migration/v0.9-to-v0.10.md +300 -60
- package/docs/migration/v0.9.1-to-v0.9.2.md +6 -5
- package/docs/posts/config-v2-lessons-16.md +1 -1
- package/docs/posts/llm-mode-reflect-13.md +1 -1
- package/docs/posts/release-0.6.0.md +11 -11
- package/docs/posts/release-0.8.0.md +4 -4
- package/docs/posts/workflows-vaults-09.md +1 -1
- package/docs/reference/README.md +1 -1
- package/docs/reference/asset-types.md +2 -2
- package/docs/reference/cli.md +477 -388
- package/docs/reference/configuration.md +569 -550
- package/docs/reference/data-and-telemetry.md +9 -6
- package/docs/reference/env-and-secrets.md +72 -15
- package/docs/reference/refs.md +3 -20
- package/docs/reference/registry.md +12 -38
- package/docs/reference/supported-formats.md +1 -1
- package/docs/reference/tasks.md +22 -11
- package/docs/reference/ui-api.md +14 -9
- package/docs/reference/workflow-schema.md +199 -154
- package/docs/reference/workflows.md +4 -6
- package/package.json +9 -11
- package/schemas/akm-config.json +1696 -2922
- package/schemas/akm-task.json +4 -4
- package/schemas/akm-workflow.json +36 -9
- package/ROADMAP.md +0 -112
- package/dist/assets/models.json +0 -35
- package/dist/commands/health/engine-usage.js +0 -45
- package/dist/commands/sources/dangerous-env-audit.js +0 -134
- package/dist/core/activation-policy.js +0 -67
- package/dist/core/config/schema/engines.js +0 -160
- package/dist/core/config/schema/execution.js +0 -23
- package/dist/core/spawn-env.js +0 -268
- package/dist/execution/directory-identity.js +0 -78
- package/dist/integrations/agent/builder-shared.js +0 -33
- package/dist/integrations/agent/builders.js +0 -43
- package/dist/integrations/agent/engine-fallback.js +0 -59
- package/dist/integrations/agent/engine-resolution.js +0 -333
- package/dist/integrations/agent/model-map.js +0 -475
- package/dist/integrations/harnesses/aider/agent-builder.js +0 -107
- package/dist/integrations/harnesses/aider/result-extractor.js +0 -53
- package/dist/integrations/harnesses/amazonq/agent-builder.js +0 -138
- package/dist/integrations/harnesses/amazonq/result-extractor.js +0 -48
- package/dist/integrations/harnesses/claude/agent-builder.js +0 -106
- package/dist/integrations/harnesses/claude/config-import.js +0 -67
- package/dist/integrations/harnesses/claude/result-extractor.js +0 -67
- package/dist/integrations/harnesses/codex/agent-builder.js +0 -150
- package/dist/integrations/harnesses/codex/result-extractor.js +0 -110
- package/dist/integrations/harnesses/copilot/agent-builder.js +0 -117
- package/dist/integrations/harnesses/copilot/result-extractor.js +0 -178
- package/dist/integrations/harnesses/gemini/agent-builder.js +0 -114
- package/dist/integrations/harnesses/gemini/result-extractor.js +0 -149
- package/dist/integrations/harnesses/opencode/config-import.js +0 -149
- package/dist/integrations/harnesses/opencode/model-config.js +0 -33
- package/dist/integrations/harnesses/opencode/model-work-agent.js +0 -115
- package/dist/integrations/harnesses/opencode/session-log-types.js +0 -12
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -44
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +0 -1052
- package/dist/integrations/harnesses/opencode-sdk/v1-adapter.js +0 -199
- package/dist/integrations/harnesses/opencode-sdk/v2-adapter.js +0 -254
- package/dist/integrations/harnesses/opencode-sdk/wire.js +0 -66
- package/dist/integrations/harnesses/openhands/agent-builder.js +0 -120
- package/dist/integrations/harnesses/openhands/result-extractor.js +0 -135
- package/dist/integrations/harnesses/pi/agent-builder.js +0 -89
- package/dist/integrations/harnesses/pi/result-extractor.js +0 -168
- package/dist/integrations/harnesses/shared.js +0 -18
- package/dist/integrations/harnesses/types.js +0 -55
- package/dist/llm/feature-gate.js +0 -115
- package/dist/output/shapes/models-list.js +0 -16
- package/dist/output/shapes/registry-search.js +0 -10
- package/dist/setup/detected-engines.js +0 -136
- package/dist/setup/engine-config.js +0 -97
- package/dist/setup/harness-config-import.js +0 -47
- package/dist/setup/providers.js +0 -14
- package/dist/setup/steps/semantic.js +0 -39
- package/dist/workflows/authoring/scope-key.js +0 -79
- package/dist/workflows/exec/lowering-notices.js +0 -23
- package/dist/workflows/source-semantics.js +0 -110
- package/docs/architecture/0.10-process-rules.md +0 -832
- package/docs/architecture/akm-architecture-decision-history.md +0 -2055
- package/docs/architecture/comparisons/claude-code-vs-akm-workflows-full.md +0 -550
- package/docs/architecture/decisions/0001-no-interpolation-attached-structured-context.md +0 -72
- package/docs/architecture/decisions/0002-unit-reuse-and-input-hash-scope.md +0 -142
- package/docs/architecture/decisions/0003-child-env-allowlist-and-provenance.md +0 -189
- package/docs/architecture/decisions/0004-task-input-contract-and-flag-coercion.md +0 -97
- package/docs/architecture/decisions/0005-task-result-vocabulary-and-legacy-read-mapping.md +0 -108
- package/docs/architecture/decisions/0006-task-source-version-routing.md +0 -124
- package/docs/architecture/decisions/0007-workflow-composition-bounds.md +0 -83
- package/docs/architecture/decisions/0008-task-binding-normalization.md +0 -88
- package/docs/architecture/decisions/0009-child-run-publication-column-parity.md +0 -80
- package/docs/architecture/decisions/0010-driver-protocol-cut.md +0 -36
- package/docs/architecture/decisions/0011-engine-run-loop-invariants.md +0 -125
- package/docs/architecture/decisions/README.md +0 -62
- package/docs/architecture/internals/functional-contract-patterns.md +0 -340
- package/docs/architecture/internals/registry-network-boundary.md +0 -57
- package/docs/architecture/internals/search.md +0 -248
- package/docs/architecture/reviews/env-secret-access.md +0 -319
- package/docs/architecture/runtime-boundary-design.md +0 -153
- package/docs/architecture/specs/0.9.0-close-out-plan.md +0 -361
- package/docs/architecture/specs/0.9.0-decisions.md +0 -532
- package/docs/architecture/specs/0.9.0-docs-code-drift-register.md +0 -745
- package/docs/architecture/specs/0.9.0-open-items-register.md +0 -135
- package/docs/architecture/specs/0.9.0-public-api-issue-backlog.md +0 -740
- package/docs/architecture/specs/0.9.0-release-surface-review.md +0 -636
- package/docs/architecture/specs/agent-command-engine-model-design.md +0 -513
- package/docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md +0 -501
- package/docs/architecture/specs/akm-0.9.0-ref-grammar-decision.md +0 -291
- package/docs/architecture/specs/akm-format-neutral-bundle-workspace-spec.md +0 -2059
- package/docs/architecture/specs/di-seams-plan.md +0 -539
- package/docs/architecture/specs/driver-protocol-keep-or-cut.md +0 -275
- package/docs/architecture/specs/fact-asset-type.md +0 -142
- package/docs/architecture/specs/improve-collapse-churn-detector-design.md +0 -634
- package/docs/architecture/specs/reviews/task-workflow-unification/README.md +0 -72
- package/docs/architecture/specs/reviews/task-workflow-unification/findings-consolidated.md +0 -152
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-alternatives.md +0 -352
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-bunqueue.md +0 -300
- package/docs/architecture/specs/reviews/task-workflow-unification/library-eval-openworkflow.md +0 -402
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-1.md +0 -758
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-2.md +0 -645
- package/docs/architecture/specs/reviews/task-workflow-unification/opus-review-3.md +0 -602
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-adversarial.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-architecture.md +0 -27
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-coverage.md +0 -74
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r1-security.md +0 -15
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-adversarial.md +0 -132
- package/docs/architecture/specs/reviews/task-workflow-unification/panel-r2-verification.md +0 -147
- package/docs/architecture/specs/stash-conventions-code-spec.md +0 -275
- package/docs/architecture/specs/stash-organization-conventions.md +0 -377
- package/docs/architecture/specs/task-workflow-format-unification.md +0 -721
- package/docs/architecture/specs/workflow-engine-buy-vs-build.md +0 -231
- package/docs/architecture/specs/workflow-format-unification.md +0 -432
- package/docs/architecture/testing/manual-testing-checklist.md +0 -3411
- package/docs/architecture/testing/okf-v0.2-conformance-runbook.md +0 -924
- package/docs/architecture/testing/task-workflow-manual-tests.md +0 -1720
- package/docs/guides/claude-code-vs-akm-workflows.md +0 -29
- package/docs/guides/knowledge-management.md +0 -18
- package/docs/maintainers/curate-workmap.md +0 -335
- package/docs/migration/v0.5-to-v0.6.md +0 -759
- package/docs/migration/v0.7-to-v0.8.md +0 -1378
- package/docs/plans/0.9.2-agent-command-workflow-plan.md +0 -423
|
@@ -28,14 +28,13 @@ export async function searchRegistry(query, options) {
|
|
|
28
28
|
const provider = createProvider(entry, warnings);
|
|
29
29
|
if (!provider)
|
|
30
30
|
return Promise.resolve(null);
|
|
31
|
-
return provider.search({ query: trimmed, limit
|
|
31
|
+
return provider.search({ query: trimmed, limit });
|
|
32
32
|
}));
|
|
33
33
|
// Merge results grouped by provider
|
|
34
34
|
// Each provider batch is normalized to [0, 1] before merging so that raw
|
|
35
35
|
// scores from different providers (e.g. static-index can exceed 1.85 while
|
|
36
36
|
// skills-sh uses installs-relative scoring) are comparable in the merged list.
|
|
37
37
|
const allHits = [];
|
|
38
|
-
const allAssetHits = [];
|
|
39
38
|
for (let i = 0; i < results.length; i++) {
|
|
40
39
|
const result = results[i];
|
|
41
40
|
if (result.status === "rejected") {
|
|
@@ -61,21 +60,6 @@ export async function searchRegistry(query, options) {
|
|
|
61
60
|
for (const hit of validHits) {
|
|
62
61
|
allHits.push(hit);
|
|
63
62
|
}
|
|
64
|
-
if (value.assetHits) {
|
|
65
|
-
const validAssetHits = [];
|
|
66
|
-
for (const hit of value.assetHits) {
|
|
67
|
-
if (isCompleteAssetHit(hit)) {
|
|
68
|
-
validAssetHits.push(hit);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
dropped++;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
normalizeScores(validAssetHits);
|
|
75
|
-
for (const hit of validAssetHits) {
|
|
76
|
-
allAssetHits.push(hit);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
63
|
if (dropped > 0) {
|
|
80
64
|
warnings.push(`Registry ${registryLabel} returned ${dropped} incomplete hit(s); dropped from response.`);
|
|
81
65
|
}
|
|
@@ -85,14 +69,7 @@ export async function searchRegistry(query, options) {
|
|
|
85
69
|
// Sort merged hits by normalized score descending, apply limit
|
|
86
70
|
allHits.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
|
|
87
71
|
const limitedHits = allHits.slice(0, limit);
|
|
88
|
-
|
|
89
|
-
const limitedAssetHits = allAssetHits.slice(0, limit);
|
|
90
|
-
return {
|
|
91
|
-
query: trimmed,
|
|
92
|
-
hits: limitedHits,
|
|
93
|
-
warnings,
|
|
94
|
-
assetHits: limitedAssetHits.length > 0 ? limitedAssetHits : undefined,
|
|
95
|
-
};
|
|
72
|
+
return { query: trimmed, hits: limitedHits, warnings };
|
|
96
73
|
}
|
|
97
74
|
// ── Registry resolution ─────────────────────────────────────────────────────
|
|
98
75
|
/**
|
|
@@ -216,26 +193,3 @@ function isCompleteHit(hit) {
|
|
|
216
193
|
typeof hit.installRef === "string" &&
|
|
217
194
|
hit.installRef.length > 0);
|
|
218
195
|
}
|
|
219
|
-
function isCompleteAssetHit(hit) {
|
|
220
|
-
if (!hit || typeof hit !== "object")
|
|
221
|
-
return false;
|
|
222
|
-
if (hit.type !== "registry-asset" ||
|
|
223
|
-
typeof hit.assetType !== "string" ||
|
|
224
|
-
hit.assetType.length === 0 ||
|
|
225
|
-
typeof hit.assetName !== "string" ||
|
|
226
|
-
hit.assetName.length === 0 ||
|
|
227
|
-
typeof hit.action !== "string") {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
// `stash` is required by the consumer (output shaping + asset-action display);
|
|
231
|
-
// rejecting incomplete stashes here keeps malformed objects out of the JSON
|
|
232
|
-
// output. Flagged in PR #168 review (#9).
|
|
233
|
-
const stash = hit.stash;
|
|
234
|
-
if (!stash || typeof stash !== "object")
|
|
235
|
-
return false;
|
|
236
|
-
if (typeof stash.id !== "string" || stash.id.length === 0)
|
|
237
|
-
return false;
|
|
238
|
-
if (typeof stash.name !== "string" || stash.name.length === 0)
|
|
239
|
-
return false;
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
@@ -47,11 +47,6 @@ export const searchCommand = defineJsonCommand({
|
|
|
47
47
|
},
|
|
48
48
|
limit: { type: "string", description: "Maximum number of results" },
|
|
49
49
|
from: { type: "string", description: "Search source (local|registry|all)", default: "local" },
|
|
50
|
-
assets: {
|
|
51
|
-
type: "boolean",
|
|
52
|
-
description: "Include asset-level search results (only meaningful with --from registry|all)",
|
|
53
|
-
default: false,
|
|
54
|
-
},
|
|
55
50
|
filter: scopeFilterArg,
|
|
56
51
|
"include-proposed": {
|
|
57
52
|
type: "boolean",
|
|
@@ -77,7 +72,6 @@ export const searchCommand = defineJsonCommand({
|
|
|
77
72
|
const includeProposed = args["include-proposed"] === true;
|
|
78
73
|
const belief = parseBeliefFilterMode(typeof args.belief === "string" ? args.belief : undefined);
|
|
79
74
|
const includeSessions = args["include-sessions"];
|
|
80
|
-
const assets = args.assets === true;
|
|
81
75
|
const outputMode = getOutputMode();
|
|
82
76
|
const result = await akmSearch({
|
|
83
77
|
query,
|
|
@@ -88,7 +82,6 @@ export const searchCommand = defineJsonCommand({
|
|
|
88
82
|
includeProposed,
|
|
89
83
|
belief,
|
|
90
84
|
includeSessions,
|
|
91
|
-
assets,
|
|
92
85
|
eventSource: resolveUsageEventSource(),
|
|
93
86
|
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
94
87
|
});
|
|
@@ -161,7 +154,7 @@ export async function runCurate(args, outputMode) {
|
|
|
161
154
|
source: parseSearchSource(args.from ?? "local"),
|
|
162
155
|
filters: parseScopeFilterFlags(args.filters ?? [], "--filter"),
|
|
163
156
|
belief: parseBeliefFilterMode(args.belief ?? "current"),
|
|
164
|
-
eventSource: resolveUsageEventSource(),
|
|
157
|
+
eventSource: args.eventSource ?? resolveUsageEventSource(),
|
|
165
158
|
attributionProjection: outputMode.shape === "agent" ? "agent" : outputMode.detail,
|
|
166
159
|
});
|
|
167
160
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* `akm search` — entry point.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Search consults the local FTS5 index. There is one query path
|
|
8
8
|
* because there is one data store. Provider fan-out is gone.
|
|
9
9
|
*
|
|
10
10
|
* The orchestration here is thin: build the FTS query, optionally interleave
|
|
@@ -125,9 +125,7 @@ export async function akmSearch(input) {
|
|
|
125
125
|
includeExcludedTypes: input.includeSessions === true,
|
|
126
126
|
readOnly: input.readOnly,
|
|
127
127
|
});
|
|
128
|
-
const registryResult = source === "local"
|
|
129
|
-
? undefined
|
|
130
|
-
: await searchRegistry(query, { limit, includeAssets: input.assets === true, registries: config.registries });
|
|
128
|
+
const registryResult = source === "local" ? undefined : await searchRegistry(query, { limit, registries: config.registries });
|
|
131
129
|
if (source === "local") {
|
|
132
130
|
const localHits = localResult?.hits ?? [];
|
|
133
131
|
const warnings = [...(localResult?.warnings ?? []), ...duplicateConceptWarnings(localHits, config.defaultBundle)];
|
|
@@ -154,6 +152,7 @@ export async function akmSearch(input) {
|
|
|
154
152
|
id: hit.id,
|
|
155
153
|
description: hit.description,
|
|
156
154
|
action: `akm bundle add ${installRef} -> then search again`,
|
|
155
|
+
installRef,
|
|
157
156
|
score: hit.score,
|
|
158
157
|
registryName: hit.registryName,
|
|
159
158
|
...(hit.warnings && hit.warnings.length > 0 ? { warnings: hit.warnings } : {}),
|
|
@@ -317,8 +316,8 @@ function logSearchEvent(rawQuery, response, mode = "keyword", eventSource = "use
|
|
|
317
316
|
}
|
|
318
317
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
319
318
|
/**
|
|
320
|
-
* Validate a named `--from` against the bundle-derived source list (
|
|
321
|
-
*
|
|
319
|
+
* Validate a named `--from` against the bundle-derived source list (a named
|
|
320
|
+
* source is a `bundles` key, matched via its derived
|
|
322
321
|
* source entry's `name`, or an exact path). Throws INVALID_SOURCE_VALUE with
|
|
323
322
|
* the known names before any stash access can fail differently.
|
|
324
323
|
*/
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* `akm show` — entry point.
|
|
6
6
|
*
|
|
7
|
-
* Spec §6.2:
|
|
8
|
-
*
|
|
9
7
|
* show(ref) → indexer.lookup(ref) → readFile(entry.filePath)
|
|
10
8
|
*
|
|
11
9
|
* The richer presentation logic (matchers, renderers, edit-hints,
|
|
@@ -26,7 +24,7 @@ import { extractSection, markdownFragmentSlugs } from "../../core/asset/markdown
|
|
|
26
24
|
import { buildMarkdownLeadContext, fragmentForSelector, MARKDOWN_FRAGMENT_CONTEXT_DEFAULT_MAX_CHARS, } from "../../core/asset/markdown-fragments.js";
|
|
27
25
|
import { displayRef, displayRefForConceptId, typeNameFromConceptId } from "../../core/asset/resolve-ref.js";
|
|
28
26
|
import { META_DIR, parseMetaRef, readMetaFile } from "../../core/asset/stash-meta.js";
|
|
29
|
-
import { asNonEmptyString,
|
|
27
|
+
import { asNonEmptyString, isContainedResolvedPath } from "../../core/common.js";
|
|
30
28
|
import { loadConfig } from "../../core/config/config.js";
|
|
31
29
|
import { NotFoundError, rethrowIfDataDirUnreadable, rethrowIfTestIsolationError, UsageError } from "../../core/errors.js";
|
|
32
30
|
import { appendEvent } from "../../core/events.js";
|
|
@@ -45,13 +43,11 @@ import { withIndexDb } from "../../storage/repositories/index-db.js";
|
|
|
45
43
|
import { getEntryById, getEntryIdByFilePath } from "../../storage/repositories/index-entries-repository.js";
|
|
46
44
|
import { getIndexedMarkdownFragment } from "../../storage/repositories/index-fts-repository.js";
|
|
47
45
|
import { readEntryLinks } from "../../storage/repositories/index-links-repository.js";
|
|
48
|
-
import { getCurrentWorkflowScopeKey } from "../../workflows/authoring/scope-key.js";
|
|
49
46
|
import { buildWorkflowAction } from "../../workflows/renderer.js";
|
|
50
|
-
import { getActiveWorkflowRun } from "../../workflows/runtime/runs.js";
|
|
51
47
|
/**
|
|
52
48
|
* Unified show: queries the local FTS5 index, then reads that row's file path.
|
|
53
49
|
* A physical owner can arbitrate collisions during lookup, but show never
|
|
54
|
-
* renders an asset without an indexed row
|
|
50
|
+
* renders an asset without an indexed row; no provider or disk
|
|
55
51
|
* fallback.
|
|
56
52
|
*
|
|
57
53
|
* When `detail` is `"brief"` or `"summary"`, the response omits
|
|
@@ -381,20 +377,6 @@ export async function showLocal(input) {
|
|
|
381
377
|
}
|
|
382
378
|
if (response.type === "workflow")
|
|
383
379
|
response.action = buildWorkflowAction(canonicalRef);
|
|
384
|
-
// 07 P1-D: provenance-aware toolPolicy CEILING. An agent's self-declared
|
|
385
|
-
// `tools` frontmatter is honoured ONLY for the operator's own PRIMARY stash —
|
|
386
|
-
// the assets they authored. Every other source is content pulled from
|
|
387
|
-
// elsewhere and must not name its own tool grant: registry-installed packs, a
|
|
388
|
-
// configured secondary source, and even a git source the operator marked
|
|
389
|
-
// `--writable` to contribute edits upstream (writability is "can I push", not
|
|
390
|
-
// "do I trust this content to grant itself tools"). Drop the policy so dispatch
|
|
391
|
-
// falls back to the parent/default grant. Keys off primary-stash identity —
|
|
392
|
-
// `allSources[0]` is always the primary (search-source.ts) — not a
|
|
393
|
-
// name-derived registryId or the orthogonal `writable` bit. `source` undefined
|
|
394
|
-
// (unresolved path) also fails closed.
|
|
395
|
-
if (response.toolPolicy !== undefined && !isPrimaryStash) {
|
|
396
|
-
delete response.toolPolicy;
|
|
397
|
-
}
|
|
398
380
|
const editable = isEditable(assetPath, config, allSources);
|
|
399
381
|
// Evidence must describe the same revision as the rendered claim: ordinary
|
|
400
382
|
// Markdown show is source-live, while indexed fragment show is a snapshot.
|
|
@@ -421,10 +403,6 @@ export async function showLocal(input) {
|
|
|
421
403
|
...(!editable ? { editHint: buildEditHint(canonicalRef) } : {}),
|
|
422
404
|
...showLinks(indexedEntry.itemRef, displayDefaultBundle, input.readOnly === true),
|
|
423
405
|
};
|
|
424
|
-
const activeRun = input.readOnly ? null : await getActiveWorkflowRun(getCurrentWorkflowScopeKey());
|
|
425
|
-
if (activeRun) {
|
|
426
|
-
fullResponse.activeRun = activeRun;
|
|
427
|
-
}
|
|
428
406
|
if (input.detail === "brief") {
|
|
429
407
|
return buildBriefResponse(fullResponse, assetPath);
|
|
430
408
|
}
|
|
@@ -513,16 +491,15 @@ function findUnrecognizedScriptSource(assetParts, sources) {
|
|
|
513
491
|
continue;
|
|
514
492
|
const sourceRoot = path.resolve(source.path);
|
|
515
493
|
const candidate = path.resolve(assetPathForName("script", path.join(sourceRoot, scriptDir), assetParts.name));
|
|
516
|
-
if (!
|
|
494
|
+
if (!isContainedResolvedPath(candidate, sourceRoot))
|
|
517
495
|
continue;
|
|
518
496
|
const authoredStat = fs.lstatSync(candidate);
|
|
519
497
|
if (!authoredStat.isFile() && !authoredStat.isSymbolicLink())
|
|
520
498
|
continue;
|
|
521
|
-
const realRoot = fs.realpathSync(sourceRoot);
|
|
522
499
|
const realCandidate = fs.realpathSync(candidate);
|
|
523
|
-
if (!
|
|
500
|
+
if (!fs.statSync(realCandidate).isFile())
|
|
524
501
|
continue;
|
|
525
|
-
return { extension, path: realCandidate, sourceRoot:
|
|
502
|
+
return { extension, path: realCandidate, sourceRoot: fs.realpathSync(sourceRoot) };
|
|
526
503
|
}
|
|
527
504
|
catch {
|
|
528
505
|
// Missing, unreadable, dangling, or otherwise unsafe paths remain normal
|
|
@@ -534,7 +511,7 @@ function findUnrecognizedScriptSource(assetParts, sources) {
|
|
|
534
511
|
/**
|
|
535
512
|
* Minimal `show`: ref → indexer lookup → file contents. Used by callers that
|
|
536
513
|
* just need the raw file (e.g. clone, write-source) and don't want the full
|
|
537
|
-
* renderer graph.
|
|
514
|
+
* renderer graph.
|
|
538
515
|
*/
|
|
539
516
|
export async function showByRef(ref) {
|
|
540
517
|
const parsed = parseBundleRef(ref);
|
|
@@ -12,10 +12,12 @@ import { serializeFrontmatter } from "../core/asset/asset-serialize.js";
|
|
|
12
12
|
import { DESCRIPTION_MAX_CHARS } from "../core/authoring-rules.js";
|
|
13
13
|
import { toErrorMessage, tryReadStdinText } from "../core/common.js";
|
|
14
14
|
import { loadConfig } from "../core/config/config.js";
|
|
15
|
+
import { SHIPPED_ALIAS } from "../core/config/model-aliases.js";
|
|
15
16
|
import { ConfigError, UsageError } from "../core/errors.js";
|
|
16
17
|
import { parseEmbeddedJsonResponse } from "../core/parse.js";
|
|
17
18
|
import { DURATION_UNITS, parseDuration as parseDurationSpec } from "../core/time.js";
|
|
18
19
|
import { warn } from "../core/warn.js";
|
|
20
|
+
import { noticeSet } from "../execution/notices.js";
|
|
19
21
|
import { SCOPE_KEYS } from "../indexer/passes/metadata.js";
|
|
20
22
|
import { callStructured } from "../llm/structured-call.js";
|
|
21
23
|
import { withLlmStage } from "../llm/usage-telemetry.js";
|
|
@@ -222,7 +224,7 @@ export function parseEnrichObserved(parsed) {
|
|
|
222
224
|
}
|
|
223
225
|
return undefined;
|
|
224
226
|
}
|
|
225
|
-
/**
|
|
227
|
+
/** Timeout for the `--enrich` LLM call, in place of the connection's own. */
|
|
226
228
|
const LLM_ENRICH_TIMEOUT_MS = 10_000;
|
|
227
229
|
/**
|
|
228
230
|
* Attempt LLM enrichment of memory metadata. Returns merged metadata
|
|
@@ -232,14 +234,14 @@ const LLM_ENRICH_TIMEOUT_MS = 10_000;
|
|
|
232
234
|
*/
|
|
233
235
|
export async function runLlmEnrich(body) {
|
|
234
236
|
const config = loadConfig();
|
|
235
|
-
const resolved = resolveImproveExecution({ config, processName: "remember-enrich" });
|
|
237
|
+
const resolved = resolveImproveExecution({ config, processName: "remember-enrich", alias: SHIPPED_ALIAS.enrich });
|
|
236
238
|
if (!resolved) {
|
|
237
|
-
warn("Warning: --enrich requires
|
|
239
|
+
warn("Warning: --enrich requires a connection or harness to be configured. Run `akm setup` to configure one.");
|
|
238
240
|
return { tags: [] };
|
|
239
241
|
}
|
|
240
242
|
const runner = resolved.runner;
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
+
const notices = noticeSet();
|
|
244
|
+
notices.add(resolved.notices);
|
|
243
245
|
const prompt = `You are a memory tagger for a developer knowledge base.
|
|
244
246
|
Given the memory text below, return ONLY a JSON object with these fields:
|
|
245
247
|
- "tags": array of 1-5 short lowercase keyword tags
|
|
@@ -251,53 +253,36 @@ ${body.slice(0, 2000)}
|
|
|
251
253
|
|
|
252
254
|
Return ONLY the JSON object, no prose, no markdown fences.`;
|
|
253
255
|
try {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
},
|
|
270
|
-
parse: (raw) => raw ?? "",
|
|
271
|
-
onError: () => "",
|
|
272
|
-
fallback: "",
|
|
273
|
-
})),
|
|
274
|
-
new Promise((_, reject) => {
|
|
275
|
-
timeoutHandle = setTimeout(() => reject(new Error("LLM enrichment timed out")), LLM_ENRICH_TIMEOUT_MS);
|
|
276
|
-
}),
|
|
277
|
-
]);
|
|
278
|
-
}
|
|
279
|
-
finally {
|
|
280
|
-
if (timeoutHandle !== undefined) {
|
|
281
|
-
clearTimeout(timeoutHandle);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
})();
|
|
285
|
-
const parsed = parseEmbeddedJsonResponse(result);
|
|
256
|
+
const outcome = await withLlmStage("remember", () => callStructured({
|
|
257
|
+
runner,
|
|
258
|
+
messages: [
|
|
259
|
+
{ role: "system", content: "Return only valid JSON. No prose." },
|
|
260
|
+
{ role: "user", content: prompt },
|
|
261
|
+
],
|
|
262
|
+
// The write path must not block on a misbehaving endpoint.
|
|
263
|
+
request: { maxTokens: 256, temperature: 0.1, timeoutMs: LLM_ENRICH_TIMEOUT_MS },
|
|
264
|
+
onNotices: notices.add,
|
|
265
|
+
}));
|
|
266
|
+
if (!outcome.ok) {
|
|
267
|
+
warn(`Warning: --enrich failed (${outcome.error}). Writing memory without enrichment.`);
|
|
268
|
+
return { tags: [], ...notices.fields() };
|
|
269
|
+
}
|
|
270
|
+
const parsed = parseEmbeddedJsonResponse(outcome.raw);
|
|
286
271
|
if (!parsed) {
|
|
287
272
|
warn("Warning: --enrich received invalid JSON from the LLM. Writing memory without enrichment.");
|
|
288
|
-
return { tags: [], ...
|
|
273
|
+
return { tags: [], ...notices.fields() };
|
|
289
274
|
}
|
|
290
275
|
const tags = Array.isArray(parsed.tags)
|
|
291
276
|
? parsed.tags.filter((t) => typeof t === "string" && t.trim().length > 0)
|
|
292
277
|
: [];
|
|
293
278
|
const description = typeof parsed.description === "string" && parsed.description.trim() ? parsed.description.trim() : undefined;
|
|
294
|
-
return { tags, description, observed_at: parseEnrichObserved(parsed), ...
|
|
279
|
+
return { tags, description, observed_at: parseEnrichObserved(parsed), ...notices.fields() };
|
|
295
280
|
}
|
|
296
281
|
catch (err) {
|
|
297
282
|
if (err instanceof ConfigError)
|
|
298
283
|
throw err;
|
|
299
284
|
warn(`Warning: --enrich failed (${toErrorMessage(err)}). Writing memory without enrichment.`);
|
|
300
|
-
return { tags: [], ...
|
|
285
|
+
return { tags: [], ...notices.fields() };
|
|
301
286
|
}
|
|
302
287
|
}
|
|
303
288
|
// R-061(c): `resolveRememberContentArg` / `wasRememberFlagValueConsumedAsContent`
|
|
@@ -7,8 +7,7 @@ import { VALID_ADAPTER_IDS } from "../../core/adapter/adapter-ids.js";
|
|
|
7
7
|
import { UsageError } from "../../core/errors.js";
|
|
8
8
|
import { appendEvent } from "../../core/events.js";
|
|
9
9
|
import { warn } from "../../core/warn.js";
|
|
10
|
-
import {
|
|
11
|
-
import { akmRemove, akmUpdate } from "./installed-stashes.js";
|
|
10
|
+
import { akmUpdate } from "./installed-stashes.js";
|
|
12
11
|
import { akmAdd } from "./source-add.js";
|
|
13
12
|
import { addStash, removeStash } from "./source-manage.js";
|
|
14
13
|
// ── Shared website-options helper ──────────
|
|
@@ -36,31 +35,6 @@ export function shouldWarnOnPlainHttp(ref) {
|
|
|
36
35
|
return true;
|
|
37
36
|
}
|
|
38
37
|
}
|
|
39
|
-
/**
|
|
40
|
-
* Audit a freshly-installed stash for dangerous env keys and decide whether the
|
|
41
|
-
* install must be blocked. The scanner and decision policy are shared with
|
|
42
|
-
* `bundle update` in dangerous-env-audit.ts.
|
|
43
|
-
*/
|
|
44
|
-
export async function auditInstalledStashForDangerousKeys(opts) {
|
|
45
|
-
const { installedStashRoot, ref, allowDangerousKeys, rollbackTarget, isTTY } = opts;
|
|
46
|
-
return auditStashForDangerousKeys({
|
|
47
|
-
stashRoot: installedStashRoot,
|
|
48
|
-
ref,
|
|
49
|
-
allowDangerousKeys,
|
|
50
|
-
isTTY,
|
|
51
|
-
operation: "install",
|
|
52
|
-
rollback: async () => {
|
|
53
|
-
try {
|
|
54
|
-
await akmRemove({ target: rollbackTarget });
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return (`Rollback failed — stash may still be installed at ${installedStashRoot}. ` +
|
|
59
|
-
`Remove it manually with: akm bundle remove ${rollbackTarget}`);
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
38
|
// ── Command definition ────────────────────────────────────────────────────────
|
|
65
39
|
export const addCommand = defineJsonCommand({
|
|
66
40
|
meta: {
|
|
@@ -90,7 +64,8 @@ export const addCommand = defineJsonCommand({
|
|
|
90
64
|
after: { type: "string", description: "Insert the new bundle after this configured bundle" },
|
|
91
65
|
credential: {
|
|
92
66
|
type: "string",
|
|
93
|
-
|
|
67
|
+
// biome-ignore lint/suspicious/noTemplateCurlyInString: literal `${ref}` token syntax documented for users, not interpolation
|
|
68
|
+
description: "Git HTTPS bearer credential reference ($VAR or ${secrets/name}); never a literal token",
|
|
94
69
|
},
|
|
95
70
|
"max-pages": { type: "string", description: "Maximum pages to crawl for website sources (default: 50)" },
|
|
96
71
|
"max-depth": { type: "string", description: "Maximum crawl depth for website sources (default: 3)" },
|
|
@@ -99,16 +74,18 @@ export const addCommand = defineJsonCommand({
|
|
|
99
74
|
description: "Allow a plain HTTP source URL after explicitly accepting transport substitution risk.",
|
|
100
75
|
default: false,
|
|
101
76
|
},
|
|
77
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
78
|
+
// fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: its
|
|
79
|
+
// env files are no longer scanned for process-hijacking keys.
|
|
102
80
|
"allow-dangerous-env-keys": {
|
|
103
81
|
type: "boolean",
|
|
104
|
-
description: "
|
|
82
|
+
description: "Deprecated, no effect: add no longer scans env files for process-hijacking keys. Accepted through 0.10 for existing scripts.",
|
|
105
83
|
default: false,
|
|
106
84
|
},
|
|
107
85
|
},
|
|
108
86
|
async run({ args }) {
|
|
109
87
|
const ref = args.ref.trim();
|
|
110
88
|
const allowInsecureTransport = args["allow-insecure-transport"];
|
|
111
|
-
const allowDangerousKeys = args["allow-dangerous-env-keys"];
|
|
112
89
|
if (args.before && args.after)
|
|
113
90
|
throw new UsageError("Only one of --before or --after may be used.");
|
|
114
91
|
// --provider → declarative bundle source (URL for git/website; bare
|
|
@@ -153,7 +130,7 @@ export const addCommand = defineJsonCommand({
|
|
|
153
130
|
if (args.provider === "git" && result.added && result.entry?.name) {
|
|
154
131
|
let updated;
|
|
155
132
|
try {
|
|
156
|
-
updated = await akmUpdate({ target: result.entry.name
|
|
133
|
+
updated = await akmUpdate({ target: result.entry.name });
|
|
157
134
|
}
|
|
158
135
|
catch (error) {
|
|
159
136
|
removeStash(result.entry.name);
|
|
@@ -204,38 +181,6 @@ export const addCommand = defineJsonCommand({
|
|
|
204
181
|
writable: args.writable === true,
|
|
205
182
|
},
|
|
206
183
|
});
|
|
207
|
-
// ── Post-install env key audit ──────────────────────────────────────────
|
|
208
|
-
// Resolve the stash root from the install result and scan any env files
|
|
209
|
-
// for dangerous env var keys. When findings are present the install is
|
|
210
|
-
// gated: TTY → interactive confirmation prompt; non-TTY without
|
|
211
|
-
// --allow-dangerous-env-keys → hard failure (exit 1). Pass the dedicated
|
|
212
|
-
// flag to skip the prompt non-interactively.
|
|
213
|
-
const installedStashRoot = result.installed?.stashRoot ??
|
|
214
|
-
(result.sourceAdded && "stashRoot" in result.sourceAdded ? result.sourceAdded.stashRoot : undefined);
|
|
215
|
-
if (installedStashRoot) {
|
|
216
|
-
// Use the canonical installed id (most reliably resolved by akmRemove) rather
|
|
217
|
-
// than the raw user-supplied ref which may not match after URL normalisation.
|
|
218
|
-
const rollbackTarget = result.installed?.id ?? result.sourceAdded?.stashRoot ?? ref;
|
|
219
|
-
// The audit RETURNS its decision; we decide the exit outcome here,
|
|
220
|
-
// OUTSIDE any catch, so the abort cannot be lost to a swallowed
|
|
221
|
-
// exception (C3). F4: `process.exitCode = …; return;` instead of
|
|
222
|
-
// `process.exit(...)` — the DANGEROUS_ENV_KEY error envelope has
|
|
223
|
-
// already been written to stderr by the audit itself (or is about to
|
|
224
|
-
// be), so an explicit `return` here (skipping the success `output("add",
|
|
225
|
-
// …)` below) is load-bearing, not merely cosmetic: it is what stops a
|
|
226
|
-
// blocked install from ALSO printing a success envelope.
|
|
227
|
-
const decision = await auditInstalledStashForDangerousKeys({
|
|
228
|
-
installedStashRoot,
|
|
229
|
-
ref,
|
|
230
|
-
allowDangerousKeys,
|
|
231
|
-
rollbackTarget,
|
|
232
|
-
isTTY: process.stdin.isTTY === true,
|
|
233
|
-
});
|
|
234
|
-
if (decision.blocked) {
|
|
235
|
-
process.exitCode = decision.exitCode;
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
184
|
output("add", result);
|
|
240
185
|
},
|
|
241
186
|
});
|
|
@@ -8,9 +8,7 @@
|
|
|
8
8
|
* group, hard break, no alias kept at the top level:
|
|
9
9
|
* - `create` (= old top-level `init`, src/commands/sources/init.ts)
|
|
10
10
|
* - `add` (= old top-level `add`, src/commands/sources/add-cli.ts — the
|
|
11
|
-
* command definition moved here; `add-cli.ts` keeps its exported helpers
|
|
12
|
-
* including `auditInstalledStashForDangerousKeys`, which a test imports
|
|
13
|
-
* directly)
|
|
11
|
+
* command definition moved here; `add-cli.ts` keeps its exported helpers)
|
|
14
12
|
* - `list` (= old top-level `list`)
|
|
15
13
|
* - `remove` (= old top-level `remove`)
|
|
16
14
|
* - `update` (= old top-level `update`)
|
|
@@ -134,18 +132,21 @@ const updateCommand = defineJsonCommand({
|
|
|
134
132
|
description: "Exit successfully when index/state database contention shows another akm operation is active",
|
|
135
133
|
default: false,
|
|
136
134
|
},
|
|
135
|
+
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
136
|
+
// fail with UNKNOWN_FLAG. Installing a bundle is the trust decision: an
|
|
137
|
+
// update no longer scans env files for process-hijacking keys.
|
|
137
138
|
"allow-dangerous-env-keys": {
|
|
138
139
|
type: "boolean",
|
|
139
|
-
description: "
|
|
140
|
+
description: "Deprecated, no effect: update no longer scans env files for process-hijacking keys. Accepted through 0.10 for existing scripts.",
|
|
140
141
|
default: false,
|
|
141
142
|
},
|
|
142
143
|
// Deprecated no-op, accepted through 0.10 so scripts that pass it do not
|
|
143
|
-
// fail with UNKNOWN_FLAG.
|
|
144
|
-
//
|
|
144
|
+
// fail with UNKNOWN_FLAG. Pruning old install directories of a read-only
|
|
145
|
+
// bundle no longer asks: they are a re-fetchable cache.
|
|
145
146
|
yes: {
|
|
146
147
|
type: "boolean",
|
|
147
148
|
alias: "y",
|
|
148
|
-
description: "Deprecated, no effect: update no longer asks before
|
|
149
|
+
description: "Deprecated, no effect: update no longer asks before pruning old install directories of a read-only bundle. Accepted through 0.10 for existing scripts.",
|
|
149
150
|
default: false,
|
|
150
151
|
},
|
|
151
152
|
},
|
|
@@ -156,7 +157,6 @@ const updateCommand = defineJsonCommand({
|
|
|
156
157
|
target: args.target,
|
|
157
158
|
all: args.all,
|
|
158
159
|
force: args.force,
|
|
159
|
-
allowDangerousEnvKeys: args["allow-dangerous-env-keys"],
|
|
160
160
|
});
|
|
161
161
|
}
|
|
162
162
|
catch (error) {
|
|
@@ -173,7 +173,6 @@ const updateCommand = defineJsonCommand({
|
|
|
173
173
|
target: args.target ?? null,
|
|
174
174
|
all: args.all === true,
|
|
175
175
|
force: args.force === true,
|
|
176
|
-
allowDangerousEnvKeys: args["allow-dangerous-env-keys"] === true,
|
|
177
176
|
processed: Array.isArray(result.processed)
|
|
178
177
|
? result.processed.length
|
|
179
178
|
: 0,
|
|
@@ -2,13 +2,13 @@
|
|
|
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
|
-
* Bundle-map config write helpers
|
|
5
|
+
* Bundle-map config write helpers.
|
|
6
6
|
*
|
|
7
7
|
* The `stashDir`/`sources[]`/`installed[]` trio is retired: every source is now
|
|
8
8
|
* a `bundles.<slug>` entry, and the primary working stash is the `defaultBundle`.
|
|
9
9
|
* These helpers give the source writers (`akm bundle create`, `akm setup`, `akm bundle add`,
|
|
10
10
|
* `akm sources add/remove`) one place to derive slug-legal bundle keys (via the
|
|
11
|
-
* shared {@link deriveBundleId}
|
|
11
|
+
* shared {@link deriveBundleId}), locate an existing bundle by its source
|
|
12
12
|
* descriptor, and set/repoint the primary bundle — without duplicating the
|
|
13
13
|
* keying rules across call sites.
|
|
14
14
|
*/
|
|
@@ -16,6 +16,7 @@ import { countLinksByKind } from "../../storage/repositories/index-links-reposit
|
|
|
16
16
|
import { getMeta } from "../../storage/repositories/index-meta-repository.js";
|
|
17
17
|
import { isSqliteContentionError } from "../../storage/sqlite-transaction.js";
|
|
18
18
|
import { pkgVersion } from "../../version.js";
|
|
19
|
+
import { targetRows } from "../targets.js";
|
|
19
20
|
/**
|
|
20
21
|
* Bound for `akm info`'s diagnostic index.db read — short enough that a
|
|
21
22
|
* locked database never stalls the command, unlike the shared 30s
|
|
@@ -92,7 +93,7 @@ export function assembleInfo(options) {
|
|
|
92
93
|
...(r.provider ? { provider: r.provider } : {}),
|
|
93
94
|
...(r.enabled !== undefined ? { enabled: r.enabled } : {}),
|
|
94
95
|
}));
|
|
95
|
-
// Stash providers — the unified `bundles` source list
|
|
96
|
+
// Stash providers — the unified `bundles` source list, which
|
|
96
97
|
// already includes the primary (`defaultBundle`) stash first.
|
|
97
98
|
const configuredSources = getSources(config);
|
|
98
99
|
const sourceProviders = configuredSources.map((s) => ({
|
|
@@ -151,10 +152,20 @@ export function assembleInfo(options) {
|
|
|
151
152
|
status: semanticStatus,
|
|
152
153
|
},
|
|
153
154
|
registries,
|
|
155
|
+
connectionsAndHarnesses: safeTargets(config),
|
|
154
156
|
sourceProviders,
|
|
155
157
|
indexStats,
|
|
156
158
|
};
|
|
157
159
|
}
|
|
160
|
+
/** The connections, harnesses and work table, or none when it cannot be built: `akm info` never throws. */
|
|
161
|
+
function safeTargets(config) {
|
|
162
|
+
try {
|
|
163
|
+
return targetRows({ config });
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
158
169
|
/** Best-effort path resolution for a section that must degrade, not throw: an empty string in place of an exception. */
|
|
159
170
|
function safePath(fn) {
|
|
160
171
|
try {
|
|
@@ -115,7 +115,7 @@ async function akmInitReal(options) {
|
|
|
115
115
|
let previousStashDir;
|
|
116
116
|
if (options?.persistConfig !== false) {
|
|
117
117
|
const result = mutateConfig((latest) => {
|
|
118
|
-
//
|
|
118
|
+
// The primary stash is the `defaultBundle`'s filesystem
|
|
119
119
|
// `path`, not the retired top-level `stashDir`.
|
|
120
120
|
const currentPrimary = primaryBundlePath(latest);
|
|
121
121
|
const shouldPersist = !dirExplicitlyProvided || !currentPrimary || setDefault;
|