akm-cli 0.9.1 → 0.9.2-alpha.2
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 +103 -28
- package/README.md +3 -1
- package/SECURITY.md +1 -1
- package/STABILITY.md +1 -1
- package/dist/akm +2 -2
- package/dist/akm-migrate +2 -2
- package/dist/assets/hints/cli-hints-full.md +14 -9
- package/dist/assets/improve-strategies/proactive-maintenance.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/models.json +35 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +3 -4
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +1 -3
- package/dist/assets/tasks/core/extract.yml +6 -5
- package/dist/assets/tasks/core/improve.yml +6 -5
- package/dist/assets/tasks/core/index-refresh.yml +6 -5
- package/dist/assets/tasks/core/sync.yml +6 -5
- package/dist/assets/tasks/core/version-check.yml +6 -5
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +6 -5
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +6 -5
- package/dist/cli/confirm.js +2 -2
- package/dist/cli/parse-args.js +3 -24
- package/dist/cli/retired-commands.js +1 -1
- package/dist/cli/shared.js +2 -2
- package/dist/cli.js +11 -9
- package/dist/commands/agent/agent-dispatch.js +55 -89
- package/dist/commands/agent/contribute-cli.js +12 -45
- package/dist/commands/command/builtin-action.js +32 -0
- package/dist/commands/command/command-cli.js +99 -0
- package/dist/commands/command/command-execution.js +308 -0
- package/dist/commands/command/execution-source-loader.js +176 -0
- package/dist/commands/command/portable-template.js +60 -0
- package/dist/commands/config-cli.js +10 -4
- package/dist/commands/env/env.js +4 -2
- package/dist/commands/feedback-cli.js +1 -1
- package/dist/commands/health/checks.js +241 -29
- package/dist/commands/health/html-report.js +0 -14
- package/dist/commands/health/report-view-model.js +0 -1
- package/dist/commands/health/surfaces.js +6 -7
- package/dist/commands/health/types.js +0 -2
- package/dist/commands/health.js +63 -18
- package/dist/commands/improve/collapse-detector.js +5 -6
- package/dist/commands/improve/consolidate.js +251 -214
- package/dist/commands/improve/distill/promote-memory.js +71 -34
- package/dist/commands/improve/distill/quality-gate.js +17 -5
- package/dist/commands/improve/distill.js +232 -155
- package/dist/commands/improve/eligibility.js +112 -79
- package/dist/commands/improve/execution.js +57 -0
- package/dist/commands/improve/extract-cli.js +5 -5
- package/dist/commands/improve/extract-prompt.js +64 -22
- package/dist/commands/improve/extract.js +608 -360
- package/dist/commands/improve/improve-strategies.js +43 -14
- package/dist/commands/improve/improve.js +249 -29
- package/dist/commands/improve/loop-stages.js +11 -17
- package/dist/commands/improve/memory/memory-contradiction-detect.js +90 -66
- package/dist/commands/improve/outcome-loop.js +22 -38
- package/dist/commands/improve/planner.js +134 -0
- package/dist/commands/improve/preparation.js +730 -409
- package/dist/commands/improve/reflect.js +386 -223
- package/dist/commands/improve/run-context.js +3 -4
- package/dist/commands/improve/salience.js +6 -58
- package/dist/commands/improve/session-asset.js +12 -12
- package/dist/commands/lint/index.js +101 -29
- package/dist/commands/migrate-cli.js +11 -69
- package/dist/commands/migration-tool.js +6 -9
- package/dist/commands/models-cli.js +27 -0
- package/dist/commands/proposal/drain.js +258 -186
- package/dist/commands/proposal/proposal-cli.js +32 -10
- package/dist/commands/proposal/proposal.js +2 -5
- package/dist/commands/proposal/propose.js +192 -172
- package/dist/commands/proposal/repository.js +54 -91
- package/dist/commands/proposal/validators/proposal-validators.js +9 -7
- package/dist/commands/read/curate.js +53 -22
- package/dist/commands/read/registry-search.js +25 -9
- package/dist/commands/read/remember-cli.js +14 -2
- package/dist/commands/read/search.js +10 -4
- package/dist/commands/read/show.js +139 -153
- package/dist/commands/registry-cli.js +16 -7
- package/dist/commands/remember.js +33 -18
- package/dist/commands/sources/add-cli.js +19 -178
- package/dist/commands/sources/bundle-cli.js +15 -3
- package/dist/commands/sources/dangerous-env-audit.js +135 -0
- package/dist/commands/sources/info.js +2 -1
- package/dist/commands/sources/installed-stashes.js +901 -177
- package/dist/commands/sources/schema-repair.js +174 -95
- package/dist/commands/sources/self-update.js +30 -74
- package/dist/commands/sources/source-add.js +3 -5
- package/dist/commands/sources/sources-cli.js +2 -15
- package/dist/commands/sources/update-transaction.js +220 -0
- package/dist/commands/tasks/tasks-cli.js +3 -3
- package/dist/commands/tasks/tasks.js +736 -317
- package/dist/commands/workflow-cli.js +2 -2
- package/dist/core/adapter/adapters/agent-skills-adapter.js +3 -0
- package/dist/core/adapter/adapters/akm-adapter.js +85 -35
- package/dist/core/adapter/adapters/akm-lint.js +54 -39
- package/dist/core/adapter/adapters/akm-metadata.js +45 -45
- package/dist/core/adapter/adapters/akm-task-adapter.js +32 -49
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +38 -23
- package/dist/core/adapter/adapters/dotenv-adapter.js +30 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +11 -0
- package/dist/core/adapter/adapters/index.js +0 -9
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +4 -0
- package/dist/core/adapter/adapters/okf-adapter.js +4 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +5 -8
- package/dist/core/adapter/adapters/tool-dir-shared.js +63 -6
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +4 -0
- package/dist/core/adapter/execution-source.js +308 -0
- package/dist/core/adapter/recognize-match.js +36 -13
- package/dist/core/adapter/registry.js +0 -9
- package/dist/core/asset/stash-meta.js +94 -4
- package/dist/core/common.js +6 -11
- package/dist/core/config/config-io.js +3 -3
- package/dist/core/config/config-schema.js +18 -40
- package/dist/core/config/config-sources.js +11 -21
- package/dist/core/config/config-walker.js +31 -13
- package/dist/core/config/config.js +23 -26
- package/dist/core/config/schema/engines.js +8 -7
- package/dist/core/config/schema/improve-processes.js +29 -5
- package/dist/core/config/schema/index-config.js +0 -27
- package/dist/core/config/schema/primitives.js +1 -23
- package/dist/core/config/schema/sources-bundles.js +13 -16
- package/dist/core/errors.js +2 -0
- package/dist/core/events.js +68 -32
- package/dist/core/extra-params.js +1 -0
- package/dist/core/improve-result.js +315 -0
- package/dist/core/lesson-lint.js +0 -6
- package/dist/core/maintenance-barrier.js +4 -4
- package/dist/core/network-policy.js +152 -0
- package/dist/core/paths.js +1 -1
- package/dist/core/recognition-util.js +4 -4
- package/dist/core/registry-url.js +456 -0
- package/dist/core/state/migrations.js +161 -47
- package/dist/core/state-db.js +453 -80
- package/dist/core/system-error.js +32 -0
- package/dist/core/time.js +2 -12
- package/dist/core/write-source.js +0 -18
- package/dist/execution/directory-identity.js +52 -0
- package/dist/execution/executable-identity.js +107 -0
- package/dist/execution/guarded-source.js +398 -0
- package/dist/execution/json.js +95 -0
- package/dist/{commands/health/types-session-log.js → execution/limits.js} +2 -1
- package/dist/execution/record.js +55 -0
- package/dist/execution/resolved-request.js +730 -0
- package/dist/execution/source.js +320 -0
- package/dist/indexer/bundle-identity-guard.js +5 -4
- package/dist/indexer/db/graph-db.js +33 -0
- package/dist/indexer/graph/graph-boost.js +3 -4
- package/dist/indexer/graph/graph-extraction.js +562 -373
- package/dist/indexer/index-written-assets.js +78 -39
- package/dist/indexer/indexer.js +471 -432
- package/dist/indexer/installations.js +6 -0
- package/dist/indexer/lookup/adapter-concept-owner.js +283 -0
- package/dist/indexer/materialize-embeddings.js +155 -0
- package/dist/indexer/passes/memory-inference.js +227 -174
- package/dist/indexer/passes/metadata.js +263 -118
- package/dist/indexer/scan/doc-to-entry.js +7 -10
- package/dist/indexer/scan/drain-dir.js +51 -23
- package/dist/indexer/search/db-search.js +156 -50
- package/dist/indexer/search/fts-query.js +40 -40
- package/dist/indexer/search/ranking.js +36 -1
- package/dist/indexer/search/search-attribution.js +3 -1
- package/dist/indexer/search/search-fields.js +23 -14
- package/dist/indexer/search/search-hit-enrichers.js +1 -1
- package/dist/indexer/search/search-source.js +7 -16
- package/dist/indexer/search/semantic-status.js +10 -1
- package/dist/indexer/usage/show-usage.js +105 -0
- package/dist/indexer/usage/usage-events.js +7 -2
- package/dist/indexer/walk/matchers.js +40 -10
- package/dist/indexer/walk/path-resolver.js +5 -2
- package/dist/indexer/walk/walker.js +20 -2
- package/dist/integrations/agent/builder-shared.js +3 -6
- package/dist/integrations/agent/conversation-fallback.js +16 -0
- package/dist/integrations/agent/engine-resolution.js +87 -87
- package/dist/integrations/agent/execution-cascade.js +566 -0
- package/dist/integrations/agent/execution-definitions.js +211 -0
- package/dist/integrations/agent/execution-lowering.js +811 -0
- package/dist/integrations/agent/execution-preparation.js +67 -0
- package/dist/integrations/agent/index.js +0 -2
- package/dist/integrations/agent/inline-execution.js +74 -0
- package/dist/integrations/agent/model-map.js +515 -0
- package/dist/integrations/agent/persona-fallback.js +30 -0
- package/dist/integrations/agent/request-lowering.js +186 -0
- package/dist/integrations/agent/runner-dispatch.js +230 -37
- package/dist/integrations/agent/runner.js +12 -83
- package/dist/integrations/harnesses/aider/agent-builder.js +8 -0
- package/dist/integrations/harnesses/aider/index.js +0 -1
- package/dist/integrations/harnesses/amazonq/agent-builder.js +8 -0
- package/dist/integrations/harnesses/amazonq/index.js +0 -1
- package/dist/integrations/harnesses/claude/agent-builder.js +14 -1
- package/dist/integrations/harnesses/claude/index.js +1 -5
- package/dist/integrations/harnesses/claude/session-log.js +3 -33
- package/dist/integrations/harnesses/codex/agent-builder.js +8 -0
- package/dist/integrations/harnesses/codex/index.js +0 -1
- package/dist/integrations/harnesses/copilot/agent-builder.js +8 -0
- package/dist/integrations/harnesses/copilot/index.js +0 -1
- package/dist/integrations/harnesses/gemini/agent-builder.js +8 -0
- package/dist/integrations/harnesses/gemini/index.js +0 -1
- package/dist/integrations/harnesses/index.js +4 -44
- package/dist/integrations/harnesses/opencode/agent-builder.js +16 -9
- package/dist/integrations/harnesses/opencode/index.js +0 -2
- package/dist/integrations/harnesses/opencode/session-log.js +14 -204
- package/dist/integrations/harnesses/opencode-sdk/harness.js +12 -1
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +40 -42
- package/dist/integrations/harnesses/openhands/agent-builder.js +8 -0
- package/dist/integrations/harnesses/openhands/index.js +0 -1
- package/dist/integrations/harnesses/pi/agent-builder.js +8 -0
- package/dist/integrations/harnesses/pi/index.js +0 -1
- package/dist/integrations/harnesses/shared.js +0 -1
- package/dist/integrations/harnesses/types.js +1 -3
- package/dist/integrations/lockfile.js +82 -79
- package/dist/integrations/session-logs/index.js +6 -17
- package/dist/integrations/session-logs/provider-base.js +1 -29
- package/dist/llm/client.js +10 -5
- package/dist/llm/embedder.js +6 -7
- package/dist/llm/embedders/local.js +37 -88
- package/dist/llm/embedders/types.js +1 -1
- package/dist/llm/graph-extract.js +75 -50
- package/dist/llm/index-passes.js +43 -5
- package/dist/llm/memory-infer.js +8 -6
- package/dist/llm/metadata-enhance.js +5 -3
- package/dist/llm/structured-call.js +122 -25
- package/dist/output/format-exempt.js +1 -1
- package/dist/output/render-registry.js +0 -16
- package/dist/output/renderers.js +12 -7
- package/dist/output/shapes/curate.js +1 -0
- package/dist/output/shapes/helpers.js +10 -2
- package/dist/output/shapes/passthrough.js +2 -0
- package/dist/output/text/command-format.js +31 -33
- package/dist/output/text/health-format.js +1 -29
- package/dist/output/text/migrate.js +6 -56
- package/dist/output/text/proposal-format.js +16 -1
- package/dist/output/text/workflow-format.js +16 -0
- package/dist/registry/network.js +279 -0
- package/dist/registry/pinned-request-helper.js +247 -0
- package/dist/registry/pinned-transport.js +717 -0
- package/dist/registry/providers/skills-sh.js +18 -6
- package/dist/registry/providers/static-index.js +20 -7
- package/dist/registry/resolve.js +53 -28
- package/dist/scripts/akm-migrate-node.js +19334 -52269
- package/dist/scripts/akm-migrate.js +19270 -51612
- package/dist/setup/registry-stash-loader.js +64 -20
- package/dist/setup/semantic-assets.js +9 -34
- package/dist/setup/setup.js +12 -30
- package/dist/setup/source-identity.js +17 -0
- package/dist/setup/steps/sources.js +36 -15
- package/dist/setup/steps/tasks.js +39 -11
- package/dist/sources/providers/git-provider.js +3 -3
- package/dist/sources/providers/npm.js +2 -2
- package/dist/sources/providers/provider-utils.js +4 -3
- package/dist/sources/providers/website.js +11 -7
- package/dist/sources/snapshot-fetchers/host-guard.js +9 -136
- package/dist/sources/snapshot-fetchers/website-ingest.js +25 -109
- package/dist/sources/website-url.js +73 -0
- package/dist/storage/engines/sqlite-migrations.js +81 -26
- package/dist/storage/managed-db.js +27 -24
- package/dist/storage/repositories/events-repository.js +3 -0
- package/dist/storage/repositories/index-connection.js +42 -10
- package/dist/storage/repositories/index-entries-repository.js +203 -229
- package/dist/storage/repositories/index-entry-mapper.js +8 -12
- package/dist/storage/repositories/index-entry-schema.js +255 -0
- package/dist/storage/repositories/index-fts-repository.js +64 -71
- package/dist/storage/repositories/index-llm-cache-repository.js +8 -13
- package/dist/storage/repositories/index-meta-repository.js +0 -11
- package/dist/storage/repositories/index-schema.js +74 -350
- package/dist/storage/repositories/index-utility-repository.js +12 -17
- package/dist/storage/repositories/index-vec-repository.js +56 -7
- package/dist/storage/repositories/proposals-repository.js +4 -127
- package/dist/storage/repositories/registry-cache.js +2 -1
- package/dist/storage/repositories/task-history-repository.js +20 -40
- package/dist/storage/repositories/workflow-runs-repository.js +228 -129
- package/dist/storage/sqlite-read-snapshot.js +148 -0
- package/dist/tasks/backends/cron.js +170 -42
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +787 -202
- package/dist/tasks/backends/schtasks.js +282 -83
- package/dist/tasks/embedded.js +7 -7
- package/dist/tasks/frozen-script.js +50 -0
- package/dist/tasks/resolve-akm-bin.js +5 -1
- package/dist/tasks/runner.js +239 -251
- package/dist/tasks/runtime-v3.js +281 -0
- package/dist/tasks/scheduler-binding.js +272 -0
- package/dist/tasks/scheduler-invocation.js +57 -43
- package/dist/tasks/scheduler-sync.js +654 -0
- package/dist/tasks/source-v3.js +752 -0
- package/dist/tasks/standalone-script-entry.js +5 -0
- package/dist/tasks/task-id.js +29 -0
- package/dist/workflows/authoring/authoring.js +15 -32
- package/dist/workflows/exec/dispatch-redaction.js +14 -8
- package/dist/workflows/exec/exec-unit.js +7 -28
- package/dist/workflows/exec/frozen-judge.js +57 -89
- package/dist/workflows/exec/lowering-notices.js +23 -0
- package/dist/workflows/exec/native-executor.js +301 -458
- package/dist/workflows/exec/param-secrets.js +4 -3
- package/dist/workflows/exec/run-workflow.js +26 -32
- package/dist/workflows/exec/step-work.js +105 -109
- package/dist/workflows/exec/unit-dispatch.js +103 -27
- package/dist/workflows/exec/unit-writer.js +3 -3
- package/dist/workflows/exec/worktree.js +2 -2
- package/dist/workflows/ir/compile.js +86 -72
- package/dist/workflows/ir/environment-v4.js +328 -0
- package/dist/workflows/ir/freeze-v4.js +122 -0
- package/dist/workflows/ir/plan-hash.js +13 -7
- package/dist/workflows/ir/schema-v4.js +525 -0
- package/dist/workflows/ir/schema.js +25 -284
- package/dist/workflows/ir/source-freeze-v4.js +506 -0
- package/dist/workflows/parser.js +27 -24
- package/dist/workflows/program/schema.js +1 -2
- package/dist/workflows/renderer.js +42 -29
- package/dist/workflows/resource-limits.js +4 -5
- package/dist/workflows/runtime/agent-identity.js +11 -13
- package/dist/workflows/runtime/plan-classifier.js +8 -8
- package/dist/workflows/runtime/runs.js +27 -43
- package/dist/workflows/runtime/workflow-asset-loader.js +45 -205
- package/dist/workflows/source-files.js +373 -0
- package/dist/workflows/source-ir/compile.js +196 -0
- package/dist/workflows/source-ir/github-yaml.js +577 -0
- package/dist/workflows/source-ir/ordering.js +38 -0
- package/dist/workflows/source-ir/program.js +50 -0
- package/dist/workflows/source-ir/result.js +26 -0
- package/dist/workflows/source-ir/schema.js +772 -0
- package/dist/workflows/source-ir/semantics.js +242 -0
- package/dist/workflows/source-ir/uses.js +14 -0
- package/docs/README.md +2 -0
- package/docs/migration/README.md +3 -1
- package/docs/migration/release-notes/0.9.2.md +55 -0
- package/docs/migration/release-notes/README.md +5 -0
- package/docs/migration/v0.8-to-v0.9.md +76 -1077
- package/docs/migration/v0.9.0-troubleshooting.md +104 -516
- package/docs/migration/v0.9.1-to-v0.9.2.md +150 -0
- package/docs/reference/README.md +1 -0
- package/docs/reference/cli.md +230 -98
- package/docs/reference/configuration.md +159 -36
- package/docs/reference/data-and-telemetry.md +19 -1
- package/docs/reference/supported-formats.md +23 -3
- package/docs/reference/tasks.md +182 -0
- package/docs/reference/workflow-schema.md +91 -40
- package/docs/reference/workflows.md +33 -6
- package/package.json +10 -6
- package/schemas/akm-config.json +372 -224
- package/schemas/akm-task.json +324 -80
- package/schemas/akm-workflow.json +6 -9
- package/dist/core/migration-operation.js +0 -75
- package/dist/integrations/agent/model-aliases.js +0 -74
- package/dist/tasks/parser.js +0 -380
- package/dist/tasks/schema.js +0 -123
- package/dist/tasks/validator.js +0 -80
- package/dist/workflows/ir/freeze.js +0 -320
- package/dist/workflows/runtime/document-cache.js +0 -13
package/dist/output/renderers.js
CHANGED
|
@@ -181,6 +181,9 @@ const commandMdRenderer = {
|
|
|
181
181
|
const parsedMd = parseFrontmatter(ctx.content());
|
|
182
182
|
const template = parsedMd.content;
|
|
183
183
|
const tags = readFrontmatterTags(parsedMd.data.tags);
|
|
184
|
+
const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
|
|
185
|
+
const agent = asNonEmptyString(parsedMd.data.agent);
|
|
186
|
+
const parameters = extractParameters(template);
|
|
184
187
|
return {
|
|
185
188
|
type: "command",
|
|
186
189
|
name,
|
|
@@ -189,9 +192,9 @@ const commandMdRenderer = {
|
|
|
189
192
|
description: asNonEmptyString(parsedMd.data.description),
|
|
190
193
|
...(tags ? { tags } : {}),
|
|
191
194
|
template,
|
|
192
|
-
modelHint
|
|
193
|
-
agent:
|
|
194
|
-
parameters:
|
|
195
|
+
...(modelHint !== undefined ? { modelHint } : {}),
|
|
196
|
+
...(agent !== undefined ? { agent } : {}),
|
|
197
|
+
...(parameters !== undefined ? { parameters } : {}),
|
|
195
198
|
};
|
|
196
199
|
},
|
|
197
200
|
};
|
|
@@ -201,6 +204,8 @@ const agentMdRenderer = {
|
|
|
201
204
|
buildShowResponse(ctx) {
|
|
202
205
|
const name = deriveName(ctx);
|
|
203
206
|
const parsedMd = parseFrontmatter(ctx.content());
|
|
207
|
+
const toolPolicy = parsedMd.data.tools;
|
|
208
|
+
const modelHint = typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined;
|
|
204
209
|
return {
|
|
205
210
|
type: "agent",
|
|
206
211
|
name,
|
|
@@ -212,8 +217,8 @@ const agentMdRenderer = {
|
|
|
212
217
|
// whether this self-declared policy is honoured is applied at the show
|
|
213
218
|
// layer (`akmShowUnified`), which knows whether the source is the operator's
|
|
214
219
|
// own writable stash vs a read-only third-party source (07 P1-D).
|
|
215
|
-
toolPolicy:
|
|
216
|
-
modelHint
|
|
220
|
+
...(toolPolicy !== undefined ? { toolPolicy } : {}),
|
|
221
|
+
...(modelHint !== undefined ? { modelHint } : {}),
|
|
217
222
|
};
|
|
218
223
|
},
|
|
219
224
|
};
|
|
@@ -296,8 +301,8 @@ const scriptSourceRenderer = {
|
|
|
296
301
|
path: ctx.absPath,
|
|
297
302
|
action: "Execute the run command below",
|
|
298
303
|
run: hints.run,
|
|
299
|
-
setup: hints.setup,
|
|
300
|
-
cwd: hints.cwd,
|
|
304
|
+
...(hints.setup !== undefined ? { setup: hints.setup } : {}),
|
|
305
|
+
...(hints.cwd !== undefined ? { cwd: hints.cwd } : {}),
|
|
301
306
|
};
|
|
302
307
|
}
|
|
303
308
|
}
|
|
@@ -68,6 +68,7 @@ export function shapeCurateOutput(result, detail, shape) {
|
|
|
68
68
|
query: result.query,
|
|
69
69
|
summary: result.summary,
|
|
70
70
|
items: shapedItems,
|
|
71
|
+
...(typeof result.searchMode === "string" ? { searchMode: result.searchMode } : {}),
|
|
71
72
|
...(Array.isArray(result.warnings) && result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
72
73
|
...(result.tip ? { tip: result.tip } : {}),
|
|
73
74
|
};
|
|
@@ -13,6 +13,7 @@ export function shapeProposalProducerOutput(result, detail) {
|
|
|
13
13
|
...(result.name !== undefined ? { name: result.name } : {}),
|
|
14
14
|
...(result.engine !== undefined ? { engine: result.engine } : {}),
|
|
15
15
|
...(result.exitCode !== undefined ? { exitCode: result.exitCode } : {}),
|
|
16
|
+
...(Array.isArray(result.notices) ? { notices: result.notices } : {}),
|
|
16
17
|
};
|
|
17
18
|
if (detail === "full") {
|
|
18
19
|
return {
|
|
@@ -30,6 +31,7 @@ export function shapeProposalProducerOutput(result, detail) {
|
|
|
30
31
|
ref: result.ref,
|
|
31
32
|
...(result.engine !== undefined ? { engine: result.engine } : {}),
|
|
32
33
|
...(typeof result.durationMs === "number" ? { durationMs: result.durationMs } : {}),
|
|
34
|
+
...(Array.isArray(result.notices) ? { notices: result.notices } : {}),
|
|
33
35
|
proposal: shapeProposalEntry(proposal, detail === "brief" ? "normal" : detail),
|
|
34
36
|
};
|
|
35
37
|
if (detail === "full") {
|
|
@@ -185,10 +187,14 @@ export function shapeSearchOutput(result, detail, shape = "human") {
|
|
|
185
187
|
const shapedRegistryHits = forAgent
|
|
186
188
|
? registryHits.map((hit) => shapeSearchHitForAgent(hit))
|
|
187
189
|
: registryHits.map((hit) => shapeSearchHit(hit, detail));
|
|
190
|
+
const searchMode = typeof result.searchMode === "string" ? result.searchMode : undefined;
|
|
191
|
+
const warnings = Array.isArray(result.warnings) && result.warnings.length > 0 ? result.warnings : undefined;
|
|
188
192
|
if (forAgent) {
|
|
189
193
|
return {
|
|
190
194
|
hits: shapedHits,
|
|
191
195
|
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
196
|
+
...(searchMode ? { searchMode } : {}),
|
|
197
|
+
...(warnings ? { warnings } : {}),
|
|
192
198
|
...(result.tip ? { tip: result.tip } : {}),
|
|
193
199
|
};
|
|
194
200
|
}
|
|
@@ -200,14 +206,16 @@ export function shapeSearchOutput(result, detail, shape = "human") {
|
|
|
200
206
|
hits: shapedHits,
|
|
201
207
|
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
202
208
|
...(result.tip ? { tip: result.tip } : {}),
|
|
203
|
-
...(
|
|
209
|
+
...(searchMode ? { searchMode } : {}),
|
|
210
|
+
...(warnings ? { warnings } : {}),
|
|
204
211
|
...(result.timing ? { timing: result.timing } : {}),
|
|
205
212
|
};
|
|
206
213
|
}
|
|
207
214
|
return {
|
|
208
215
|
hits: shapedHits,
|
|
209
216
|
...(shapedRegistryHits.length > 0 ? { registryHits: shapedRegistryHits } : {}),
|
|
210
|
-
...(
|
|
217
|
+
...(searchMode ? { searchMode } : {}),
|
|
218
|
+
...(warnings ? { warnings } : {}),
|
|
211
219
|
...(result.tip ? { tip: result.tip } : {}),
|
|
212
220
|
};
|
|
213
221
|
}
|
|
@@ -24,6 +24,7 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
24
24
|
"bundle-create",
|
|
25
25
|
"bundle-show",
|
|
26
26
|
"clone",
|
|
27
|
+
"command-dry-run",
|
|
27
28
|
"config",
|
|
28
29
|
"env-create",
|
|
29
30
|
"env-export",
|
|
@@ -37,6 +38,7 @@ const PASSTHROUGH_COMMANDS = [
|
|
|
37
38
|
"info",
|
|
38
39
|
"lint",
|
|
39
40
|
"list",
|
|
41
|
+
"models",
|
|
40
42
|
"proposal-accept-batch",
|
|
41
43
|
"proposal-drain",
|
|
42
44
|
"proposal-reject-batch",
|
|
@@ -2,21 +2,20 @@
|
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* rendering). The legacy field checks stay (harmless no-ops on the current
|
|
17
|
-
* shape) in case another producer still emits them; the real fields are
|
|
18
|
-
* added alongside.
|
|
5
|
+
* Plain-text renderers for the remaining leaf `akm` commands: info/config/
|
|
6
|
+
* feedback/remember/import/save/enable/disable, registry, env, wiki,
|
|
7
|
+
* events/history, search/curate, and the stash-lifecycle verbs (init,
|
|
8
|
+
* index, list, add, remove, update, upgrade, clone).
|
|
9
|
+
*
|
|
10
|
+
* Split out of `helpers.ts` (formerly 1418 lines / 59 fns) as its own
|
|
11
|
+
* sibling module: unlike `show`/`workflow`/`proposal` (each a stateful,
|
|
12
|
+
* multi-branch renderer with its own module), these are flat
|
|
13
|
+
* field-extraction formatters with no shared state beyond
|
|
14
|
+
* `formatRegistrySearchPlain` delegating to `formatSearchPlain` in this
|
|
15
|
+
* same file.
|
|
19
16
|
*/
|
|
17
|
+
import { formatRegistryUrl } from "../../core/registry-url.js";
|
|
18
|
+
/** Render the current `InfoResponse` shape. */
|
|
20
19
|
export function formatInfoPlain(r) {
|
|
21
20
|
const lines = [];
|
|
22
21
|
if (r.version)
|
|
@@ -26,12 +25,6 @@ export function formatInfoPlain(r) {
|
|
|
26
25
|
if (r.defaultBundle !== undefined) {
|
|
27
26
|
lines.push(`defaultBundle: ${r.defaultBundle === null ? "(none)" : String(r.defaultBundle)}`);
|
|
28
27
|
}
|
|
29
|
-
if (r.configPath)
|
|
30
|
-
lines.push(`configPath: ${String(r.configPath)}`);
|
|
31
|
-
if (r.cacheDir)
|
|
32
|
-
lines.push(`cacheDir: ${String(r.cacheDir)}`);
|
|
33
|
-
if (r.dbPath)
|
|
34
|
-
lines.push(`dbPath: ${String(r.dbPath)}`);
|
|
35
28
|
if (Array.isArray(r.assetTypes) && r.assetTypes.length > 0) {
|
|
36
29
|
lines.push(`assetTypes: ${r.assetTypes.join(", ")}`);
|
|
37
30
|
}
|
|
@@ -52,7 +45,8 @@ export function formatInfoPlain(r) {
|
|
|
52
45
|
const name = typeof reg.name === "string" ? `${reg.name}: ` : "";
|
|
53
46
|
const provider = typeof reg.provider === "string" ? ` (${reg.provider})` : "";
|
|
54
47
|
const disabled = reg.enabled === false ? " [disabled]" : "";
|
|
55
|
-
|
|
48
|
+
const url = typeof reg.url === "string" ? formatRegistryUrl(reg.url) : "?";
|
|
49
|
+
lines.push(` ${name}${url}${provider}${disabled}`);
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
52
|
const sourceProviders = Array.isArray(r.sourceProviders)
|
|
@@ -66,14 +60,7 @@ export function formatInfoPlain(r) {
|
|
|
66
60
|
lines.push(` [${String(source.type ?? "?")}] ${String(label)}${disabled}`);
|
|
67
61
|
}
|
|
68
62
|
}
|
|
69
|
-
const
|
|
70
|
-
if (capabilities) {
|
|
71
|
-
lines.push("capabilities:");
|
|
72
|
-
for (const [k, v] of Object.entries(capabilities)) {
|
|
73
|
-
lines.push(` ${k}: ${typeof v === "object" && v !== null ? JSON.stringify(v) : String(v)}`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
const indexStats = (r.indexStats ?? r.index);
|
|
63
|
+
const indexStats = r.indexStats;
|
|
77
64
|
if (indexStats) {
|
|
78
65
|
lines.push("indexStats:");
|
|
79
66
|
for (const [k, v] of Object.entries(indexStats)) {
|
|
@@ -101,7 +88,8 @@ export function formatConfigPlain(r) {
|
|
|
101
88
|
walk(v, path);
|
|
102
89
|
}
|
|
103
90
|
else {
|
|
104
|
-
|
|
91
|
+
const rendered = typeof v === "string" && /^registries\.\d+\.url$/u.test(path) ? formatRegistryUrl(v) : String(v);
|
|
92
|
+
lines.push(`${path}=${rendered}`);
|
|
105
93
|
}
|
|
106
94
|
}
|
|
107
95
|
};
|
|
@@ -148,7 +136,7 @@ export function formatRegistryListPlain(r) {
|
|
|
148
136
|
}
|
|
149
137
|
const lines = [];
|
|
150
138
|
for (const reg of registries) {
|
|
151
|
-
const url =
|
|
139
|
+
const url = typeof reg.url === "string" ? formatRegistryUrl(reg.url) : "?";
|
|
152
140
|
const name = typeof reg.name === "string" ? reg.name : "";
|
|
153
141
|
const provider = typeof reg.provider === "string" ? ` (${reg.provider})` : "";
|
|
154
142
|
const enabled = reg.enabled === false ? " [disabled]" : "";
|
|
@@ -169,7 +157,7 @@ export function formatRegistryRemovePlain(r) {
|
|
|
169
157
|
return typeof r.message === "string" ? r.message : "No matching registry found.";
|
|
170
158
|
}
|
|
171
159
|
const entry = r.entry;
|
|
172
|
-
const url = entry ?
|
|
160
|
+
const url = entry ? (typeof entry.url === "string" ? formatRegistryUrl(entry.url) : String(entry.name ?? "?")) : "?";
|
|
173
161
|
return `Removed registry ${url}`;
|
|
174
162
|
}
|
|
175
163
|
export function formatRegistrySearchPlain(r, detail) {
|
|
@@ -437,6 +425,14 @@ export function formatIndexPlain(r) {
|
|
|
437
425
|
for (const message of warnings)
|
|
438
426
|
out += `\n - ${String(message)}`;
|
|
439
427
|
}
|
|
428
|
+
const notices = Array.isArray(indexResult.notices) ? indexResult.notices : [];
|
|
429
|
+
for (const notice of notices) {
|
|
430
|
+
const severity = notice.severity === "info" ? "info" : "warning";
|
|
431
|
+
const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
|
|
432
|
+
out +=
|
|
433
|
+
`\n notice[${severity}] ${notice.code} adapter=${notice.adapter}${field}` +
|
|
434
|
+
(notice.message ? `: ${notice.message}` : "");
|
|
435
|
+
}
|
|
440
436
|
const verification = indexResult.verification;
|
|
441
437
|
if (verification?.ok === false && verification.message) {
|
|
442
438
|
out += `\nVerification: ${String(verification.message)}`;
|
|
@@ -586,7 +582,9 @@ export function formatUpdatePlain(r) {
|
|
|
586
582
|
}
|
|
587
583
|
}
|
|
588
584
|
for (const item of plainSynced ?? []) {
|
|
589
|
-
lines.push(
|
|
585
|
+
lines.push(item.kind === "filesystem"
|
|
586
|
+
? `update: ${item.id} reconciled (filesystem)`
|
|
587
|
+
: `update: ${item.id} synced (${item.kind})`);
|
|
590
588
|
}
|
|
591
589
|
for (const item of skipped ?? []) {
|
|
592
590
|
lines.push(`update: ${item.id} skipped — ${item.reason}`);
|
|
@@ -39,30 +39,8 @@ function renderCheckSection(title, checks, detail) {
|
|
|
39
39
|
const header = `${title} (${checks.length}${summary ? ` — ${summary}` : ""})`;
|
|
40
40
|
return [header, ...renderStatusEntries(checks.map((check) => checkStatusEntry(check, detail)))];
|
|
41
41
|
}
|
|
42
|
-
function sessionAdvisoryEntry(advisory) {
|
|
43
|
-
const isFailure = advisory.isFailurePattern === true;
|
|
44
|
-
return {
|
|
45
|
-
severityRank: isFailure ? 0 : 1,
|
|
46
|
-
glyph: (isFailure ? STATUS_GLYPH.warn : STATUS_GLYPH.pass) ?? "?",
|
|
47
|
-
headline: `${advisory.topic ?? "?"} (x${advisory.frequency ?? 0}, source: ${advisory.source ?? "?"})`,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
function renderSessionLogAdvisories(advisories) {
|
|
51
|
-
if (advisories.length === 0)
|
|
52
|
-
return [];
|
|
53
|
-
return [`sessionLogAdvisories (${advisories.length})`, ...renderStatusEntries(advisories.map(sessionAdvisoryEntry))];
|
|
54
|
-
}
|
|
55
42
|
/** Fields already rendered explicitly above — everything else in `r` falls to the `flattenForText` sweep below. */
|
|
56
|
-
const HANDLED_KEYS = new Set([
|
|
57
|
-
"ok",
|
|
58
|
-
"status",
|
|
59
|
-
"since",
|
|
60
|
-
"hardChecks",
|
|
61
|
-
"advisories",
|
|
62
|
-
"sessionLogAdvisories",
|
|
63
|
-
"shape",
|
|
64
|
-
"schemaVersion",
|
|
65
|
-
]);
|
|
43
|
+
const HANDLED_KEYS = new Set(["ok", "status", "since", "hardChecks", "advisories", "shape", "schemaVersion"]);
|
|
66
44
|
export function formatHealthPlain(r, detail) {
|
|
67
45
|
if (r === null || typeof r !== "object")
|
|
68
46
|
return null;
|
|
@@ -75,14 +53,8 @@ export function formatHealthPlain(r, detail) {
|
|
|
75
53
|
lines.push(`since: ${r.since}`);
|
|
76
54
|
const hardChecks = Array.isArray(r.hardChecks) ? r.hardChecks : [];
|
|
77
55
|
const advisories = Array.isArray(r.advisories) ? r.advisories : [];
|
|
78
|
-
const sessionLogAdvisories = Array.isArray(r.sessionLogAdvisories)
|
|
79
|
-
? r.sessionLogAdvisories
|
|
80
|
-
: [];
|
|
81
56
|
lines.push("", ...renderCheckSection("hardChecks", hardChecks, detail));
|
|
82
57
|
lines.push("", ...renderCheckSection("advisories", advisories, detail));
|
|
83
|
-
const sessionLines = renderSessionLogAdvisories(sessionLogAdvisories);
|
|
84
|
-
if (sessionLines.length > 0)
|
|
85
|
-
lines.push("", ...sessionLines);
|
|
86
58
|
if (detail === "brief" &&
|
|
87
59
|
[...hardChecks, ...advisories].some((c) => c.evidence && Object.keys(c.evidence).length > 0)) {
|
|
88
60
|
lines.push("", "(evidence omitted at --detail brief; re-run with --detail normal or --detail full to see it)");
|
|
@@ -1,37 +1,12 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import { renderStatusEntries } from "./status-list.js";
|
|
5
|
-
const ARTIFACT_ORDER = ["config", "state", "workflow", "index"];
|
|
6
|
-
const ARTIFACT_LABEL = {
|
|
7
|
-
config: "config.json",
|
|
8
|
-
state: "state.db",
|
|
9
|
-
workflow: "workflow.db",
|
|
10
|
-
index: "index.db",
|
|
11
|
-
};
|
|
12
|
-
/** Lower rank sorts first (worse-first) via `renderStatusEntries`. */
|
|
13
|
-
function artifactSeverity(status) {
|
|
14
|
-
switch (status) {
|
|
15
|
-
case "corrupt":
|
|
16
|
-
case "inconsistent":
|
|
17
|
-
case "newer":
|
|
18
|
-
return { rank: 0, glyph: "✗" };
|
|
19
|
-
case "old":
|
|
20
|
-
return { rank: 1, glyph: "⚠" };
|
|
21
|
-
case "missing":
|
|
22
|
-
return { rank: 2, glyph: "?" };
|
|
23
|
-
default: // "current"
|
|
24
|
-
return { rank: 3, glyph: "✓" };
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
4
|
function planGlyph(status) {
|
|
28
5
|
switch (status) {
|
|
29
6
|
case "current":
|
|
30
7
|
return "✓";
|
|
31
8
|
case "ready":
|
|
32
9
|
return "⚠";
|
|
33
|
-
case "not-applicable":
|
|
34
|
-
return "·";
|
|
35
10
|
default: // "blocked"
|
|
36
11
|
return "✗";
|
|
37
12
|
}
|
|
@@ -43,43 +18,18 @@ export function formatMigratePlain(result) {
|
|
|
43
18
|
if (typeof plan.status !== "string")
|
|
44
19
|
return null;
|
|
45
20
|
const lines = [`${planGlyph(plan.status)} ${plan.status}`];
|
|
46
|
-
if (plan.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
lines.push(` in-flight ${plan.activeOperation.kind} at ${plan.activeOperation.sentinelPath}`);
|
|
50
|
-
}
|
|
51
|
-
if (plan.artifacts) {
|
|
52
|
-
const entries = ARTIFACT_ORDER.filter((name) => plan.artifacts?.[name]).map((name) => {
|
|
53
|
-
const artifact = plan.artifacts?.[name];
|
|
54
|
-
const { rank, glyph } = artifactSeverity(artifact.status);
|
|
55
|
-
const detailLines = [];
|
|
56
|
-
if (artifact.detail)
|
|
57
|
-
detailLines.push(artifact.detail);
|
|
58
|
-
if (artifact.migrationIds?.length)
|
|
59
|
-
detailLines.push(`migrations applied: ${artifact.migrationIds.length}`);
|
|
60
|
-
return { severityRank: rank, glyph, headline: `${ARTIFACT_LABEL[name]}: ${artifact.status}`, detailLines };
|
|
61
|
-
});
|
|
62
|
-
lines.push("", "artifacts:", ...renderStatusEntries(entries).map((line) => ` ${line}`));
|
|
63
|
-
}
|
|
64
|
-
if (plan.targetConfig) {
|
|
65
|
-
const target = plan.targetConfig;
|
|
66
|
-
lines.push("", `target config: ${target.status} (source: ${target.source}${target.path ? `, ${target.path}` : ""})`);
|
|
67
|
-
if (target.detail)
|
|
68
|
-
lines.push(` ${target.detail}`);
|
|
69
|
-
}
|
|
70
|
-
if (plan.generatedConfig) {
|
|
71
|
-
const generated = plan.generatedConfig;
|
|
72
|
-
lines.push("", `generated config: ${generated.status} at ${generated.path}`);
|
|
73
|
-
if (generated.droppedKeys.length > 0) {
|
|
74
|
-
lines.push(` drops (add engines/defaults yourself if needed): ${generated.droppedKeys.join(", ")}`);
|
|
75
|
-
}
|
|
21
|
+
if (plan.taskV3Migration) {
|
|
22
|
+
const tasks = plan.taskV3Migration;
|
|
23
|
+
lines.push(` tasks: ${tasks.changed} change, ${tasks.skipped} current, ${tasks.blocked} blocked`);
|
|
76
24
|
}
|
|
77
25
|
if (plan.blockers?.length) {
|
|
78
26
|
lines.push("", "blockers:", ...plan.blockers.map((blocker) => ` - ${blocker}`));
|
|
79
27
|
}
|
|
80
28
|
if (plan.backupPath) {
|
|
81
|
-
lines.push("", `backup: ${plan.backupPath}
|
|
29
|
+
lines.push("", `backup: ${plan.backupPath}`);
|
|
82
30
|
}
|
|
31
|
+
if (plan.applied !== undefined)
|
|
32
|
+
lines.push(`applied: ${plan.applied}`);
|
|
83
33
|
return lines.join("\n");
|
|
84
34
|
}
|
|
85
35
|
export const migrateFormatters = [
|
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
* plain-text renderer, `formatDistillPlain`, was dead code; removed per
|
|
11
11
|
* R-063/B5.)
|
|
12
12
|
*/
|
|
13
|
+
function appendLoweringNotices(lines, result) {
|
|
14
|
+
const notices = Array.isArray(result.notices) ? result.notices : [];
|
|
15
|
+
for (const notice of notices) {
|
|
16
|
+
const severity = notice.severity === "info" ? "info" : "warning";
|
|
17
|
+
const code = typeof notice.code === "string" ? notice.code : "lowering-notice";
|
|
18
|
+
const adapter = typeof notice.adapter === "string" ? ` adapter=${notice.adapter}` : "";
|
|
19
|
+
const field = typeof notice.field === "string" ? ` field=${notice.field}` : "";
|
|
20
|
+
const message = typeof notice.message === "string" ? `: ${notice.message}` : "";
|
|
21
|
+
lines.push(` notice[${severity}] ${code}${adapter}${field}${message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
13
24
|
export function formatProposalProducerPlain(command, r) {
|
|
14
25
|
if (r.ok === false) {
|
|
15
26
|
const reason = String(r.reason);
|
|
@@ -22,13 +33,16 @@ export function formatProposalProducerPlain(command, r) {
|
|
|
22
33
|
if (r.exitCode !== undefined && r.exitCode !== null) {
|
|
23
34
|
lines.push(` exitCode: ${String(r.exitCode)}`);
|
|
24
35
|
}
|
|
36
|
+
appendLoweringNotices(lines, r);
|
|
25
37
|
return lines.join("\n");
|
|
26
38
|
}
|
|
27
39
|
const proposal = r.proposal;
|
|
28
40
|
const id = String(proposal.id);
|
|
29
41
|
const ref = String(r.ref);
|
|
30
42
|
const status = String(proposal.status);
|
|
31
|
-
|
|
43
|
+
const lines = [`${command}: queued proposal ${id} (${ref}) [${status}]`];
|
|
44
|
+
appendLoweringNotices(lines, r);
|
|
45
|
+
return lines.join("\n");
|
|
32
46
|
}
|
|
33
47
|
/**
|
|
34
48
|
* Render a one-line gate-decision summary for the proposal list / show surfaces
|
|
@@ -189,6 +203,7 @@ export function formatProposalDrainPlain(r) {
|
|
|
189
203
|
for (const d of deferred) {
|
|
190
204
|
lines.push(` - ${String(d.id ?? "?")} (${String(d.reason ?? "?")})`);
|
|
191
205
|
}
|
|
206
|
+
appendLoweringNotices(lines, r);
|
|
192
207
|
return lines.join("\n").trimEnd();
|
|
193
208
|
}
|
|
194
209
|
export function formatProposalDiffPlain(r) {
|
|
@@ -118,6 +118,22 @@ export function formatWorkflowRunPlain(result) {
|
|
|
118
118
|
// hide the announcement from the DEFAULT output mode — where it matters most.
|
|
119
119
|
for (const warning of Array.isArray(result.warnings) ? result.warnings : [])
|
|
120
120
|
lines.push(`! ${String(warning)}`);
|
|
121
|
+
// Live-only common-lowerer diagnostics are already sanitized and deduped by
|
|
122
|
+
// the workflow engine. Render their typed headline (not opaque details) so
|
|
123
|
+
// default text output has the same observability as JSON without widening a
|
|
124
|
+
// durable workflow schema.
|
|
125
|
+
for (const value of Array.isArray(result.notices) ? result.notices : []) {
|
|
126
|
+
if (typeof value !== "object" || value === null)
|
|
127
|
+
continue;
|
|
128
|
+
const notice = value;
|
|
129
|
+
if (typeof notice.code !== "string" ||
|
|
130
|
+
typeof notice.severity !== "string" ||
|
|
131
|
+
typeof notice.adapter !== "string" ||
|
|
132
|
+
typeof notice.message !== "string")
|
|
133
|
+
continue;
|
|
134
|
+
const field = typeof notice.field === "string" && notice.field ? `; ${notice.field}` : "";
|
|
135
|
+
lines.push(`! lowering[${notice.severity}] ${notice.code} (${notice.adapter}${field}): ${notice.message}`);
|
|
136
|
+
}
|
|
121
137
|
const executed = Array.isArray(result.executed) ? result.executed : [];
|
|
122
138
|
if (executed.length === 0) {
|
|
123
139
|
lines.push("executed: (no steps — run was already done or blocked)");
|