Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/lucky-pugs-repeat.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@neuledge/context": patch
---

Only skip repo-meta filenames (`security`, `license`, `changelog`, `contributing`, …) at the scan root, not at every depth. A documentation page that happens to share one of those names was being dropped silently: `context add` on the forgejo docs lost `docs/admin/actions/security.md`, the only source in the repo for `container.valid_volumes`, and reported success. `docker/docs` and `excalidraw/excalidraw` lose pages to the same rule.
45 changes: 44 additions & 1 deletion packages/context/src/git.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { describe, expect, it } from "vitest";
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
findLatestStableVersion,
isMissingRefError,
isTransientGitError,
parseMonorepoTag,
readLocalDocsFiles,
} from "./git.js";

describe("isTransientGitError", () => {
Expand Down Expand Up @@ -189,3 +193,42 @@ describe("findLatestStableVersion", () => {
});
});
});

describe("readLocalDocsFiles — repo-meta filenames", () => {
let dir: string;

beforeEach(() => {
dir = mkdtempSync(join(tmpdir(), "ctx-localdocs-"));
});

afterEach(() => {
rmSync(dir, { recursive: true, force: true });
});

const write = (rel: string, body: string): void => {
const full = join(dir, rel);
mkdirSync(join(full, ".."), { recursive: true });
writeFileSync(full, body);
};

it("skips repo-meta files at the scan root", () => {
write("security.md", "# Security policy\n\nReport issues to us.\n");
write("license.md", "# License\n\nMIT.\n");
write("guide.md", "# Guide\n\nContent.\n");

const paths = readLocalDocsFiles(dir).map((f) => f.path);

expect(paths).toEqual(["guide.md"]);
});

it("keeps a documentation page that merely shares a repo-meta filename", () => {
write(
"admin/actions/security.md",
"# Securing Actions\n\nThe default value of valid_volumes is an empty array.\n",
);

const paths = readLocalDocsFiles(dir).map((f) => f.path);

expect(paths).toEqual(["admin/actions/security.md"]);
});
});
6 changes: 5 additions & 1 deletion packages/context/src/git.ts
Original file line number Diff line number Diff line change
Expand Up @@ -474,7 +474,11 @@ function findMarkdownFiles(
const matchingExt = DOCUMENTATION_EXTENSIONS.find((ext) =>
lowerName.endsWith(ext),
);
if (matchingExt) {
// Only at the scan root: these names mean repo housekeeping there, but
// deeper in a docs tree they are ordinary pages — forgejo's
// docs/admin/actions/security.md documents Actions security, and was
// being dropped as if it were a SECURITY.md policy file.
if (matchingExt && basePath === "") {
const baseName = lowerName.slice(0, -matchingExt.length);
if (IGNORED_FILES.has(baseName)) continue;
}
Expand Down