akm-cli 0.7.5 → 0.8.0-rc.11
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/{.github/CHANGELOG.md → CHANGELOG.md} +192 -2
- package/README.md +22 -6
- package/SECURITY.md +93 -0
- package/dist/cli/config-migrate.js +144 -0
- package/dist/cli/config-validate.js +39 -0
- package/dist/cli/confirm.js +73 -0
- package/dist/cli/parse-args.js +133 -0
- package/dist/cli/shared.js +129 -0
- package/dist/cli.js +2569 -1449
- package/dist/commands/add-cli.js +279 -0
- package/dist/commands/agent-dispatch.js +110 -0
- package/dist/commands/agent-support.js +68 -0
- package/dist/commands/completions.js +3 -0
- package/dist/commands/config-cli.js +130 -534
- package/dist/commands/consolidate.js +2122 -0
- package/dist/commands/curate.js +44 -3
- package/dist/commands/db-cli.js +23 -0
- package/dist/commands/distill-promotion-policy.js +660 -0
- package/dist/commands/distill.js +1075 -77
- package/dist/commands/env.js +213 -0
- package/dist/commands/eval-cases.js +43 -0
- package/dist/commands/events.js +5 -23
- package/dist/commands/extract-cli.js +127 -0
- package/dist/commands/extract-prompt.js +204 -0
- package/dist/commands/extract.js +477 -0
- package/dist/commands/feedback-cli.js +331 -0
- package/dist/commands/graph.js +477 -0
- package/dist/commands/health.js +1302 -0
- package/dist/commands/help/help-accept.md +12 -0
- package/dist/commands/help/help-improve.md +69 -0
- package/dist/commands/help/help-proposals.md +18 -0
- package/dist/commands/help/help-propose.md +17 -0
- package/dist/commands/help/help-reject.md +11 -0
- package/dist/commands/history.js +54 -46
- package/dist/commands/improve-auto-accept.js +97 -0
- package/dist/commands/improve-cli.js +217 -0
- package/dist/commands/improve-profiles.js +166 -0
- package/dist/commands/improve-result-file.js +167 -0
- package/dist/commands/improve.js +2373 -0
- package/dist/commands/info.js +5 -2
- package/dist/commands/init.js +50 -2
- package/dist/commands/installed-stashes.js +102 -139
- package/dist/commands/knowledge.js +136 -0
- package/dist/commands/lint/agent-linter.js +49 -0
- package/dist/commands/lint/base-linter.js +479 -0
- package/dist/commands/lint/command-linter.js +49 -0
- package/dist/commands/lint/default-linter.js +16 -0
- package/dist/commands/lint/env-key-rules.js +154 -0
- package/dist/commands/lint/index.js +196 -0
- package/dist/commands/lint/knowledge-linter.js +16 -0
- package/dist/commands/lint/markdown-insertion.js +343 -0
- package/dist/commands/lint/memory-linter.js +61 -0
- package/dist/commands/lint/registry.js +36 -0
- package/dist/commands/lint/skill-linter.js +45 -0
- package/dist/commands/lint/task-linter.js +50 -0
- package/dist/commands/lint/types.js +4 -0
- package/dist/commands/lint/workflow-linter.js +56 -0
- package/dist/commands/lint.js +4 -0
- package/dist/commands/migration-help.js +5 -2
- package/dist/commands/proposal.js +67 -12
- package/dist/commands/propose.js +86 -31
- package/dist/commands/reflect.js +1091 -73
- package/dist/commands/registry-cli.js +150 -0
- package/dist/commands/registry-search.js +5 -2
- package/dist/commands/remember-cli.js +257 -0
- package/dist/commands/remember.js +69 -6
- package/dist/commands/schema-repair.js +203 -0
- package/dist/commands/search.js +115 -14
- package/dist/commands/secret.js +173 -0
- package/dist/commands/self-update.js +3 -0
- package/dist/commands/show.js +148 -25
- package/dist/commands/source-add.js +17 -45
- package/dist/commands/source-clone.js +3 -0
- package/dist/commands/source-manage.js +14 -19
- package/dist/commands/tasks.js +437 -0
- package/dist/commands/url-checker.js +42 -0
- package/dist/core/action-contributors.js +28 -0
- package/dist/core/asset-ref.js +17 -2
- package/dist/core/asset-registry.js +12 -17
- package/dist/core/asset-serialize.js +88 -0
- package/dist/core/asset-spec.js +67 -1
- package/dist/core/common.js +182 -0
- package/dist/core/concurrent.js +25 -0
- package/dist/core/config-io.js +347 -0
- package/dist/core/config-migration.js +622 -0
- package/dist/core/config-schema.js +534 -0
- package/dist/core/config-sources.js +108 -0
- package/dist/core/config-types.js +4 -0
- package/dist/core/config-walker.js +337 -0
- package/dist/core/config.js +364 -981
- package/dist/core/errors.js +42 -20
- package/dist/core/events.js +91 -138
- package/dist/core/file-lock.js +104 -0
- package/dist/core/frontmatter.js +75 -8
- package/dist/core/lesson-lint.js +3 -0
- package/dist/core/markdown.js +20 -0
- package/dist/core/memory-belief.js +62 -0
- package/dist/core/memory-contradiction-detect.js +274 -0
- package/dist/core/memory-improve.js +806 -0
- package/dist/core/parse.js +158 -0
- package/dist/core/paths.js +280 -14
- package/dist/core/proposal-quality-validators.js +380 -0
- package/dist/core/proposal-validators.js +69 -0
- package/dist/core/proposals.js +512 -42
- package/dist/core/state-db.js +1068 -0
- package/dist/core/text-truncation.js +107 -0
- package/dist/core/time.js +54 -0
- package/dist/core/tty.js +59 -0
- package/dist/core/warn.js +64 -1
- package/dist/core/write-source.js +3 -0
- package/dist/indexer/db-backup.js +391 -0
- package/dist/indexer/db-search.js +178 -256
- package/dist/indexer/db.js +975 -103
- package/dist/indexer/ensure-index.js +64 -0
- package/dist/indexer/file-context.js +3 -0
- package/dist/indexer/graph-boost.js +376 -101
- package/dist/indexer/graph-db.js +391 -0
- package/dist/indexer/graph-dedup.js +95 -0
- package/dist/indexer/graph-extraction.js +550 -124
- package/dist/indexer/index-context.js +4 -0
- package/dist/indexer/indexer.js +523 -301
- package/dist/indexer/llm-cache.js +52 -0
- package/dist/indexer/manifest.js +3 -0
- package/dist/indexer/matchers.js +167 -160
- package/dist/indexer/memory-inference.js +152 -74
- package/dist/indexer/metadata-contributors.js +29 -0
- package/dist/indexer/metadata.js +275 -196
- package/dist/indexer/path-resolver.js +92 -0
- package/dist/indexer/project-context.js +192 -0
- package/dist/indexer/ranking-contributors.js +331 -0
- package/dist/indexer/ranking.js +81 -0
- package/dist/indexer/search-fields.js +5 -9
- package/dist/indexer/search-hit-enrichers.js +111 -0
- package/dist/indexer/search-source.js +44 -10
- package/dist/indexer/semantic-status.js +6 -17
- package/dist/indexer/staleness-detect.js +447 -0
- package/dist/indexer/usage-events.js +12 -9
- package/dist/indexer/walker.js +28 -0
- package/dist/integrations/agent/builders.js +135 -0
- package/dist/integrations/agent/config.js +122 -230
- package/dist/integrations/agent/detect.js +3 -0
- package/dist/integrations/agent/index.js +7 -13
- package/dist/integrations/agent/model-aliases.js +55 -0
- package/dist/integrations/agent/profiles.js +70 -5
- package/dist/integrations/agent/prompts.js +214 -80
- package/dist/integrations/agent/runner.js +151 -0
- package/dist/integrations/agent/sdk-runner.js +126 -0
- package/dist/integrations/agent/spawn.js +118 -23
- package/dist/integrations/github.js +3 -0
- package/dist/integrations/lockfile.js +32 -69
- package/dist/integrations/session-logs/index.js +69 -0
- package/dist/integrations/session-logs/inline-refs.js +35 -0
- package/dist/integrations/session-logs/pre-filter.js +152 -0
- package/dist/integrations/session-logs/providers/claude-code.js +282 -0
- package/dist/integrations/session-logs/providers/opencode.js +258 -0
- package/dist/integrations/session-logs/types.js +4 -0
- package/dist/llm/call-ai.js +62 -0
- package/dist/llm/client.js +77 -124
- package/dist/llm/embedder.js +20 -29
- package/dist/llm/embedders/cache.js +3 -7
- package/dist/llm/embedders/local.js +42 -1
- package/dist/llm/embedders/remote.js +20 -8
- package/dist/llm/embedders/types.js +3 -7
- package/dist/llm/feature-gate.js +95 -48
- package/dist/llm/graph-extract.js +676 -70
- package/dist/llm/index-passes.js +44 -29
- package/dist/llm/memory-infer.js +77 -71
- package/dist/llm/metadata-enhance.js +42 -29
- package/dist/llm/prompts/extract-session.md +80 -0
- package/dist/llm/prompts/graph-extract-user-prompt.md +35 -0
- package/dist/output/cli-hints-full.md +292 -0
- package/dist/output/cli-hints-short.md +66 -0
- package/dist/output/cli-hints.js +7 -320
- package/dist/output/context.js +60 -8
- package/dist/output/renderers.js +300 -257
- package/dist/output/shapes/curate.js +56 -0
- package/dist/output/shapes/distill.js +10 -0
- package/dist/output/shapes/env-list.js +19 -0
- package/dist/output/shapes/events.js +11 -0
- package/dist/output/shapes/helpers.js +424 -0
- package/dist/output/shapes/history.js +7 -0
- package/dist/output/shapes/passthrough.js +102 -0
- package/dist/output/shapes/proposal-accept.js +7 -0
- package/dist/output/shapes/proposal-diff.js +7 -0
- package/dist/output/shapes/proposal-list.js +7 -0
- package/dist/output/shapes/proposal-producer.js +11 -0
- package/dist/output/shapes/proposal-reject.js +7 -0
- package/dist/output/shapes/proposal-show.js +7 -0
- package/dist/output/shapes/registry-search.js +6 -0
- package/dist/output/shapes/registry.js +30 -0
- package/dist/output/shapes/search.js +6 -0
- package/dist/output/shapes/secret-list.js +19 -0
- package/dist/output/shapes/show.js +6 -0
- package/dist/output/shapes/vault-list.js +19 -0
- package/dist/output/shapes.js +51 -516
- package/dist/output/text/add.js +6 -0
- package/dist/output/text/clone.js +6 -0
- package/dist/output/text/config.js +6 -0
- package/dist/output/text/curate.js +6 -0
- package/dist/output/text/distill.js +7 -0
- package/dist/output/text/enable-disable.js +7 -0
- package/dist/output/text/events.js +10 -0
- package/dist/output/text/feedback.js +6 -0
- package/dist/output/text/helpers.js +1039 -0
- package/dist/output/text/history.js +7 -0
- package/dist/output/text/import.js +6 -0
- package/dist/output/text/index.js +6 -0
- package/dist/output/text/info.js +6 -0
- package/dist/output/text/init.js +6 -0
- package/dist/output/text/list.js +6 -0
- package/dist/output/text/proposal-producer.js +8 -0
- package/dist/output/text/proposal.js +11 -0
- package/dist/output/text/registry-commands.js +11 -0
- package/dist/output/text/registry.js +30 -0
- package/dist/output/text/remember.js +6 -0
- package/dist/output/text/remove.js +6 -0
- package/dist/output/text/save.js +6 -0
- package/dist/output/text/search.js +6 -0
- package/dist/output/text/show.js +6 -0
- package/dist/output/text/update.js +6 -0
- package/dist/output/text/upgrade.js +6 -0
- package/dist/output/text/vault.js +16 -0
- package/dist/output/text/wiki.js +15 -0
- package/dist/output/text/workflow.js +14 -0
- package/dist/output/text.js +44 -1092
- package/dist/registry/build-index.js +3 -0
- package/dist/registry/create-provider-registry.js +3 -0
- package/dist/registry/factory.js +4 -1
- package/dist/registry/origin-resolve.js +3 -0
- package/dist/registry/providers/index.js +3 -0
- package/dist/registry/providers/skills-sh.js +71 -50
- package/dist/registry/providers/static-index.js +53 -48
- package/dist/registry/providers/types.js +3 -24
- package/dist/registry/resolve.js +11 -16
- package/dist/registry/types.js +3 -0
- package/dist/scripts/migrate-storage.js +17750 -0
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +9031 -0
- package/dist/scripts/migrations/v16-to-v17.js +141 -0
- package/dist/setup/detect.js +3 -0
- package/dist/setup/ripgrep-install.js +3 -0
- package/dist/setup/ripgrep-resolve.js +3 -0
- package/dist/setup/setup.js +775 -37
- package/dist/setup/steps.js +3 -15
- package/dist/sources/include.js +3 -0
- package/dist/sources/provider-factory.js +5 -12
- package/dist/sources/provider.js +3 -20
- package/dist/sources/providers/filesystem.js +19 -23
- package/dist/sources/providers/git.js +138 -21
- package/dist/sources/providers/index.js +3 -0
- package/dist/sources/providers/install-types.js +3 -13
- package/dist/sources/providers/npm.js +3 -4
- package/dist/sources/providers/provider-utils.js +3 -0
- package/dist/sources/providers/sync-from-ref.js +3 -11
- package/dist/sources/providers/tar-utils.js +3 -0
- package/dist/sources/providers/website.js +18 -22
- package/dist/sources/resolve.js +3 -0
- package/dist/sources/types.js +3 -0
- package/dist/sources/website-ingest.js +7 -0
- package/dist/tasks/backends/cron.js +203 -0
- package/dist/tasks/backends/exec-utils.js +28 -0
- package/dist/tasks/backends/index.js +24 -0
- package/dist/tasks/backends/launchd-template.xml +19 -0
- package/dist/tasks/backends/launchd.js +187 -0
- package/dist/tasks/backends/schtasks-template.xml +29 -0
- package/dist/tasks/backends/schtasks.js +215 -0
- package/dist/tasks/parser.js +211 -0
- package/dist/tasks/resolveAkmBin.js +87 -0
- package/dist/tasks/runner.js +458 -0
- package/dist/tasks/schedule.js +227 -0
- package/dist/tasks/schema.js +15 -0
- package/dist/tasks/validator.js +62 -0
- package/dist/version.js +3 -0
- package/dist/wiki/index-template.md +12 -0
- package/dist/wiki/ingest-workflow-template.md +54 -0
- package/dist/wiki/log-template.md +8 -0
- package/dist/wiki/schema-template.md +61 -0
- package/dist/wiki/wiki-templates.js +15 -0
- package/dist/wiki/wiki.js +13 -61
- package/dist/workflows/authoring.js +8 -25
- package/dist/workflows/cli.js +3 -0
- package/dist/workflows/db.js +140 -10
- package/dist/workflows/document-cache.js +3 -10
- package/dist/workflows/parser.js +3 -0
- package/dist/workflows/renderer.js +11 -3
- package/dist/workflows/runs.js +77 -92
- package/dist/workflows/schema.js +3 -0
- package/dist/workflows/scope-key.js +3 -0
- package/dist/workflows/validator.js +4 -8
- package/dist/workflows/workflow-template.md +24 -0
- package/docs/README.md +10 -2
- package/docs/data-and-telemetry.md +225 -0
- package/docs/migration/release-notes/0.7.0.md +1 -1
- package/docs/migration/release-notes/0.7.5.md +2 -2
- package/docs/migration/release-notes/0.8.0.md +48 -0
- package/docs/migration/v0.7-to-v0.8.md +1307 -0
- package/package.json +30 -12
- package/.github/LICENSE +0 -374
- package/dist/commands/install-audit.js +0 -381
- package/dist/commands/vault.js +0 -328
- package/dist/templates/wiki-templates.js +0 -100
package/dist/output/renderers.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
1
4
|
/**
|
|
2
5
|
* Built-in asset renderers.
|
|
3
6
|
*
|
|
@@ -8,12 +11,13 @@
|
|
|
8
11
|
*/
|
|
9
12
|
import fs from "node:fs";
|
|
10
13
|
import path from "node:path";
|
|
11
|
-
import { listKeys as listVaultKeys } from "../commands/
|
|
12
|
-
import { hasErrnoCode } from "../core/common";
|
|
13
|
-
import { parseFrontmatter
|
|
14
|
+
import { listKeys as listVaultKeys } from "../commands/env";
|
|
15
|
+
import { asNonEmptyString, hasErrnoCode } from "../core/common";
|
|
16
|
+
import { parseFrontmatter } from "../core/frontmatter";
|
|
14
17
|
import { extractFrontmatterOnly, extractLineRange, extractSection, formatToc, parseMarkdownToc, } from "../core/markdown";
|
|
15
18
|
import { registerRenderer } from "../indexer/file-context";
|
|
16
19
|
import { extractCommentMetadata, extractDescriptionFromComments } from "../indexer/metadata";
|
|
20
|
+
import { registerMetadataContributor } from "../indexer/metadata-contributors";
|
|
17
21
|
import { buildWorkflowAction, workflowMdRenderer } from "../workflows/renderer";
|
|
18
22
|
// ── Interpreter auto-detection map ───────────────────────────────────────────
|
|
19
23
|
const INTERPRETER_MAP = {
|
|
@@ -165,7 +169,7 @@ const skillMdRenderer = {
|
|
|
165
169
|
name,
|
|
166
170
|
path: ctx.absPath,
|
|
167
171
|
action: "Read and follow the instructions below",
|
|
168
|
-
description:
|
|
172
|
+
description: asNonEmptyString(parsed.data.description),
|
|
169
173
|
...(tags ? { tags } : {}),
|
|
170
174
|
content: parsed.content,
|
|
171
175
|
};
|
|
@@ -184,11 +188,11 @@ const commandMdRenderer = {
|
|
|
184
188
|
name,
|
|
185
189
|
path: ctx.absPath,
|
|
186
190
|
action: "Fill $ARGUMENTS placeholders in the template, then dispatch",
|
|
187
|
-
description:
|
|
191
|
+
description: asNonEmptyString(parsedMd.data.description),
|
|
188
192
|
...(tags ? { tags } : {}),
|
|
189
193
|
template,
|
|
190
194
|
modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
|
|
191
|
-
agent:
|
|
195
|
+
agent: asNonEmptyString(parsedMd.data.agent),
|
|
192
196
|
parameters: extractParameters(template),
|
|
193
197
|
};
|
|
194
198
|
},
|
|
@@ -204,168 +208,67 @@ const agentMdRenderer = {
|
|
|
204
208
|
name,
|
|
205
209
|
path: ctx.absPath,
|
|
206
210
|
action: "Dispatch using the prompt below verbatim. Use modelHint and toolPolicy if present.",
|
|
207
|
-
description:
|
|
211
|
+
description: asNonEmptyString(parsedMd.data.description),
|
|
208
212
|
prompt: parsedMd.content,
|
|
209
213
|
toolPolicy: parsedMd.data.tools,
|
|
210
214
|
modelHint: typeof parsedMd.data.model === "string" ? parsedMd.data.model : undefined,
|
|
211
215
|
};
|
|
212
216
|
},
|
|
213
217
|
};
|
|
214
|
-
// ── 4. knowledge-md
|
|
215
|
-
const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
type: "knowledge",
|
|
247
|
-
name,
|
|
248
|
-
path: ctx.absPath,
|
|
249
|
-
action: "Reference material - read the content below. Use 'toc' view for large documents.",
|
|
250
|
-
content: `Section "${v.heading}" not found in ${name}. Try \`akm show <ref> toc\` to discover available headings.`,
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
type: "knowledge",
|
|
255
|
-
name,
|
|
256
|
-
path: ctx.absPath,
|
|
257
|
-
action: "Reference material - read the content below. Use 'toc' view for large documents.",
|
|
258
|
-
content: section.content,
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
case "lines": {
|
|
262
|
-
return {
|
|
263
|
-
type: "knowledge",
|
|
264
|
-
name,
|
|
265
|
-
path: ctx.absPath,
|
|
266
|
-
action: "Reference material - read the content below. Use 'toc' view for large documents.",
|
|
267
|
-
content: extractLineRange(content, v.start, v.end),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
default: {
|
|
271
|
-
return {
|
|
272
|
-
type: "knowledge",
|
|
273
|
-
name,
|
|
274
|
-
path: ctx.absPath,
|
|
275
|
-
action: "Reference material - read the content below. Use 'toc' view for large documents.",
|
|
276
|
-
content,
|
|
277
|
-
};
|
|
218
|
+
// ── 4. knowledge-md / wiki-md shared helper ───────────────────────────────────
|
|
219
|
+
const KNOWLEDGE_ACTION = "Reference material - read the content below. Use 'toc' view for large documents.";
|
|
220
|
+
const WIKI_PAGE_ACTION = "Wiki page — read below. Use 'toc' to scan, 'section <heading>' for depth.";
|
|
221
|
+
/**
|
|
222
|
+
* Shared implementation for knowledge-md and wiki-md `buildShowResponse`.
|
|
223
|
+
*
|
|
224
|
+
* Both renderers handle the same set of view modes (toc, frontmatter, section,
|
|
225
|
+
* lines, full). The only differences are the `type` discriminant and the
|
|
226
|
+
* section-not-found message. Extracting this helper eliminates ~90 lines of
|
|
227
|
+
* byte-for-byte duplication.
|
|
228
|
+
*/
|
|
229
|
+
function buildMarkdownViewResponse(ctx, type, action) {
|
|
230
|
+
const name = deriveName(ctx);
|
|
231
|
+
const v = ctx.matchResult.meta?.view ?? { mode: "full" };
|
|
232
|
+
const content = ctx.content();
|
|
233
|
+
switch (v.mode) {
|
|
234
|
+
case "toc": {
|
|
235
|
+
const toc = parseMarkdownToc(content);
|
|
236
|
+
return { type, name, path: ctx.absPath, action, content: formatToc(toc) };
|
|
237
|
+
}
|
|
238
|
+
case "frontmatter": {
|
|
239
|
+
const fm = extractFrontmatterOnly(content);
|
|
240
|
+
return { type, name, path: ctx.absPath, action, content: fm ?? "(no frontmatter)" };
|
|
241
|
+
}
|
|
242
|
+
case "section": {
|
|
243
|
+
const section = extractSection(content, v.heading);
|
|
244
|
+
if (!section) {
|
|
245
|
+
const notFoundMsg = type === "wiki"
|
|
246
|
+
? `Section "${v.heading}" not found in ${name}. Try \`akm show wiki:${name} toc\` to discover available headings.`
|
|
247
|
+
: `Section "${v.heading}" not found in ${name}. Try \`akm show <ref> toc\` to discover available headings.`;
|
|
248
|
+
return { type, name, path: ctx.absPath, action, content: notFoundMsg };
|
|
278
249
|
}
|
|
250
|
+
return { type, name, path: ctx.absPath, action, content: section.content };
|
|
279
251
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
try {
|
|
283
|
-
const toc = parseMarkdownToc(ctx.content());
|
|
284
|
-
if (toc.headings.length > 0)
|
|
285
|
-
entry.toc = toc.headings;
|
|
252
|
+
case "lines": {
|
|
253
|
+
return { type, name, path: ctx.absPath, action, content: extractLineRange(content, v.start, v.end) };
|
|
286
254
|
}
|
|
287
|
-
|
|
288
|
-
|
|
255
|
+
default: {
|
|
256
|
+
return { type, name, path: ctx.absPath, action, content };
|
|
289
257
|
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// ── 4. knowledge-md ──────────────────────────────────────────────────────────
|
|
261
|
+
const knowledgeMdRenderer = {
|
|
262
|
+
name: "knowledge-md",
|
|
263
|
+
buildShowResponse(ctx) {
|
|
264
|
+
return buildMarkdownViewResponse(ctx, "knowledge", KNOWLEDGE_ACTION);
|
|
290
265
|
},
|
|
291
266
|
};
|
|
292
267
|
// ── 4b. wiki-md ──────────────────────────────────────────────────────────────
|
|
293
|
-
const WIKI_PAGE_ACTION = "Wiki page — read below. Use 'toc' to scan, 'section <heading>' for depth.";
|
|
294
268
|
const wikiMdRenderer = {
|
|
295
269
|
name: "wiki-md",
|
|
296
270
|
buildShowResponse(ctx) {
|
|
297
|
-
|
|
298
|
-
const v = ctx.matchResult.meta?.view ?? { mode: "full" };
|
|
299
|
-
const content = ctx.content();
|
|
300
|
-
switch (v.mode) {
|
|
301
|
-
case "toc": {
|
|
302
|
-
const toc = parseMarkdownToc(content);
|
|
303
|
-
return {
|
|
304
|
-
type: "wiki",
|
|
305
|
-
name,
|
|
306
|
-
path: ctx.absPath,
|
|
307
|
-
action: WIKI_PAGE_ACTION,
|
|
308
|
-
content: formatToc(toc),
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
case "frontmatter": {
|
|
312
|
-
const fm = extractFrontmatterOnly(content);
|
|
313
|
-
return {
|
|
314
|
-
type: "wiki",
|
|
315
|
-
name,
|
|
316
|
-
path: ctx.absPath,
|
|
317
|
-
action: WIKI_PAGE_ACTION,
|
|
318
|
-
content: fm ?? "(no frontmatter)",
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
case "section": {
|
|
322
|
-
const section = extractSection(content, v.heading);
|
|
323
|
-
if (!section) {
|
|
324
|
-
return {
|
|
325
|
-
type: "wiki",
|
|
326
|
-
name,
|
|
327
|
-
path: ctx.absPath,
|
|
328
|
-
action: WIKI_PAGE_ACTION,
|
|
329
|
-
content: `Section "${v.heading}" not found in ${name}. Try \`akm show wiki:${name} toc\` to discover available headings.`,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
return {
|
|
333
|
-
type: "wiki",
|
|
334
|
-
name,
|
|
335
|
-
path: ctx.absPath,
|
|
336
|
-
action: WIKI_PAGE_ACTION,
|
|
337
|
-
content: section.content,
|
|
338
|
-
};
|
|
339
|
-
}
|
|
340
|
-
case "lines": {
|
|
341
|
-
return {
|
|
342
|
-
type: "wiki",
|
|
343
|
-
name,
|
|
344
|
-
path: ctx.absPath,
|
|
345
|
-
action: WIKI_PAGE_ACTION,
|
|
346
|
-
content: extractLineRange(content, v.start, v.end),
|
|
347
|
-
};
|
|
348
|
-
}
|
|
349
|
-
default: {
|
|
350
|
-
return {
|
|
351
|
-
type: "wiki",
|
|
352
|
-
name,
|
|
353
|
-
path: ctx.absPath,
|
|
354
|
-
action: WIKI_PAGE_ACTION,
|
|
355
|
-
content,
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
},
|
|
360
|
-
extractMetadata(entry, ctx) {
|
|
361
|
-
try {
|
|
362
|
-
const toc = parseMarkdownToc(ctx.content());
|
|
363
|
-
if (toc.headings.length > 0)
|
|
364
|
-
entry.toc = toc.headings;
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
// Non-fatal: skip TOC if file can't be read
|
|
368
|
-
}
|
|
271
|
+
return buildMarkdownViewResponse(ctx, "wiki", WIKI_PAGE_ACTION);
|
|
369
272
|
},
|
|
370
273
|
};
|
|
371
274
|
// ── 4c. lesson-md ────────────────────────────────────────────────────────────
|
|
@@ -384,8 +287,8 @@ const lessonMdRenderer = {
|
|
|
384
287
|
buildShowResponse(ctx) {
|
|
385
288
|
const name = deriveName(ctx);
|
|
386
289
|
const parsed = parseFrontmatter(ctx.content());
|
|
387
|
-
const description =
|
|
388
|
-
const whenToUse =
|
|
290
|
+
const description = asNonEmptyString(parsed.data.description);
|
|
291
|
+
const whenToUse = asNonEmptyString(parsed.data.when_to_use);
|
|
389
292
|
const action = whenToUse
|
|
390
293
|
? `Apply this lesson when: ${whenToUse}`
|
|
391
294
|
: "Apply this lesson when its `when_to_use` trigger matches the current task.";
|
|
@@ -398,33 +301,6 @@ const lessonMdRenderer = {
|
|
|
398
301
|
content: parsed.content,
|
|
399
302
|
};
|
|
400
303
|
},
|
|
401
|
-
extractMetadata(entry, ctx) {
|
|
402
|
-
try {
|
|
403
|
-
const parsed = parseFrontmatter(ctx.content());
|
|
404
|
-
const fm = parsed.data;
|
|
405
|
-
const desc = toStringOrUndefined(fm.description);
|
|
406
|
-
if (desc && !entry.description) {
|
|
407
|
-
entry.description = desc;
|
|
408
|
-
entry.source = "frontmatter";
|
|
409
|
-
entry.confidence = 0.9;
|
|
410
|
-
}
|
|
411
|
-
const whenToUse = toStringOrUndefined(fm.when_to_use);
|
|
412
|
-
if (whenToUse) {
|
|
413
|
-
const hints = new Set(entry.searchHints ?? []);
|
|
414
|
-
hints.add(`when_to_use:${whenToUse}`);
|
|
415
|
-
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
416
|
-
}
|
|
417
|
-
if (Array.isArray(fm.tags) && fm.tags.length > 0) {
|
|
418
|
-
const fmTags = fm.tags.filter((t) => typeof t === "string" && t.trim().length > 0);
|
|
419
|
-
if (fmTags.length > 0) {
|
|
420
|
-
entry.tags = Array.from(new Set([...(entry.tags ?? []), ...fmTags]));
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
catch {
|
|
425
|
-
// Non-fatal: skip metadata extraction on parse error
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
304
|
};
|
|
429
305
|
// ── 5. memory-md ─────────────────────────────────────────────────────────────
|
|
430
306
|
const memoryMdRenderer = {
|
|
@@ -439,58 +315,6 @@ const memoryMdRenderer = {
|
|
|
439
315
|
content: ctx.content(),
|
|
440
316
|
};
|
|
441
317
|
},
|
|
442
|
-
extractMetadata(entry, ctx) {
|
|
443
|
-
try {
|
|
444
|
-
const parsed = parseFrontmatter(ctx.content());
|
|
445
|
-
const fm = parsed.data;
|
|
446
|
-
// Description from frontmatter
|
|
447
|
-
const desc = toStringOrUndefined(fm.description);
|
|
448
|
-
if (desc && !entry.description) {
|
|
449
|
-
entry.description = desc;
|
|
450
|
-
entry.source = "frontmatter";
|
|
451
|
-
entry.confidence = 0.9;
|
|
452
|
-
}
|
|
453
|
-
// Tags from frontmatter
|
|
454
|
-
if (Array.isArray(fm.tags) && fm.tags.length > 0) {
|
|
455
|
-
const fmTags = fm.tags.filter((t) => typeof t === "string" && t.trim().length > 0);
|
|
456
|
-
if (fmTags.length > 0) {
|
|
457
|
-
entry.tags = Array.from(new Set([...(entry.tags ?? []), ...fmTags]));
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
// Build searchHints from structured memory metadata fields
|
|
461
|
-
const hints = new Set(entry.searchHints ?? []);
|
|
462
|
-
const source = toStringOrUndefined(fm.source);
|
|
463
|
-
if (source)
|
|
464
|
-
hints.add(source);
|
|
465
|
-
// observed_at: prefer frontmatter value, fall back to file mtime
|
|
466
|
-
const fmObservedAt = toStringOrUndefined(fm.observed_at);
|
|
467
|
-
if (fmObservedAt) {
|
|
468
|
-
hints.add(`observed_at:${fmObservedAt}`);
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
// mtime fallback: format as ISO date (YYYY-MM-DD)
|
|
472
|
-
try {
|
|
473
|
-
const mtime = ctx.stat().mtime;
|
|
474
|
-
const isoDate = mtime.toISOString().slice(0, 10);
|
|
475
|
-
hints.add(`observed_at:${isoDate}`);
|
|
476
|
-
}
|
|
477
|
-
catch {
|
|
478
|
-
// Non-fatal: skip mtime fallback on stat error
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
const expires = toStringOrUndefined(fm.expires);
|
|
482
|
-
if (expires)
|
|
483
|
-
hints.add(`expires:${expires}`);
|
|
484
|
-
if (fm.subjective === true)
|
|
485
|
-
hints.add("subjective");
|
|
486
|
-
if (hints.size > 0) {
|
|
487
|
-
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
catch {
|
|
491
|
-
// Non-fatal: skip metadata extraction on error
|
|
492
|
-
}
|
|
493
|
-
},
|
|
494
318
|
};
|
|
495
319
|
// ── 6. workflow-md ───────────────────────────────────────────────────────────
|
|
496
320
|
// Defined in src/workflows/renderer.ts and imported above.
|
|
@@ -537,16 +361,6 @@ const scriptSourceRenderer = {
|
|
|
537
361
|
throw error;
|
|
538
362
|
}
|
|
539
363
|
},
|
|
540
|
-
extractMetadata(entry, ctx) {
|
|
541
|
-
if (ctx.ext !== ".md") {
|
|
542
|
-
const commentDesc = extractDescriptionFromComments(ctx.absPath);
|
|
543
|
-
if (commentDesc && !entry.description) {
|
|
544
|
-
entry.description = commentDesc;
|
|
545
|
-
entry.source = "comments";
|
|
546
|
-
entry.confidence = 0.7;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
},
|
|
550
364
|
};
|
|
551
365
|
// ── 8. vault-env ─────────────────────────────────────────────────────────────
|
|
552
366
|
/**
|
|
@@ -574,22 +388,248 @@ const vaultEnvRenderer = {
|
|
|
574
388
|
if (keys.length > 0)
|
|
575
389
|
hit.keys = keys;
|
|
576
390
|
},
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
391
|
+
};
|
|
392
|
+
// ── 8b. env-file ───────────────────────────────────────────────────────────────
|
|
393
|
+
/**
|
|
394
|
+
* Env renderer. Like the (deprecated) vault renderer, returns ONLY key names
|
|
395
|
+
* and start-of-line comments — never values. Deliberately omits
|
|
396
|
+
* content/template/prompt so env values cannot leak through `akm show`.
|
|
397
|
+
*/
|
|
398
|
+
const envFileRenderer = {
|
|
399
|
+
name: "env-file",
|
|
400
|
+
buildShowResponse(ctx) {
|
|
401
|
+
const name = deriveName(ctx);
|
|
581
402
|
const { keys, comments } = listVaultKeys(ctx.absPath);
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
403
|
+
return {
|
|
404
|
+
type: "env",
|
|
405
|
+
name,
|
|
406
|
+
path: ctx.absPath,
|
|
407
|
+
action: "Environment — keys + comments only. Use `akm env run <ref> -- <command>` to run with the whole .env injected (the safe path — values never reach stdout). `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.",
|
|
408
|
+
description: comments.length > 0 ? comments.join("\n") : undefined,
|
|
409
|
+
keys,
|
|
410
|
+
comments,
|
|
411
|
+
};
|
|
412
|
+
},
|
|
413
|
+
enrichSearchHit(hit, _stashDir) {
|
|
414
|
+
const { keys } = listVaultKeys(hit.path);
|
|
415
|
+
if (keys.length > 0)
|
|
416
|
+
hit.keys = keys;
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
// ── 9. secret-file ─────────────────────────────────────────────────────────────
|
|
420
|
+
/**
|
|
421
|
+
* Secret renderer. The ENTIRE file is the secret value, so this surfaces ONLY
|
|
422
|
+
* the name + path + a usage hint — never content/template/prompt/keys. There
|
|
423
|
+
* is no `enrichSearchHit`: secrets are discoverable by name alone.
|
|
424
|
+
*/
|
|
425
|
+
const secretFileRenderer = {
|
|
426
|
+
name: "secret-file",
|
|
427
|
+
buildShowResponse(ctx) {
|
|
428
|
+
const name = deriveName(ctx);
|
|
429
|
+
return {
|
|
430
|
+
type: "secret",
|
|
431
|
+
name,
|
|
432
|
+
path: ctx.absPath,
|
|
433
|
+
action: "Secret — name only; the file contents are the value and are never written to akm's stdout. Use `akm secret path <ref>` for the file path, or `akm secret run <ref> <VAR> -- <command>` to run with the value injected into $VAR.",
|
|
434
|
+
};
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
// ── 7. task-md ───────────────────────────────────────────────────────────────
|
|
438
|
+
const TASK_PAGE_ACTION = "Scheduled task — `akm tasks show <id>` for parsed details, `akm tasks run <id>` to invoke now.";
|
|
439
|
+
const taskMdRenderer = {
|
|
440
|
+
name: "task-yaml",
|
|
441
|
+
buildShowResponse(ctx) {
|
|
442
|
+
const name = deriveName(ctx);
|
|
443
|
+
return {
|
|
444
|
+
type: "task",
|
|
445
|
+
name,
|
|
446
|
+
path: ctx.absPath,
|
|
447
|
+
action: TASK_PAGE_ACTION,
|
|
448
|
+
content: ctx.content(),
|
|
449
|
+
};
|
|
591
450
|
},
|
|
592
451
|
};
|
|
452
|
+
function applyTocMetadata(entry, ctx) {
|
|
453
|
+
try {
|
|
454
|
+
const toc = parseMarkdownToc(ctx.content());
|
|
455
|
+
if (toc.headings.length > 0)
|
|
456
|
+
entry.toc = toc.headings;
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// Non-fatal: skip TOC if file can't be read
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Parse frontmatter, apply description (if not already set) and merge tags
|
|
464
|
+
* into `entry`. Returns the raw frontmatter data object so callers can access
|
|
465
|
+
* type-specific fields without re-parsing.
|
|
466
|
+
*/
|
|
467
|
+
function applyFrontmatterDescriptionAndTags(entry, ctx) {
|
|
468
|
+
const parsed = parseFrontmatter(ctx.content());
|
|
469
|
+
const fm = parsed.data;
|
|
470
|
+
const desc = asNonEmptyString(fm.description);
|
|
471
|
+
if (desc && !entry.description) {
|
|
472
|
+
entry.description = desc;
|
|
473
|
+
entry.source = "frontmatter";
|
|
474
|
+
entry.confidence = 0.9;
|
|
475
|
+
}
|
|
476
|
+
if (Array.isArray(fm.tags) && fm.tags.length > 0) {
|
|
477
|
+
const fmTags = fm.tags.filter((t) => typeof t === "string" && t.trim().length > 0);
|
|
478
|
+
if (fmTags.length > 0) {
|
|
479
|
+
entry.tags = Array.from(new Set([...(entry.tags ?? []), ...fmTags]));
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return fm;
|
|
483
|
+
}
|
|
484
|
+
function applyLessonMetadata(entry, ctx) {
|
|
485
|
+
try {
|
|
486
|
+
const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
|
|
487
|
+
const whenToUse = asNonEmptyString(fm.when_to_use);
|
|
488
|
+
if (whenToUse) {
|
|
489
|
+
const hints = new Set(entry.searchHints ?? []);
|
|
490
|
+
hints.add(`when_to_use:${whenToUse}`);
|
|
491
|
+
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch {
|
|
495
|
+
// Non-fatal: skip metadata extraction on parse error
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
function applyMemoryMetadata(entry, ctx) {
|
|
499
|
+
try {
|
|
500
|
+
const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
|
|
501
|
+
const hints = new Set(entry.searchHints ?? []);
|
|
502
|
+
const source = asNonEmptyString(fm.source);
|
|
503
|
+
if (source)
|
|
504
|
+
hints.add(source);
|
|
505
|
+
const fmObservedAt = asNonEmptyString(fm.observed_at);
|
|
506
|
+
if (fmObservedAt) {
|
|
507
|
+
hints.add(`observed_at:${fmObservedAt}`);
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
try {
|
|
511
|
+
const isoDate = ctx.stat().mtime.toISOString().slice(0, 10);
|
|
512
|
+
hints.add(`observed_at:${isoDate}`);
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
// Non-fatal: skip mtime fallback on stat error
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const expires = asNonEmptyString(fm.expires);
|
|
519
|
+
if (expires)
|
|
520
|
+
hints.add(`expires:${expires}`);
|
|
521
|
+
if (fm.subjective === true)
|
|
522
|
+
hints.add("subjective");
|
|
523
|
+
if (hints.size > 0) {
|
|
524
|
+
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Non-fatal: skip metadata extraction on error
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
function applyScriptMetadata(entry, ctx) {
|
|
532
|
+
if (ctx.ext === ".md")
|
|
533
|
+
return;
|
|
534
|
+
const commentDesc = extractDescriptionFromComments(ctx.absPath);
|
|
535
|
+
if (commentDesc && !entry.description) {
|
|
536
|
+
entry.description = commentDesc;
|
|
537
|
+
entry.source = "comments";
|
|
538
|
+
entry.confidence = 0.7;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
function applyVaultMetadata(entry, ctx) {
|
|
542
|
+
const { keys, comments } = listVaultKeys(ctx.absPath);
|
|
543
|
+
if (comments.length > 0 && !entry.description) {
|
|
544
|
+
entry.description = comments.join(" ").slice(0, 500);
|
|
545
|
+
entry.source = "comments";
|
|
546
|
+
entry.confidence = 0.7;
|
|
547
|
+
}
|
|
548
|
+
if (keys.length > 0) {
|
|
549
|
+
entry.searchHints = keys;
|
|
550
|
+
}
|
|
551
|
+
entry.tags = Array.from(new Set([...(entry.tags ?? []), "vault", "secrets"]));
|
|
552
|
+
}
|
|
553
|
+
function applyEnvMetadata(entry, ctx) {
|
|
554
|
+
const { keys, comments } = listVaultKeys(ctx.absPath);
|
|
555
|
+
if (comments.length > 0 && !entry.description) {
|
|
556
|
+
entry.description = comments.join(" ").slice(0, 500);
|
|
557
|
+
entry.source = "comments";
|
|
558
|
+
entry.confidence = 0.7;
|
|
559
|
+
}
|
|
560
|
+
if (keys.length > 0) {
|
|
561
|
+
entry.searchHints = keys;
|
|
562
|
+
}
|
|
563
|
+
entry.tags = Array.from(new Set([...(entry.tags ?? []), "env", "secrets"]));
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Secret metadata: tags only. Must NEVER read the file body — the whole file
|
|
567
|
+
* is the value, so the entry is built from the filename alone (name-only).
|
|
568
|
+
*/
|
|
569
|
+
function applySecretMetadata(entry, _ctx) {
|
|
570
|
+
entry.tags = Array.from(new Set([...(entry.tags ?? []), "secret", "sensitive"]));
|
|
571
|
+
}
|
|
572
|
+
function applyTaskMetadata(entry, ctx) {
|
|
573
|
+
try {
|
|
574
|
+
const fm = applyFrontmatterDescriptionAndTags(entry, ctx);
|
|
575
|
+
entry.tags = Array.from(new Set([...(entry.tags ?? []), "task", "scheduled"]));
|
|
576
|
+
const hints = new Set(entry.searchHints ?? []);
|
|
577
|
+
const schedule = asNonEmptyString(fm.schedule);
|
|
578
|
+
if (schedule)
|
|
579
|
+
hints.add(`schedule:${schedule}`);
|
|
580
|
+
const workflow = asNonEmptyString(fm.workflow);
|
|
581
|
+
if (workflow)
|
|
582
|
+
hints.add(`workflow:${workflow}`);
|
|
583
|
+
const prompt = asNonEmptyString(fm.prompt);
|
|
584
|
+
if (prompt)
|
|
585
|
+
hints.add(`prompt:${prompt}`);
|
|
586
|
+
if (hints.size > 0)
|
|
587
|
+
entry.searchHints = Array.from(hints).filter(Boolean);
|
|
588
|
+
}
|
|
589
|
+
catch {
|
|
590
|
+
// Non-fatal: skip metadata extraction on error
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
registerMetadataContributor({
|
|
594
|
+
name: "toc-metadata",
|
|
595
|
+
appliesTo: ({ rendererName }) => rendererName === "knowledge-md" || rendererName === "wiki-md",
|
|
596
|
+
contribute: (entry, ctx) => applyTocMetadata(entry, ctx.renderContext),
|
|
597
|
+
});
|
|
598
|
+
registerMetadataContributor({
|
|
599
|
+
name: "lesson-frontmatter-metadata",
|
|
600
|
+
appliesTo: ({ rendererName }) => rendererName === "lesson-md",
|
|
601
|
+
contribute: (entry, ctx) => applyLessonMetadata(entry, ctx.renderContext),
|
|
602
|
+
});
|
|
603
|
+
registerMetadataContributor({
|
|
604
|
+
name: "memory-frontmatter-metadata",
|
|
605
|
+
appliesTo: ({ rendererName }) => rendererName === "memory-md",
|
|
606
|
+
contribute: (entry, ctx) => applyMemoryMetadata(entry, ctx.renderContext),
|
|
607
|
+
});
|
|
608
|
+
registerMetadataContributor({
|
|
609
|
+
name: "script-comment-metadata",
|
|
610
|
+
appliesTo: ({ rendererName }) => rendererName === "script-source",
|
|
611
|
+
contribute: (entry, ctx) => applyScriptMetadata(entry, ctx.renderContext),
|
|
612
|
+
});
|
|
613
|
+
registerMetadataContributor({
|
|
614
|
+
name: "vault-secret-metadata",
|
|
615
|
+
appliesTo: ({ rendererName }) => rendererName === "vault-env",
|
|
616
|
+
contribute: (entry, ctx) => applyVaultMetadata(entry, ctx.renderContext),
|
|
617
|
+
});
|
|
618
|
+
registerMetadataContributor({
|
|
619
|
+
name: "env-file-metadata",
|
|
620
|
+
appliesTo: ({ rendererName }) => rendererName === "env-file",
|
|
621
|
+
contribute: (entry, ctx) => applyEnvMetadata(entry, ctx.renderContext),
|
|
622
|
+
});
|
|
623
|
+
registerMetadataContributor({
|
|
624
|
+
name: "secret-file-metadata",
|
|
625
|
+
appliesTo: ({ rendererName }) => rendererName === "secret-file",
|
|
626
|
+
contribute: (entry, ctx) => applySecretMetadata(entry, ctx.renderContext),
|
|
627
|
+
});
|
|
628
|
+
registerMetadataContributor({
|
|
629
|
+
name: "task-yaml-metadata",
|
|
630
|
+
appliesTo: ({ rendererName }) => rendererName === "task-yaml",
|
|
631
|
+
contribute: (entry, ctx) => applyTaskMetadata(entry, ctx.renderContext),
|
|
632
|
+
});
|
|
593
633
|
// ── Registration ─────────────────────────────────────────────────────────────
|
|
594
634
|
/** All built-in renderers. */
|
|
595
635
|
const builtinRenderers = [
|
|
@@ -602,7 +642,10 @@ const builtinRenderers = [
|
|
|
602
642
|
memoryMdRenderer,
|
|
603
643
|
workflowMdRenderer,
|
|
604
644
|
scriptSourceRenderer,
|
|
645
|
+
envFileRenderer,
|
|
605
646
|
vaultEnvRenderer,
|
|
647
|
+
secretFileRenderer,
|
|
648
|
+
taskMdRenderer,
|
|
606
649
|
];
|
|
607
650
|
/**
|
|
608
651
|
* Register all built-in renderers with the file-context registry.
|
|
@@ -614,4 +657,4 @@ export function registerBuiltinRenderers() {
|
|
|
614
657
|
}
|
|
615
658
|
}
|
|
616
659
|
// ── Named exports for testing ────────────────────────────────────────────────
|
|
617
|
-
export { agentMdRenderer, commandMdRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, skillMdRenderer, vaultEnvRenderer, wikiMdRenderer, workflowMdRenderer, };
|
|
660
|
+
export { agentMdRenderer, commandMdRenderer, envFileRenderer, INTERPRETER_MAP, knowledgeMdRenderer, lessonMdRenderer, memoryMdRenderer, SETUP_SIGNALS, scriptSourceRenderer, secretFileRenderer, skillMdRenderer, vaultEnvRenderer, wikiMdRenderer, workflowMdRenderer, };
|