akm-cli 0.9.0-rc.8 → 0.9.0
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 +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -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 +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -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 +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- 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 +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- 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 +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- 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/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
*
|
|
17
17
|
* `file-context.ts#runMatchers` (`:242-265`) is async ONLY because of its lazy
|
|
18
18
|
* `ensureBuiltinsRegistered()` dynamic import; its ARBITRATION is pure and
|
|
19
|
-
* synchronous. We reproduce it here by importing the SAME
|
|
19
|
+
* synchronous. We reproduce it here by importing the SAME four builtin matcher
|
|
20
20
|
* functions (`matchers.ts` `extensionMatcher` / `directoryMatcher` /
|
|
21
|
-
* `parentDirHintMatcher` / `smartMdMatcher`
|
|
21
|
+
* `parentDirHintMatcher` / `smartMdMatcher`) in the
|
|
22
22
|
* SAME order they are registered, collecting every non-null
|
|
23
23
|
* `MatchResult` and picking the winner by **specificity descending, ties broken
|
|
24
24
|
* by later-registered (higher index) winning** — byte-identical to
|
|
@@ -69,10 +69,14 @@
|
|
|
69
69
|
* logic, not re-implementing it. Neither is a taxonomy import-cycle (SCC)
|
|
70
70
|
* participant: `matchers.ts` resolves renderers via `type-presentation.ts`, and
|
|
71
71
|
* `asset-placement.ts` is a pure leaf (only Node builtins + `recognition-util`).
|
|
72
|
-
* Nothing in `src/` imports this adapter back
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
72
|
+
* Nothing in `src/` imports this adapter back except the `adapters/index.ts`
|
|
73
|
+
* barrel — which is NOT test-only: `core/adapter/registry.ts:33` imports it
|
|
74
|
+
* in production for the frozen `BUILTIN_ADAPTERS` list
|
|
75
|
+
* (`installations.ts#detectAdapterId`, `provider-utils.ts#detectStashRoot`).
|
|
76
|
+
* The adapter is still itself a leaf, since neither the barrel nor the
|
|
77
|
+
* registry import anything that imports back into this file — verified: `bun
|
|
78
|
+
* scripts/lint-import-cycles.ts` reports 0 cycle participants and this module
|
|
79
|
+
* is NOT one.
|
|
76
80
|
*/
|
|
77
81
|
import fs from "node:fs";
|
|
78
82
|
import path from "node:path";
|
|
@@ -115,7 +119,6 @@ const WIKI_INFRA_FILES = new Set(["schema.md", "index.md", "log.md"]);
|
|
|
115
119
|
* invariant for sensitive env/secret files holds by construction. Returns `true`
|
|
116
120
|
* when the `akm` adapter must ABSTAIN (recognize → null):
|
|
117
121
|
* - an `env/…` `.env` file with a sibling `.sensitive` marker;
|
|
118
|
-
* - anything under the frozen legacy `vaults/` dir (the `vault` type is gone);
|
|
119
122
|
* - a `secrets/` `.sensitive`/`.lock` marker, or a secret with a sibling
|
|
120
123
|
* `<name>.sensitive` marker;
|
|
121
124
|
* - a `wikis/<name>/` root-level infra file (schema.md/index.md/log.md).
|
|
@@ -132,10 +135,6 @@ function akmStashAbstains(root, absPath) {
|
|
|
132
135
|
if (fs.existsSync(absPath.replace(/\.env$/, ".sensitive")))
|
|
133
136
|
return true;
|
|
134
137
|
}
|
|
135
|
-
// The legacy `vaults/` directory (frozen copy left by the 0.8 migration) is
|
|
136
|
-
// never indexed — the `vault` asset type was removed in 0.9.0.
|
|
137
|
-
if (segments[0] === "vaults")
|
|
138
|
-
return true;
|
|
139
138
|
// Skip secret files that are themselves a `.sensitive` marker, or that have a
|
|
140
139
|
// sibling `<name>.sensitive` marker. Secrets are otherwise indexed by name
|
|
141
140
|
// only (their bytes are never read for classification here).
|
|
@@ -190,8 +189,12 @@ const DOCUMENT_JSON_CARRIED_FIELDS = [
|
|
|
190
189
|
"wikiRole",
|
|
191
190
|
"sources",
|
|
192
191
|
"generation",
|
|
193
|
-
"sourceRefs",
|
|
194
192
|
"evidenceSources",
|
|
193
|
+
// D2 (#730): the OKF v0.2 provenance `promoteProposal` stamps onto AKM-native
|
|
194
|
+
// writes (generated/verified/sources, namespaced — see `types.ts`'s
|
|
195
|
+
// `OkfProvenance` doc). Carried so the akm adapter rereads what it wrote and
|
|
196
|
+
// `akm show` surfaces it, exactly like every other field in this list.
|
|
197
|
+
"provenance",
|
|
195
198
|
];
|
|
196
199
|
/**
|
|
197
200
|
* Map the fully-assembled `IndexDocument` (produced by the shared metadata
|
|
@@ -254,17 +257,12 @@ function recognize(c, file) {
|
|
|
254
257
|
const match = recognizeMatch(file);
|
|
255
258
|
if (match === null)
|
|
256
259
|
return null;
|
|
257
|
-
//
|
|
258
|
-
//
|
|
259
|
-
// extension only if the type's toCanonicalName abstains (e.g. a `skills/x.md`
|
|
260
|
-
// flat file, or a `SKILL.md` sitting directly at the skills/ root with no name
|
|
261
|
-
// dir). The basename fallback is byte-identical to the pre-0.9.0 flat-walk's
|
|
262
|
-
// `?? baseName` fallback (metadata.ts `generateMetadata`), so `entry.name`
|
|
263
|
-
// stays the BARE canonical name — never the stash-root-relative path, which
|
|
264
|
-
// would re-embed the `<stash-subdir>/` type prefix and double-prefix every
|
|
265
|
-
// downstream legacy `type:name` ref (e.g. `skill:skills/x`).
|
|
260
|
+
// Canonical name = the winning type's per-type canonical name (§5.1).
|
|
261
|
+
// Invalid placements are not projected onto a different identity.
|
|
266
262
|
const derived = deriveCanonicalAssetNameFromStashRoot(match.type, c.root, file.absPath);
|
|
267
|
-
|
|
263
|
+
if (derived === undefined)
|
|
264
|
+
return null;
|
|
265
|
+
const canonicalName = derived;
|
|
268
266
|
// conceptId = the QUALIFIED `<stash-subdir>/<canonical-name>` spelling
|
|
269
267
|
// (ref-grammar decision D-R2): the same form `placeNew` consumes, and for
|
|
270
268
|
// markdown types the OKF concept ID (path − .md). Both branches now feed a
|
|
@@ -416,8 +414,8 @@ export const akmAdapter = {
|
|
|
416
414
|
id: "akm",
|
|
417
415
|
version: "0.9.0",
|
|
418
416
|
// Recognized-extension HINT, derived from what the matchers accept (§6):
|
|
419
|
-
// `.md` (markdown types + skill), `.yaml`/`.yml` (
|
|
420
|
-
//
|
|
417
|
+
// `.md` (markdown types + skill), `.yaml`/`.yml` (task YAML), `.env` (env
|
|
418
|
+
// files), and the 16 SCRIPT_EXTENSIONS. This is a
|
|
421
419
|
// NON-EXHAUSTIVE hint for the akm adapter: recognition is directory-driven
|
|
422
420
|
// via `recognize()` (e.g. a bare `secrets/<anything>` file with no extension
|
|
423
421
|
// is a `secret`), so `recognize()` — not this list — is the source of truth.
|
|
@@ -484,9 +482,11 @@ export const akmAdapter = {
|
|
|
484
482
|
/**
|
|
485
483
|
* Install-time probe (§1.2), reproducing today's stash-root detection
|
|
486
484
|
* (`provider-utils.ts#detectStashRoot`/`hasStashDirs`): a root is an AKM
|
|
487
|
-
* workspace root when it carries a `.stash` marker
|
|
488
|
-
*
|
|
489
|
-
*
|
|
485
|
+
* workspace root when it carries a `.stash` marker, multiple native placement
|
|
486
|
+
* directories, or one native directory whose Markdown is absent or
|
|
487
|
+
* declares the matching AKM type. The final check prevents an OKF bundle with
|
|
488
|
+
* an unrelated open type under (for example) `knowledge/` from being claimed
|
|
489
|
+
* by AKM merely because the directory name overlaps.
|
|
490
490
|
*/
|
|
491
491
|
looksLikeRoot(root) {
|
|
492
492
|
try {
|
|
@@ -504,6 +504,25 @@ export const akmAdapter = {
|
|
|
504
504
|
catch {
|
|
505
505
|
return false;
|
|
506
506
|
}
|
|
507
|
-
|
|
507
|
+
const ownedDirs = entries.filter((entry) => entry.isDirectory() && ownedDirNames.has(entry.name));
|
|
508
|
+
if (ownedDirs.length >= 2)
|
|
509
|
+
return true;
|
|
510
|
+
const only = ownedDirs[0];
|
|
511
|
+
if (!only)
|
|
512
|
+
return false;
|
|
513
|
+
const expectedType = stashDirToType(only.name);
|
|
514
|
+
try {
|
|
515
|
+
const markdown = fs
|
|
516
|
+
.readdirSync(path.join(root, only.name), { withFileTypes: true })
|
|
517
|
+
.find((entry) => entry.isFile() && entry.name.toLowerCase().endsWith(".md"));
|
|
518
|
+
if (!markdown)
|
|
519
|
+
return true;
|
|
520
|
+
const data = parseFrontmatter(fs.readFileSync(path.join(root, only.name, markdown.name), "utf8")).data;
|
|
521
|
+
const declaredType = typeof data.type === "string" ? data.type.trim() : "";
|
|
522
|
+
return !declaredType || declaredType === expectedType;
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
508
527
|
},
|
|
509
528
|
};
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
*
|
|
42
42
|
* Imported ONLY by `akm-adapter.ts` (no inbound `src/` edge) → can never join a
|
|
43
43
|
* cycle. It VALUE-imports `parseWorkflow` (already transitively reachable from
|
|
44
|
-
* `akm-adapter` via `matchers.ts`) and the
|
|
44
|
+
* `akm-adapter` via `matchers.ts`) and the pure predicate `isDangerousEnvKey`
|
|
45
45
|
* from `commands/lint/env-key-rules` — the predicate is imported, not copied,
|
|
46
46
|
* precisely so the 40+ security-sensitive dangerous-key names cannot drift from
|
|
47
47
|
* the canonical set; importing it is ratchet-neutral (verified: 18). The small
|
|
@@ -51,14 +51,17 @@
|
|
|
51
51
|
* adapter.
|
|
52
52
|
*/
|
|
53
53
|
import path from "node:path";
|
|
54
|
-
import {
|
|
54
|
+
import { isDangerousEnvKey } from "../../../commands/lint/env-key-rules.js";
|
|
55
|
+
import { taskFieldProblems } from "../../../tasks/schema.js";
|
|
56
|
+
import { compileWorkflowPlan } from "../../../workflows/ir/compile.js";
|
|
55
57
|
import { parseWorkflow } from "../../../workflows/parser.js";
|
|
58
|
+
import { conceptIdForStashFile } from "../../asset/resolve-ref.js";
|
|
56
59
|
/** Recommended `category` values for facts — `commands/lint/fact-linter.ts:9`. */
|
|
57
60
|
const KNOWN_CATEGORIES = new Set(["personal", "team", "project", "convention", "meta"]);
|
|
58
61
|
/** Placeholder markers a workflow stub carries — `commands/lint/workflow-linter.ts:10`. */
|
|
59
62
|
const PLACEHOLDER_STRINGS = ["Describe what this workflow accomplishes", "Example Workflow"];
|
|
60
63
|
/** Inline suppression token — `commands/lint/env-key-rules.ts:138` (not exported there; reproduced verbatim). */
|
|
61
|
-
const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-
|
|
64
|
+
const SUPPRESSION_COMMENT = "# akm-lint-ok: dangerous-env-key";
|
|
62
65
|
// ── BaseLinter protected-method ports (base-linter.ts:520-551) ───────────────
|
|
63
66
|
/** Port of `BaseLinter.checkMissingNameOrType` (`:520-527`). */
|
|
64
67
|
function checkMissingNameOrType(data, frontmatter) {
|
|
@@ -149,10 +152,14 @@ function collectSuppressedKeys(raw) {
|
|
|
149
152
|
return suppressed;
|
|
150
153
|
}
|
|
151
154
|
/**
|
|
152
|
-
* env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#
|
|
155
|
+
* env/secret dangerous-key scan (`lint/index.ts:191-218` + `env-key-rules.ts#checkEnvForDangerousKeys`),
|
|
153
156
|
* keyed on `type` and preserving the `.env`-suffix narrowness (see file header).
|
|
154
|
-
* Reads the overlay `raw`, not disk.
|
|
155
|
-
*
|
|
157
|
+
* Reads the overlay `raw`, not disk.
|
|
158
|
+
*
|
|
159
|
+
* The emitted `Ref:` comes from `conceptIdForStashFile` — the one place that
|
|
160
|
+
* spells a diagnostic ref the way `akm show` accepts it. It used to be
|
|
161
|
+
* hand-built as `env:<base>` / `secret:<base>`, a colon grammar the 0.9.0 ref
|
|
162
|
+
* parser rejects outright — a dead-end ref on a *security* finding.
|
|
156
163
|
*/
|
|
157
164
|
export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
|
|
158
165
|
if (type !== "env" && type !== "secret")
|
|
@@ -160,20 +167,19 @@ export function dangerousEnvKeyDiagnostics(type, relPath, raw) {
|
|
|
160
167
|
const baseNameWithExt = path.basename(relPath);
|
|
161
168
|
if (!baseNameWithExt.endsWith(".env"))
|
|
162
169
|
return []; // NARROWNESS: collectEnvFiles only visits *.env
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
const ref = baseName === "" ? `${refPrefix}:.env` : `${refPrefix}:${baseName}`;
|
|
170
|
+
// `relPath` is already stash-root-relative, so "." IS the stash root here.
|
|
171
|
+
const ref = conceptIdForStashFile(type, ".", relPath);
|
|
166
172
|
const keys = scanKeys(raw);
|
|
167
173
|
const suppressed = collectSuppressedKeys(raw);
|
|
168
174
|
const diagnostics = [];
|
|
169
175
|
for (const key of keys) {
|
|
170
|
-
if (!
|
|
176
|
+
if (!isDangerousEnvKey(key))
|
|
171
177
|
continue;
|
|
172
178
|
if (suppressed.has(key))
|
|
173
179
|
continue;
|
|
174
180
|
diagnostics.push({
|
|
175
181
|
file: relPath,
|
|
176
|
-
issue: "dangerous-
|
|
182
|
+
issue: "dangerous-env-key",
|
|
177
183
|
detail: `Env key \`${key}\` can be used to hijack process execution when injected via \`akm env run\`. Ref: ${ref}. Review this file before running \`akm env run\` commands against untrusted stashes. (suppress with: ${SUPPRESSION_COMMENT} on previous line)`,
|
|
178
184
|
fixed: false,
|
|
179
185
|
});
|
|
@@ -221,10 +227,7 @@ export async function perTypeValidateChecks(args) {
|
|
|
221
227
|
case "task":
|
|
222
228
|
return taskDiagnostics(relPath, data);
|
|
223
229
|
case "workflow":
|
|
224
|
-
//
|
|
225
|
-
// filters `.md`); YAML programs are not a lint path (lint golden pins the
|
|
226
|
-
// workflow-program via parseWorkflowProgram, not a linter). So the extra
|
|
227
|
-
// checks apply to markdown workflows only.
|
|
230
|
+
// Unified workflows are markdown-only; other extensions are not a lint path.
|
|
228
231
|
return ext === ".md" ? workflowDiagnostics(relPath, raw, body) : [];
|
|
229
232
|
case "memory":
|
|
230
233
|
return memoryDiagnostics(relPath, data, body, ctx);
|
|
@@ -261,17 +264,16 @@ export function factDiagnostics(relPath, data) {
|
|
|
261
264
|
}
|
|
262
265
|
return [];
|
|
263
266
|
}
|
|
264
|
-
/**
|
|
267
|
+
/**
|
|
268
|
+
* TaskLinter extra check (`task-linter.ts:25-58`). `data` is the parsed YAML.
|
|
269
|
+
* Field rules come from the shared {@link taskFieldProblems} (see its doc for
|
|
270
|
+
* the lint-vs-parser reconciliation story); this sweep additionally requires
|
|
271
|
+
* at least one target.
|
|
272
|
+
*/
|
|
265
273
|
export function taskDiagnostics(relPath, data) {
|
|
266
274
|
if (data === null || Object.keys(data).length === 0)
|
|
267
275
|
return [];
|
|
268
|
-
const missing =
|
|
269
|
-
if (!("schedule" in data) || typeof data.schedule !== "string" || data.schedule.trim() === "") {
|
|
270
|
-
missing.push("schedule");
|
|
271
|
-
}
|
|
272
|
-
if (!("enabled" in data) || typeof data.enabled !== "boolean") {
|
|
273
|
-
missing.push("enabled (must be a boolean)");
|
|
274
|
-
}
|
|
276
|
+
const missing = taskFieldProblems(data);
|
|
275
277
|
const hasTarget = "prompt" in data || "workflow" in data || "command" in data;
|
|
276
278
|
if (!hasTarget)
|
|
277
279
|
missing.push("prompt, workflow, or command");
|
|
@@ -298,8 +300,9 @@ export function matchWorkflowPlaceholder(body) {
|
|
|
298
300
|
}
|
|
299
301
|
/**
|
|
300
302
|
* WorkflowLinter's `invalid-workflow-structure` check (`workflow-linter.ts:48-77`):
|
|
301
|
-
*
|
|
302
|
-
* read-only `/.cache/`+`/registry/`
|
|
303
|
+
* parse and compile through the unified workflow frontend, surfacing every
|
|
304
|
+
* structural or semantic error and skipping the read-only `/.cache/`+`/registry/`
|
|
305
|
+
* cached copies. Shared with the live linter;
|
|
303
306
|
* `parsePath` is the path handed to `parseWorkflow` (the adapter passes the
|
|
304
307
|
* change relPath, the CLI passes the absolute filePath — matching each caller's
|
|
305
308
|
* legacy behavior). NEVER writes.
|
|
@@ -319,6 +322,18 @@ export function workflowStructureDiagnostics(relPath, raw, parsePath) {
|
|
|
319
322
|
fixed: false,
|
|
320
323
|
});
|
|
321
324
|
}
|
|
325
|
+
return diagnostics;
|
|
326
|
+
}
|
|
327
|
+
const compiled = compileWorkflowPlan(result.document, path.basename(parsePath, path.extname(parsePath)));
|
|
328
|
+
if (!compiled.ok) {
|
|
329
|
+
for (const err of compiled.errors) {
|
|
330
|
+
diagnostics.push({
|
|
331
|
+
file: relPath,
|
|
332
|
+
issue: "invalid-workflow-structure",
|
|
333
|
+
detail: err.message,
|
|
334
|
+
fixed: false,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
322
337
|
}
|
|
323
338
|
}
|
|
324
339
|
catch (e) {
|
|
@@ -334,8 +349,8 @@ export function workflowStructureDiagnostics(relPath, raw, parsePath) {
|
|
|
334
349
|
/**
|
|
335
350
|
* WorkflowLinter extra checks (`workflow-linter.ts:22-79`), READ-ONLY:
|
|
336
351
|
* `placeholder-stub` is NEVER deleted here (validate MUST NOT write) — emitted
|
|
337
|
-
* as a non-fixable Diagnostic. `invalid-workflow-structure`
|
|
338
|
-
*
|
|
352
|
+
* as a non-fixable Diagnostic. `invalid-workflow-structure` parses and compiles
|
|
353
|
+
* the whole `raw` through the unified workflow frontend.
|
|
339
354
|
*/
|
|
340
355
|
function workflowDiagnostics(relPath, raw, body) {
|
|
341
356
|
const diagnostics = [];
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
/**
|
|
5
5
|
* Index-time metadata fold for the `akm` adapter's `recognize` — akm 0.9.0
|
|
6
6
|
* chunk-2, WI-C, implementing spec §2 ("the nine index-time metadata
|
|
7
|
-
* contributors move into recognize") + the
|
|
7
|
+
* contributors move into recognize") + the workflow contributor.
|
|
8
8
|
*
|
|
9
9
|
* This leaf reproduces the 11 `registerMetadataContributor` sites keyed on the
|
|
10
10
|
* winning RENDERER name (exactly how each contributor's `appliesTo({ rendererName })`
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
* lesson-frontmatter-metadata, memory-frontmatter-metadata,
|
|
15
15
|
* script-comment-metadata, env-file-metadata, secret-file-metadata,
|
|
16
16
|
* task-yaml-metadata, session-md-metadata, fact-md-metadata;
|
|
17
|
-
* - `workflows/renderer.ts` (
|
|
18
|
-
* workflow-program-metadata (workflow-program-yaml).
|
|
17
|
+
* - `workflows/renderer.ts` (1): workflow-document-metadata (workflow-md).
|
|
19
18
|
*
|
|
20
19
|
* ── Cycle-safety (chunk-2 ratchet, baseline 18) ──
|
|
21
20
|
*
|
|
@@ -58,8 +57,6 @@ import fs from "node:fs";
|
|
|
58
57
|
import { parse as parseYaml } from "yaml";
|
|
59
58
|
import { listKeys } from "../../../commands/env/env.js";
|
|
60
59
|
import { parseWorkflow } from "../../../workflows/parser.js";
|
|
61
|
-
import { parseWorkflowProgram } from "../../../workflows/program/parser.js";
|
|
62
|
-
import { programStepInstructions, projectProgramParameters } from "../../../workflows/program/project.js";
|
|
63
60
|
import { parseFrontmatter } from "../../asset/frontmatter.js";
|
|
64
61
|
import { parseMarkdownToc } from "../../asset/markdown.js";
|
|
65
62
|
import { nonEmptyString } from "./shared.js";
|
|
@@ -312,20 +309,23 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
312
309
|
return out;
|
|
313
310
|
const doc = result.document;
|
|
314
311
|
const hints = new Set();
|
|
315
|
-
|
|
312
|
+
if (doc.preamble)
|
|
313
|
+
hints.add(doc.preamble);
|
|
316
314
|
for (const step of doc.steps) {
|
|
317
|
-
hints.add(step.title);
|
|
318
315
|
hints.add(step.id);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
316
|
+
if (step.instructions)
|
|
317
|
+
hints.add(step.instructions.text);
|
|
318
|
+
if (step.gateRubric)
|
|
319
|
+
hints.add(step.gateRubric.text);
|
|
322
320
|
}
|
|
323
321
|
out.searchHints = Array.from(hints).filter(Boolean);
|
|
324
|
-
if (doc.
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
...(
|
|
328
|
-
})
|
|
322
|
+
if (doc.params) {
|
|
323
|
+
const parameters = Object.entries(doc.params).map(([name, schema]) => {
|
|
324
|
+
const description = schema.description;
|
|
325
|
+
return { name, ...(typeof description === "string" && description ? { description } : {}) };
|
|
326
|
+
});
|
|
327
|
+
if (parameters.length)
|
|
328
|
+
out.parameters = parameters;
|
|
329
329
|
}
|
|
330
330
|
}
|
|
331
331
|
catch {
|
|
@@ -333,35 +333,6 @@ export function foldRecognizedMetadata(rendererName, file) {
|
|
|
333
333
|
}
|
|
334
334
|
return out;
|
|
335
335
|
}
|
|
336
|
-
// ── workflow-program-metadata (workflow-program-yaml) ──
|
|
337
|
-
case "workflow-program-yaml": {
|
|
338
|
-
try {
|
|
339
|
-
const result = parseWorkflowProgram(file.content(), { path: file.relPath });
|
|
340
|
-
if (!result.ok)
|
|
341
|
-
return out;
|
|
342
|
-
const program = result.program;
|
|
343
|
-
const hints = new Set();
|
|
344
|
-
hints.add(program.name);
|
|
345
|
-
for (const step of program.steps) {
|
|
346
|
-
hints.add(step.id);
|
|
347
|
-
if (step.title)
|
|
348
|
-
hints.add(step.title);
|
|
349
|
-
hints.add(programStepInstructions(step));
|
|
350
|
-
for (const criterion of step.gate?.criteria ?? [])
|
|
351
|
-
hints.add(criterion);
|
|
352
|
-
}
|
|
353
|
-
out.searchHints = Array.from(hints).filter(Boolean);
|
|
354
|
-
if (!out.description && program.description)
|
|
355
|
-
out.description = program.description;
|
|
356
|
-
const parameters = projectProgramParameters(program);
|
|
357
|
-
if (parameters?.length)
|
|
358
|
-
out.parameters = parameters;
|
|
359
|
-
}
|
|
360
|
-
catch {
|
|
361
|
-
// See file header: broken programs drop at drain time, not here.
|
|
362
|
-
}
|
|
363
|
-
return out;
|
|
364
|
-
}
|
|
365
336
|
default:
|
|
366
337
|
// No contributor applies to this renderer (e.g. skill-md/command-md/
|
|
367
338
|
// agent-md — the static-only mappings carry no metadata contributor).
|
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
*
|
|
13
13
|
* ── validate (spec §6 task validation column) ──
|
|
14
14
|
*
|
|
15
|
-
* A task must declare a `schedule`,
|
|
16
|
-
*
|
|
17
|
-
* `
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* A task must declare `version: 2`, a `schedule`, and EXACTLY ONE target
|
|
16
|
+
* (`prompt` XOR `workflow` XOR `command`). `enabled` is OPTIONAL — the parser
|
|
17
|
+
* defaults it to `true`, so an omitted field means an ACTIVE task — but must
|
|
18
|
+
* be a boolean when present. The akm adapter's `TaskLinter` port checks
|
|
19
|
+
* "at least one" target; the native task family here is STRICTER — declaring
|
|
20
|
+
* two targets is `invalid-task-yaml`. So this adapter owns a purpose-built
|
|
21
|
+
* one-target check rather than reusing that port.
|
|
20
22
|
*
|
|
21
23
|
* Conformance oracle (authored, DO NOT modify): fixture
|
|
22
24
|
* `tests/fixtures/bundles/akm-task/` + goldens
|
|
@@ -25,6 +27,7 @@
|
|
|
25
27
|
import fs from "node:fs";
|
|
26
28
|
import path from "node:path";
|
|
27
29
|
import { parse as parseYaml } from "yaml";
|
|
30
|
+
import { taskFieldProblems } from "../../../tasks/schema.js";
|
|
28
31
|
import { hashContent } from "./shared.js";
|
|
29
32
|
/** A native task bundle is single-component; its one component is `main`. */
|
|
30
33
|
const COMPONENT_ID = "main";
|
|
@@ -68,15 +71,15 @@ function parseTaskYaml(raw) {
|
|
|
68
71
|
}
|
|
69
72
|
return {};
|
|
70
73
|
}
|
|
71
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* The native `invalid-task-yaml` check: the shared field rules
|
|
76
|
+
* ({@link taskFieldProblems} — see its doc for the lint-vs-parser
|
|
77
|
+
* reconciliation story) plus this adapter's stricter EXACTLY-ONE-target rule.
|
|
78
|
+
*/
|
|
72
79
|
function taskDiagnostics(relPath, data) {
|
|
73
80
|
if (Object.keys(data).length === 0)
|
|
74
81
|
return [];
|
|
75
|
-
const problems =
|
|
76
|
-
if (typeof data.schedule !== "string" || data.schedule.trim() === "")
|
|
77
|
-
problems.push("schedule");
|
|
78
|
-
if (typeof data.enabled !== "boolean")
|
|
79
|
-
problems.push("enabled (must be a boolean)");
|
|
82
|
+
const problems = taskFieldProblems(data);
|
|
80
83
|
const targets = TARGET_KEYS.filter((k) => k in data && data[k] !== undefined && data[k] !== null);
|
|
81
84
|
if (targets.length === 0)
|
|
82
85
|
problems.push("exactly one target (prompt, workflow, or command)");
|
|
@@ -120,8 +123,7 @@ export const akmTaskAdapter = {
|
|
|
120
123
|
/**
|
|
121
124
|
* Install-time probe (§1.2): a root holding a top-level `.yml` file that
|
|
122
125
|
* parses as a task (a `schedule` key). The task-shape probe keeps it disjoint
|
|
123
|
-
* from
|
|
124
|
-
* and from any non-task YAML.
|
|
126
|
+
* from non-task YAML.
|
|
125
127
|
*/
|
|
126
128
|
looksLikeRoot(root) {
|
|
127
129
|
let entries;
|