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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
// Output text formatters for `akm reflect` / `akm
|
|
4
|
+
// Output text formatters for `akm reflect` / `akm proposal new` (#226; the
|
|
5
|
+
// latter formerly the top-level `akm propose`, moved in the 0.9 CLI
|
|
6
|
+
// overhaul, S8).
|
|
5
7
|
import { formatProposalProducerPlain } from "../helpers.js";
|
|
6
8
|
export const proposalProducerFormatters = [
|
|
7
9
|
{ command: "reflect", handler: (r) => formatProposalProducerPlain("reflect", r) },
|
|
8
|
-
{ command: "
|
|
10
|
+
{ command: "proposal-new", handler: (r) => formatProposalProducerPlain("proposal new", r) },
|
|
9
11
|
];
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* Plain-text renderers for `akm proposal *` commands.
|
|
6
|
+
*
|
|
7
|
+
* Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
|
|
8
|
+
* sibling module: proposal listing/show share the gate-decision summary
|
|
9
|
+
* helpers. (`akm distill` has no registered top-level command — its former
|
|
10
|
+
* plain-text renderer, `formatDistillPlain`, was dead code; removed per
|
|
11
|
+
* R-063/B5.)
|
|
12
|
+
*/
|
|
13
|
+
export function formatProposalProducerPlain(command, r) {
|
|
14
|
+
if (r.ok === false) {
|
|
15
|
+
const reason = String(r.reason);
|
|
16
|
+
const error = typeof r.error === "string" ? r.error : "";
|
|
17
|
+
const lines = [`${command}: failed (${reason})`];
|
|
18
|
+
if (error)
|
|
19
|
+
lines.push(` error: ${error}`);
|
|
20
|
+
if (r.ref)
|
|
21
|
+
lines.push(` ref: ${String(r.ref)}`);
|
|
22
|
+
if (r.exitCode !== undefined && r.exitCode !== null) {
|
|
23
|
+
lines.push(` exitCode: ${String(r.exitCode)}`);
|
|
24
|
+
}
|
|
25
|
+
return lines.join("\n");
|
|
26
|
+
}
|
|
27
|
+
const proposal = r.proposal;
|
|
28
|
+
const id = String(proposal.id);
|
|
29
|
+
const ref = String(r.ref);
|
|
30
|
+
const status = String(proposal.status);
|
|
31
|
+
return `${command}: queued proposal ${id} (${ref}) [${status}]`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Render a one-line gate-decision summary for the proposal list / show surfaces
|
|
35
|
+
* (#577), e.g. `gate=deferred:max-diff-lines (210 > 200)`. Returns the empty
|
|
36
|
+
* string when no well-formed decision is present.
|
|
37
|
+
*/
|
|
38
|
+
export function formatGateDecisionSummary(raw) {
|
|
39
|
+
if (typeof raw !== "object" || raw === null)
|
|
40
|
+
return "";
|
|
41
|
+
const d = raw;
|
|
42
|
+
const outcome = typeof d.outcome === "string" ? d.outcome : undefined;
|
|
43
|
+
if (!outcome)
|
|
44
|
+
return "";
|
|
45
|
+
const reason = typeof d.reason === "string" && d.reason.length > 0 ? `:${d.reason}` : "";
|
|
46
|
+
const cmp = formatGateThresholdComparison(d);
|
|
47
|
+
return `gate=${outcome}${reason}${cmp ? ` (${cmp})` : ""}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reconstruct the drain threshold comparison when both operands are present.
|
|
51
|
+
* Returns the empty string when the decision lacks either operand.
|
|
52
|
+
*/
|
|
53
|
+
function formatGateThresholdComparison(d) {
|
|
54
|
+
const thresholds = (typeof d.thresholds === "object" && d.thresholds !== null ? d.thresholds : {});
|
|
55
|
+
const measured = typeof d.measured === "number" ? d.measured : undefined;
|
|
56
|
+
if (measured === undefined)
|
|
57
|
+
return "";
|
|
58
|
+
if (typeof thresholds.maxDiffLines === "number") {
|
|
59
|
+
return `${measured} > ${thresholds.maxDiffLines}`;
|
|
60
|
+
}
|
|
61
|
+
if (typeof thresholds.minContentLines === "number") {
|
|
62
|
+
return `${measured} < ${thresholds.minContentLines}`;
|
|
63
|
+
}
|
|
64
|
+
return "";
|
|
65
|
+
}
|
|
66
|
+
export function formatProposalListPlain(r) {
|
|
67
|
+
const proposals = r.proposals;
|
|
68
|
+
const total = r.totalCount;
|
|
69
|
+
if (proposals.length === 0) {
|
|
70
|
+
// NEW-1: `akm reflect` and `akm distill` are internal improve-pipeline
|
|
71
|
+
// process names (src/commands/improve/{reflect,distill}.ts), not
|
|
72
|
+
// registered top-level commands (see the subCommands map in src/cli.ts) —
|
|
73
|
+
// an agent following this hint would run a command that does not exist.
|
|
74
|
+
// The real ways to queue a proposal are `akm improve <ref>` (which runs
|
|
75
|
+
// the reflect/distill/consolidate pipeline internally) and
|
|
76
|
+
// `akm proposal new`.
|
|
77
|
+
return `${total} proposal(s).\nNo proposals.\nGenerate one with \`akm improve <ref>\` or \`akm proposal new <type> <name> --task ...\`.`;
|
|
78
|
+
}
|
|
79
|
+
const lines = [`${total} proposal(s)`, ""];
|
|
80
|
+
for (const p of proposals) {
|
|
81
|
+
const id = String(p.id);
|
|
82
|
+
const ref = String(p.ref);
|
|
83
|
+
const status = String(p.status);
|
|
84
|
+
const source = String(p.source);
|
|
85
|
+
const created = String(p.createdAt);
|
|
86
|
+
// #577: surface the gate verdict inline so the queue explains itself.
|
|
87
|
+
const gate = formatGateDecisionSummary(p.gateDecision);
|
|
88
|
+
const gateSuffix = gate ? ` ${gate}` : "";
|
|
89
|
+
lines.push(`${id} [${status}] ${ref} source=${source} ${created}${gateSuffix}`);
|
|
90
|
+
}
|
|
91
|
+
return lines.join("\n").trimEnd();
|
|
92
|
+
}
|
|
93
|
+
export function formatProposalShowPlain(r) {
|
|
94
|
+
const p = r.proposal;
|
|
95
|
+
const lines = [];
|
|
96
|
+
lines.push(`# proposal ${String(p.id)}`);
|
|
97
|
+
lines.push(`ref: ${String(p.ref)}`);
|
|
98
|
+
lines.push(`status: ${String(p.status)}`);
|
|
99
|
+
lines.push(`source: ${String(p.source)}`);
|
|
100
|
+
if (p.sourceRun)
|
|
101
|
+
lines.push(`sourceRun: ${String(p.sourceRun)}`);
|
|
102
|
+
if (p.createdAt)
|
|
103
|
+
lines.push(`createdAt: ${String(p.createdAt)}`);
|
|
104
|
+
if (p.updatedAt)
|
|
105
|
+
lines.push(`updatedAt: ${String(p.updatedAt)}`);
|
|
106
|
+
if (typeof p.confidence === "number")
|
|
107
|
+
lines.push(`confidence: ${p.confidence.toFixed(2)}`);
|
|
108
|
+
// #577: gate decision (auto-accepted / deferred / auto-rejected + reason +
|
|
109
|
+
// thresholds), when this proposal has passed through a gate.
|
|
110
|
+
const gate = p.gateDecision;
|
|
111
|
+
if (gate && typeof gate.outcome === "string") {
|
|
112
|
+
lines.push(`gate.decision: ${String(gate.outcome)}`);
|
|
113
|
+
lines.push(`gate.reason: ${String(gate.reason)}`);
|
|
114
|
+
const cmp = formatGateThresholdComparison(gate);
|
|
115
|
+
if (cmp)
|
|
116
|
+
lines.push(`gate.thresholds: ${cmp}`);
|
|
117
|
+
if (gate.gate)
|
|
118
|
+
lines.push(`gate.by: ${String(gate.gate)}`);
|
|
119
|
+
if (gate.decidedAt)
|
|
120
|
+
lines.push(`gate.decidedAt: ${String(gate.decidedAt)}`);
|
|
121
|
+
}
|
|
122
|
+
const review = p.review;
|
|
123
|
+
if (review) {
|
|
124
|
+
lines.push(`review.outcome: ${String(review.outcome ?? "?")}`);
|
|
125
|
+
if (review.reason)
|
|
126
|
+
lines.push(`review.reason: ${String(review.reason)}`);
|
|
127
|
+
if (review.decidedAt)
|
|
128
|
+
lines.push(`review.decidedAt: ${String(review.decidedAt)}`);
|
|
129
|
+
}
|
|
130
|
+
const validation = r.validation;
|
|
131
|
+
if (validation) {
|
|
132
|
+
const findings = Array.isArray(validation.findings) ? validation.findings : [];
|
|
133
|
+
// Partition findings by severity. `severity: "warn"` findings are
|
|
134
|
+
// non-blocking (the validator reports `ok: true` for a warn-only proposal),
|
|
135
|
+
// so they must read as advisory — a distinct icon/label from blocking errors.
|
|
136
|
+
const warnings = findings.filter((f) => f.severity === "warn");
|
|
137
|
+
const errors = findings.filter((f) => f.severity !== "warn");
|
|
138
|
+
lines.push("");
|
|
139
|
+
if (errors.length > 0) {
|
|
140
|
+
const warnSuffix = warnings.length > 0 ? `, ${warnings.length} warning(s)` : "";
|
|
141
|
+
lines.push(`✗ invalid (${errors.length} error(s)${warnSuffix})`);
|
|
142
|
+
}
|
|
143
|
+
else if (warnings.length > 0) {
|
|
144
|
+
lines.push(`✓ valid (${warnings.length} warning(s))`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
lines.push("✓ valid");
|
|
148
|
+
}
|
|
149
|
+
// Errors first (blocking), then warnings (advisory, non-blocking).
|
|
150
|
+
for (const f of errors) {
|
|
151
|
+
lines.push(` ✗ error [${String(f.kind)}] ${String(f.message)}`);
|
|
152
|
+
}
|
|
153
|
+
for (const f of warnings) {
|
|
154
|
+
lines.push(` ⚠ warning [${String(f.kind)}] ${String(f.message)} (non-blocking)`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const payload = p.payload;
|
|
158
|
+
if (payload && typeof payload.content === "string") {
|
|
159
|
+
lines.push("");
|
|
160
|
+
lines.push("payload:");
|
|
161
|
+
lines.push(payload.content);
|
|
162
|
+
}
|
|
163
|
+
return lines.join("\n").trimEnd();
|
|
164
|
+
}
|
|
165
|
+
export function formatProposalAcceptPlain(r) {
|
|
166
|
+
return `Accepted proposal ${String(r.id)} → ${String(r.ref)} at ${String(r.assetPath)}`;
|
|
167
|
+
}
|
|
168
|
+
export function formatProposalRejectPlain(r) {
|
|
169
|
+
const reason = r.reason ? ` (${String(r.reason)})` : "";
|
|
170
|
+
return `Rejected proposal ${String(r.id)} (${String(r.ref)})${reason}`;
|
|
171
|
+
}
|
|
172
|
+
export function formatProposalDrainPlain(r) {
|
|
173
|
+
const policy = String(r.policy ?? "?");
|
|
174
|
+
const applyMode = String(r.applyMode ?? "queue");
|
|
175
|
+
const promoted = Array.isArray(r.promoted) ? r.promoted : [];
|
|
176
|
+
const rejected = Array.isArray(r.rejected) ? r.rejected : [];
|
|
177
|
+
const deferred = Array.isArray(r.deferred) ? r.deferred : [];
|
|
178
|
+
const skippedByCap = Array.isArray(r.skippedByCap) ? r.skippedByCap : [];
|
|
179
|
+
const staged = Array.isArray(r.staged) ? r.staged : [];
|
|
180
|
+
const prefix = r.dryRun === true ? "[dry-run] " : "";
|
|
181
|
+
const lines = [
|
|
182
|
+
`${prefix}Drained proposal queue (strategy=${String(r.strategy ?? "?")}, policy=${policy}, applyMode=${applyMode})`,
|
|
183
|
+
` promoted: ${promoted.length}`,
|
|
184
|
+
` rejected: ${rejected.length}`,
|
|
185
|
+
` deferred: ${deferred.length}`,
|
|
186
|
+
` skippedByCap: ${skippedByCap.length}`,
|
|
187
|
+
` staged: ${staged.length}`,
|
|
188
|
+
];
|
|
189
|
+
for (const d of deferred) {
|
|
190
|
+
lines.push(` - ${String(d.id ?? "?")} (${String(d.reason ?? "?")})`);
|
|
191
|
+
}
|
|
192
|
+
return lines.join("\n").trimEnd();
|
|
193
|
+
}
|
|
194
|
+
export function formatProposalDiffPlain(r) {
|
|
195
|
+
const header = r.isNew
|
|
196
|
+
? `# proposal ${String(r.id)} (new asset: ${String(r.ref)})`
|
|
197
|
+
: `# proposal ${String(r.id)} (update: ${String(r.ref)})`;
|
|
198
|
+
const unified = typeof r.unified === "string" ? r.unified : "";
|
|
199
|
+
if (!unified)
|
|
200
|
+
return `${header}\n(no changes)`;
|
|
201
|
+
return `${header}\n${unified}`;
|
|
202
|
+
}
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
// Output text formatters for `akm registry *` commands.
|
|
5
|
-
import { formatRegistryAddPlain,
|
|
5
|
+
import { formatRegistryAddPlain, formatRegistryListPlain, formatRegistryRemovePlain, formatRegistrySearchPlain, } from "./helpers.js";
|
|
6
6
|
export const registryCommandFormatters = [
|
|
7
7
|
{ command: "registry-list", handler: (r) => formatRegistryListPlain(r) },
|
|
8
8
|
{ command: "registry-add", handler: (r) => formatRegistryAddPlain(r) },
|
|
9
9
|
{ command: "registry-remove", handler: (r) => formatRegistryRemovePlain(r) },
|
|
10
10
|
{ command: "registry-search", handler: (r, detail) => formatRegistrySearchPlain(r, detail) },
|
|
11
|
-
{ command: "registry-build-index", handler: (r) => formatRegistryBuildIndexPlain(r) },
|
|
12
11
|
];
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Plain-text formatter registry.
|
|
6
|
+
*
|
|
7
|
+
* Separated from `text.ts` so per-command formatter modules can import
|
|
8
|
+
* `registerTextFormatter` without creating a circular dependency back into
|
|
9
|
+
* the main text module.
|
|
10
|
+
*/
|
|
11
|
+
import { createCommandRegistry } from "../command-registry.js";
|
|
12
|
+
const TEXT_FORMATTER_REGISTRY = createCommandRegistry();
|
|
5
13
|
/**
|
|
6
14
|
* Register a plain-text formatter for a command name.
|
|
7
15
|
*
|
|
@@ -13,7 +21,7 @@ const TEXT_FORMATTER_REGISTRY = new Map();
|
|
|
13
21
|
* ```
|
|
14
22
|
*/
|
|
15
23
|
export function registerTextFormatter(command, handler) {
|
|
16
|
-
TEXT_FORMATTER_REGISTRY.
|
|
24
|
+
TEXT_FORMATTER_REGISTRY.register(command, handler);
|
|
17
25
|
}
|
|
18
26
|
/**
|
|
19
27
|
* Register a batch of {@link TextFormatterEntry} definitions in iteration order.
|
|
@@ -23,15 +31,13 @@ export function registerTextFormatter(command, handler) {
|
|
|
23
31
|
* with no reliance on module import order.
|
|
24
32
|
*/
|
|
25
33
|
export function registerTextFormatters(entries) {
|
|
26
|
-
|
|
27
|
-
TEXT_FORMATTER_REGISTRY.set(command, handler);
|
|
28
|
-
}
|
|
34
|
+
TEXT_FORMATTER_REGISTRY.registerAll(entries);
|
|
29
35
|
}
|
|
30
36
|
/**
|
|
31
37
|
* Remove a previously-registered text formatter. Test-only utility.
|
|
32
38
|
*/
|
|
33
39
|
export function deregisterTextFormatter(command) {
|
|
34
|
-
TEXT_FORMATTER_REGISTRY.
|
|
40
|
+
TEXT_FORMATTER_REGISTRY.deregister(command);
|
|
35
41
|
}
|
|
36
42
|
/**
|
|
37
43
|
* Look up a registered text formatter by command name.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `akm show` agent-directive emission.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from `formatShowPlain` (formerly the largest function in
|
|
8
|
+
* `helpers.ts`): once the base show content is assembled, this module
|
|
9
|
+
* appends the REC-01/REC-09 APPLY / show-loop / workflow-active directive
|
|
10
|
+
* blocks that tell the calling agent how to act on the rendered asset.
|
|
11
|
+
* Directive strings are byte-identical to the pre-extraction version —
|
|
12
|
+
* only the seam moved.
|
|
13
|
+
*/
|
|
14
|
+
import { conceptIdFromTypeName } from "../../core/asset/resolve-ref.js";
|
|
15
|
+
/**
|
|
16
|
+
* Append the type-specific agent directive block to an in-progress
|
|
17
|
+
* `formatShowPlain` render. Mutates `lines` in place (matches the original
|
|
18
|
+
* inline behavior — push/unshift/splice all operate on the same array the
|
|
19
|
+
* caller continues to join afterward).
|
|
20
|
+
*/
|
|
21
|
+
export function appendShowDirectives(lines, r) {
|
|
22
|
+
// REC-01 / REC-09: Append a type-specific directive so agents apply the
|
|
23
|
+
// content rather than substituting training-data approximations.
|
|
24
|
+
const assetType = typeof r.type === "string" ? r.type : null;
|
|
25
|
+
// 0.9.0 (Q-02 / R-002): the retired `type:name` colon grammar is gone —
|
|
26
|
+
// build the slash conceptId the same way the workflow branch below does
|
|
27
|
+
// (`workflows/${name}`), via the entry's own already-computed `ref` when
|
|
28
|
+
// present (it carries correct bundle-qualification), falling back to a
|
|
29
|
+
// type-derived conceptId for callers that don't set `ref`.
|
|
30
|
+
const assetRef = typeof r.ref === "string"
|
|
31
|
+
? r.ref
|
|
32
|
+
: typeof r.name === "string" && assetType
|
|
33
|
+
? conceptIdFromTypeName(assetType, r.name)
|
|
34
|
+
: null;
|
|
35
|
+
// Show-loop detection: if the agent has shown this asset 3+ times without
|
|
36
|
+
// writing anything, surface a warning so it stops cycling and acts.
|
|
37
|
+
const showLoopCount = typeof r.showLoopWarning === "number" ? r.showLoopWarning : 0;
|
|
38
|
+
if (showLoopCount >= 3) {
|
|
39
|
+
lines.push("");
|
|
40
|
+
lines.push(`WARNING: You have shown this asset ${showLoopCount} times without completing the task.`);
|
|
41
|
+
lines.push("Stop re-reading — you have the information you need. Act on it now:");
|
|
42
|
+
lines.push(" - Write your output file using the content above.");
|
|
43
|
+
lines.push(` - If this asset does not contain what you need, run \`akm feedback '${assetRef ?? "<ref>"}' --negative\` and search for a different asset.`);
|
|
44
|
+
}
|
|
45
|
+
if (assetType === "skill" || assetType === "knowledge") {
|
|
46
|
+
const activeRun = r.activeRun;
|
|
47
|
+
if (activeRun) {
|
|
48
|
+
// Active workflow: redirect agent to workflow commands instead of direct apply
|
|
49
|
+
lines.unshift(` akm workflow complete '${activeRun.runId}'${activeRun.stepId ? ` --step '${activeRun.stepId}'` : ""}`);
|
|
50
|
+
lines.unshift("Read this schema, then follow your workflow step's instructions to edit the workspace file. When done, mark the step complete:");
|
|
51
|
+
lines.unshift(`WORKFLOW ACTIVE — schema shown as reference (run: ${activeRun.runId})`);
|
|
52
|
+
lines.unshift("---");
|
|
53
|
+
lines.unshift("");
|
|
54
|
+
// Still show feedback line at the end but skip the APPLY directive
|
|
55
|
+
lines.push("");
|
|
56
|
+
lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` if the step succeeds, or \`--negative\` if this schema did not help.`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// No active workflow: show the APPLY directive. Branch on whether this
|
|
60
|
+
// skill primarily teaches CLI commands (shell output) vs YAML schema.
|
|
61
|
+
const preApplyLines = [...lines];
|
|
62
|
+
lines.push("");
|
|
63
|
+
lines.push("---");
|
|
64
|
+
if (isCommandOutputSkill(preApplyLines)) {
|
|
65
|
+
lines.push("APPLY (only if no workflow step is required for this task):");
|
|
66
|
+
lines.push(" 1. Identify the output file from README.md (typically commands.txt).");
|
|
67
|
+
lines.push(" 2. Write the exact command syntax from the code blocks above — replace every placeholder (`<name>`, `<value>`) with a real, concrete value from your task context. Do not write placeholder text.");
|
|
68
|
+
lines.push(" 3. Each command should be on a single line (no backslash line continuation unless the verifier expects it).");
|
|
69
|
+
lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` after the task succeeds, or \`--negative\` if this reference did not contain the needed command syntax.`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
lines.push("APPLY (only if no workflow step is required for this task):");
|
|
73
|
+
lines.push(" 1. Identify the target file from README.md — write or edit it. If the file does not yet exist, CREATE it with the full structure from this schema.");
|
|
74
|
+
lines.push(" 2. Add/edit the fields shown above using the exact field names from this schema.");
|
|
75
|
+
lines.push(" 3. COPY the exact YAML structure and field names from the code blocks above — do not substitute synonyms or invent nesting. Replace every placeholder value with a real, concrete value from your task context. Do not leave any field as null, empty, or a placeholder.");
|
|
76
|
+
lines.push(`Run \`akm feedback ${assetRef ? `'${assetRef}'` : "<ref>"} --positive\` after the task succeeds, or \`--negative\` if the task fails after following this guidance.`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else if (assetType === "workflow") {
|
|
81
|
+
const workflowName = typeof r.name === "string" ? r.name : null;
|
|
82
|
+
const workflowRef = workflowName ? `workflows/${workflowName}` : "<ref>";
|
|
83
|
+
// Insert action directive BEFORE the workflow content by prepending to lines at the
|
|
84
|
+
// separator position. We find where the header ends and insert after the first `---`.
|
|
85
|
+
// Since lines already contain the full content at this point, we locate the insertion
|
|
86
|
+
// index: right after the first `---` separator if present, otherwise after the header.
|
|
87
|
+
const separatorIdx = lines.indexOf("---");
|
|
88
|
+
const insertIdx = separatorIdx >= 0 ? separatorIdx + 1 : r.type || r.name ? 1 : 0;
|
|
89
|
+
const actionDirective = [
|
|
90
|
+
`ACTION REQUIRED: Do not execute steps manually from this output.`,
|
|
91
|
+
`Run \`akm workflow next '${workflowRef}'\` to get your current step with exact instructions.`,
|
|
92
|
+
"---",
|
|
93
|
+
];
|
|
94
|
+
lines.splice(insertIdx, 0, "", ...actionDirective);
|
|
95
|
+
lines.push("");
|
|
96
|
+
lines.push("---");
|
|
97
|
+
lines.push(`NEXT STEP: Run \`akm workflow next '${workflowRef}'\` to see the current workflow step.`);
|
|
98
|
+
lines.push("Do not edit workspace files before completing each step with `akm workflow complete`.");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect whether a skill's rendered content primarily teaches CLI commands
|
|
103
|
+
* rather than YAML schema. Used to select the right APPLY directive variant.
|
|
104
|
+
*
|
|
105
|
+
* Heuristic: count code-block lines that start with known shell command
|
|
106
|
+
* prefixes vs lines that look like YAML key-value pairs. If CLI lines
|
|
107
|
+
* outnumber YAML lines (and there is at least one CLI line), treat the
|
|
108
|
+
* skill as command-output.
|
|
109
|
+
*/
|
|
110
|
+
function isCommandOutputSkill(lines) {
|
|
111
|
+
const codeLines = lines.filter((l) => l.startsWith(" ") || l.startsWith("\t") || /^`/.test(l));
|
|
112
|
+
const cliPattern = /^(az |kubectl |docker |git |helm |terraform |aws |gcloud )/;
|
|
113
|
+
const yamlPattern = /^\s+\w+:/;
|
|
114
|
+
const cliCount = codeLines.filter((l) => cliPattern.test(l.trim())).length;
|
|
115
|
+
const yamlCount = codeLines.filter((l) => yamlPattern.test(l)).length;
|
|
116
|
+
return cliCount > yamlCount && cliCount > 0;
|
|
117
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import { appendShowDirectives } from "./show-directives.js";
|
|
5
|
+
export function formatShowPlain(r, detail) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
if (r.type || r.name) {
|
|
8
|
+
lines.push(`# ${String(r.type ?? "asset")}: ${String(r.name ?? "unknown")}`);
|
|
9
|
+
}
|
|
10
|
+
if (r.path && r.editable !== false) {
|
|
11
|
+
lines.push(`file: ${String(r.path)}`);
|
|
12
|
+
}
|
|
13
|
+
if (r.origin !== undefined)
|
|
14
|
+
lines.push(`# origin: ${String(r.origin)}`);
|
|
15
|
+
if (r.action)
|
|
16
|
+
lines.push(`# ${String(r.action)}`);
|
|
17
|
+
if (r.description)
|
|
18
|
+
lines.push(`description: ${String(r.description)}`);
|
|
19
|
+
if (r.workflowTitle)
|
|
20
|
+
lines.push(`workflowTitle: ${String(r.workflowTitle)}`);
|
|
21
|
+
if (r.agent)
|
|
22
|
+
lines.push(`agent: ${String(r.agent)}`);
|
|
23
|
+
if (Array.isArray(r.parameters) && r.parameters.length > 0)
|
|
24
|
+
lines.push(`parameters: ${r.parameters.join(", ")}`);
|
|
25
|
+
if (Array.isArray(r.workflowParameters) && r.workflowParameters.length > 0) {
|
|
26
|
+
lines.push("workflowParameters:");
|
|
27
|
+
for (const parameter of r.workflowParameters) {
|
|
28
|
+
const name = typeof parameter.name === "string" ? parameter.name : "unknown";
|
|
29
|
+
const description = typeof parameter.description === "string" && parameter.description.trim() ? `: ${parameter.description}` : "";
|
|
30
|
+
lines.push(` - ${name}${description}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (r.modelHint != null)
|
|
34
|
+
lines.push(`modelHint: ${String(r.modelHint)}`);
|
|
35
|
+
if (r.toolPolicy != null)
|
|
36
|
+
lines.push(`toolPolicy: ${JSON.stringify(r.toolPolicy)}`);
|
|
37
|
+
if (r.run)
|
|
38
|
+
lines.push(`run: ${String(r.run)}`);
|
|
39
|
+
if (r.setup)
|
|
40
|
+
lines.push(`setup: ${String(r.setup)}`);
|
|
41
|
+
if (r.cwd)
|
|
42
|
+
lines.push(`cwd: ${String(r.cwd)}`);
|
|
43
|
+
if (detail === "full") {
|
|
44
|
+
if (r.path)
|
|
45
|
+
lines.push(`path: ${String(r.path)}`);
|
|
46
|
+
if (r.editable !== undefined)
|
|
47
|
+
lines.push(`editable: ${String(r.editable)}`);
|
|
48
|
+
if (r.editHint)
|
|
49
|
+
lines.push(`editHint: ${String(r.editHint)}`);
|
|
50
|
+
if (r.schemaVersion !== undefined)
|
|
51
|
+
lines.push(`schemaVersion: ${String(r.schemaVersion)}`);
|
|
52
|
+
}
|
|
53
|
+
const related = typeof r.related === "object" && r.related !== null ? r.related : undefined;
|
|
54
|
+
const relatedHits = related && Array.isArray(related.hits) ? related.hits : [];
|
|
55
|
+
if (related) {
|
|
56
|
+
lines.push("");
|
|
57
|
+
lines.push(`related: ${String(related.total ?? relatedHits.length)}`);
|
|
58
|
+
for (const hit of relatedHits) {
|
|
59
|
+
lines.push(` - ${String(hit.type ?? "?")}: ${formatRelatedLabel(hit)}`);
|
|
60
|
+
const shared = Array.isArray(hit.sharedEntities) ? hit.sharedEntities.map(String) : [];
|
|
61
|
+
if (shared.length > 0)
|
|
62
|
+
lines.push(` shared: ${shared.join(", ")}`);
|
|
63
|
+
lines.push(` relationCount: ${String(hit.relationCount ?? 0)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const payloads = [r.content, r.template, r.prompt].filter((value) => value != null).map(String);
|
|
67
|
+
if (Array.isArray(r.steps) && r.steps.length > 0) {
|
|
68
|
+
if (lines.length > 0)
|
|
69
|
+
lines.push("");
|
|
70
|
+
lines.push("steps:");
|
|
71
|
+
for (const [index, step] of r.steps.entries()) {
|
|
72
|
+
const title = typeof step.title === "string" ? step.title : "Untitled step";
|
|
73
|
+
const id = typeof step.id === "string" ? step.id : "unknown";
|
|
74
|
+
lines.push(` ${index + 1}. ${title} [${id}]`);
|
|
75
|
+
if (typeof step.instructions === "string" && step.instructions.trim()) {
|
|
76
|
+
const instrLines = step.instructions.trim().split("\n");
|
|
77
|
+
lines.push(` instructions: ${instrLines[0]}`);
|
|
78
|
+
for (const instrLine of instrLines.slice(1))
|
|
79
|
+
lines.push(` ${instrLine}`);
|
|
80
|
+
}
|
|
81
|
+
if (Array.isArray(step.completionCriteria) && step.completionCriteria.length > 0) {
|
|
82
|
+
lines.push(" completion:");
|
|
83
|
+
for (const criterion of step.completionCriteria) {
|
|
84
|
+
lines.push(` - ${String(criterion)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (payloads.length > 0) {
|
|
90
|
+
if (lines.length > 0)
|
|
91
|
+
lines.push("");
|
|
92
|
+
lines.push(...payloads);
|
|
93
|
+
}
|
|
94
|
+
appendShowDirectives(lines, r);
|
|
95
|
+
return lines.length > 0 ? lines.join("\n") : null;
|
|
96
|
+
}
|
|
97
|
+
function formatRelatedLabel(hit) {
|
|
98
|
+
const ref = typeof hit.ref === "string" ? hit.ref : undefined;
|
|
99
|
+
if (ref)
|
|
100
|
+
return ref;
|
|
101
|
+
const pathValue = typeof hit.path === "string" ? hit.path : "?";
|
|
102
|
+
return pathValue.split("/").pop() ?? pathValue;
|
|
103
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import { formatSyncPlain } from "./helpers.js";
|
|
5
|
+
export const syncFormatters = [{ command: "sync", handler: (r) => formatSyncPlain(r) }];
|