diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5943a886..a2bf002d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
All notable changes to Context are documented here.
+## 0.7.65 - 2026-10-13
+
+- Inline code in knowledge website articles that names a cited repository file, one of its directories, or the unique name of such a directory (for example a Skill name) links to that path at the recorded revision, shown with a link icon and a dotted underline. Bare file names, uncited or ambiguous names stay plain text, as do headings and existing links.
+- Writing guidance asks authors to name cited repository files, directories and Skills in inline code instead of hand-writing repository links or adding source-link columns.
+
## 0.7.64 - 2026-10-13
- The knowledge website homepage no longer highlights the first section in the top bar; a `site.nav` link to the current page, such as a documentation home link, is highlighted instead.
diff --git a/bun.lock b/bun.lock
index e1a9503f..cec03ab1 100644
--- a/bun.lock
+++ b/bun.lock
@@ -18,7 +18,7 @@
},
"packages/context": {
"name": "@c4a/context",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"yaml": "^2.5.1",
"zod": "^3.23.8",
@@ -26,7 +26,7 @@
},
"packages/context-cli": {
"name": "@c4a/context-cli",
- "version": "0.7.64",
+ "version": "0.7.65",
"bin": {
"context": "dist/cli.js",
},
@@ -73,7 +73,7 @@
},
"packages/core": {
"name": "@c4a/core",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"picomatch": "^4.0.4",
"yaml": "^2.4.5",
@@ -85,7 +85,7 @@
},
"packages/dev-cli": {
"name": "@c4a/dev-cli",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/context": "workspace:*",
"@c4a/core": "workspace:*",
@@ -97,7 +97,7 @@
},
"packages/extract": {
"name": "@c4a/extract",
- "version": "0.7.64",
+ "version": "0.7.65",
"bin": {
"c4a-extract-code": "./dist/bin/c4a-extract-code.js",
},
@@ -112,7 +112,7 @@
},
"packages/extract-contract": {
"name": "@c4a/extract-contract",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"graphql": "^16.14.2",
@@ -122,7 +122,7 @@
},
"packages/extract-go": {
"name": "@c4a/extract-go",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"@c4a/extract": "workspace:*",
@@ -132,7 +132,7 @@
},
"packages/extract-mdx": {
"name": "@c4a/extract-mdx",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"remark-mdx": "^3.1.1",
@@ -144,7 +144,7 @@
},
"packages/extract-proto": {
"name": "@c4a/extract-proto",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"zod": "^3.23.8",
@@ -152,7 +152,7 @@
},
"packages/extract-rush": {
"name": "@c4a/extract-rush",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"typescript": "^5.5.4",
@@ -162,7 +162,7 @@
},
"packages/extract-sql": {
"name": "@c4a/extract-sql",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"node-sql-parser": "^5.4.0",
@@ -171,7 +171,7 @@
},
"packages/extract-style": {
"name": "@c4a/extract-style",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"postcss": "^8.5.26",
@@ -183,7 +183,7 @@
},
"packages/extract-thrift": {
"name": "@c4a/extract-thrift",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"zod": "^3.23.8",
@@ -191,7 +191,7 @@
},
"packages/extract-ts": {
"name": "@c4a/extract-ts",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"@c4a/core": "workspace:*",
"@c4a/extract": "workspace:*",
@@ -202,7 +202,7 @@
},
"packages/tui": {
"name": "@c4a/tui",
- "version": "0.7.64",
+ "version": "0.7.65",
"dependencies": {
"ink": "^5.0.0",
"react": "^18.3.1",
diff --git a/package.json b/package.json
index b2e16a19..f24e5316 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "context",
- "version": "0.7.64",
+ "version": "0.7.65",
"packageManager": "bun@1.3.9",
"repository": {
"type": "git",
diff --git a/packages/context-cli/context-workflow/provider.yaml b/packages/context-cli/context-workflow/provider.yaml
index 7cdfe846..587a0b70 100644
--- a/packages/context-cli/context-workflow/provider.yaml
+++ b/packages/context-cli/context-workflow/provider.yaml
@@ -1,6 +1,6 @@
schema: agent-graph.provider.v1
id: c4a/context
-version: 0.7.64
+version: 0.7.65
name: Context workflow
description: Internal work contract for Context knowledge workspaces.
graphs:
diff --git a/packages/context-cli/context-workflow/resources/manuals/guides/package-outputs.md b/packages/context-cli/context-workflow/resources/manuals/guides/package-outputs.md
index eaab84fd..b59a28b7 100644
--- a/packages/context-cli/context-workflow/resources/manuals/guides/package-outputs.md
+++ b/packages/context-cli/context-workflow/resources/manuals/guides/package-outputs.md
@@ -186,7 +186,7 @@ article identity; legacy pages without `artifact_ref` use their approved path,
so moving those legacy files changes their URL. The shared knowledge map,
KB layout and production Markdown remain unchanged.
-Article pages include a small source footer from recorded article source references and the source registry. Repository entries link to the recorded revision and module (or an explicitly referenced file); document entries link to their registered HTTP(S) URL. Unrecorded associations are not inferred from prose. Source-footer changes participate in the website build fingerprint without modifying knowledge Markdown.
+Article pages include a small source footer from recorded article source references and the source registry. Repository entries link to the recorded revision and module (or an explicitly referenced file); document entries link to their registered HTTP(S) URL. Unrecorded associations are not inferred from prose. Source-footer changes participate in the website build fingerprint without modifying knowledge Markdown. Inline code in article prose that spells a cited repository file exactly, a cited file's directory of at least two segments (with or without a trailing `/`), or the name of exactly one such directory when it contains `.`, `-` or `_` links to that path at the recorded revision. Headings, existing links and code blocks are left unchanged, and ambiguous or uncited spellings remain plain code.
The website reuses resource delivery already performed for the KB: bundled
resources are copied into the site's `resources/`; Git raw links remain remote,
diff --git a/packages/context-cli/context-workflow/resources/procedures/production-stage-files.md b/packages/context-cli/context-workflow/resources/procedures/production-stage-files.md
index 5d918e42..d4852d46 100644
--- a/packages/context-cli/context-workflow/resources/procedures/production-stage-files.md
+++ b/packages/context-cli/context-workflow/resources/procedures/production-stage-files.md
@@ -72,6 +72,12 @@ complete article with stable `context:section` markers. References contain
text. CLI computes source digests. A fragment may cite at most three distinct
source positions; an article may have multiple fragments.
+When prose names a file, directory or Skill from a cited repository, write its
+exact repository-relative path, or the unique name of its directory such as a
+Skill name, in inline code and cite a file inside it. The website links such
+spellings to the recorded revision; do not hand-write links to repository files
+or add source-link columns.
+
A revision uses `edits` instead of `content`/`references`. The file contains an
`edits` list. Each item maps `replace: [old-fragment-ids]` to `with: [...]`, whose
entries contain `id` and the changed `markdown` and/or `references`.
diff --git a/packages/context-cli/package.json b/packages/context-cli/package.json
index feafcb0a..b03385c5 100644
--- a/packages/context-cli/package.json
+++ b/packages/context-cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/context-cli",
"description": "Local runtime and Agent integration for traceable knowledge production",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/context-cli/src/__tests__/packageSite.test.ts b/packages/context-cli/src/__tests__/packageSite.test.ts
index 30519681..45b36743 100644
--- a/packages/context-cli/src/__tests__/packageSite.test.ts
+++ b/packages/context-cli/src/__tests__/packageSite.test.ts
@@ -80,7 +80,7 @@ test("VitePress builds an independent site with search, safe prose, anchors and
for (const page of mapping.pages) {
const path = join(root, pkg.outDir, page.package_path);
await mkdir(join(path, ".."), { recursive: true });
- await writeFile(path, `---\nhead: [[script, {}, "unsafe-script"]]\n---\n# ${page.title}\n\nParagraph before anchor.\n\n\n## Entry\n\n{{ window.alert('unsafe') }}\n\n\n\n| A | B |\n|---|---|\n| { x?: number; y?: number; } | 2 |\n\n\`\`\`mermaid\nflowchart LR\nA-->B\n\`\`\`\n\n\n`);
+ await writeFile(path, `---\nhead: [[script, {}, "unsafe-script"]]\n---\n# ${page.title}\n\nParagraph before anchor.\n\n\n## Entry \`entry.ts\`\n\nRead \`src/entry.ts\`, \`packages/ui/src/\`, \`src\` and [\`entry.ts\`](https://example.com/x).\n\n{{ window.alert('unsafe') }}\n\n\n\n| A | B |\n|---|---|\n| { x?: number; y?: number; } | 2 |\n\n\`\`\`mermaid\nflowchart LR\nA-->B\n\`\`\`\n\n\n`);
}
await mkdir(join(root, pkg.outDir, "others/assets"), { recursive: true });
await writeFile(join(root, pkg.outDir, "others/assets/example.svg"), '');
@@ -169,6 +169,12 @@ test("VitePress builds an independent site with search, safe prose, anchors and
expect(article).toContain("language-mermaid");
expect(article).toContain('class="context-sources"');
expect(article).toContain("https://github.com/example/components/blob/abc123/packages/ui/src/entry.ts#L1-L1");
+ const sourceLinks = [...article.matchAll(/]*>([^<]+)<\/code><\/a>/gu)].map(match => [match[2], match[1]]);
+ expect(sourceLinks).toEqual([
+ ["src/entry.ts", "https://github.com/example/components/blob/abc123/packages/ui/src/entry.ts"],
+ ["packages/ui/src/", "https://github.com/example/components/tree/abc123/packages/ui/src"],
+ ]);
+ expect(article).toContain(' {
+ const entry = article("skills/context-code-indexer/SKILL.md");
+ entry.sections[0]!.references.push({ ...entry.sections[0]!.references[0]!, locator: { path: "skills/context-note-indexer/SKILL.md", start_line: 1, end_line: 2 } });
+ const links = siteSourceLinks(entry, registry);
+ const blob = "https://github.com/example/widgets/blob/abc123def4567890abc123def4567890abc123de/packages/ui";
+ const tree = "https://github.com/example/widgets/tree/abc123def4567890abc123def4567890abc123de/packages/ui";
+ expect(links["skills/context-code-indexer/SKILL.md"]).toBe(`${blob}/skills/context-code-indexer/SKILL.md`);
+ expect(links["packages/ui/skills/context-code-indexer/SKILL.md"]).toBe(`${blob}/skills/context-code-indexer/SKILL.md`);
+ expect(links["skills/context-code-indexer/"]).toBe(`${tree}/skills/context-code-indexer`);
+ expect(links["context-code-indexer"]).toBe(`${tree}/skills/context-code-indexer`);
+ expect(links["packages/ui/"]).toBe(tree);
+ // Two cited SKILL.md files, a one-segment directory and plain words are not guessed.
+ expect(links["SKILL.md"]).toBeUndefined();
+ expect(siteSourceLinks(article(), registry)["button.ts"]).toBeUndefined();
+ expect(links["skills"]).toBeUndefined();
+ expect(links["skills/"]).toBeUndefined();
+ expect(links["packages"]).toBeUndefined();
+ expect(Object.keys(links).every(key => !key.startsWith("guide"))).toBe(true);
+});
+
+test("unsafe paths and worktree content never become inline source links", () => {
+ expect(siteSourceLinks(article("../../secret"), registry)).toEqual({});
+ const entry = article("docs/guide.md");
+ entry.sections[0]!.references = [{ ...entry.sections[0]!.references[0]!, source_ref: `repo-content:docs@${"c".repeat(40)}+worktree` }];
+ expect(siteSourceLinks(entry, registry, "https://example.org/team/project.git")).toEqual({});
+ entry.sections[0]!.references[0]!.source_ref = `repo-content:docs@${"c".repeat(40)}`;
+ expect(siteSourceLinks(entry, registry, "https://example.org/team/project.git")["docs/guide.md"])
+ .toBe(`https://example.org/team/project/blob/${"c".repeat(40)}/docs/guide.md`);
+});
diff --git a/packages/context-cli/src/project/indexerBaseContracts.ts b/packages/context-cli/src/project/indexerBaseContracts.ts
index 166a47e9..c5594f42 100644
--- a/packages/context-cli/src/project/indexerBaseContracts.ts
+++ b/packages/context-cli/src/project/indexerBaseContracts.ts
@@ -21,7 +21,7 @@ import { bundledMarkdownReaderQuestionContracts } from
"./indexerBaseMarkdownAuthoringCatalog.js";
const BASE_CONTRACT_VERSION = "1.1.0";
-export const BUNDLED_INDEXER_PARSER_PACKAGE_VERSION = "0.7.64";
+export const BUNDLED_INDEXER_PARSER_PACKAGE_VERSION = "0.7.65";
const BUNDLED_PARSER_REQUIREMENTS = buildIndexerParserCapabilityRequirements(
BUNDLED_INDEXER_PARSER_PACKAGE_VERSION,
);
diff --git a/packages/context-cli/src/project/packageSite.ts b/packages/context-cli/src/project/packageSite.ts
index ba10f1cc..21bf53d1 100644
--- a/packages/context-cli/src/project/packageSite.ts
+++ b/packages/context-cli/src/project/packageSite.ts
@@ -17,7 +17,7 @@ import { parseKnowledgeFrontmatter } from "./packageKnowledgeProjection.js";
import { knowledgeMapSectionAnchor } from "./packageKnowledgeMap.js";
import { markdownReaderLinks } from "./markdownLinks.js";
import type { ApprovedKnowledgeFile } from "./packageIndexes.js";
-import { articleProvenanceMarkdown, siteArticleSources } from "./packageSiteSources.js";
+import { articleProvenanceMarkdown, siteArticleSources, siteSourceLinks } from "./packageSiteSources.js";
import { siteMarkdownConfig, siteThemeCss, siteThemeScript, siteThemeLabels } from "./packageSiteTheme.js";
import { packageSiteBranding } from "./packageSiteBranding.js";
import { writeSiteExtensions, siteExtensionTargets, invalidSiteExtension } from "./packageSiteExtensions.js";
@@ -261,11 +261,13 @@ export async function writePackageSite(input: {
const pageFrontmatter = (page: SitePage, content: string, titles?: Record) => {
const original = sourceContent.get(page.package_path);
const sources = siteArticleSources(original?.article, registry, repositoryRemote);
+ const sourceLinks = siteSourceLinks(original?.article, registry, repositoryRemote);
const timestamp = parseKnowledgeFrontmatter(original?.content ?? content).timestamp;
const updated = typeof timestamp === "string" && Number.isFinite(Date.parse(timestamp))
? new Date(timestamp).toISOString() : null;
return `---\ntitle: ${JSON.stringify(page.title)}\n${titles ? `contextTitles: ${JSON.stringify(titles)}\n` : ""}` +
- `contextSources: ${JSON.stringify(sources)}\ncontextUpdated: ${JSON.stringify(updated)}\n---\n`;
+ `contextSources: ${JSON.stringify(sources)}\n` +
+ `${Object.keys(sourceLinks).length ? `contextSourceLinks: ${JSON.stringify(sourceLinks)}\n` : ""}contextUpdated: ${JSON.stringify(updated)}\n---\n`;
};
for (const page of byPath.values()) {
const content = await readFile(join(root, page.package_path), "utf8");
diff --git a/packages/context-cli/src/project/packageSiteSources.ts b/packages/context-cli/src/project/packageSiteSources.ts
index 93b0144d..c8cfa6b7 100644
--- a/packages/context-cli/src/project/packageSiteSources.ts
+++ b/packages/context-cli/src/project/packageSiteSources.ts
@@ -60,3 +60,48 @@ export function siteArticleSources(article: ArticleStructureEntry | undefined, r
}
return [...new Map(sources.map(source => [JSON.stringify(source), source])).values()];
}
+
+/**
+ * Inline code that spells a cited repository file, a cited file's directory (at least two
+ * segments), or the distinctive name of exactly one such directory links to the cited revision.
+ * Only recorded references produce links; ambiguous spellings stay plain text.
+ */
+export function siteSourceLinks(article: ArticleStructureEntry | undefined, registry: SourcesRegistry, repositoryRemote?: string): Record {
+ const candidates = new Map>();
+ const names = new Map>();
+ const add = (map: Map>, key: string, url: string) => map.set(key, (map.get(key) ?? new Set()).add(url));
+ for (const reference of article?.sections.flatMap(section => section.references) ?? []) {
+ const ref = reference.source_ref;
+ const local = parseRepoContentRef(ref);
+ const repo = local ? undefined : registry.repos.find(entry => ref === `repo:${entry.id}` || ref === `repo:${entry.name}`);
+ const prefix = repo?.subpath?.replace(/^\/+|\/+$/gu, "") ?? "";
+ const base = repo && repoUrl(repo.remote);
+ const target = (path: string, directory: boolean) => local
+ ? local.worktree ? undefined : repoContentWebUrl(repositoryRemote, local.commit, path, directory)
+ : base ? `${base}/${directory ? "tree" : "blob"}/${encodeURIComponent(repo!.ref)}/${encodedPath(path)}` : undefined;
+ const path = reference.locator.path;
+ const parts = path.split("/");
+ if (!local && !repo || path.startsWith("/") || parts.some(part => !part || part === "." || part === "..")) continue;
+ // Authors may write a path relative to the registered module or to its repository root.
+ for (const written of new Set([path, prefix ? `${prefix}/${path}` : path])) {
+ const segments = written.split("/");
+ for (let depth = segments.length; depth >= 1; depth--) {
+ const spelled = segments.slice(0, depth).join("/");
+ const full = prefix && !written.startsWith(`${prefix}/`) ? `${prefix}/${spelled}` : spelled;
+ const directory = depth < segments.length;
+ const url = target(local ? spelled : full, directory);
+ if (!url) break;
+ if (!directory) add(candidates, spelled, url);
+ else if (depth >= 2) { add(candidates, spelled, url); add(candidates, `${spelled}/`, url); }
+ // File names such as README.md recur across projects, so only directory names stand alone.
+ const name = segments[depth - 1]!;
+ if (directory && /[._-]/u.test(name)) add(names, name, url);
+ }
+ }
+ }
+ const links: Record = {};
+ for (const map of [names, candidates]) {
+ for (const [key, urls] of map) if (urls.size === 1) links[key] = [...urls][0]!;
+ }
+ return links;
+}
diff --git a/packages/context-cli/src/project/packageSiteTheme.ts b/packages/context-cli/src/project/packageSiteTheme.ts
index cbfa7331..0cc567c0 100644
--- a/packages/context-cli/src/project/packageSiteTheme.ts
+++ b/packages/context-cli/src/project/packageSiteTheme.ts
@@ -50,6 +50,29 @@ export const siteMarkdownConfig = String.raw`
const render = md.renderer.rules[name];
if (render) md.renderer.rules[name] = (...args) => render(...args).replace(/\{/g, '{');
}
+ // The compiler lists contextSourceLinks only from the page's recorded references.
+ // Headings stay unlinked because their text also feeds the outline links.
+ md.core.ruler.push('context_source_links', state => {
+ const links = state.env.frontmatter && state.env.frontmatter.contextSourceLinks;
+ if (!links || typeof links !== 'object') return;
+ state.tokens.forEach((block, position) => {
+ if (block.type !== 'inline' || !block.children || state.tokens[position - 1]?.type === 'heading_open') return;
+ const children = [];
+ let depth = 0;
+ for (const token of block.children) {
+ if (token.type === 'link_open') depth++;
+ if (token.type === 'link_close') depth--;
+ const href = token.type === 'code_inline' && depth === 0 && Object.hasOwn(links, token.content) ? links[token.content] : null;
+ if (typeof href !== 'string' || !/^https?:\/\//.test(href)) { children.push(token); continue; }
+ const open = new state.Token('html_inline', '', 0);
+ open.content = '';
+ const close = new state.Token('html_inline', '', 0);
+ close.content = '';
+ children.push(open, token, close);
+ }
+ block.children = children;
+ });
+ });
md.block.ruler.before('paragraph', 'context_anchor', (state, line, end, silent) => {
const raw = state.src.slice(state.bMarks[line] + state.tShift[line], state.eMarks[line]);
const match = /^<\/a>$/.exec(raw);
@@ -692,6 +715,12 @@ ${readerContentStyles(".vp-doc")}
.context-sources li + li { margin-top: 6px; }
.context-sources a { color: inherit; text-decoration: none; border-bottom: 1px solid transparent; }
.context-sources a:hover { color: var(--vp-c-brand-1); border-color: currentColor; }
+.vp-doc a.context-source-link { font-weight: inherit; border-bottom: 0; }
+.vp-doc a.context-source-link::before { content: ""; display: inline-block; width: .85em; height: .85em; margin-right: .25em; vertical-align: -.1em; background: currentColor; opacity: .55; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/%3E%3Cpath d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71'/%3E%3Cpath d='M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71'/%3E%3C/svg%3E") center / contain no-repeat; transition: opacity .15s; }
+.vp-doc a.context-source-link > code { border-bottom: 1px dotted color-mix(in srgb, var(--vp-c-text-1) 55%, transparent); transition: color .15s, border-color .15s; }
+.vp-doc td a.context-source-link { white-space: nowrap; }
+.vp-doc a.context-source-link:hover::before { opacity: 1; }
+.vp-doc a.context-source-link:hover > code { color: var(--vp-c-brand-1); border-bottom-style: solid; border-bottom-color: currentColor; }
/* Section landing pages: two cards per row, one on narrow screens. */
.context-section-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; margin-top: 24px; }
.vp-doc .context-section-card { min-width: 0; padding: 18px 20px; border: 1px solid var(--vp-c-divider); border-radius: 12px;
diff --git a/packages/context/docs/guides/package-outputs.md b/packages/context/docs/guides/package-outputs.md
index 7ac16bec..8296c0d5 100644
--- a/packages/context/docs/guides/package-outputs.md
+++ b/packages/context/docs/guides/package-outputs.md
@@ -180,7 +180,7 @@ article identity; legacy pages without `artifact_ref` use their approved path,
so moving those legacy files changes their URL. The shared knowledge map,
KB layout and production Markdown remain unchanged.
-Article pages include a small source footer from recorded article source references and the source registry. Repository entries link to the recorded revision and module (or an explicitly referenced file); document entries link to their registered HTTP(S) URL. Unrecorded associations are not inferred from prose. Source-footer changes participate in the website build fingerprint without modifying knowledge Markdown.
+Article pages include a small source footer from recorded article source references and the source registry. Repository entries link to the recorded revision and module (or an explicitly referenced file); document entries link to their registered HTTP(S) URL. Unrecorded associations are not inferred from prose. Source-footer changes participate in the website build fingerprint without modifying knowledge Markdown. Inline code in article prose that spells a cited repository file exactly, a cited file's directory of at least two segments (with or without a trailing `/`), or the name of exactly one such directory when it contains `.`, `-` or `_` links to that path at the recorded revision. Headings, existing links and code blocks are left unchanged, and ambiguous or uncited spellings remain plain code.
The website reuses resource delivery already performed for the KB: bundled
resources are copied into the site's `resources/`; Git raw links remain remote,
diff --git a/packages/context/package.json b/packages/context/package.json
index e3f1dfbf..ac7c11ad 100644
--- a/packages/context/package.json
+++ b/packages/context/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/context",
"description": "Declarative SDK for Context knowledge sources, workflows, review, and package outputs",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/core/package.json b/packages/core/package.json
index fbe8dee6..1e41d9d0 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/core",
"description": "Shared extraction types, schemas, and utilities for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/dev-cli/package.json b/packages/dev-cli/package.json
index 650079c1..cc5c6011 100644
--- a/packages/dev-cli/package.json
+++ b/packages/dev-cli/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/dev-cli",
"description": "Developer menu for Context build, verification, link, and release preparation",
- "version": "0.7.64",
+ "version": "0.7.65",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/packages/extract-contract/package.json b/packages/extract-contract/package.json
index 44fd93b5..8cb51b2c 100644
--- a/packages/extract-contract/package.json
+++ b/packages/extract-contract/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-contract",
"description": "OpenAPI and GraphQL contract catalog adapter for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-go/package.json b/packages/extract-go/package.json
index 4a22c25e..fd3576bc 100644
--- a/packages/extract-go/package.json
+++ b/packages/extract-go/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-go",
"description": "Go extraction plugin and structural index for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-mdx/package.json b/packages/extract-mdx/package.json
index c696609d..ae2c9452 100644
--- a/packages/extract-mdx/package.json
+++ b/packages/extract-mdx/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-mdx",
"description": "MDX component and example catalog bridge for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-proto/package.json b/packages/extract-proto/package.json
index 1466f4ec..ad06eee7 100644
--- a/packages/extract-proto/package.json
+++ b/packages/extract-proto/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-proto",
"description": "Protocol Buffers IDL catalog parser for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-rush/package.json b/packages/extract-rush/package.json
index f7bb31e2..cec1446a 100644
--- a/packages/extract-rush/package.json
+++ b/packages/extract-rush/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-rush",
"description": "Rush workspace structural index for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-sql/package.json b/packages/extract-sql/package.json
index 0578dd8f..d507889e 100644
--- a/packages/extract-sql/package.json
+++ b/packages/extract-sql/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-sql",
"description": "Dialect-bound lightweight SQL evidence adapter for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-style/package.json b/packages/extract-style/package.json
index a7daee4a..9e497d56 100644
--- a/packages/extract-style/package.json
+++ b/packages/extract-style/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-style",
"description": "Lightweight CSS and SCSS evidence adapter for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-thrift/package.json b/packages/extract-thrift/package.json
index b9f2e171..63369184 100644
--- a/packages/extract-thrift/package.json
+++ b/packages/extract-thrift/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-thrift",
"description": "Apache Thrift IDL catalog parser for Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract-ts/package.json b/packages/extract-ts/package.json
index 69e1f058..d24c8e98 100644
--- a/packages/extract-ts/package.json
+++ b/packages/extract-ts/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract-ts",
"description": "TypeScript and JavaScript extraction plugin for the Context ExtractionResult v2 contract",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/extract/package.json b/packages/extract/package.json
index 35315207..5967b00b 100644
--- a/packages/extract/package.json
+++ b/packages/extract/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/extract",
"description": "Language-plugin framework and repository runner for Context code evidence",
- "version": "0.7.64",
+ "version": "0.7.65",
"type": "module",
"license": "MIT",
"engines": {
diff --git a/packages/tui/package.json b/packages/tui/package.json
index 94e7db10..50064e52 100644
--- a/packages/tui/package.json
+++ b/packages/tui/package.json
@@ -1,7 +1,7 @@
{
"name": "@c4a/tui",
"description": "Shared terminal UI components (Ink + React) for Context development tools",
- "version": "0.7.64",
+ "version": "0.7.65",
"private": true,
"type": "module",
"license": "MIT",
diff --git a/plugins/context/repo-install/claude/.claude-plugin/plugin.json b/plugins/context/repo-install/claude/.claude-plugin/plugin.json
index b8a98f5d..210be7ef 100644
--- a/plugins/context/repo-install/claude/.claude-plugin/plugin.json
+++ b/plugins/context/repo-install/claude/.claude-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "c4a",
"description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
- "version": "0.7.64",
+ "version": "0.7.65",
"author": {
"name": "c4a"
},
diff --git a/plugins/context/repo-install/codex/.codex-plugin/plugin.json b/plugins/context/repo-install/codex/.codex-plugin/plugin.json
index f37c1869..69be1638 100644
--- a/plugins/context/repo-install/codex/.codex-plugin/plugin.json
+++ b/plugins/context/repo-install/codex/.codex-plugin/plugin.json
@@ -1,6 +1,6 @@
{
"name": "c4a",
- "version": "0.7.64",
+ "version": "0.7.65",
"description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
"author": { "name": "c4a" },
"homepage": "https://github.com/context4ai/c4a",
@@ -10,7 +10,7 @@
"skills": "./skills/",
"interface": {
"displayName": "C4A Context",
- "shortDescription": "Initialize and advance a local, source-linked project knowledge workspace.\nv0.7.64",
+ "shortDescription": "Initialize and advance a local, source-linked project knowledge workspace.\nv0.7.65",
"longDescription": "Create a Context workspace and use agent-guided next steps to register sources, run extraction, review candidates, build package outputs, and verify health without silently mutating source repositories.",
"developerName": "c4a",
"category": "Productivity",
diff --git a/plugins/context/repo-install/cursor/.cursor-plugin/plugin.json b/plugins/context/repo-install/cursor/.cursor-plugin/plugin.json
index cb3762c0..eb2713ce 100644
--- a/plugins/context/repo-install/cursor/.cursor-plugin/plugin.json
+++ b/plugins/context/repo-install/cursor/.cursor-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "c4a",
"displayName": "C4A Context",
- "version": "0.7.64",
+ "version": "0.7.65",
"description": "Start or continue a project-local knowledge workspace through one graph-routed entry.",
"author": {
"name": "Context4AI",