akm-cli 0.9.0-beta.9 → 0.9.0-rc.1
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 +715 -0
- package/README.md +12 -4
- package/dist/akm +38 -0
- package/dist/akm-migrate-storage +38 -0
- package/dist/assets/help/help-improve.md +9 -6
- package/dist/assets/hints/cli-hints-full.md +6 -5
- package/dist/assets/profiles/default.json +9 -4
- package/dist/assets/profiles/frequent.json +1 -1
- package/dist/assets/profiles/memory-focus.json +1 -1
- package/dist/assets/profiles/proactive-maintenance.json +25 -0
- package/dist/assets/profiles/quick.json +1 -1
- package/dist/assets/profiles/recombine-only.json +21 -0
- package/dist/assets/profiles/reflect-distill.json +30 -0
- package/dist/assets/profiles/synthesize.json +15 -0
- package/dist/assets/profiles/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +23 -0
- package/dist/assets/prompts/contradiction-judge.md +33 -0
- package/dist/assets/prompts/distill-knowledge-system.md +22 -0
- package/dist/assets/prompts/distill-lesson-system.md +36 -0
- package/dist/assets/prompts/extract-session.md +11 -3
- package/dist/assets/prompts/graph-extract-system.md +1 -0
- package/dist/assets/prompts/graph-extract-user-prompt.md +1 -1
- package/dist/assets/prompts/memory-infer-system.md +1 -0
- package/dist/assets/prompts/memory-infer-user.md +5 -0
- package/dist/assets/prompts/metadata-enhance-system.md +1 -0
- package/dist/assets/prompts/procedural-system.md +44 -0
- package/dist/assets/prompts/recombine-system.md +40 -0
- package/dist/assets/prompts/staleness-detect-system.md +6 -0
- package/dist/assets/prompts/validate-summary-judge.md +1 -0
- package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +39 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +40 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +43 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +38 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +43 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +40 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +43 -0
- package/dist/assets/templates/html/health.html +281 -111
- package/dist/assets/wiki/ingest-workflow-template.md +45 -16
- package/dist/assets/wiki/schema-template.md +4 -4
- package/dist/cli/clack.js +56 -0
- package/dist/cli/config-migrate.js +7 -1
- package/dist/cli/confirm.js +1 -1
- package/dist/cli/parse-args.js +46 -1
- package/dist/cli/shared.js +28 -0
- package/dist/cli.js +25 -21
- package/dist/commands/agent/agent-dispatch.js +3 -2
- package/dist/commands/agent/agent-support.js +0 -7
- package/dist/commands/agent/contribute-cli.js +26 -7
- package/dist/commands/config-cli.js +26 -13
- package/dist/commands/env/child-env.js +47 -0
- package/dist/commands/env/env-binding.js +95 -0
- package/dist/commands/env/env-cli.js +228 -292
- package/dist/commands/env/env.js +14 -67
- package/dist/commands/env/secret-cli.js +140 -138
- package/dist/commands/feedback-cli.js +156 -155
- package/dist/commands/graph/graph-cli.js +5 -13
- package/dist/commands/graph/graph.js +3 -3
- package/dist/commands/health/advisories.js +151 -0
- package/dist/commands/health/checks.js +103 -16
- package/dist/commands/health/html-report.js +447 -81
- package/dist/commands/health/improve-metrics.js +771 -0
- package/dist/commands/health/llm-usage.js +65 -0
- package/dist/commands/health/md-report.js +103 -0
- package/dist/commands/health/metrics.js +278 -0
- package/dist/commands/health/stash-exposure.js +46 -0
- package/dist/commands/health/surfaces.js +216 -0
- package/dist/commands/health/task-runs.js +135 -0
- package/dist/commands/health/types.js +26 -0
- package/dist/commands/health/windows.js +195 -0
- package/dist/commands/health.js +91 -1091
- package/dist/commands/improve/anti-collapse.js +170 -0
- package/dist/commands/improve/calibration.js +161 -0
- package/dist/commands/improve/collapse-detector.js +421 -0
- package/dist/commands/improve/consolidate/chunking.js +141 -0
- package/dist/commands/improve/consolidate/eligibility.js +64 -0
- package/dist/commands/improve/consolidate/merge.js +145 -0
- package/dist/commands/improve/consolidate/sanitize.js +231 -0
- package/dist/commands/{lint.js → improve/consolidate/types.js} +1 -1
- package/dist/commands/improve/consolidate.js +1295 -1277
- package/dist/commands/improve/dedup.js +482 -0
- package/dist/commands/improve/distill/content-repair.js +202 -0
- package/dist/commands/improve/distill/promote-memory.js +229 -0
- package/dist/commands/improve/distill/quality-gate.js +236 -0
- package/dist/commands/improve/distill-guards.js +127 -0
- package/dist/commands/improve/distill-promotion-policy.js +826 -167
- package/dist/commands/improve/distill.js +228 -605
- package/dist/commands/improve/eligibility.js +434 -0
- package/dist/commands/improve/encoding-salience.js +205 -0
- package/dist/commands/improve/extract-cli.js +179 -59
- package/dist/commands/improve/extract-prompt.js +54 -3
- package/dist/commands/improve/extract-watch.js +140 -0
- package/dist/commands/improve/extract.js +409 -43
- package/dist/commands/improve/feedback-valence.js +54 -0
- package/dist/commands/improve/hot-probation.js +45 -0
- package/dist/commands/improve/improve-auto-accept.js +157 -10
- package/dist/commands/improve/improve-cli.js +115 -73
- package/dist/commands/improve/improve-profiles.js +28 -8
- package/dist/commands/improve/improve-result-file.js +15 -25
- package/dist/commands/improve/improve-session.js +58 -0
- package/dist/commands/improve/improve.js +485 -2764
- package/dist/commands/improve/locks.js +154 -0
- package/dist/commands/improve/loop-stages.js +1100 -0
- package/dist/commands/improve/memory/memory-belief.js +14 -15
- package/dist/commands/improve/memory/memory-contradiction-detect.js +83 -60
- package/dist/commands/improve/memory/memory-improve.js +27 -27
- package/dist/commands/improve/outcome-loop.js +270 -0
- package/dist/commands/improve/preparation.js +2002 -0
- package/dist/commands/improve/proactive-maintenance.js +37 -35
- package/dist/commands/improve/procedural.js +398 -0
- package/dist/commands/improve/recombine.js +818 -0
- package/dist/commands/improve/reflect-noise.js +0 -0
- package/dist/commands/improve/reflect.js +206 -45
- package/dist/commands/improve/salience.js +455 -0
- package/dist/commands/improve/schema-similarity-gate.js +168 -0
- package/dist/commands/improve/shared.js +51 -0
- package/dist/commands/improve/triage.js +93 -0
- package/dist/commands/lint/agent-linter.js +19 -24
- package/dist/commands/lint/base-linter.js +173 -60
- package/dist/commands/lint/command-linter.js +19 -24
- package/dist/commands/lint/env-key-rules.js +38 -1
- package/dist/commands/lint/fact-linter.js +39 -0
- package/dist/commands/lint/index.js +31 -13
- package/dist/commands/lint/memory-linter.js +1 -1
- package/dist/commands/lint/registry.js +7 -2
- package/dist/commands/lint/task-linter.js +3 -3
- package/dist/commands/lint/workflow-linter.js +26 -1
- package/dist/commands/observability-cli.js +4 -4
- package/dist/commands/proposal/drain-policies.js +13 -4
- package/dist/commands/proposal/drain.js +45 -51
- package/dist/commands/proposal/legacy-import.js +115 -0
- package/dist/commands/proposal/proposal-cli.js +24 -34
- package/dist/commands/proposal/proposal.js +2 -1
- package/dist/commands/proposal/propose.js +8 -3
- package/dist/commands/proposal/repository.js +829 -0
- package/dist/commands/proposal/validators/proposal-quality-validators.js +9 -8
- package/dist/commands/proposal/validators/proposals.js +93 -895
- package/dist/commands/read/curate.js +410 -111
- package/dist/commands/read/knowledge.js +10 -3
- package/dist/commands/read/remember-cli.js +133 -138
- package/dist/commands/read/search-cli.js +15 -8
- package/dist/commands/read/search.js +22 -11
- package/dist/commands/read/show.js +106 -14
- package/dist/commands/registry-cli.js +76 -87
- package/dist/commands/remember.js +11 -12
- package/dist/commands/sources/add-cli.js +91 -95
- package/dist/commands/sources/history.js +1 -1
- package/dist/commands/sources/init.js +66 -18
- package/dist/commands/sources/installed-stashes.js +11 -3
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +44 -46
- package/dist/commands/sources/self-update.js +2 -2
- package/dist/commands/sources/source-add.js +7 -3
- package/dist/commands/sources/sources-cli.js +3 -3
- package/dist/commands/sources/stash-cli.js +19 -39
- package/dist/commands/sources/stash-skeleton.js +57 -8
- package/dist/commands/tasks/default-tasks.js +15 -2
- package/dist/commands/tasks/tasks-cli.js +20 -29
- package/dist/commands/tasks/tasks.js +39 -11
- package/dist/commands/wiki-cli.js +23 -38
- package/dist/commands/workflow-cli.js +291 -13
- package/dist/core/asset/asset-registry.js +3 -1
- package/dist/core/asset/asset-spec.js +79 -5
- package/dist/core/asset/frontmatter.js +188 -167
- package/dist/core/asset/markdown.js +8 -0
- package/dist/core/authoring-rules.js +92 -0
- package/dist/core/common.js +4 -23
- package/dist/core/concurrent.js +10 -1
- package/dist/core/config/config-io.js +10 -1
- package/dist/core/config/config-migration.js +18 -40
- package/dist/core/config/config-schema.js +403 -62
- package/dist/core/config/config-types.js +3 -3
- package/dist/core/config/config.js +67 -22
- package/dist/core/deep-merge.js +38 -0
- package/dist/core/errors.js +1 -0
- package/dist/core/eval/rank-metrics.js +113 -0
- package/dist/core/events.js +4 -7
- package/dist/core/improve-types.js +47 -8
- package/dist/core/json-schema.js +142 -0
- package/dist/core/logs-db.js +14 -75
- package/dist/core/parse.js +36 -16
- package/dist/core/paths.js +18 -18
- package/dist/core/standards/resolve-standards-context.js +87 -0
- package/dist/core/standards/resolve-stash-standards.js +99 -0
- package/dist/core/standards/resolve-type-conventions.js +66 -0
- package/dist/core/state/migrations.js +770 -0
- package/dist/core/state-db.js +132 -1126
- package/dist/core/structured.js +69 -0
- package/dist/core/time.js +53 -0
- package/dist/core/warn.js +21 -0
- package/dist/core/write-source.js +37 -0
- package/dist/indexer/db/db.js +261 -770
- package/dist/indexer/db/entry-mapper.js +41 -0
- package/dist/indexer/db/graph-db.js +129 -86
- package/dist/indexer/db/llm-cache.js +2 -2
- package/dist/indexer/db/schema.js +516 -0
- package/dist/indexer/ensure-index.js +36 -92
- package/dist/indexer/feedback/utility-policy.js +75 -0
- package/dist/indexer/graph/graph-boost.js +51 -41
- package/dist/indexer/graph/graph-extraction.js +207 -4
- package/dist/indexer/index-writer-lock.js +18 -11
- package/dist/indexer/index-written-assets.js +105 -0
- package/dist/indexer/indexer.js +182 -204
- package/dist/indexer/passes/dir-staleness.js +114 -0
- package/dist/indexer/passes/memory-inference.js +13 -5
- package/dist/indexer/passes/metadata.js +20 -0
- package/dist/indexer/read-preflight.js +23 -0
- package/dist/indexer/search/db-search.js +89 -13
- package/dist/indexer/search/fts-query.js +51 -0
- package/dist/indexer/search/ranking-contributors.js +95 -9
- package/dist/indexer/search/ranking.js +79 -3
- package/dist/indexer/search/search-fields.js +6 -0
- package/dist/indexer/search/search-source.js +32 -21
- package/dist/indexer/search/semantic-status.js +4 -0
- package/dist/indexer/walk/matchers.js +48 -0
- package/dist/indexer/walk/walker.js +21 -13
- package/dist/integrations/agent/builders.js +41 -13
- package/dist/integrations/agent/config.js +20 -59
- package/dist/integrations/agent/detect.js +9 -0
- package/dist/integrations/agent/index.js +3 -19
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +79 -6
- package/dist/integrations/agent/prompts.js +75 -9
- package/dist/integrations/agent/runner-dispatch.js +83 -0
- package/dist/integrations/agent/runner.js +13 -9
- package/dist/integrations/agent/spawn.js +206 -81
- package/dist/integrations/harnesses/aider/agent-builder.js +113 -0
- package/dist/integrations/harnesses/aider/index.js +58 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +153 -0
- package/dist/integrations/harnesses/amazonq/index.js +59 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -7
- package/dist/integrations/harnesses/claude/index.js +27 -23
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +10 -0
- package/dist/integrations/harnesses/codex/agent-builder.js +137 -0
- package/dist/integrations/harnesses/codex/index.js +63 -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 +60 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +121 -0
- package/dist/integrations/harnesses/gemini/index.js +60 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/index.js +28 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +1 -1
- package/dist/integrations/harnesses/opencode/index.js +17 -16
- package/dist/integrations/harnesses/opencode/session-log.js +173 -3
- package/dist/integrations/harnesses/opencode-sdk/harness.js +65 -0
- package/dist/integrations/harnesses/opencode-sdk/index.js +10 -34
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +642 -71
- package/dist/integrations/harnesses/openhands/agent-builder.js +126 -0
- package/dist/integrations/harnesses/openhands/index.js +58 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +104 -0
- package/dist/integrations/harnesses/pi/index.js +58 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/types.js +8 -0
- package/dist/integrations/session-logs/index.js +40 -11
- package/dist/llm/call-ai.js +2 -2
- package/dist/llm/client.js +34 -11
- package/dist/llm/embedder.js +67 -4
- package/dist/llm/embedders/cache.js +3 -1
- package/dist/llm/embedders/deterministic.js +66 -0
- package/dist/llm/embedders/local.js +73 -3
- package/dist/llm/feature-gate.js +16 -15
- package/dist/llm/graph-extract.js +67 -44
- package/dist/llm/memory-infer-impl.js +138 -0
- package/dist/llm/memory-infer.js +1 -127
- package/dist/llm/metadata-enhance.js +44 -31
- package/dist/llm/structured-call.js +49 -0
- package/dist/migrate-storage-node.mjs +8 -0
- package/dist/output/context.js +5 -5
- package/dist/output/renderers.js +87 -15
- package/dist/output/shapes/curate.js +14 -2
- package/dist/output/shapes/helpers.js +0 -3
- package/dist/output/shapes/passthrough.js +6 -1
- package/dist/output/text/helpers.js +241 -2
- package/dist/output/text/workflow.js +4 -1
- package/dist/registry/providers/skills-sh.js +21 -147
- package/dist/registry/providers/static-index.js +15 -157
- package/dist/registry/resolve.js +27 -9
- package/dist/runtime.js +25 -1
- package/dist/schemas/akm-config.json +14225 -0
- package/dist/schemas/akm-workflow.json +328 -0
- package/dist/scripts/migrate-storage.js +2743 -8390
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +1652 -607
- package/dist/setup/detect.js +9 -0
- package/dist/setup/legacy-config.js +106 -0
- package/dist/setup/prompt.js +57 -0
- package/dist/setup/providers.js +14 -0
- package/dist/setup/registry-stash-loader.js +12 -0
- package/dist/setup/semantic-assets.js +124 -0
- package/dist/setup/setup.js +52 -1614
- package/dist/setup/steps/connection.js +734 -0
- package/dist/setup/steps/output.js +31 -0
- package/dist/setup/steps/platforms.js +124 -0
- package/dist/setup/steps/semantic.js +27 -0
- package/dist/setup/steps/sources.js +222 -0
- package/dist/setup/steps/stashdir.js +42 -0
- package/dist/setup/steps/tasks.js +152 -0
- package/dist/sources/include.js +6 -2
- package/dist/sources/providers/filesystem.js +0 -1
- package/dist/sources/providers/git-install.js +210 -0
- package/dist/sources/providers/git-provider.js +234 -0
- package/dist/sources/providers/git-stash.js +248 -0
- package/dist/sources/providers/git.js +10 -661
- package/dist/sources/providers/npm.js +2 -6
- package/dist/sources/providers/provider-utils.js +13 -7
- package/dist/sources/providers/sync-from-ref.js +9 -1
- package/dist/sources/providers/website.js +9 -5
- package/dist/sources/website-ingest.js +187 -29
- package/dist/sources/wiki-fetchers/registry.js +53 -0
- package/dist/sources/wiki-fetchers/youtube.js +239 -0
- package/dist/storage/database.js +45 -10
- package/dist/storage/managed-db.js +82 -0
- package/dist/storage/repositories/canaries-repository.js +107 -0
- package/dist/storage/repositories/consolidation-repository.js +38 -0
- package/dist/storage/repositories/embeddings-repository.js +72 -0
- package/dist/storage/repositories/events-repository.js +187 -0
- package/dist/storage/repositories/extract-sessions-repository.js +96 -0
- package/dist/storage/repositories/improve-runs-repository.js +146 -0
- package/dist/storage/repositories/index-db.js +14 -8
- package/dist/storage/repositories/proposals-repository.js +220 -0
- package/dist/storage/repositories/recombine-repository.js +213 -0
- package/dist/storage/repositories/registry-cache.js +93 -0
- package/dist/storage/repositories/registry-index-cache-repository.js +46 -0
- package/dist/storage/repositories/task-history-repository.js +93 -0
- package/dist/storage/repositories/workflow-runs-repository.js +189 -1
- package/dist/storage/sqlite-pragmas.js +146 -0
- package/dist/tasks/backends/cron.js +1 -1
- package/dist/tasks/backends/index.js +9 -0
- package/dist/tasks/backends/launchd.js +1 -1
- package/dist/tasks/backends/schtasks.js +1 -1
- package/dist/tasks/{resolveAkmBin.js → resolve-akm-bin.js} +2 -2
- package/dist/tasks/runner.js +15 -13
- package/dist/text-import-hook.mjs +1 -1
- package/dist/wiki/wiki.js +52 -11
- package/dist/workflows/authoring/authoring.js +123 -10
- package/dist/workflows/authoring/workflow-program-template.yaml +31 -0
- package/dist/workflows/cli.js +5 -0
- package/dist/workflows/db.js +138 -4
- package/dist/workflows/exec/brief.js +484 -0
- package/dist/workflows/exec/native-executor.js +975 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1295 -0
- package/dist/workflows/exec/run-workflow.js +596 -0
- package/dist/workflows/exec/scheduler.js +100 -0
- package/dist/workflows/exec/step-work.js +1156 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/watch.js +116 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +388 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +33 -0
- package/dist/workflows/ir/schema.js +4 -0
- package/dist/workflows/parser.js +3 -1
- package/dist/workflows/program/expressions.js +369 -0
- package/dist/workflows/program/parser.js +760 -0
- package/dist/workflows/program/project.js +105 -0
- package/dist/workflows/program/schema.js +54 -0
- package/dist/workflows/renderer.js +82 -5
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/runs.js +248 -153
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +188 -0
- package/dist/workflows/validate-summary.js +26 -10
- package/dist/workflows/validator.js +1 -1
- package/docs/README.md +69 -18
- package/docs/data-and-telemetry.md +7 -5
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.9.0-beta.60.md +19 -0
- package/docs/migration/release-notes/0.9.0.md +39 -0
- package/package.json +10 -10
- package/dist/assets/tasks/core/update-stashes.yml +0 -4
- package/dist/commands/db-cli.js +0 -23
- package/dist/indexer/db/db-backup.js +0 -376
- package/dist/indexer/passes/staleness-detect.js +0 -488
package/dist/output/renderers.js
CHANGED
|
@@ -18,7 +18,7 @@ import { asNonEmptyString, hasErrnoCode } from "../core/common.js";
|
|
|
18
18
|
import { extractCommentMetadata, extractDescriptionFromComments } from "../indexer/passes/metadata.js";
|
|
19
19
|
import { registerMetadataContributor } from "../indexer/passes/metadata-contributors.js";
|
|
20
20
|
import { registerRenderer } from "../indexer/walk/file-context.js";
|
|
21
|
-
import { buildWorkflowAction, workflowMdRenderer } from "../workflows/renderer.js";
|
|
21
|
+
import { buildWorkflowAction, workflowMdRenderer, workflowProgramRenderer } from "../workflows/renderer.js";
|
|
22
22
|
// ── Interpreter auto-detection map ───────────────────────────────────────────
|
|
23
23
|
const INTERPRETER_MAP = {
|
|
24
24
|
".sh": "bash",
|
|
@@ -210,6 +210,10 @@ const agentMdRenderer = {
|
|
|
210
210
|
action: "Dispatch using the prompt below verbatim. Use modelHint and toolPolicy if present.",
|
|
211
211
|
description: asNonEmptyString(parsedMd.data.description),
|
|
212
212
|
prompt: parsedMd.content,
|
|
213
|
+
// `tools` is self-declared frontmatter. The provenance CEILING that decides
|
|
214
|
+
// whether this self-declared policy is honoured is applied at the show
|
|
215
|
+
// layer (`akmShowUnified`), which knows whether the source is the operator's
|
|
216
|
+
// own writable stash vs a read-only third-party source (07 P1-D).
|
|
213
217
|
toolPolicy: parsedMd.data.tools,
|
|
214
218
|
modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
|
|
215
219
|
};
|
|
@@ -364,23 +368,21 @@ const scriptSourceRenderer = {
|
|
|
364
368
|
};
|
|
365
369
|
// ── 8. env-file ───────────────────────────────────────────────────────────────
|
|
366
370
|
/**
|
|
367
|
-
* Env renderer. Returns ONLY key names
|
|
368
|
-
*
|
|
369
|
-
* through `akm show`.
|
|
371
|
+
* Env renderer. Returns ONLY key names — never values, and never comment
|
|
372
|
+
* text (comments routinely contain commented-out credentials). Deliberately
|
|
373
|
+
* omits content/template/prompt so env values cannot leak through `akm show`.
|
|
370
374
|
*/
|
|
371
375
|
const envFileRenderer = {
|
|
372
376
|
name: "env-file",
|
|
373
377
|
buildShowResponse(ctx) {
|
|
374
378
|
const name = deriveName(ctx);
|
|
375
|
-
const { keys
|
|
379
|
+
const { keys } = listVaultKeys(ctx.absPath);
|
|
376
380
|
return {
|
|
377
381
|
type: "env",
|
|
378
382
|
name,
|
|
379
383
|
path: ctx.absPath,
|
|
380
|
-
action: "Environment —
|
|
381
|
-
description: comments.length > 0 ? comments.join("\n") : undefined,
|
|
384
|
+
action: "Environment — key names only. Use `akm env run <ref> -- <command>` to run with the whole .env injected; prefer `--clean` to minimize inherited parent env. AKM itself does not print values, but child stdout/stderr is not redacted. `akm env export <ref> --out <file>` writes a sourceable script to a file. Never `source` the raw file. Values stay on disk and are never written to akm's stdout.",
|
|
382
385
|
keys,
|
|
383
|
-
comments,
|
|
384
386
|
};
|
|
385
387
|
},
|
|
386
388
|
enrichSearchHit(hit, _stashDir) {
|
|
@@ -468,6 +470,44 @@ const sessionMdRenderer = {
|
|
|
468
470
|
};
|
|
469
471
|
},
|
|
470
472
|
};
|
|
473
|
+
// ── 9. fact-md ───────────────────────────────────────────────────────────────
|
|
474
|
+
/**
|
|
475
|
+
* Renderer for the `fact` asset type. A fact is durable stash-level semantic
|
|
476
|
+
* knowledge (personal/team/project details, coding conventions, stash-meta).
|
|
477
|
+
* It carries `category` (personal|team|project|convention|meta) and an
|
|
478
|
+
* optional `pinned` flag marking it as part of the always-injected core. The
|
|
479
|
+
* renderer surfaces a one-liner (category + pinned marker) so an agent can tell
|
|
480
|
+
* at a glance what kind of fact it is and whether it is core context.
|
|
481
|
+
*/
|
|
482
|
+
const factMdRenderer = {
|
|
483
|
+
name: "fact-md",
|
|
484
|
+
buildShowResponse(ctx) {
|
|
485
|
+
const name = deriveName(ctx);
|
|
486
|
+
const parsed = parseFrontmatter(ctx.content());
|
|
487
|
+
const fm = parsed.data;
|
|
488
|
+
const category = asNonEmptyString(fm.category);
|
|
489
|
+
const description = asNonEmptyString(fm.description);
|
|
490
|
+
const pinned = fm.pinned === true;
|
|
491
|
+
const headerParts = [
|
|
492
|
+
category ? `category: ${category}` : undefined,
|
|
493
|
+
pinned ? "pinned (core context)" : undefined,
|
|
494
|
+
].filter((p) => !!p);
|
|
495
|
+
const action = [
|
|
496
|
+
"Durable stash fact — apply it as background context.",
|
|
497
|
+
headerParts.length > 0 ? headerParts.join(" ") : undefined,
|
|
498
|
+
]
|
|
499
|
+
.filter((p) => !!p)
|
|
500
|
+
.join("\n");
|
|
501
|
+
return {
|
|
502
|
+
type: "fact",
|
|
503
|
+
name,
|
|
504
|
+
path: ctx.absPath,
|
|
505
|
+
action,
|
|
506
|
+
description,
|
|
507
|
+
content: parsed.content,
|
|
508
|
+
};
|
|
509
|
+
},
|
|
510
|
+
};
|
|
471
511
|
function applySessionMetadata(entry, ctx) {
|
|
472
512
|
try {
|
|
473
513
|
const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
|
|
@@ -501,6 +541,34 @@ function applyTocMetadata(entry, ctx) {
|
|
|
501
541
|
// Non-fatal: skip TOC if file can't be read
|
|
502
542
|
}
|
|
503
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* Fact metadata: surface `category` and the `pinned` core marker as tags +
|
|
546
|
+
* search hints (no dedicated DB columns — same encoding pattern as session /
|
|
547
|
+
* task). `pinned` is mirrored to both a `pinned` tag and a `pinned` search
|
|
548
|
+
* hint so the ranking contributor can detect it and queries can target it.
|
|
549
|
+
*/
|
|
550
|
+
function applyFactMetadata(entry, ctx) {
|
|
551
|
+
try {
|
|
552
|
+
const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
|
|
553
|
+
const tags = new Set([...(entry.tags ?? []), "fact"]);
|
|
554
|
+
const hints = new Set(entry.searchHints ?? []);
|
|
555
|
+
const category = asNonEmptyString(fm.category);
|
|
556
|
+
if (category) {
|
|
557
|
+
tags.add(category);
|
|
558
|
+
hints.add(`category:${category}`);
|
|
559
|
+
}
|
|
560
|
+
if (fm.pinned === true) {
|
|
561
|
+
tags.add("pinned");
|
|
562
|
+
hints.add("pinned");
|
|
563
|
+
}
|
|
564
|
+
entry.tags = Array.from(tags).filter(Boolean);
|
|
565
|
+
if (hints.size > 0)
|
|
566
|
+
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
567
|
+
}
|
|
568
|
+
catch {
|
|
569
|
+
// Non-fatal: skip metadata extraction on parse error
|
|
570
|
+
}
|
|
571
|
+
}
|
|
504
572
|
/**
|
|
505
573
|
* Parse frontmatter, apply description (if not already set) and merge tags
|
|
506
574
|
* into `entry`. Returns the raw frontmatter data object so callers can access
|
|
@@ -581,12 +649,9 @@ function applyScriptMetadata(entry, ctx) {
|
|
|
581
649
|
}
|
|
582
650
|
}
|
|
583
651
|
function applyEnvMetadata(entry, ctx) {
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
entry.source = "comments";
|
|
588
|
-
entry.confidence = 0.7;
|
|
589
|
-
}
|
|
652
|
+
// Key names only — comment text must never reach description/search_text
|
|
653
|
+
// (comments routinely contain commented-out credentials).
|
|
654
|
+
const { keys } = listVaultKeys(ctx.absPath);
|
|
590
655
|
if (keys.length > 0) {
|
|
591
656
|
entry.searchHints = keys;
|
|
592
657
|
}
|
|
@@ -660,6 +725,11 @@ registerMetadataContributor({
|
|
|
660
725
|
appliesTo: ({ rendererName }) => rendererName === "session-md",
|
|
661
726
|
contribute: (entry, ctx) => applySessionMetadata(entry, ctx.renderContext),
|
|
662
727
|
});
|
|
728
|
+
registerMetadataContributor({
|
|
729
|
+
name: "fact-md-metadata",
|
|
730
|
+
appliesTo: ({ rendererName }) => rendererName === "fact-md",
|
|
731
|
+
contribute: (entry, ctx) => applyFactMetadata(entry, ctx.renderContext),
|
|
732
|
+
});
|
|
663
733
|
// ── Registration ─────────────────────────────────────────────────────────────
|
|
664
734
|
/** All built-in renderers. */
|
|
665
735
|
const builtinRenderers = [
|
|
@@ -671,11 +741,13 @@ const builtinRenderers = [
|
|
|
671
741
|
lessonMdRenderer,
|
|
672
742
|
memoryMdRenderer,
|
|
673
743
|
workflowMdRenderer,
|
|
744
|
+
workflowProgramRenderer,
|
|
674
745
|
scriptSourceRenderer,
|
|
675
746
|
envFileRenderer,
|
|
676
747
|
secretFileRenderer,
|
|
677
748
|
taskMdRenderer,
|
|
678
749
|
sessionMdRenderer,
|
|
750
|
+
factMdRenderer,
|
|
679
751
|
];
|
|
680
752
|
/**
|
|
681
753
|
* Register all built-in renderers with the file-context registry.
|
|
@@ -687,4 +759,4 @@ export function registerBuiltinRenderers() {
|
|
|
687
759
|
}
|
|
688
760
|
}
|
|
689
761
|
// ── Named exports for testing ────────────────────────────────────────────────
|
|
690
|
-
export { agentMdRenderer, commandMdRenderer, envFileRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, wikiMdRenderer, workflowMdRenderer, };
|
|
762
|
+
export { agentMdRenderer, commandMdRenderer, envFileRenderer, factMdRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, wikiMdRenderer, workflowMdRenderer, workflowProgramRenderer, };
|
|
@@ -5,7 +5,7 @@ import { capDescription, NORMAL_DESCRIPTION_LIMIT, pickFields } from "./helpers.
|
|
|
5
5
|
// Curation is a small, high-signal top-N. Even at `brief` we keep `followUp`
|
|
6
6
|
// (the actionable `akm show <ref>` command) and `reason` (why this asset was
|
|
7
7
|
// selected) — these are the point of curate, unlike a bulk search listing.
|
|
8
|
-
const BRIEF_FIELDS = ["source", "type", "name", "ref", "id", "followUp", "reason"];
|
|
8
|
+
const BRIEF_FIELDS = ["source", "type", "name", "ref", "id", "supportRefs", "followUp", "reason"];
|
|
9
9
|
const NORMAL_FIELDS = [
|
|
10
10
|
"source",
|
|
11
11
|
"type",
|
|
@@ -17,12 +17,24 @@ const NORMAL_FIELDS = [
|
|
|
17
17
|
"keys",
|
|
18
18
|
"parameters",
|
|
19
19
|
"run",
|
|
20
|
+
"supportRefs",
|
|
20
21
|
"followUp",
|
|
21
22
|
"reason",
|
|
22
23
|
"score",
|
|
23
24
|
];
|
|
24
25
|
// Agent shape: the minimal field set an LLM needs to decide and act.
|
|
25
|
-
const AGENT_FIELDS = [
|
|
26
|
+
const AGENT_FIELDS = [
|
|
27
|
+
"source",
|
|
28
|
+
"type",
|
|
29
|
+
"name",
|
|
30
|
+
"ref",
|
|
31
|
+
"id",
|
|
32
|
+
"description",
|
|
33
|
+
"supportRefs",
|
|
34
|
+
"followUp",
|
|
35
|
+
"reason",
|
|
36
|
+
"score",
|
|
37
|
+
];
|
|
26
38
|
function shapeCurateItem(item, detail, shape) {
|
|
27
39
|
if (shape === "agent") {
|
|
28
40
|
return capDescription(pickFields(item, AGENT_FIELDS), NORMAL_DESCRIPTION_LIMIT);
|
|
@@ -369,7 +369,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
369
369
|
"workflowParameters",
|
|
370
370
|
"steps",
|
|
371
371
|
"keys",
|
|
372
|
-
"comments",
|
|
373
372
|
"related",
|
|
374
373
|
]);
|
|
375
374
|
}
|
|
@@ -385,7 +384,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
385
384
|
"run",
|
|
386
385
|
"origin",
|
|
387
386
|
"keys",
|
|
388
|
-
"comments",
|
|
389
387
|
"related",
|
|
390
388
|
]);
|
|
391
389
|
}
|
|
@@ -411,7 +409,6 @@ export function shapeShowOutput(result, detail, shape = "human") {
|
|
|
411
409
|
"cwd",
|
|
412
410
|
"activeRun",
|
|
413
411
|
"keys",
|
|
414
|
-
"comments",
|
|
415
412
|
"related",
|
|
416
413
|
// path and editable are always projected so JSON consumers can locate and
|
|
417
414
|
// edit the asset without needing --detail full (QA #7).
|
|
@@ -23,7 +23,6 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
23
23
|
"agent-result",
|
|
24
24
|
"clone",
|
|
25
25
|
"config",
|
|
26
|
-
"db-backups",
|
|
27
26
|
"disable",
|
|
28
27
|
"enable",
|
|
29
28
|
"env-create",
|
|
@@ -43,6 +42,7 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
43
42
|
"extract",
|
|
44
43
|
"health",
|
|
45
44
|
"improve",
|
|
45
|
+
"improve-canary",
|
|
46
46
|
"lessons-coverage",
|
|
47
47
|
"import",
|
|
48
48
|
"index",
|
|
@@ -86,15 +86,20 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
86
86
|
"wiki-remove",
|
|
87
87
|
"wiki-show",
|
|
88
88
|
"wiki-stash",
|
|
89
|
+
"workflow-abandon",
|
|
90
|
+
"workflow-brief",
|
|
89
91
|
"workflow-complete",
|
|
90
92
|
"workflow-complete-rejected",
|
|
91
93
|
"workflow-create",
|
|
92
94
|
"workflow-list",
|
|
93
95
|
"workflow-next",
|
|
96
|
+
"workflow-report",
|
|
94
97
|
"workflow-resume",
|
|
98
|
+
"workflow-run",
|
|
95
99
|
"workflow-start",
|
|
96
100
|
"workflow-status",
|
|
97
101
|
"workflow-validate",
|
|
102
|
+
"workflow-watch",
|
|
98
103
|
];
|
|
99
104
|
export const passthroughShapes = PASSTHROUGH_COMMANDS.map((command) => ({
|
|
100
105
|
command,
|
|
@@ -194,7 +194,18 @@ export function formatWorkflowValidatePlain(r) {
|
|
|
194
194
|
return `workflow validate: failed (${pathValue})`;
|
|
195
195
|
const title = typeof r.title === "string" ? r.title : "";
|
|
196
196
|
const stepCount = typeof r.stepCount === "number" ? r.stepCount : 0;
|
|
197
|
-
|
|
197
|
+
const lines = [`workflow validate: ok — ${title || pathValue} (${stepCount} step(s))`];
|
|
198
|
+
// Non-fatal advisories: clearly marked, printed after the ok line so `ok`
|
|
199
|
+
// is never in doubt. Absent/empty for markdown and fully-typed programs.
|
|
200
|
+
const warnings = Array.isArray(r.warnings) ? r.warnings : [];
|
|
201
|
+
if (warnings.length > 0) {
|
|
202
|
+
lines.push(` ${warnings.length} warning(s):`);
|
|
203
|
+
for (const w of warnings) {
|
|
204
|
+
const line = typeof w.line === "number" ? w.line : "?";
|
|
205
|
+
lines.push(` warning: ${pathValue}:${line} — ${String(w.message ?? "")}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return lines.join("\n");
|
|
198
209
|
}
|
|
199
210
|
/**
|
|
200
211
|
* Plain-text rendering for a step-completion that was rejected by the
|
|
@@ -722,8 +733,59 @@ export function formatWorkflowStatusPlain(result) {
|
|
|
722
733
|
}
|
|
723
734
|
}
|
|
724
735
|
}
|
|
736
|
+
// `workflow status --units` (#22): the honest per-unit diagnostic surface —
|
|
737
|
+
// failure_reason plus any journaled result/error text. Diagnostics only; the
|
|
738
|
+
// deterministic step evidence above is unaffected.
|
|
739
|
+
const units = Array.isArray(result.units) ? result.units : undefined;
|
|
740
|
+
if (units) {
|
|
741
|
+
lines.push("");
|
|
742
|
+
lines.push(units.length > 0 ? "units:" : "units: (none journaled)");
|
|
743
|
+
for (const unit of units) {
|
|
744
|
+
const id = typeof unit.unitId === "string" ? unit.unitId : "unknown";
|
|
745
|
+
const status = typeof unit.status === "string" ? unit.status : "unknown";
|
|
746
|
+
const node = typeof unit.nodeId === "string" ? unit.nodeId : "";
|
|
747
|
+
const attempts = typeof unit.attempts === "number" ? unit.attempts : undefined;
|
|
748
|
+
const suffix = attempts !== undefined && attempts > 1 ? `, attempt ${attempts}` : "";
|
|
749
|
+
lines.push(` - ${id} [${node}] (${status}${suffix})`);
|
|
750
|
+
// Codex round-3 finding B: a `running` claim gone silent past the check-in
|
|
751
|
+
// window — the driver likely died. Surface it (with the claim holder) so a
|
|
752
|
+
// human can reclaim/re-run the unit, matching what `brief` reports.
|
|
753
|
+
if (unit.stale === true) {
|
|
754
|
+
const holder = typeof unit.claimHolder === "string" && unit.claimHolder.trim() ? ` claimed by ${unit.claimHolder}` : "";
|
|
755
|
+
lines.push(` stale: claim went silent past the check-in window${holder} — its driver may have died`);
|
|
756
|
+
}
|
|
757
|
+
if (typeof unit.failureReason === "string" && unit.failureReason.trim()) {
|
|
758
|
+
lines.push(` failure_reason: ${unit.failureReason}`);
|
|
759
|
+
}
|
|
760
|
+
if (typeof unit.diagnostic === "string" && unit.diagnostic.trim()) {
|
|
761
|
+
const diagLines = unit.diagnostic.split("\n");
|
|
762
|
+
lines.push(` diagnostic: ${diagLines[0]}`);
|
|
763
|
+
for (const diagLine of diagLines.slice(1))
|
|
764
|
+
lines.push(` ${diagLine}`);
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
// Review C2: the check-in `continue` directive must survive plain-text
|
|
769
|
+
// rendering — JSON consumers saw `checkin` but the text path dropped it.
|
|
770
|
+
const checkinLine = formatWorkflowCheckinLine(result);
|
|
771
|
+
if (checkinLine) {
|
|
772
|
+
lines.push("");
|
|
773
|
+
lines.push(checkinLine);
|
|
774
|
+
}
|
|
725
775
|
return lines.join("\n");
|
|
726
776
|
}
|
|
777
|
+
/**
|
|
778
|
+
* Render the stalled-run check-in directive (#506) when present on a
|
|
779
|
+
* workflow-next/status result. Returns null when the run is healthy.
|
|
780
|
+
*/
|
|
781
|
+
function formatWorkflowCheckinLine(result) {
|
|
782
|
+
const checkin = typeof result.checkin === "object" && result.checkin !== null
|
|
783
|
+
? result.checkin
|
|
784
|
+
: undefined;
|
|
785
|
+
if (!checkin || typeof checkin.directive !== "string" || !checkin.directive.trim())
|
|
786
|
+
return null;
|
|
787
|
+
return checkin.directive.trim();
|
|
788
|
+
}
|
|
727
789
|
export function formatWorkflowNextPlain(result) {
|
|
728
790
|
const base = formatWorkflowStatusPlain(result);
|
|
729
791
|
const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
|
|
@@ -765,6 +827,155 @@ export function formatWorkflowNextPlain(result) {
|
|
|
765
827
|
}
|
|
766
828
|
return lines.join("\n");
|
|
767
829
|
}
|
|
830
|
+
export function formatWorkflowRunPlain(result) {
|
|
831
|
+
const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
|
|
832
|
+
if (!run)
|
|
833
|
+
return null;
|
|
834
|
+
const lines = [`run: ${String(run.id ?? "unknown")}`, `status: ${String(run.status ?? "unknown")}`];
|
|
835
|
+
const executed = Array.isArray(result.executed) ? result.executed : [];
|
|
836
|
+
if (executed.length === 0) {
|
|
837
|
+
lines.push("executed: (no steps — run was already done or blocked)");
|
|
838
|
+
}
|
|
839
|
+
else {
|
|
840
|
+
lines.push("executed:");
|
|
841
|
+
for (const step of executed) {
|
|
842
|
+
const marker = step.ok === true ? "ok" : "FAILED";
|
|
843
|
+
lines.push(` - ${String(step.stepId ?? "?")} [${marker}] units: ${String(step.unitCount ?? 0)}` +
|
|
844
|
+
(Number(step.failedUnits ?? 0) > 0 ? ` (${String(step.failedUnits)} failed)` : ""));
|
|
845
|
+
if (typeof step.summary === "string" && step.summary.trim()) {
|
|
846
|
+
lines.push(` ${step.summary}`);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
const gate = typeof result.gateRejection === "object" && result.gateRejection !== null
|
|
851
|
+
? result.gateRejection
|
|
852
|
+
: undefined;
|
|
853
|
+
if (gate) {
|
|
854
|
+
lines.push(`gate rejected step ${String(gate.stepId ?? "?")}: ${String(gate.feedback ?? "")}`);
|
|
855
|
+
const missing = Array.isArray(gate.missing) ? gate.missing : [];
|
|
856
|
+
for (const item of missing)
|
|
857
|
+
lines.push(` missing: ${String(item)}`);
|
|
858
|
+
}
|
|
859
|
+
if (result.done === true)
|
|
860
|
+
lines.push("workflow completed.");
|
|
861
|
+
return lines.join("\n");
|
|
862
|
+
}
|
|
863
|
+
export function formatWorkflowBriefPlain(result) {
|
|
864
|
+
const run = typeof result.run === "object" && result.run !== null ? result.run : undefined;
|
|
865
|
+
if (!run)
|
|
866
|
+
return null;
|
|
867
|
+
const lines = [];
|
|
868
|
+
lines.push(`# Workflow brief: ${String(run.id ?? "unknown")}`);
|
|
869
|
+
lines.push(`workflow: ${String(run.workflowRef ?? "?")} (${String(run.workflowTitle ?? "")})`);
|
|
870
|
+
lines.push(`status: ${String(run.status ?? "?")}`);
|
|
871
|
+
if (typeof result.message === "string")
|
|
872
|
+
lines.push(result.message);
|
|
873
|
+
const lease = typeof result.engineLease === "object" && result.engineLease !== null
|
|
874
|
+
? result.engineLease
|
|
875
|
+
: undefined;
|
|
876
|
+
if (lease) {
|
|
877
|
+
const live = lease.live === true ? "LIVE" : "expired";
|
|
878
|
+
lines.push(`engine lease: ${String(lease.holder ?? "?")} (until ${String(lease.until ?? "?")}) [${live}]`);
|
|
879
|
+
}
|
|
880
|
+
const warnings = Array.isArray(result.warnings) ? result.warnings : [];
|
|
881
|
+
for (const w of warnings)
|
|
882
|
+
lines.push(`! ${String(w)}`);
|
|
883
|
+
if (result.done === true) {
|
|
884
|
+
lines.push("");
|
|
885
|
+
lines.push("This run is completed — no work remains.");
|
|
886
|
+
return lines.join("\n");
|
|
887
|
+
}
|
|
888
|
+
const step = typeof result.step === "object" && result.step !== null ? result.step : undefined;
|
|
889
|
+
if (!step) {
|
|
890
|
+
return lines.join("\n");
|
|
891
|
+
}
|
|
892
|
+
const gate = typeof step.gate === "object" && step.gate !== null ? step.gate : undefined;
|
|
893
|
+
lines.push("");
|
|
894
|
+
lines.push(`## Active step: ${String(step.stepId ?? "?")} — ${String(step.title ?? "")} [${String(step.kind ?? "execute")}]`);
|
|
895
|
+
if (gate) {
|
|
896
|
+
const criteria = Array.isArray(gate.criteria) ? gate.criteria : [];
|
|
897
|
+
lines.push(`gate: loop ${String(gate.currentLoop ?? 1)} of max ${String(gate.maxLoops ?? 1)}` +
|
|
898
|
+
(criteria.length > 0 ? `; criteria: ${criteria.map(String).join("; ")}` : "; no completion criteria") +
|
|
899
|
+
(gate.judgesArtifact === true ? " (artifact-judged)" : ""));
|
|
900
|
+
}
|
|
901
|
+
if (step.outputSchema !== undefined)
|
|
902
|
+
lines.push("outputSchema: declared (see JSON output)");
|
|
903
|
+
const feedback = typeof result.gateFeedback === "object" && result.gateFeedback !== null
|
|
904
|
+
? result.gateFeedback
|
|
905
|
+
: undefined;
|
|
906
|
+
if (feedback) {
|
|
907
|
+
lines.push(`gate feedback (previous loop rejected): ${String(feedback.feedback ?? "")}`);
|
|
908
|
+
const missing = Array.isArray(feedback.missing) ? feedback.missing : [];
|
|
909
|
+
for (const m of missing)
|
|
910
|
+
lines.push(` - missing: ${String(m)}`);
|
|
911
|
+
}
|
|
912
|
+
const route = typeof result.route === "object" && result.route !== null ? result.route : undefined;
|
|
913
|
+
if (route) {
|
|
914
|
+
lines.push("");
|
|
915
|
+
lines.push(`## Route contract on ${String(route.input ?? "?")}`);
|
|
916
|
+
const when = typeof route.when === "object" && route.when !== null ? route.when : {};
|
|
917
|
+
for (const [value, target] of Object.entries(when))
|
|
918
|
+
lines.push(` when "${value}" → ${String(target)}`);
|
|
919
|
+
if (route.defaultStepId !== undefined)
|
|
920
|
+
lines.push(` default → ${String(route.defaultStepId)}`);
|
|
921
|
+
const decision = typeof route.decision === "object" && route.decision !== null
|
|
922
|
+
? route.decision
|
|
923
|
+
: undefined;
|
|
924
|
+
if (decision)
|
|
925
|
+
lines.push(` decision NOW: value "${String(decision.value)}" → ${String(decision.selected)}`);
|
|
926
|
+
else if (typeof route.decisionError === "string")
|
|
927
|
+
lines.push(` decision error: ${route.decisionError}`);
|
|
928
|
+
else
|
|
929
|
+
lines.push(" decision: pending this step's output (evaluated after units complete)");
|
|
930
|
+
}
|
|
931
|
+
const workList = typeof result.workList === "object" && result.workList !== null
|
|
932
|
+
? result.workList
|
|
933
|
+
: undefined;
|
|
934
|
+
const units = workList && Array.isArray(workList.units) ? workList.units : [];
|
|
935
|
+
if (workList?.error) {
|
|
936
|
+
lines.push("");
|
|
937
|
+
lines.push(`work-list error: ${String(workList.error)}`);
|
|
938
|
+
}
|
|
939
|
+
else if (units.length > 0) {
|
|
940
|
+
lines.push("");
|
|
941
|
+
lines.push(`## Units (${units.length})`);
|
|
942
|
+
for (const u of units) {
|
|
943
|
+
const model = u.model ? ` model=${String(u.model)}` : "";
|
|
944
|
+
const journaled = typeof u.journaled === "object" && u.journaled !== null ? u.journaled : undefined;
|
|
945
|
+
const jstatus = journaled ? ` [journaled: ${String(journaled.status)}]` : "";
|
|
946
|
+
lines.push(`- ${String(u.unitId)} (runner=${String(u.runner)}${model})${jstatus}`);
|
|
947
|
+
const env = Array.isArray(u.env) ? u.env : [];
|
|
948
|
+
if (env.length > 0)
|
|
949
|
+
lines.push(` env (names): ${env.map(String).join(", ")}`);
|
|
950
|
+
if (u.outputSchema !== undefined)
|
|
951
|
+
lines.push(" outputSchema: declared (see JSON output)");
|
|
952
|
+
const resolved = typeof u.resolved === "object" && u.resolved !== null ? u.resolved : undefined;
|
|
953
|
+
if (resolved && resolved.ok === false)
|
|
954
|
+
lines.push(` RESOLUTION ERROR: ${String(resolved.error)}`);
|
|
955
|
+
if (typeof u.report === "string")
|
|
956
|
+
lines.push(` report: ${u.report}`);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
// Finding D: a non-dispatching step (route-only / empty / all-unresolvable)
|
|
960
|
+
// advances via the `--settle` verb, surfaced so a driver can advance the spine.
|
|
961
|
+
if (typeof result.settleCommand === "string") {
|
|
962
|
+
lines.push("");
|
|
963
|
+
lines.push("## Advance (no reportable units)");
|
|
964
|
+
lines.push(`settle: ${result.settleCommand}`);
|
|
965
|
+
}
|
|
966
|
+
const guidance = typeof result.reportGuidance === "object" && result.reportGuidance !== null
|
|
967
|
+
? result.reportGuidance
|
|
968
|
+
: undefined;
|
|
969
|
+
if (guidance) {
|
|
970
|
+
lines.push("");
|
|
971
|
+
lines.push("## Reporting");
|
|
972
|
+
if (typeof guidance.checkin === "string")
|
|
973
|
+
lines.push(`heartbeat: ${guidance.checkin}`);
|
|
974
|
+
if (typeof guidance.failure === "string")
|
|
975
|
+
lines.push(`on failure: ${guidance.failure}`);
|
|
976
|
+
}
|
|
977
|
+
return lines.join("\n");
|
|
978
|
+
}
|
|
768
979
|
export function formatSearchPlain(r, detail) {
|
|
769
980
|
const hits = r.hits ?? [];
|
|
770
981
|
const registryHits = r.registryHits ?? [];
|
|
@@ -1005,6 +1216,15 @@ export function formatCuratePlain(r, detail) {
|
|
|
1005
1216
|
lines.push(` run: ${String(item.run)}`);
|
|
1006
1217
|
if (item.followUp)
|
|
1007
1218
|
lines.push(` show: ${String(item.followUp)}`);
|
|
1219
|
+
if (Array.isArray(item.supportRefs) && item.supportRefs.length > 0) {
|
|
1220
|
+
for (const support of item.supportRefs) {
|
|
1221
|
+
if (!support.ref)
|
|
1222
|
+
continue;
|
|
1223
|
+
const label = typeof support.type === "string" ? `[${support.type}] ` : "";
|
|
1224
|
+
const why = typeof support.reason === "string" ? ` — ${support.reason}` : "";
|
|
1225
|
+
lines.push(` support: ${label}${String(support.ref)}${why}`);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1008
1228
|
if (detail !== "brief" && item.reason)
|
|
1009
1229
|
lines.push(` why: ${String(item.reason)}`);
|
|
1010
1230
|
}
|
|
@@ -1026,8 +1246,14 @@ export function formatCuratePlain(r, detail) {
|
|
|
1026
1246
|
}
|
|
1027
1247
|
export function formatInitPlain(r) {
|
|
1028
1248
|
let out = `Stash initialized at ${r.stashDir ?? "unknown"}`;
|
|
1029
|
-
|
|
1249
|
+
// When --dir scaffolded a secondary stash but the default was deliberately
|
|
1250
|
+
// left untouched, tell the user instead of silently repointing their default.
|
|
1251
|
+
if (r.defaultStashUpdated === false && typeof r.previousStashDir === "string" && r.previousStashDir) {
|
|
1252
|
+
out += `\nYour default stash is unchanged (${r.previousStashDir}). Re-run with --set-default to make ${r.stashDir} the default.`;
|
|
1253
|
+
}
|
|
1254
|
+
else if (r.configPath) {
|
|
1030
1255
|
out += `\nConfig saved to ${r.configPath}`;
|
|
1256
|
+
}
|
|
1031
1257
|
return out;
|
|
1032
1258
|
}
|
|
1033
1259
|
export function formatIndexPlain(r) {
|
|
@@ -1043,6 +1269,19 @@ export function formatIndexPlain(r) {
|
|
|
1043
1269
|
if (verification?.ok === false && verification.message) {
|
|
1044
1270
|
out += `\nVerification: ${String(verification.message)}`;
|
|
1045
1271
|
}
|
|
1272
|
+
const timing = indexResult.timing;
|
|
1273
|
+
if (timing) {
|
|
1274
|
+
out +=
|
|
1275
|
+
`\nTiming: total ${timing.totalMs}ms` +
|
|
1276
|
+
`, preflight ${timing.preflightMs}ms` +
|
|
1277
|
+
`, walk ${timing.walkMs}ms` +
|
|
1278
|
+
`, llm ${timing.llmMs}ms` +
|
|
1279
|
+
`, embeddings ${timing.embedMs}ms` +
|
|
1280
|
+
`, fts ${timing.ftsMs}ms` +
|
|
1281
|
+
`, finalize ${timing.finalizeMs}ms` +
|
|
1282
|
+
`, clean ${timing.cleanMs}ms` +
|
|
1283
|
+
`, end-to-end ${timing.endToEndMs}ms`;
|
|
1284
|
+
}
|
|
1046
1285
|
return out;
|
|
1047
1286
|
}
|
|
1048
1287
|
export function formatListPlain(r) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
// Output text formatters for all `akm workflow *` commands.
|
|
5
|
-
import { formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
|
|
5
|
+
import { formatWorkflowBriefPlain, formatWorkflowCompleteRejectedPlain, formatWorkflowCreatePlain, formatWorkflowListPlain, formatWorkflowNextPlain, formatWorkflowResumePlain, formatWorkflowRunPlain, formatWorkflowStatusPlain, formatWorkflowValidatePlain, } from "./helpers.js";
|
|
6
6
|
export const workflowFormatters = [
|
|
7
7
|
{ command: "workflow-start", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
8
8
|
{ command: "workflow-status", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
@@ -13,4 +13,7 @@ export const workflowFormatters = [
|
|
|
13
13
|
{ command: "workflow-create", handler: (r) => formatWorkflowCreatePlain(r) },
|
|
14
14
|
{ command: "workflow-validate", handler: (r) => formatWorkflowValidatePlain(r) },
|
|
15
15
|
{ command: "workflow-resume", handler: (r) => formatWorkflowResumePlain(r) },
|
|
16
|
+
{ command: "workflow-abandon", handler: (r) => formatWorkflowStatusPlain(r) },
|
|
17
|
+
{ command: "workflow-run", handler: (r) => formatWorkflowRunPlain(r) },
|
|
18
|
+
{ command: "workflow-brief", handler: (r) => formatWorkflowBriefPlain(r) },
|
|
16
19
|
];
|