akm-cli 0.9.0-rc.0 → 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 +1283 -22
- 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/prompts/workflow-unit-preamble.md +26 -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 +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- 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/migration-help.js +7 -4
- 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 +232 -121
- 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 -834
- 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/json-schema.js +142 -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 -34
- 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 -56
- 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 +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- 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 +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- 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 +14 -279
- 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 +11 -39
- 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 -1164
- 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 +3 -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 +240 -19
- 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/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- 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/schemas/akm-workflow.json +373 -0
- 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 -259
- 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 -1413
- 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 -49
- 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/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- 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/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -0,0 +1,303 @@
|
|
|
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
|
+
* Managed-subprocess primitive.
|
|
6
|
+
*
|
|
7
|
+
* The battle-tested spawn/timeout/abort/capture core, extracted from the agent
|
|
8
|
+
* CLI spawn wrapper so non-agent subprocess callers (task commands, setup
|
|
9
|
+
* probes/installers) get the same guarantees the agent path already had:
|
|
10
|
+
*
|
|
11
|
+
* • Process-GROUP spawn (`detached: true` when capturing) so a negative-pid
|
|
12
|
+
* kill reaps the whole descendant tree — no orphaned children.
|
|
13
|
+
* • A SIGTERM→SIGKILL kill ladder on timeout/abort — a child that ignores
|
|
14
|
+
* SIGTERM is force-killed after a grace period instead of wedging forever.
|
|
15
|
+
* • Bounded output capture ({@link readStream}) that cannot block past the
|
|
16
|
+
* wall budget even when the child leaves a pipe endpoint open.
|
|
17
|
+
* • Injectable `spawnFn`/`setTimeoutFn`/`clearTimeoutFn` seams so callers
|
|
18
|
+
* can drive the machinery deterministically in tests.
|
|
19
|
+
*
|
|
20
|
+
* Runtime boundary: the default spawn comes from `../runtime`; this module
|
|
21
|
+
* never touches `Bun.*` directly. It also never imports from `integrations/`
|
|
22
|
+
* or `tasks/` — it is a leaf primitive those layers consume.
|
|
23
|
+
*/
|
|
24
|
+
import { spawn as runtimeSpawn } from "../runtime.js";
|
|
25
|
+
/**
|
|
26
|
+
* Kill the process group of `proc` with `signal`, falling back to
|
|
27
|
+
* `proc.kill(signal)` when `proc.pid` is unavailable (e.g. test fakes).
|
|
28
|
+
*
|
|
29
|
+
* Passing a negative PID to `process.kill` targets the entire process
|
|
30
|
+
* group, so opencode's child processes (the .opencode binary, etc.) are
|
|
31
|
+
* reaped alongside the node wrapper. The fallback keeps test fakes working
|
|
32
|
+
* without modification.
|
|
33
|
+
*/
|
|
34
|
+
export function killGroup(proc, signal) {
|
|
35
|
+
if (typeof proc.pid === "number") {
|
|
36
|
+
try {
|
|
37
|
+
process.kill(-proc.pid, signal);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Process may have already exited; fall through to direct kill.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
proc.kill(signal);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* ignore */
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* SIGTERM→SIGKILL kill ladder shared by the timeout and abort paths (§4.6
|
|
53
|
+
* dedup, H3). No-op when the child has already exited; otherwise runs
|
|
54
|
+
* `onKill` (the caller's reason flag — `timedOut` / `aborted` — set BEFORE
|
|
55
|
+
* the first signal, exactly as the inlined copies did), SIGTERMs the
|
|
56
|
+
* process group, and schedules a follow-up SIGKILL after `graceMs` in case
|
|
57
|
+
* the process ignores SIGTERM. The SIGKILL timer is unref'ed so it never
|
|
58
|
+
* pins the event loop.
|
|
59
|
+
*/
|
|
60
|
+
export function scheduleKillLadder(proc, opts) {
|
|
61
|
+
if (!proc || proc.exitCode !== null)
|
|
62
|
+
return;
|
|
63
|
+
opts.onKill();
|
|
64
|
+
killGroup(proc, "SIGTERM");
|
|
65
|
+
const sigkillTimer = opts.setTimeoutFn(() => {
|
|
66
|
+
if (!proc || proc.exitCode !== null)
|
|
67
|
+
return;
|
|
68
|
+
killGroup(proc, "SIGKILL");
|
|
69
|
+
}, opts.graceMs ?? 5000);
|
|
70
|
+
if (typeof sigkillTimer !== "number")
|
|
71
|
+
sigkillTimer.unref?.();
|
|
72
|
+
}
|
|
73
|
+
const STREAM_READ_TIMEOUT = Symbol("stream-read-timeout");
|
|
74
|
+
/**
|
|
75
|
+
* Drain a readable stream to text, optionally racing each read against a
|
|
76
|
+
* timeout so a process that is killed via SIGTERM/SIGKILL but whose pipe
|
|
77
|
+
* endpoints stay open (e.g. background threads still holding the fd) cannot
|
|
78
|
+
* block the caller indefinitely. On timeout we return whatever was decoded
|
|
79
|
+
* before the pipe stopped draining.
|
|
80
|
+
*/
|
|
81
|
+
export async function readStream(stream, opts) {
|
|
82
|
+
if (!stream)
|
|
83
|
+
return { text: "", timedOut: false };
|
|
84
|
+
const reader = stream.getReader();
|
|
85
|
+
const decoder = new TextDecoder();
|
|
86
|
+
let text = "";
|
|
87
|
+
if (!opts?.timeoutMs) {
|
|
88
|
+
try {
|
|
89
|
+
while (true) {
|
|
90
|
+
const chunk = await reader.read();
|
|
91
|
+
if (chunk.done)
|
|
92
|
+
break;
|
|
93
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
94
|
+
}
|
|
95
|
+
text += decoder.decode();
|
|
96
|
+
return { text, timedOut: false };
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return { text, timedOut: false, error };
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
try {
|
|
103
|
+
reader.releaseLock();
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* ignore */
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const setTimeoutImpl = opts.setTimeoutFn ?? setTimeout;
|
|
111
|
+
const clearTimeoutImpl = opts.clearTimeoutFn ?? clearTimeout;
|
|
112
|
+
let timer;
|
|
113
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
114
|
+
timer = setTimeoutImpl(() => {
|
|
115
|
+
timer = undefined;
|
|
116
|
+
resolve(STREAM_READ_TIMEOUT);
|
|
117
|
+
}, opts.timeoutMs);
|
|
118
|
+
if (typeof timer !== "number")
|
|
119
|
+
timer.unref?.();
|
|
120
|
+
});
|
|
121
|
+
try {
|
|
122
|
+
while (true) {
|
|
123
|
+
const chunk = await Promise.race([reader.read(), timeoutPromise]);
|
|
124
|
+
if (chunk === STREAM_READ_TIMEOUT) {
|
|
125
|
+
void reader.cancel().catch(() => { });
|
|
126
|
+
return { text, timedOut: true };
|
|
127
|
+
}
|
|
128
|
+
if (chunk.done)
|
|
129
|
+
break;
|
|
130
|
+
text += decoder.decode(chunk.value, { stream: true });
|
|
131
|
+
}
|
|
132
|
+
text += decoder.decode();
|
|
133
|
+
return { text, timedOut: false };
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return { text, timedOut: false, error };
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
if (timer !== undefined) {
|
|
140
|
+
clearTimeoutImpl(timer);
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
reader.releaseLock();
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
/* ignore */
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const EMPTY_READ = { text: "", timedOut: false };
|
|
151
|
+
function toError(err) {
|
|
152
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Spawn `cmd` and manage its lifecycle: process-group spawn, hard timeout and
|
|
156
|
+
* cooperative abort (both via the SIGTERM→SIGKILL {@link scheduleKillLadder}),
|
|
157
|
+
* bounded output capture, and an optional stdin payload. Never throws for a
|
|
158
|
+
* spawn/exit failure — those surface as {@link ManagedSubprocessResult.spawnError}.
|
|
159
|
+
*/
|
|
160
|
+
export async function runManagedSubprocess(cmd, opts) {
|
|
161
|
+
const setTimeoutImpl = opts.setTimeoutFn ?? setTimeout;
|
|
162
|
+
const clearTimeoutImpl = opts.clearTimeoutFn ?? clearTimeout;
|
|
163
|
+
const spawnFn = opts.spawnFn ?? runtimeSpawn;
|
|
164
|
+
const capture = opts.capture;
|
|
165
|
+
const timeoutMs = opts.timeoutMs;
|
|
166
|
+
// Refuse to spawn at all when the caller's signal is already aborted.
|
|
167
|
+
if (opts.signal?.aborted) {
|
|
168
|
+
return {
|
|
169
|
+
exitCode: null,
|
|
170
|
+
stdout: "",
|
|
171
|
+
stderr: "",
|
|
172
|
+
timedOut: false,
|
|
173
|
+
aborted: true,
|
|
174
|
+
stdoutRead: EMPTY_READ,
|
|
175
|
+
stderrRead: EMPTY_READ,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
let proc;
|
|
179
|
+
try {
|
|
180
|
+
proc = spawnFn(cmd, {
|
|
181
|
+
stdin: capture ? (opts.stdin !== undefined ? "pipe" : "ignore") : "inherit",
|
|
182
|
+
stdout: capture ? "pipe" : "inherit",
|
|
183
|
+
stderr: capture ? "pipe" : "inherit",
|
|
184
|
+
...(opts.env ? { env: opts.env } : {}),
|
|
185
|
+
...(opts.cwd ? { cwd: opts.cwd } : {}),
|
|
186
|
+
// Spawn in its own process group so killGroup(-pid, signal) reaches all
|
|
187
|
+
// descendants. Only in captured mode — interactive mode inherits the
|
|
188
|
+
// parent terminal's process group intentionally.
|
|
189
|
+
...(capture ? { detached: true } : {}),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
return {
|
|
194
|
+
exitCode: null,
|
|
195
|
+
stdout: "",
|
|
196
|
+
stderr: "",
|
|
197
|
+
timedOut: false,
|
|
198
|
+
aborted: false,
|
|
199
|
+
spawnError: toError(err),
|
|
200
|
+
stdoutRead: EMPTY_READ,
|
|
201
|
+
stderrRead: EMPTY_READ,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
opts.onSpawn?.(proc);
|
|
205
|
+
// Hard timeout: SIGTERM now, SIGKILL after the grace period if ignored.
|
|
206
|
+
// Skipped entirely when timeoutMs is null.
|
|
207
|
+
let timedOut = false;
|
|
208
|
+
let timer;
|
|
209
|
+
if (timeoutMs !== null) {
|
|
210
|
+
timer = setTimeoutImpl(() => {
|
|
211
|
+
scheduleKillLadder(proc, {
|
|
212
|
+
onKill: () => {
|
|
213
|
+
timedOut = true;
|
|
214
|
+
},
|
|
215
|
+
setTimeoutFn: setTimeoutImpl,
|
|
216
|
+
...(opts.graceMs !== undefined ? { graceMs: opts.graceMs } : {}),
|
|
217
|
+
});
|
|
218
|
+
}, timeoutMs);
|
|
219
|
+
}
|
|
220
|
+
// Cooperative cancel: same ladder, flagged separately so the caller can tell
|
|
221
|
+
// a budget/user abort from a wall-clock expiry.
|
|
222
|
+
let aborted = false;
|
|
223
|
+
const abortSignal = opts.signal;
|
|
224
|
+
const onAbort = () => {
|
|
225
|
+
scheduleKillLadder(proc, {
|
|
226
|
+
onKill: () => {
|
|
227
|
+
aborted = true;
|
|
228
|
+
},
|
|
229
|
+
setTimeoutFn: setTimeoutImpl,
|
|
230
|
+
...(opts.graceMs !== undefined ? { graceMs: opts.graceMs } : {}),
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
if (abortSignal) {
|
|
234
|
+
// A signal that aborted between the pre-spawn check and here fires the
|
|
235
|
+
// listener directly (the "abort" event would otherwise never re-dispatch).
|
|
236
|
+
if (abortSignal.aborted)
|
|
237
|
+
onAbort();
|
|
238
|
+
else
|
|
239
|
+
abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
240
|
+
}
|
|
241
|
+
// Stream-drain timeout: the wall budget plus a 2 s grace, or 30 s when there
|
|
242
|
+
// is no kill timer. Ensures the caller never hangs past the budget even if a
|
|
243
|
+
// killed child leaves a pipe write-end open in a background thread.
|
|
244
|
+
const streamDrainTimeoutMs = timeoutMs !== null ? timeoutMs + 2_000 : 30_000;
|
|
245
|
+
const stdoutPromise = capture
|
|
246
|
+
? readStream(proc.stdout ?? null, {
|
|
247
|
+
timeoutMs: streamDrainTimeoutMs,
|
|
248
|
+
setTimeoutFn: setTimeoutImpl,
|
|
249
|
+
clearTimeoutFn: clearTimeoutImpl,
|
|
250
|
+
})
|
|
251
|
+
: Promise.resolve(EMPTY_READ);
|
|
252
|
+
const stderrPromise = capture
|
|
253
|
+
? readStream(proc.stderr ?? null, {
|
|
254
|
+
timeoutMs: streamDrainTimeoutMs,
|
|
255
|
+
setTimeoutFn: setTimeoutImpl,
|
|
256
|
+
clearTimeoutFn: clearTimeoutImpl,
|
|
257
|
+
})
|
|
258
|
+
: Promise.resolve(EMPTY_READ);
|
|
259
|
+
// Optional stdin payload (captured mode only). Race the write/close against
|
|
260
|
+
// proc.exited so a child that never drains stdin cannot pin us past the
|
|
261
|
+
// timeout.
|
|
262
|
+
if (opts.stdin !== undefined && capture && proc.stdin) {
|
|
263
|
+
const stdinPayload = opts.stdin;
|
|
264
|
+
const stdinStream = proc.stdin;
|
|
265
|
+
const stdinDone = (async () => {
|
|
266
|
+
try {
|
|
267
|
+
const writer = stdinStream.getWriter();
|
|
268
|
+
await writer.write(new TextEncoder().encode(stdinPayload));
|
|
269
|
+
await writer.close();
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// Best-effort: ignore stdin write failures, the child will get EOF.
|
|
273
|
+
}
|
|
274
|
+
})();
|
|
275
|
+
await Promise.race([stdinDone, proc.exited.catch(() => undefined)]);
|
|
276
|
+
}
|
|
277
|
+
let exitCode = null;
|
|
278
|
+
try {
|
|
279
|
+
exitCode = await proc.exited;
|
|
280
|
+
}
|
|
281
|
+
catch (err) {
|
|
282
|
+
if (timer !== undefined)
|
|
283
|
+
clearTimeoutImpl(timer);
|
|
284
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
285
|
+
// Drain readers so they don't surface as unhandled rejections. The streams
|
|
286
|
+
// carry their own drain timeout so this cannot block indefinitely.
|
|
287
|
+
await Promise.allSettled([stdoutPromise, stderrPromise]);
|
|
288
|
+
return {
|
|
289
|
+
exitCode: null,
|
|
290
|
+
stdout: "",
|
|
291
|
+
stderr: "",
|
|
292
|
+
timedOut: false,
|
|
293
|
+
aborted: false,
|
|
294
|
+
spawnError: toError(err),
|
|
295
|
+
stdoutRead: EMPTY_READ,
|
|
296
|
+
stderrRead: EMPTY_READ,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
clearTimeoutImpl(timer);
|
|
300
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
301
|
+
const [stdoutRead, stderrRead] = await Promise.all([stdoutPromise, stderrPromise]);
|
|
302
|
+
return { exitCode, stdout: stdoutRead.text, stderr: stderrRead.text, timedOut, aborted, stdoutRead, stderrRead };
|
|
303
|
+
}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
* implementations historically maintained overlapping-but-not-identical
|
|
10
10
|
* vocabularies of hanging-connector words, which was a maintenance trap.
|
|
11
11
|
*
|
|
12
|
-
* This module is the single source of truth.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* This module is the single source of truth. A separate section-heading regex
|
|
13
|
+
* (`HEADING_FRAGMENT_PATTERNS` in
|
|
14
|
+
* `src/commands/proposal/validators/proposal-quality-validators.ts`) layers on
|
|
15
|
+
* top of these heuristics and is shared across distill, consolidate, and
|
|
16
|
+
* reflect rather than staying local to any one of them.
|
|
15
17
|
*/
|
|
16
18
|
/**
|
|
17
19
|
* Words that, when ending a sentence, suggest the description was truncated
|
|
@@ -87,8 +89,10 @@ export const TRUNCATION_TRAILING_WORDS = new Set([
|
|
|
87
89
|
* - Trailing ellipsis (`...` or `…`)
|
|
88
90
|
* - Last word matches {@link TRUNCATION_TRAILING_WORDS}
|
|
89
91
|
*
|
|
90
|
-
* Does NOT detect section-heading fragments — that check
|
|
91
|
-
*
|
|
92
|
+
* Does NOT detect section-heading fragments — that check lives in
|
|
93
|
+
* `HEADING_FRAGMENT_PATTERNS` in
|
|
94
|
+
* `src/commands/proposal/validators/proposal-quality-validators.ts`, shared by
|
|
95
|
+
* distill, consolidate, and reflect.
|
|
92
96
|
*/
|
|
93
97
|
export function detectTruncatedDescription(description) {
|
|
94
98
|
const trimmed = description.trim();
|
package/dist/core/time.js
CHANGED
|
@@ -98,6 +98,26 @@ export function parseSinceToIso(since) {
|
|
|
98
98
|
}
|
|
99
99
|
return parsed.toISOString();
|
|
100
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* LENIENT variant for config-driven since-values that may be a duration
|
|
103
|
+
* shorthand (e.g. `"30m"`, `"24h"`, `"7d"` per {@link DURATION_UNITS}):
|
|
104
|
+
* a matching duration resolves to the ISO timestamp of `now - duration`;
|
|
105
|
+
* anything else is returned UNCHANGED (assumed to already be an ISO
|
|
106
|
+
* timestamp) — this function never throws.
|
|
107
|
+
*
|
|
108
|
+
* Deliberately distinct from {@link parseSinceToIso}, which rejects
|
|
109
|
+
* unparseable input with a UsageError: the identity fallback here is
|
|
110
|
+
* behavior consumers rely on (consolidate's incremental narrowing compares
|
|
111
|
+
* the returned string lexicographically against file-mtime ISO strings, so
|
|
112
|
+
* garbage input silently selects nothing rather than failing the run —
|
|
113
|
+
* pinned by tests/commands/goldens-duration-flags.test.ts).
|
|
114
|
+
*/
|
|
115
|
+
export function parseSinceToIsoLenient(since) {
|
|
116
|
+
const ms = parseDuration(since, DURATION_UNITS);
|
|
117
|
+
if (ms === null)
|
|
118
|
+
return since;
|
|
119
|
+
return new Date(Date.now() - ms).toISOString();
|
|
120
|
+
}
|
|
101
121
|
/**
|
|
102
122
|
* Convert an ISO-8601 timestamp string to the SQLite datetime format
|
|
103
123
|
* `"YYYY-MM-DD HH:MM:SS"` used by `datetime('now')`.
|
|
@@ -0,0 +1,130 @@
|
|
|
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
|
+
* Chunk 1.5 (WI-1.5.1, D1.5-4) — the §2.3 "compile-time safety mitigation"
|
|
6
|
+
* table for AKM's own presentation metadata. EXTENDED by chunk-2 WI-C
|
|
7
|
+
* (`docs/architecture/specs/akm-0.9.0-bundle-adapter-spec.md` §2) to carry the per-`type`
|
|
8
|
+
* renderer NAME + action builder, so this table becomes the `TYPE_PRESENTATION`
|
|
9
|
+
* data table §2 mandates ("Renderer/action = data table keyed on the open
|
|
10
|
+
* `type`, pointing at a named-function core module").
|
|
11
|
+
*
|
|
12
|
+
* The open type token (chunk 1.5) trades the deleted closed asset-type
|
|
13
|
+
* union's exhaustiveness checking for a runtime lookup. `TYPE_PRESENTATION`
|
|
14
|
+
* restores that exhaustiveness for AKM's OWN known types (the compiler
|
|
15
|
+
* demands an entry whenever {@link KnownType} gains a member), while
|
|
16
|
+
* {@link presentationFor} stays open over `string` so foreign/adapter types
|
|
17
|
+
* still resolve to a sane generic fallback instead of `undefined`/a throw.
|
|
18
|
+
*
|
|
19
|
+
* ── renderer/action provenance (WI-C, §2) ──
|
|
20
|
+
*
|
|
21
|
+
* The `renderer` NAMES and `action` builders below are the SINGLE SOURCE OF
|
|
22
|
+
* TRUTH for search-hit rendering — chunk-3 folded the old mutable renderer/
|
|
23
|
+
* action registry singleton into this static table (reached via
|
|
24
|
+
* {@link defaultRendererRegistry}). They cover all built-in types — INCLUDING
|
|
25
|
+
* the 15th type `instruction` (a read-like-knowledge markdown doc added for the
|
|
26
|
+
* format-family adapters) and the 6 "static-only" mappings
|
|
27
|
+
* (script/skill/command/agent/knowledge/memory) — §6 "6 renderer mappings".
|
|
28
|
+
* The workflow action is the one function-valued builder; its
|
|
29
|
+
* `buildWorkflowAction` body (`output/renderers.ts` — a cycle-sensitive module)
|
|
30
|
+
* is reproduced inline here rather than imported, to keep this leaf import-free
|
|
31
|
+
* (only `recognition-util`, D1-5's pure sink); `tests/core/adapter/
|
|
32
|
+
* akm-presentation.test.ts` pins the renderer/action values against drift.
|
|
33
|
+
*/
|
|
34
|
+
import { isKnownType } from "./recognition-util.js";
|
|
35
|
+
/** POSIX-shell single-quote a value — inlined from `output/renderers.ts#shellQuote` (cycle-sensitive; see file header). */
|
|
36
|
+
function shellQuote(value) {
|
|
37
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
38
|
+
}
|
|
39
|
+
/** Reproduced from `output/renderers.ts#buildWorkflowAction` — the one function-valued `ACTION_BUILDERS.workflow` entry. */
|
|
40
|
+
function buildWorkflowAction(ref) {
|
|
41
|
+
return `Resume the active run or start a new run with \`akm workflow next ${shellQuote(ref)}\`.`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Exhaustive over {@link KnownType} — a HAND-WRITTEN literal, not derived
|
|
45
|
+
* from `KNOWN_TYPES` programmatically, so the compiler rejects this object
|
|
46
|
+
* if a `KNOWN_TYPES` member is added without a corresponding entry here
|
|
47
|
+
* (TypeScript's version of the `§7.3 shipped-assets lint` cross-check the
|
|
48
|
+
* plan describes for later — "adding a KNOWN_TYPE forces a decision").
|
|
49
|
+
*
|
|
50
|
+
* `renderer`/`action` are the built-in search-hit rendering data (WI-C, §2) —
|
|
51
|
+
* see the file header.
|
|
52
|
+
*/
|
|
53
|
+
export const TYPE_PRESENTATION = {
|
|
54
|
+
skill: { label: "Skill", renderer: "skill-md", action: (ref) => `akm show ${ref} -> follow the instructions` },
|
|
55
|
+
command: {
|
|
56
|
+
label: "Command",
|
|
57
|
+
renderer: "command-md",
|
|
58
|
+
action: (ref) => `akm show ${ref} -> fill placeholders and dispatch`,
|
|
59
|
+
},
|
|
60
|
+
agent: { label: "Agent", renderer: "agent-md", action: (ref) => `akm show ${ref} -> dispatch with full prompt` },
|
|
61
|
+
knowledge: {
|
|
62
|
+
label: "Knowledge",
|
|
63
|
+
renderer: "knowledge-md",
|
|
64
|
+
action: (ref) => `akm show ${ref} -> read reference material`,
|
|
65
|
+
},
|
|
66
|
+
workflow: { label: "Workflow", renderer: "workflow-md", action: (ref) => buildWorkflowAction(ref) },
|
|
67
|
+
script: { label: "Script", renderer: "script-source", action: (ref) => `akm show ${ref} -> execute the run command` },
|
|
68
|
+
memory: { label: "Memory", renderer: "memory-md", action: (ref) => `akm show ${ref} -> recall context` },
|
|
69
|
+
env: {
|
|
70
|
+
label: "Env",
|
|
71
|
+
renderer: "env-file",
|
|
72
|
+
action: (ref) => `akm show ${ref} -> inspect key names; akm env run ${ref} -- <command> -> run with the whole .env injected (prefer --clean to minimize inherited parent env; child stdout is not redacted). akm env export ${ref} --out <file> writes a sourceable script (values to a file, not stdout).`,
|
|
73
|
+
},
|
|
74
|
+
secret: {
|
|
75
|
+
label: "Secret",
|
|
76
|
+
renderer: "secret-file",
|
|
77
|
+
action: (ref) => `akm show ${ref} -> name only (value never shown); akm secret run ${ref} <VAR> -- <command> -> run with value injected into $VAR`,
|
|
78
|
+
},
|
|
79
|
+
lesson: {
|
|
80
|
+
label: "Lesson",
|
|
81
|
+
renderer: "lesson-md",
|
|
82
|
+
action: (ref) => `akm show ${ref} -> read the lesson and apply when_to_use`,
|
|
83
|
+
},
|
|
84
|
+
task: {
|
|
85
|
+
label: "Task",
|
|
86
|
+
renderer: "task-yaml",
|
|
87
|
+
action: (ref) => `akm show ${ref} -> inspect; akm task run <id> -> run now; edit the file + akm task sync -> unschedule`,
|
|
88
|
+
},
|
|
89
|
+
session: {
|
|
90
|
+
label: "Session",
|
|
91
|
+
renderer: "session-md",
|
|
92
|
+
action: (ref) => `akm show ${ref} -> read the session summary; follow the \`access\` frontmatter to open the raw log at \`log_path\``,
|
|
93
|
+
},
|
|
94
|
+
fact: {
|
|
95
|
+
label: "Fact",
|
|
96
|
+
renderer: "fact-md",
|
|
97
|
+
action: (ref) => `akm show ${ref} -> read the stash fact and apply it as durable context`,
|
|
98
|
+
},
|
|
99
|
+
// `instruction` (CLAUDE.md / AGENTS.md) is a read-like-knowledge markdown
|
|
100
|
+
// doc (spec §6/§7 instruction row, maintainer resolution 2026-07): it REUSES
|
|
101
|
+
// the `knowledge-md` renderer and mirrors knowledge's read action, so an
|
|
102
|
+
// instruction hit renders exactly like knowledge instead of the generic
|
|
103
|
+
// fallback (the parity guard in akm-presentation.test.ts pins this).
|
|
104
|
+
instruction: {
|
|
105
|
+
label: "Instruction",
|
|
106
|
+
renderer: "knowledge-md",
|
|
107
|
+
action: (ref) => `akm show ${ref} -> read the project instructions`,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
/** Generic fallback for a type outside {@link KNOWN_TYPES} — never `undefined`, never a throw. */
|
|
111
|
+
const DEFAULT_PRESENTATION = { label: "Asset" };
|
|
112
|
+
/**
|
|
113
|
+
* Open-string lookup with a generic, non-`undefined` fallback (plan §2.3).
|
|
114
|
+
* `undefined` (no type known yet) and any foreign/adapter type both resolve
|
|
115
|
+
* to {@link DEFAULT_PRESENTATION}; only AKM's own {@link KNOWN_TYPES} get a
|
|
116
|
+
* type-specific presentation.
|
|
117
|
+
*/
|
|
118
|
+
export function presentationFor(type) {
|
|
119
|
+
if (type !== undefined && isKnownType(type))
|
|
120
|
+
return TYPE_PRESENTATION[type];
|
|
121
|
+
return DEFAULT_PRESENTATION;
|
|
122
|
+
}
|
|
123
|
+
export const defaultRendererRegistry = {
|
|
124
|
+
rendererNameFor(type) {
|
|
125
|
+
return presentationFor(type).renderer;
|
|
126
|
+
},
|
|
127
|
+
actionBuilderFor(type) {
|
|
128
|
+
return presentationFor(type).action;
|
|
129
|
+
},
|
|
130
|
+
};
|
package/dist/core/warn.js
CHANGED