UNPKG

akm-cli

Version:

akm (Agent Knowledge Manager) — a portable, local-first capability library for AI agents. Discover, load, share, and improve reusable skills, scripts, workflows, and knowledge across any shell-capable coding agent, including Claude Code, OpenCode, and Cur

60 lines (59 loc) • 2.62 kB
// This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. /** The one implementation of "is this a derived memory, and what is its parent?" (R12), keyed on the memory name. */ import { conceptIdFromTypeName, parseRefInput } from "../../../core/asset/resolve-ref.js"; import { asNonEmptyString } from "../../../core/common.js"; import { DERIVED_SUFFIX } from "../../../core/recognition-util.js"; /** * A belief edge (`supersededBy` / `contradictedBy` / `currentBeliefRefs`) as a * bare memory name. Both spellings occur: `memory:<name>` (pre-0.9 edges) and * `[bundle//]memories/<name>` (what `--supersedes` writes today); accepting only * the first once read every superseded memory back as active. */ export function parseMemoryName(value) { if (!value) return undefined; const trimmed = value.trim(); if (trimmed.startsWith("memory:")) return trimmed.slice("memory:".length) || undefined; try { const parsed = parseRefInput(trimmed); return parsed.type === "memory" && parsed.name.length > 0 ? parsed.name : undefined; } catch { return undefined; } } /** A `source:` backref as a memory conceptId, or `undefined` when it is not a memory ref. */ export function parseMemoryRef(value) { if (!value) return undefined; try { const parsed = parseRefInput(value.trim()); return parsed.type === "memory" ? conceptIdFromTypeName("memory", parsed.name) : undefined; } catch { return undefined; } } /** The belief-edge identity spelling, `memory:<name>` (separate from `source:` asset refs). */ export function memoryIdentityRef(name) { return `memory:${name}`; } /** Inferred (`inferred: true`) or named with the `.derived` suffix. */ export function isDerivedMemory(name, frontmatter) { return frontmatter.inferred === true || name.endsWith(DERIVED_SUFFIX); } /** A derived memory's parent conceptId: from `source`, else `derivedFrom`, else the name minus `.derived`. */ export function resolveParentRef(name, frontmatter) { const fromSource = parseMemoryRef(asNonEmptyString(frontmatter.source)); if (fromSource) return fromSource; const derivedFrom = asNonEmptyString(frontmatter.derivedFrom); if (derivedFrom) return conceptIdFromTypeName("memory", derivedFrom); if (name.endsWith(DERIVED_SUFFIX)) return conceptIdFromTypeName("memory", name.slice(0, -DERIVED_SUFFIX.length)); return undefined; }