akm-cli 0.9.0-rc.1 → 0.9.0-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1190 -52
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +13 -9
- package/dist/commands/env/env-cli.js +76 -159
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +75 -228
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -855
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -73
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -58
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +8 -3
- package/dist/integrations/agent/profiles.js +6 -99
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +78 -13
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +48 -279
- package/dist/integrations/harnesses/aider/agent-builder.js +9 -8
- package/dist/integrations/harnesses/aider/index.js +2 -12
- package/dist/integrations/harnesses/amazonq/agent-builder.js +10 -16
- package/dist/integrations/harnesses/amazonq/index.js +3 -17
- package/dist/integrations/harnesses/claude/agent-builder.js +2 -3
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +1 -14
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -7
- package/dist/integrations/harnesses/codex/index.js +2 -13
- package/dist/integrations/harnesses/copilot/agent-builder.js +9 -9
- package/dist/integrations/harnesses/copilot/index.js +1 -13
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -9
- package/dist/integrations/harnesses/gemini/index.js +1 -13
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +31 -33
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +1 -18
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +3 -17
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +274 -191
- package/dist/integrations/harnesses/openhands/agent-builder.js +12 -10
- package/dist/integrations/harnesses/openhands/index.js +2 -12
- package/dist/integrations/harnesses/pi/agent-builder.js +11 -18
- package/dist/integrations/harnesses/pi/index.js +3 -16
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +38 -34
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +24 -40
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +15 -281
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +8 -40
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1375
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +1 -2
- package/dist/output/text.js +10 -19
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +68 -35
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/workflows/authoring/authoring.js +96 -148
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -20
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +25 -59
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +157 -94
- package/dist/workflows/exec/report.js +365 -200
- package/dist/workflows/exec/run-workflow.js +46 -40
- package/dist/workflows/exec/scheduler.js +12 -41
- package/dist/workflows/exec/step-work.js +239 -205
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/ir/compile.js +141 -283
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/plan-hash.js +40 -5
- package/dist/workflows/ir/schema.js +537 -1
- package/dist/workflows/parser.js +878 -306
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +99 -121
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +200 -113
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +235 -97
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +4 -26
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/{dist/schemas → schemas}/akm-workflow.json +127 -82
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -316
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1414
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -25
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/schemas/akm-config.json +0 -14225
- package/dist/scripts/migrate-storage.js +0 -13169
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -10169
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/db.js +0 -350
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -760
- package/dist/workflows/program/project.js +0 -105
- package/docs/data-and-telemetry.md +0 -227
- package/docs/migration/release-notes/0.9.0-beta.60.md +0 -19
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
package/README.md
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
# akm -- Agent Knowledge
|
|
1
|
+
# akm -- Agent Knowledge Manager
|
|
2
2
|
|
|
3
|
-
> **akm** (Agent Knowledge
|
|
3
|
+
> **akm** (Agent Knowledge Manager) -- A knowledge toolkit for AI agents.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/akm-cli)
|
|
6
6
|
[](https://www.npmjs.com/package/akm-cli)
|
|
7
7
|
[](https://github.com/itlackey/akm/blob/main/LICENSE)
|
|
8
8
|
|
|
9
|
-
`akm` is a
|
|
10
|
-
agents, knowledge, memories, workflows,
|
|
11
|
-
|
|
9
|
+
`akm` is a knowledge toolkit for AI agent capabilities -- scripts, skills, commands,
|
|
10
|
+
agents, knowledge, instructions, memories, workflows, env files, secrets, lessons,
|
|
11
|
+
tasks, sessions, and facts. It can discover and install bundles from npm, git, local
|
|
12
|
+
directories, and configured registries. It works with any AI coding assistant that can run shell commands,
|
|
12
13
|
including [Claude Code](https://claude.ai/code),
|
|
13
14
|
[OpenCode](https://opencode.ai), [Cursor](https://cursor.com), and more.
|
|
14
15
|
|
|
15
16
|
## Install
|
|
16
17
|
|
|
17
|
-
**Option 1 —
|
|
18
|
+
**Option 1 — npm package (recommended; requires [Node.js](https://nodejs.org) >= 22):**
|
|
18
19
|
|
|
19
20
|
```sh
|
|
20
|
-
|
|
21
|
-
curl -fsSL https://github.com/itlackey/akm/releases/latest/download/install.sh | bash
|
|
22
|
-
|
|
23
|
-
# Windows (PowerShell)
|
|
24
|
-
irm https://github.com/itlackey/akm/releases/latest/download/install.ps1 | iex
|
|
21
|
+
npm install -g akm-cli
|
|
25
22
|
```
|
|
26
23
|
|
|
27
|
-
**Option 2 —
|
|
24
|
+
**Option 2 — Prebuilt binary (no runtime required):**
|
|
28
25
|
|
|
29
26
|
```sh
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
**Option 3 — Node.js (requires Node.js >= 20.12):**
|
|
27
|
+
# Linux / macOS
|
|
28
|
+
curl -fsSL https://github.com/itlackey/akm/releases/latest/download/install.sh | bash
|
|
34
29
|
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
# Windows (PowerShell)
|
|
31
|
+
irm https://github.com/itlackey/akm/releases/latest/download/install.ps1 | iex
|
|
37
32
|
```
|
|
38
33
|
|
|
39
34
|
Upgrade in place with `akm upgrade`.
|
|
40
35
|
|
|
41
|
-
|
|
36
|
+
The npm package always uses Node.js to bootstrap its cross-platform command.
|
|
37
|
+
If a working [Bun](https://bun.sh) >= 1.0 is also on `PATH`, the launcher
|
|
38
|
+
prefers Bun for execution; old, unusable, or absent Bun installations fall back
|
|
39
|
+
to Node.js. Node.js remains required for the npm package. The standalone
|
|
40
|
+
binaries are runtime-free.
|
|
41
|
+
|
|
42
42
|
> The old `vault` asset type was removed in 0.9.0; use `env` for whole `.env`
|
|
43
43
|
> groups and `secret` for standalone sensitive values.
|
|
44
44
|
|
|
@@ -46,16 +46,41 @@ Upgrade in place with `akm upgrade`.
|
|
|
46
46
|
|
|
47
47
|
```sh
|
|
48
48
|
akm setup # Guided setup: configure, initialize, and index
|
|
49
|
-
akm
|
|
49
|
+
akm task doctor # Verify scheduler and installed runtime
|
|
50
|
+
akm bundle add github:owner/repo # Add a bundle from GitHub
|
|
50
51
|
akm search "deploy" # Find assets across all sources
|
|
51
|
-
akm show
|
|
52
|
+
akm show scripts/deploy.sh # View details and run command
|
|
52
53
|
```
|
|
53
54
|
|
|
55
|
+
Non-interactive setup never activates schedules.
|
|
56
|
+
|
|
57
|
+
## Schedule Tasks Safely
|
|
58
|
+
|
|
59
|
+
```sh
|
|
60
|
+
akm setup # Review definitions, schedules, and enabled state
|
|
61
|
+
# Confirm scheduler activation only after reviewing the complete task summary.
|
|
62
|
+
akm task doctor # Verify backend, runtime, task state, and warnings
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Setup shows the complete task review — both the general-purpose core
|
|
66
|
+
templates and the maintainer-oriented improve cadence — before asking one
|
|
67
|
+
explicit question about changing task files and the OS scheduler. Only
|
|
68
|
+
confirmation prepares the definitions and syncs the scheduler. Declining, or
|
|
69
|
+
running setup non-interactively, leaves both unchanged. A scheduled entry
|
|
70
|
+
captures the installed akm runtime used during activation. Ordinary
|
|
71
|
+
`akm task sync` preserves that runtime; after moving or replacing the
|
|
72
|
+
installation, use `akm task sync --rebind` explicitly to migrate or repair
|
|
73
|
+
scheduler entries, then run `akm task doctor` again.
|
|
74
|
+
|
|
75
|
+
Rerunning setup preserves existing scheduler bindings. If setup changes the AKM
|
|
76
|
+
storage path, or the installed runtime path changes, run
|
|
77
|
+
`akm task sync --rebind` explicitly.
|
|
78
|
+
|
|
54
79
|
## Why akm?
|
|
55
80
|
|
|
56
81
|
- **Works with any AI agent** -- No plugins or SDKs required. Any model that can run shell commands can use `akm`.
|
|
57
|
-
- **One command to search
|
|
58
|
-
- **Install
|
|
82
|
+
- **One command to search your knowledge** -- Local assets are searched by default. Add `--from registry` or `--from all` for configured registry results; [skills.sh](https://skills.sh) participates only when enabled.
|
|
83
|
+
- **Install bundles from anywhere** -- npm, GitHub, GitLab, local directories.
|
|
59
84
|
- **Semantic search** -- Optional local embeddings (via Ollama or HuggingFace) for finding assets by meaning, not just keywords.
|
|
60
85
|
- **Private registries** -- Host your own registry for team or enterprise use.
|
|
61
86
|
|
|
@@ -67,22 +92,22 @@ Add this to your `AGENTS.md`, `CLAUDE.md`, or system prompt:
|
|
|
67
92
|
## Resources & Capabilities
|
|
68
93
|
|
|
69
94
|
You have access to a searchable library of scripts, skills, commands, agents,
|
|
70
|
-
knowledge, memories, workflows,
|
|
71
|
-
via the `akm` CLI. Use `akm -h` for details.
|
|
95
|
+
knowledge, instructions, memories, workflows, env files, secrets, lessons, tasks,
|
|
96
|
+
sessions, and facts via the `akm` CLI. Use `akm -h` for details.
|
|
72
97
|
```
|
|
73
98
|
|
|
74
|
-
## Install
|
|
99
|
+
## Install Bundles from Anywhere
|
|
75
100
|
|
|
76
101
|
```sh
|
|
77
|
-
akm add @scope/
|
|
78
|
-
akm add github:owner/repo#v1.2.3 # GitHub with tag
|
|
79
|
-
akm add git+https://gitlab.com/org/
|
|
80
|
-
akm add ./path/to/local/
|
|
102
|
+
akm bundle add @scope/pkg # npm
|
|
103
|
+
akm bundle add github:owner/repo#v1.2.3 # GitHub with tag
|
|
104
|
+
akm bundle add git+https://gitlab.com/org/repo # Any git repo
|
|
105
|
+
akm bundle add ./path/to/local/dir # Local directory
|
|
81
106
|
```
|
|
82
107
|
|
|
83
|
-
Manage
|
|
108
|
+
Manage bundles with `akm bundle list`, `akm bundle update --all`, and `akm bundle remove`.
|
|
84
109
|
|
|
85
|
-
## Publish Your Own
|
|
110
|
+
## Publish Your Own Bundle
|
|
86
111
|
|
|
87
112
|
1. Organize your assets into a directory
|
|
88
113
|
2. Add `"akm"` to `keywords` in `package.json`
|
|
@@ -93,11 +118,11 @@ Manage stashes with `akm list`, `akm update --all`, and `akm remove`.
|
|
|
93
118
|
|
|
94
119
|
Full docs, CLI reference, and guides are available on [GitHub](https://github.com/itlackey/akm):
|
|
95
120
|
|
|
96
|
-
- [Getting Started](https://github.com/itlackey/akm/blob/main/docs/getting-started.md)
|
|
97
|
-
- [CLI Reference](https://github.com/itlackey/akm/blob/main/docs/cli.md)
|
|
98
|
-
- [Configuration](https://github.com/itlackey/akm/blob/main/docs/configuration.md)
|
|
99
|
-
- [
|
|
100
|
-
- [Registry](https://github.com/itlackey/akm/blob/main/docs/registry.md)
|
|
121
|
+
- [Getting Started](https://github.com/itlackey/akm/blob/main/docs/guides/getting-started.md)
|
|
122
|
+
- [CLI Reference](https://github.com/itlackey/akm/blob/main/docs/reference/cli.md)
|
|
123
|
+
- [Configuration](https://github.com/itlackey/akm/blob/main/docs/reference/configuration.md)
|
|
124
|
+
- [Bundle Maker's Guide](https://github.com/itlackey/akm/blob/main/docs/guides/stash-makers.md)
|
|
125
|
+
- [Registry](https://github.com/itlackey/akm/blob/main/docs/reference/registry.md)
|
|
101
126
|
|
|
102
127
|
## License
|
|
103
128
|
|
package/SECURITY.md
CHANGED
|
@@ -7,9 +7,9 @@ Security fixes are made on the latest minor release line of `akm-cli`. The
|
|
|
7
7
|
|
|
8
8
|
| Version | Supported |
|
|
9
9
|
| --- | --- |
|
|
10
|
-
| 0.
|
|
11
|
-
| 0.
|
|
12
|
-
| < 0.
|
|
10
|
+
| 0.9.x | ✅ active |
|
|
11
|
+
| 0.8.x | ❌ no longer maintained |
|
|
12
|
+
| < 0.8 | ❌ no longer maintained |
|
|
13
13
|
|
|
14
14
|
## Reporting a vulnerability
|
|
15
15
|
|
|
@@ -31,7 +31,7 @@ shell commands (via scripts, workflows, and agent dispatch), and talks to
|
|
|
31
31
|
explicitly configured external services (LLM endpoints, git remotes, npm,
|
|
32
32
|
HTTP sources). It does **not** ship telemetry, send data to anyone by
|
|
33
33
|
default, or open network listeners. See
|
|
34
|
-
[`docs/data-and-telemetry.md`](docs/data-and-telemetry.md) for the on-disk
|
|
34
|
+
[`docs/reference/data-and-telemetry.md`](docs/reference/data-and-telemetry.md) for the on-disk
|
|
35
35
|
inventory.
|
|
36
36
|
|
|
37
37
|
Several akm surfaces execute user-controlled code or data with the full
|
|
@@ -42,52 +42,67 @@ bugs, but you should be aware of them:
|
|
|
42
42
|
|
|
43
43
|
Workflow steps run in your shell with your PATH and your environment
|
|
44
44
|
variables — including any secrets you have exported or loaded via
|
|
45
|
-
`akm
|
|
46
|
-
[`docs/
|
|
47
|
-
code"](docs/
|
|
45
|
+
`akm env run` / `akm secret run`. **Only add workflow sources you trust.** See
|
|
46
|
+
[`docs/reference/workflows.md` — "Security: workflow sources are executed
|
|
47
|
+
code"](docs/reference/workflows.md#security-workflow-sources-are-executed-code)
|
|
48
48
|
for the full discussion.
|
|
49
49
|
|
|
50
50
|
### Scripts execute shell commands
|
|
51
51
|
|
|
52
|
-
`akm show
|
|
52
|
+
`akm show scripts/<name>` returns a `run:` command line the user (or an
|
|
53
53
|
integrating agent) then executes. The same trust model applies: scripts you
|
|
54
54
|
install from third-party stashes are third-party code.
|
|
55
55
|
|
|
56
56
|
### Agents and commands embed user-authored prompts
|
|
57
57
|
|
|
58
|
-
`akm show
|
|
58
|
+
`akm show agents/<name>` and `akm show commands/<name>` return prompt
|
|
59
59
|
templates and system prompts that an LLM will execute. A malicious stash
|
|
60
60
|
maintainer could write a system prompt that instructs the LLM to read
|
|
61
61
|
sensitive files in your working tree and exfiltrate them via the LLM
|
|
62
62
|
response. Audit the prompt body the same way you'd audit a script.
|
|
63
63
|
|
|
64
|
-
###
|
|
64
|
+
### Installing a stash means trusting its code
|
|
65
65
|
|
|
66
|
-
`akm
|
|
67
|
-
`<stash>/vaults/<name>.env`. They are protected against other local users
|
|
68
|
-
by filesystem permissions but not encrypted at rest. Do not commit vault
|
|
69
|
-
files to source control — they are `.gitignore`d in the default stash
|
|
70
|
-
layout for that reason. The `akm vault show` / `akm vault list` commands
|
|
71
|
-
never echo values; `akm vault load` produces shell-eval output meant to be
|
|
72
|
-
piped to `eval`, never displayed.
|
|
66
|
+
Installing a stash is not a data-only operation: **`<stashDir>/scripts/wiki-fetchers/*.{ts,js,mjs}` is imported and EXECUTED during `akm index`** (when a website-snapshot source in that stash is synced), with no gate, no prompt, and no allowlist. Every file in that directory is dynamically `import()`ed, and only *after* the module has fully evaluated does akm check that its default export looks like a fetcher (`{ name, matches, fetch }`) — module-level code (anything outside the exported functions) runs unconditionally before that check ever happens, and a file that fails the check still ran. There is no sandboxing: a wiki-fetcher script executes with the full permissions of the akm process, exactly like the scripts and workflow steps documented above.
|
|
73
67
|
|
|
74
|
-
|
|
68
|
+
This is a deliberate design decision (owner ruling), not an oversight, and it will not change without a separate decision to add a gate. **If you install a stash from a source you do not trust, you are trusting its code to run on your machine at index time** — audit `scripts/wiki-fetchers/` the same way you would audit any other executable you're about to run, before installing.
|
|
75
69
|
|
|
76
|
-
`
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
70
|
+
The built-in YouTube snapshot fetcher (`src/sources/snapshot-fetchers/youtube.ts`) deliberately **impersonates the YouTube Android app's InnerTube client** (`clientName: "ANDROID"`, a spoofed `clientVersion`) when calling YouTube's private `youtubei/v1/player` endpoint, because the public web client's caption URLs are Proof-of-Origin-Token gated and return empty bodies. This is known, intentional behavior needed to fetch captions at all, not a bug — documented here so it isn't mistaken for one.
|
|
71
|
+
|
|
72
|
+
### Environment and secret assets are plaintext on disk
|
|
73
|
+
|
|
74
|
+
`env` and `secret` assets are owner-permissioned plaintext under `<stash>/env/`
|
|
75
|
+
and `<stash>/secrets/`. They are protected against other local users by
|
|
76
|
+
filesystem permissions but are not encrypted at rest. Do not commit these
|
|
77
|
+
files to source control. Normal `akm env` and `akm secret` output never echoes
|
|
78
|
+
values; materialize values only at the command boundary with `akm env run`,
|
|
79
|
+
`akm secret run`, or `akm secret path`.
|
|
80
|
+
|
|
81
|
+
The knowledge graph extracted from your assets (entities/relations) lives
|
|
82
|
+
only in `$DATA/index.db` and is surfaced as aggregate counts via `akm health`
|
|
83
|
+
(`--report` for the full breakdown) — there is no export command that writes
|
|
84
|
+
graph content to an arbitrary path.
|
|
85
|
+
|
|
86
|
+
### Improve / propose send asset content to the configured LLM
|
|
87
|
+
|
|
88
|
+
`akm improve` (whose strategies run processes such as reflect, distill, and
|
|
89
|
+
consolidate) and `akm proposal new` can send asset frontmatter and body to the
|
|
90
|
+
named LLM engine selected by the command, strategy, or current defaults. LLM
|
|
91
|
+
connections live under
|
|
92
|
+
`engines.<name>` in `~/.config/akm/config.json`. If you configure a third-party
|
|
93
|
+
LLM, your asset content goes to that third party. Use a local engine endpoint
|
|
94
|
+
(for example, `http://localhost:11434/v1/chat/completions` via Ollama) for assets
|
|
95
|
+
containing secrets or private notes.
|
|
82
96
|
|
|
83
97
|
## Known non-issues
|
|
84
98
|
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
99
|
+
- **The `akm-cli` npm package requires Node.js >= 22 as its bootstrap.** A
|
|
100
|
+
working Bun >= 1.0 is preferred for execution when it is also on `PATH`; old,
|
|
101
|
+
unusable, or absent Bun installations fall back to Node.js. Bun does not
|
|
102
|
+
remove the package's Node.js requirement. Standalone binaries are
|
|
103
|
+
runtime-free. This is a compatibility limitation, not a security risk.
|
|
89
104
|
- **Workflows can read any file the akm process can read.** This is not a
|
|
90
105
|
bug — see "Threat model" above.
|
|
91
|
-
-
|
|
92
|
-
|
|
93
|
-
home or write outside the install directory.
|
|
106
|
+
- **Installing `akm-cli` runs the preinstall hook.** The hook only validates
|
|
107
|
+
the runtime version and exits non-zero when it is unsupported; it does not
|
|
108
|
+
phone home or write outside the install directory.
|
package/dist/akm
CHANGED
|
@@ -1,38 +1,162 @@
|
|
|
1
|
-
#!/bin/
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
|
|
12
|
+
const CONTEXT_ARG = "--scheduler-context";
|
|
13
|
+
const CONTEXT_KEYS = ["AKM_BUNDLE_DIR", "AKM_CONFIG_DIR", "AKM_DATA_DIR", "AKM_CACHE_DIR", "AKM_STATE_DIR"];
|
|
14
|
+
const CONTROL_CHARACTER = /[\u0000-\u001f\u007f-\u009f]/;
|
|
15
|
+
|
|
16
|
+
function invalidContext(file, reason) {
|
|
17
|
+
throw new Error(`Invalid scheduler context descriptor "${file}": ${reason}.`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function readSchedulerContext(file) {
|
|
21
|
+
if (CONTROL_CHARACTER.test(file) || (!path.posix.isAbsolute(file) && !path.win32.isAbsolute(file))) {
|
|
22
|
+
invalidContext(file, "path must be absolute");
|
|
23
|
+
}
|
|
24
|
+
let linkStat;
|
|
25
|
+
try {
|
|
26
|
+
linkStat = fs.lstatSync(file);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
invalidContext(file, error instanceof Error ? error.message : String(error));
|
|
29
|
+
}
|
|
30
|
+
if (linkStat.isSymbolicLink()) invalidContext(file, "symbolic links are not allowed");
|
|
31
|
+
if (!linkStat.isFile()) invalidContext(file, "path is not a regular file");
|
|
32
|
+
|
|
33
|
+
let bytes;
|
|
34
|
+
let fd;
|
|
35
|
+
try {
|
|
36
|
+
const noFollow = process.platform === "win32" ? 0 : fs.constants.O_NOFOLLOW;
|
|
37
|
+
fd = fs.openSync(file, fs.constants.O_RDONLY | noFollow);
|
|
38
|
+
const stat = fs.fstatSync(fd);
|
|
39
|
+
if (!stat.isFile()) invalidContext(file, "path is not a regular file");
|
|
40
|
+
if (process.platform !== "win32") {
|
|
41
|
+
if (typeof process.getuid !== "function") {
|
|
42
|
+
invalidContext(file, "current uid is unavailable for ownership verification");
|
|
43
|
+
}
|
|
44
|
+
const uid = process.getuid();
|
|
45
|
+
if (stat.uid !== uid) invalidContext(file, `file owner ${stat.uid} does not match uid ${uid}`);
|
|
46
|
+
if ((stat.mode & 0o077) !== 0) invalidContext(file, "group or other permissions must be disabled");
|
|
47
|
+
}
|
|
48
|
+
bytes = fs.readFileSync(fd);
|
|
49
|
+
} finally {
|
|
50
|
+
if (fd !== undefined) fs.closeSync(fd);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const match = /^([a-f0-9]{64})\.json$/.exec(path.basename(file));
|
|
54
|
+
const digest = createHash("sha256").update(bytes).digest("hex");
|
|
55
|
+
if (!match || match[1] !== digest) {
|
|
56
|
+
invalidContext(file, "content SHA-256 does not match the descriptor filename");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let descriptor;
|
|
60
|
+
try {
|
|
61
|
+
descriptor = JSON.parse(bytes.toString("utf8"));
|
|
62
|
+
} catch (error) {
|
|
63
|
+
invalidContext(file, error instanceof Error ? error.message : String(error));
|
|
64
|
+
}
|
|
65
|
+
if (
|
|
66
|
+
typeof descriptor !== "object" ||
|
|
67
|
+
descriptor === null ||
|
|
68
|
+
Array.isArray(descriptor) ||
|
|
69
|
+
descriptor.version !== 1 ||
|
|
70
|
+
Object.keys(descriptor).sort().join("\0") !== "environment\0version"
|
|
71
|
+
) {
|
|
72
|
+
invalidContext(file, "expected the scheduler context v1 schema");
|
|
73
|
+
}
|
|
74
|
+
const environment = descriptor.environment;
|
|
75
|
+
const expected = [...CONTEXT_KEYS, "PATH"].sort();
|
|
76
|
+
const keys =
|
|
77
|
+
environment && typeof environment === "object" && !Array.isArray(environment)
|
|
78
|
+
? Object.keys(environment).sort()
|
|
79
|
+
: [];
|
|
80
|
+
if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])) {
|
|
81
|
+
invalidContext(file, "environment keys do not match the scheduler context v1 schema");
|
|
82
|
+
}
|
|
83
|
+
for (const key of CONTEXT_KEYS) {
|
|
84
|
+
const value = environment[key];
|
|
85
|
+
if (
|
|
86
|
+
typeof value !== "string" ||
|
|
87
|
+
value.trim() === "" ||
|
|
88
|
+
CONTROL_CHARACTER.test(value) ||
|
|
89
|
+
(!path.posix.isAbsolute(value) && !path.win32.isAbsolute(value))
|
|
90
|
+
) {
|
|
91
|
+
invalidContext(file, `${key} must be an absolute path without control characters`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (typeof environment.PATH !== "string" || CONTROL_CHARACTER.test(environment.PATH)) {
|
|
95
|
+
invalidContext(file, "PATH must be a string without control characters");
|
|
96
|
+
}
|
|
97
|
+
return environment;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const contextIndex = process.argv.indexOf(CONTEXT_ARG);
|
|
101
|
+
let contextValid = true;
|
|
102
|
+
if (contextIndex !== -1) {
|
|
103
|
+
try {
|
|
104
|
+
const contextPath = process.argv[contextIndex + 1];
|
|
105
|
+
if (!contextPath) throw new Error(`${CONTEXT_ARG} requires an absolute path.`);
|
|
106
|
+
const environment = readSchedulerContext(contextPath);
|
|
107
|
+
const expected = [...CONTEXT_KEYS, "PATH"].sort();
|
|
108
|
+
for (const key of expected) process.env[key] = environment[key];
|
|
109
|
+
process.argv.splice(contextIndex, 2);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error(`akm: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
|
+
process.exitCode = 78;
|
|
113
|
+
contextValid = false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (contextValid) {
|
|
118
|
+
process.env.AKM_LAUNCHER_NODE = process.execPath;
|
|
119
|
+
process.env.AKM_LAUNCHER_PATH = fileURLToPath(import.meta.url);
|
|
120
|
+
|
|
121
|
+
if (!process.versions.bun) {
|
|
122
|
+
const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
|
|
123
|
+
if (major < 22) {
|
|
124
|
+
console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const bunProbe = process.versions.bun
|
|
130
|
+
? { status: 0, stdout: process.versions.bun }
|
|
131
|
+
: spawnSync("bun", ["--version"], {
|
|
132
|
+
encoding: "utf8",
|
|
133
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
134
|
+
timeout: 5_000,
|
|
135
|
+
});
|
|
136
|
+
const [bunMajor = 0] = (bunProbe.status === 0 ? bunProbe.stdout.trim() : "").split(".").map(Number);
|
|
137
|
+
const useBun = bunMajor >= 1;
|
|
138
|
+
const bunEntry = fileURLToPath(new URL("./cli.js", import.meta.url));
|
|
139
|
+
const nodeEntry = fileURLToPath(new URL("./cli-node.mjs", import.meta.url));
|
|
140
|
+
|
|
141
|
+
if (!useBun && !process.versions.bun) {
|
|
142
|
+
await import("./cli-node.mjs");
|
|
143
|
+
} else {
|
|
144
|
+
const command = useBun ? (process.versions.bun ? process.execPath : "bun") : "node";
|
|
145
|
+
const entry = useBun ? bunEntry : nodeEntry;
|
|
146
|
+
const runtime = useBun ? "Bun" : "Node.js";
|
|
147
|
+
const result = await new Promise((resolve) => {
|
|
148
|
+
const child = spawn(command, [entry, ...process.argv.slice(2)], { stdio: "inherit", env: process.env });
|
|
149
|
+
child.once("error", (error) => resolve({ error }));
|
|
150
|
+
child.once("exit", (code, signal) => resolve({ code, signal }));
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (result.error) {
|
|
154
|
+
console.error(`akm launcher could not start ${runtime}: ${result.error.message}`);
|
|
155
|
+
process.exitCode = 127;
|
|
156
|
+
} else if (result.signal) {
|
|
157
|
+
process.kill(process.pid, result.signal);
|
|
158
|
+
} else {
|
|
159
|
+
process.exitCode = result.code ?? 1;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
package/dist/akm-migrate
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
|
|
6
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
|
|
9
|
+
if (!process.versions.bun) {
|
|
10
|
+
const [major = 0, minor = 0] = process.versions.node.split(".").map(Number);
|
|
11
|
+
if (major < 22) {
|
|
12
|
+
console.error("The akm-cli npm package requires Node.js >= 22 to bootstrap.");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const bunProbe = process.versions.bun
|
|
18
|
+
? { status: 0, stdout: process.versions.bun }
|
|
19
|
+
: spawnSync("bun", ["--version"], {
|
|
20
|
+
encoding: "utf8",
|
|
21
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
22
|
+
timeout: 5_000,
|
|
23
|
+
});
|
|
24
|
+
const [bunMajor = 0] = (bunProbe.status === 0 ? bunProbe.stdout.trim() : "").split(".").map(Number);
|
|
25
|
+
const useBun = bunMajor >= 1;
|
|
26
|
+
const bunEntry = fileURLToPath(new URL("./scripts/akm-migrate.js", import.meta.url));
|
|
27
|
+
|
|
28
|
+
{
|
|
29
|
+
const command = process.versions.bun ? process.execPath : useBun ? "bun" : process.execPath;
|
|
30
|
+
const result = await new Promise((resolve) => {
|
|
31
|
+
const child = spawn(command, [bunEntry, ...process.argv.slice(2)], { stdio: "inherit" });
|
|
32
|
+
child.once("error", (error) => resolve({ error }));
|
|
33
|
+
child.once("exit", (code, signal) => resolve({ code, signal }));
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (result.error) {
|
|
37
|
+
console.error(`akm-migrate launcher could not start its runtime: ${result.error.message}`);
|
|
38
|
+
process.exitCode = 127;
|
|
39
|
+
} else if (result.signal) {
|
|
40
|
+
process.kill(process.pid, result.signal);
|
|
41
|
+
} else {
|
|
42
|
+
process.exitCode = result.code ?? 1;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
<RegistrationInfo>
|
|
4
4
|
<Description>akm scheduled task: {{TASK_ID}}</Description>
|
|
5
5
|
<URI>{{FOLDER}}{{TASK_ID}}</URI>
|
|
6
|
+
<Source>{{SIGNATURE}}</Source>
|
|
7
|
+
<Documentation>Log target (informational only; schtasks doesn't redirect): {{LOG_PATH}}</Documentation>
|
|
6
8
|
</RegistrationInfo>
|
|
7
9
|
<Triggers>
|
|
8
10
|
{{TRIGGER_XML}}
|
|
@@ -25,5 +27,4 @@
|
|
|
25
27
|
<Arguments>{{ARGS}}</Arguments>
|
|
26
28
|
</Exec>
|
|
27
29
|
</Actions>
|
|
28
|
-
<!-- Log target (informational only; schtasks doesn't redirect): {{LOG_PATH}} -->
|
|
29
30
|
</Task>
|