@codefast/cli 0.5.0-canary.9 → 0.6.0

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.
Files changed (52) hide show
  1. package/README.md +56 -13
  2. package/dist/arrange/domain/ast/helpers.js +1 -1
  3. package/dist/arrange/domain/ast/simplify-targets.js +4 -8
  4. package/dist/arrange/domain/ast/simplify-targets.js.map +1 -1
  5. package/dist/arrange/domain/constants.js +1 -1
  6. package/dist/arrange/domain/grouping.js +2 -2
  7. package/dist/arrange/domain/imports.js +1 -1
  8. package/dist/arrange/domain/tailwind-token.js +6 -4
  9. package/dist/arrange/domain/tailwind-token.js.map +1 -1
  10. package/dist/arrange/domain/token-classifier.js +12 -12
  11. package/dist/arrange/domain/token-classifier.js.map +1 -1
  12. package/dist/arrange/domain/types.js +1 -1
  13. package/dist/audit/cli-schema.js +24 -1
  14. package/dist/audit/cli-schema.js.map +1 -1
  15. package/dist/audit/command.js +89 -5
  16. package/dist/audit/command.js.map +1 -1
  17. package/dist/audit/domain/audit-file.js +1 -1
  18. package/dist/audit/domain/comment-content.js +178 -0
  19. package/dist/audit/domain/comment-content.js.map +1 -0
  20. package/dist/audit/domain/comment-dividers.js +146 -0
  21. package/dist/audit/domain/comment-dividers.js.map +1 -0
  22. package/dist/audit/domain/link-references.js +64 -0
  23. package/dist/audit/domain/link-references.js.map +1 -0
  24. package/dist/audit/domain/markdown-links.js +76 -0
  25. package/dist/audit/domain/markdown-links.js.map +1 -0
  26. package/dist/audit/domain/tokenize.js +2 -2
  27. package/dist/audit/domain/tsdoc-syntax.js +33 -0
  28. package/dist/audit/domain/tsdoc-syntax.js.map +1 -0
  29. package/dist/audit/output.js +88 -0
  30. package/dist/audit/output.js.map +1 -1
  31. package/dist/audit/prepare.js +63 -1
  32. package/dist/audit/prepare.js.map +1 -1
  33. package/dist/audit/run-comments.js +165 -0
  34. package/dist/audit/run-comments.js.map +1 -0
  35. package/dist/audit/run-links.js +92 -0
  36. package/dist/audit/run-links.js.map +1 -0
  37. package/dist/audit/run.js +1 -1
  38. package/dist/core/config/schema.js +24 -0
  39. package/dist/core/config/schema.js.map +1 -1
  40. package/dist/core/workspace/markdown-walk.js +28 -0
  41. package/dist/core/workspace/markdown-walk.js.map +1 -0
  42. package/dist/core/workspace/resolver.js +1 -1
  43. package/dist/core/workspace/skip-directories.js +19 -0
  44. package/dist/core/workspace/skip-directories.js.map +1 -0
  45. package/dist/core/workspace/source-walk.js +45 -0
  46. package/dist/core/workspace/source-walk.js.map +1 -0
  47. package/dist/core/workspace/typescript-walk.js +1 -13
  48. package/dist/core/workspace/typescript-walk.js.map +1 -1
  49. package/dist/mirror/domain/exports.js +1 -1
  50. package/dist/mirror/supplement-exports.js +1 -1
  51. package/dist/mirror/write-exports.js +1 -1
  52. package/package.json +6 -5
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/audit/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAsB;IAC9D,OAAO,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAC/E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAsB;IAC1D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACrC,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvG,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,cAAc,oBAAoB,eAAe,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,wDAAwD,eAAe,EAAE,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAsB,EAAE,OAAe;IAC9E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,aAAa,EAAE,CAAU;QACzB,EAAE,EAAE,MAAM,CAAC,cAAc,KAAK,CAAC;QAC/B,GAAG,EAAE,OAAO;QACZ,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/audit/output.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { AppError, messageFrom } from "#/core/errors";
4
4
  import { err, ok } from "#/core/result";
5
5
  import { findRepoRoot } from "#/core/workspace/resolver";
6
6
  /**
7
- * Load config and resolve the scan target for `audit rtl`.
7
+ * Loads config and resolves the scan target for `audit rtl`.
8
8
  *
9
9
  * @since 1.0.0-canary.7
10
10
  */
@@ -39,4 +39,66 @@ export async function prepareRtlAudit(fs, args) {
39
39
  allowlist: rtlConfig.allowlist ?? [],
40
40
  });
41
41
  }
42
+ /**
43
+ * Loads config and resolves the scan target for `audit links`.
44
+ *
45
+ * @remarks Defaults to the repo root rather than a configured path: a link audit that only covers one
46
+ * package cannot see the cross-package references that are the ones most likely to rot.
47
+ *
48
+ * @since 0.5.0
49
+ */
50
+ export async function prepareLinkAudit(fs, args) {
51
+ let rootDir;
52
+ try {
53
+ rootDir = fs.canonicalPathSync(findRepoRoot(args.currentWorkingDirectory, fs));
54
+ }
55
+ catch (caughtError) {
56
+ return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
57
+ }
58
+ const loadedOutcome = await loadCodefastConfig(rootDir, fs);
59
+ if (!loadedOutcome.ok) {
60
+ return loadedOutcome;
61
+ }
62
+ const linksConfig = loadedOutcome.value.config.audit?.links ?? {};
63
+ const targetPath = args.rawTarget === undefined ? rootDir : resolveRepoRelativePath(args.currentWorkingDirectory, args.rawTarget);
64
+ if (!fs.existsSync(targetPath)) {
65
+ return err(new AppError("NOT_FOUND", `Not found: ${targetPath}`));
66
+ }
67
+ return ok({
68
+ rootDir,
69
+ targetPath: fs.canonicalPathSync(targetPath),
70
+ allowlist: linksConfig.allowlist ?? [],
71
+ });
72
+ }
73
+ /**
74
+ * Loads config and resolves the scan target for `audit comments`.
75
+ *
76
+ * @remarks Defaults to the repo root: a divider convention that only holds inside one package
77
+ * is not a convention.
78
+ *
79
+ * @since 0.6.0
80
+ */
81
+ export async function prepareCommentAudit(fs, args) {
82
+ let rootDir;
83
+ try {
84
+ rootDir = fs.canonicalPathSync(findRepoRoot(args.currentWorkingDirectory, fs));
85
+ }
86
+ catch (caughtError) {
87
+ return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
88
+ }
89
+ const loadedOutcome = await loadCodefastConfig(rootDir, fs);
90
+ if (!loadedOutcome.ok) {
91
+ return loadedOutcome;
92
+ }
93
+ const commentsConfig = loadedOutcome.value.config.audit?.comments ?? {};
94
+ const targetPath = args.rawTarget === undefined ? rootDir : resolveRepoRelativePath(args.currentWorkingDirectory, args.rawTarget);
95
+ if (!fs.existsSync(targetPath)) {
96
+ return err(new AppError("NOT_FOUND", `Not found: ${targetPath}`));
97
+ }
98
+ return ok({
99
+ rootDir,
100
+ targetPath: fs.canonicalPathSync(targetPath),
101
+ allowlist: commentsConfig.allowlist ?? [],
102
+ });
103
+ }
42
104
  //# sourceMappingURL=prepare.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/audit/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAazD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAkB,EAClB,IAGC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,iGAAiG;QACjG,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,WAAoB,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,IAAI,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;IACrC,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CAAC;IAC1C,MAAM,mBAAmB,GAAG,aAAa,IAAI,gBAAgB,CAAC;IAC9D,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,GAAG,CACR,IAAI,QAAQ,CACV,kBAAkB,EAClB,sFAAsF,CACvF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,uBAAuB,CACxC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,EACpE,mBAAmB,CACpB,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,cAAc,UAAU,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,EAAE,CAAC;QACR,OAAO;QACP,UAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC;QAC5C,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE;KACrC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/audit/prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import path from "node:path";
2
+ import { scanCommentContent } from "#/audit/domain/comment-content";
3
+ import { applyCommentDividerFixes, DIVIDER_COLUMN, scanCommentDividers } from "#/audit/domain/comment-dividers";
4
+ import { countHeadMentions, isPathLinkTarget, linkTargetHead, scanLinkReferences, } from "#/audit/domain/link-references";
5
+ import { scanTsdocSyntax } from "#/audit/domain/tsdoc-syntax";
6
+ import { AppError, messageFrom } from "#/core/errors";
7
+ import { err, ok } from "#/core/result";
8
+ import { sourceCommentLanguage, walkSourceFiles } from "#/core/workspace/source-walk";
9
+ const reasonByDefect = {
10
+ "bad-width": `rule does not end at column ${DIVIDER_COLUMN}`,
11
+ "dead-link": "{@link} target has no mention outside links — likely renamed",
12
+ "detached-doc": "// run separates a doc block from its declaration — merge it into the block",
13
+ "doc-pointer": "comment points at a document — state the invariant here instead",
14
+ "jsdoc-type": "JSDoc {type} syntax — the declaration already carries the type",
15
+ "legacy-form": "legacy divider form",
16
+ "param-coverage": "a block naming any parameter must name them all — a partial list reads as complete",
17
+ "param-hyphen": "TSDoc separates the name from its description with ' - '",
18
+ "since-order": "@since is stamped at release and stays the block's last tag",
19
+ "stacked-doc": "// run stacked above a doc block — fold it into the block",
20
+ };
21
+ /**
22
+ * Reports every comment off the repo's conventions: divider form (which `fix` rewrites), banned
23
+ * content — document pointers, JSDoc types, tag misuse — `{@link}` targets nothing declares, and
24
+ * every diagnostic the official TSDoc parser raises against a doc block's grammar.
25
+ *
26
+ * @since 0.6.0
27
+ */
28
+ export function runCommentAudit(fs, args) {
29
+ try {
30
+ const allowlist = new Set(args.allowlist);
31
+ const { rootDir, targetPath, fix } = args;
32
+ const filesToScan = collectScanPaths(fs, targetPath);
33
+ const perFile = new Map();
34
+ const scanned = [];
35
+ let allowlistedCount = 0;
36
+ let fixedCount = 0;
37
+ let dividerCount = 0;
38
+ for (const absolutePath of filesToScan) {
39
+ const language = sourceCommentLanguage(absolutePath);
40
+ if (language === null) {
41
+ continue;
42
+ }
43
+ const relativePath = toPosixPath(path.relative(rootDir, absolutePath));
44
+ let content = fs.readFileSync(absolutePath, "utf8");
45
+ if (fix) {
46
+ const rewritten = applyCommentDividerFixes(content, language);
47
+ if (rewritten.fixedCount > 0) {
48
+ fs.writeFileSync(absolutePath, rewritten.content, "utf8");
49
+ content = rewritten.content;
50
+ fixedCount += rewritten.fixedCount;
51
+ }
52
+ }
53
+ scanned.push({ absolutePath, relativePath, content, links: scanLinkReferences(content) });
54
+ const regions = scanCommentDividers(content, language);
55
+ dividerCount += regions.length;
56
+ const breakages = [];
57
+ for (const region of regions) {
58
+ if (region.defect === null) {
59
+ continue;
60
+ }
61
+ if (allowlist.has(region.raw) || allowlist.has(`${relativePath}:${region.raw}`)) {
62
+ allowlistedCount++;
63
+ continue;
64
+ }
65
+ breakages.push({ line: region.startLine, raw: region.raw, reason: reasonByDefect[region.defect] });
66
+ }
67
+ for (const finding of scanCommentContent(content, language)) {
68
+ if (allowlist.has(finding.raw) || allowlist.has(`${relativePath}:${finding.raw}`)) {
69
+ allowlistedCount++;
70
+ continue;
71
+ }
72
+ breakages.push({ line: finding.line, raw: finding.raw, reason: reasonByDefect[finding.defect] });
73
+ }
74
+ if (language === "js") {
75
+ for (const finding of scanTsdocSyntax(content)) {
76
+ if (allowlist.has(finding.raw) || allowlist.has(`${relativePath}:${finding.raw}`)) {
77
+ allowlistedCount++;
78
+ continue;
79
+ }
80
+ breakages.push({ line: finding.line, raw: finding.raw, reason: finding.reason });
81
+ }
82
+ }
83
+ if (breakages.length > 0) {
84
+ perFile.set(relativePath, breakages);
85
+ }
86
+ }
87
+ // Cross-file resolution only sees what was scanned, so a partial scan would misread
88
+ // every out-of-scope symbol as dead — the check runs on full-tree scans alone.
89
+ if (targetPath === rootDir) {
90
+ allowlistedCount += appendDeadLinkBreakages(fs, scanned, allowlist, perFile);
91
+ }
92
+ const files = [];
93
+ let breakageCount = 0;
94
+ for (const [relativePath, breakages] of perFile) {
95
+ breakages.sort((a, b) => a.line - b.line);
96
+ breakageCount += breakages.length;
97
+ files.push({ relativePath, breakages });
98
+ }
99
+ return ok({
100
+ files,
101
+ breakageCount,
102
+ allowlistedCount,
103
+ fixedCount,
104
+ dividerCount,
105
+ scannedFileCount: filesToScan.length,
106
+ });
107
+ }
108
+ catch (caughtError) {
109
+ return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
110
+ }
111
+ }
112
+ function appendDeadLinkBreakages(fs, scanned, allowlist, perFile) {
113
+ const linkOccurrences = new Map();
114
+ const heads = new Set();
115
+ for (const file of scanned) {
116
+ for (const reference of file.links) {
117
+ if (isPathLinkTarget(reference.target)) {
118
+ continue;
119
+ }
120
+ const head = linkTargetHead(reference.target);
121
+ heads.add(head);
122
+ linkOccurrences.set(head, (linkOccurrences.get(head) ?? 0) + 1);
123
+ }
124
+ }
125
+ const mentions = countHeadMentions(scanned.map((file) => file.content), heads);
126
+ let allowlisted = 0;
127
+ for (const file of scanned) {
128
+ for (const reference of file.links) {
129
+ let dead;
130
+ if (reference.target.startsWith("http://") || reference.target.startsWith("https://")) {
131
+ continue;
132
+ }
133
+ else if (isPathLinkTarget(reference.target)) {
134
+ dead = !fs.existsSync(path.resolve(path.dirname(file.absolutePath), reference.target));
135
+ }
136
+ else {
137
+ const head = linkTargetHead(reference.target);
138
+ dead = (mentions.get(head) ?? 0) <= (linkOccurrences.get(head) ?? 0);
139
+ }
140
+ if (!dead) {
141
+ continue;
142
+ }
143
+ const raw = `{@link ${reference.target}}`;
144
+ if (allowlist.has(raw) || allowlist.has(`${file.relativePath}:${raw}`)) {
145
+ allowlisted++;
146
+ continue;
147
+ }
148
+ const breakages = perFile.get(file.relativePath) ?? [];
149
+ breakages.push({ line: reference.line, raw, reason: reasonByDefect["dead-link"] });
150
+ perFile.set(file.relativePath, breakages);
151
+ }
152
+ }
153
+ return allowlisted;
154
+ }
155
+ function collectScanPaths(fs, targetPath) {
156
+ const stats = fs.statSync(targetPath);
157
+ if (stats.isFile()) {
158
+ return [targetPath];
159
+ }
160
+ return walkSourceFiles(targetPath, fs);
161
+ }
162
+ function toPosixPath(filePath) {
163
+ return filePath.split(path.sep).join("/");
164
+ }
165
+ //# sourceMappingURL=run-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-comments.js","sourceRoot":"","sources":["../../src/audit/run-comments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import path from "node:path";
2
+ import { collectMarkdownAnchors, scanMarkdownLinks } from "#/audit/domain/markdown-links";
3
+ import { AppError, messageFrom } from "#/core/errors";
4
+ import { err, ok } from "#/core/result";
5
+ import { walkMarkdownFiles } from "#/core/workspace/markdown-walk";
6
+ /**
7
+ * Reports markdown links that point at nothing — a missing path, or an anchor the target does not offer.
8
+ *
9
+ * @since 0.5.0
10
+ */
11
+ export function runLinkAudit(fs, args) {
12
+ try {
13
+ const allowlist = new Set(args.allowlist);
14
+ const { rootDir, targetPath } = args;
15
+ const filesToScan = collectScanPaths(fs, targetPath);
16
+ // One read per document however many links land on it.
17
+ const anchorsByFile = new Map();
18
+ const files = [];
19
+ let breakageCount = 0;
20
+ let allowlistedCount = 0;
21
+ let linkCount = 0;
22
+ for (const absolutePath of filesToScan) {
23
+ const relativePath = toPosixPath(path.relative(rootDir, absolutePath));
24
+ const content = fs.readFileSync(absolutePath, "utf8");
25
+ const scan = scanMarkdownLinks(content);
26
+ anchorsByFile.set(absolutePath, scan.anchors);
27
+ linkCount += scan.references.length;
28
+ const breakages = [];
29
+ for (const reference of scan.references) {
30
+ const breakage = inspectReference(fs, anchorsByFile, {
31
+ absolutePath,
32
+ reference,
33
+ ownAnchors: scan.anchors,
34
+ });
35
+ if (breakage === null) {
36
+ continue;
37
+ }
38
+ if (allowlist.has(breakage.raw) || allowlist.has(`${relativePath}:${breakage.raw}`)) {
39
+ allowlistedCount++;
40
+ continue;
41
+ }
42
+ breakages.push(breakage);
43
+ }
44
+ if (breakages.length === 0) {
45
+ continue;
46
+ }
47
+ breakageCount += breakages.length;
48
+ files.push({ relativePath, breakages });
49
+ }
50
+ return ok({ files, breakageCount, allowlistedCount, linkCount, scannedFileCount: filesToScan.length });
51
+ }
52
+ catch (caughtError) {
53
+ return err(new AppError("INFRA_FAILURE", messageFrom(caughtError), caughtError));
54
+ }
55
+ }
56
+ function inspectReference(fs, anchorsByFile, args) {
57
+ const { absolutePath, reference, ownAnchors } = args;
58
+ const raw = reference.anchor === null ? reference.targetPath : `${reference.targetPath}#${reference.anchor}`;
59
+ if (reference.targetPath === "") {
60
+ return ownAnchors.has(reference.anchor)
61
+ ? null
62
+ : { line: reference.line, raw, reason: "anchor not found in this document" };
63
+ }
64
+ const resolved = path.resolve(path.dirname(absolutePath), reference.targetPath);
65
+ if (!fs.existsSync(resolved)) {
66
+ return { line: reference.line, raw, reason: "path does not exist" };
67
+ }
68
+ if (reference.anchor === null || !resolved.endsWith(".md")) {
69
+ return null;
70
+ }
71
+ // A cross-document anchor fails softly in a browser — it scrolls to the top — so nothing else catches it.
72
+ const anchors = anchorsByFile.get(resolved) ??
73
+ (() => {
74
+ const parsed = collectMarkdownAnchors(fs.readFileSync(resolved, "utf8"));
75
+ anchorsByFile.set(resolved, parsed);
76
+ return parsed;
77
+ })();
78
+ return anchors.has(reference.anchor)
79
+ ? null
80
+ : { line: reference.line, raw, reason: `anchor not found in ${path.basename(resolved)}` };
81
+ }
82
+ function collectScanPaths(fs, targetPath) {
83
+ const stats = fs.statSync(targetPath);
84
+ if (stats.isFile()) {
85
+ return [targetPath];
86
+ }
87
+ return walkMarkdownFiles(targetPath, fs);
88
+ }
89
+ function toPosixPath(filePath) {
90
+ return filePath.split(path.sep).join("/");
91
+ }
92
+ //# sourceMappingURL=run-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-links.js","sourceRoot":"","sources":["../../src/audit/run-links.ts"],"names":[],"mappings":"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"}
package/dist/audit/run.js CHANGED
@@ -4,7 +4,7 @@ import { AppError, messageFrom } from "#/core/errors";
4
4
  import { err, ok } from "#/core/result";
5
5
  import { walkTsxFiles } from "#/core/workspace/typescript-walk";
6
6
  /**
7
- * Scan a target path for physical-direction Tailwind class violations.
7
+ * Scans a target path for physical-direction Tailwind class violations.
8
8
  *
9
9
  * @since 1.0.0-canary.7
10
10
  */
@@ -78,12 +78,36 @@ export const codefastAuditRtlConfigSchema = z
78
78
  allowlist: z.array(z.string()).optional(),
79
79
  })
80
80
  .strict();
81
+ /**
82
+ * Link audit defaults — the scan always starts at the repo root, so only exceptions are configured.
83
+ *
84
+ * @since 0.5.0
85
+ */
86
+ export const codefastAuditLinksConfigSchema = z
87
+ .object({
88
+ /** Bare link targets or `repo/relative/doc.md:target` entries to ignore. */
89
+ allowlist: z.array(z.string()).optional(),
90
+ })
91
+ .strict();
92
+ /**
93
+ * Comment-divider audit defaults — the scan always starts at the repo root, so only exceptions are configured.
94
+ *
95
+ * @since 0.6.0
96
+ */
97
+ export const codefastAuditCommentsConfigSchema = z
98
+ .object({
99
+ /** Divider lines as written, or `repo/relative/path.ts:<divider>` entries, to ignore. */
100
+ allowlist: z.array(z.string()).optional(),
101
+ })
102
+ .strict();
81
103
  /**
82
104
  * @since 0.3.16-canary.0
83
105
  */
84
106
  export const codefastAuditConfigSchema = z
85
107
  .object({
86
108
  rtl: codefastAuditRtlConfigSchema.optional(),
109
+ links: codefastAuditLinksConfigSchema.optional(),
110
+ comments: codefastAuditCommentsConfigSchema.optional(),
87
111
  })
88
112
  .strict();
89
113
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/core/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import path from "node:path";
2
+ import { defaultSkipDirectoryNames } from "#/core/workspace/skip-directories";
3
+ /**
4
+ * Every markdown file under a root, skipping build output and vendored trees.
5
+ *
6
+ * @since 0.5.0
7
+ */
8
+ export function walkMarkdownFiles(rootDirectoryPath, fs) {
9
+ const result = [];
10
+ visitMarkdownPaths(result, rootDirectoryPath, fs);
11
+ return result;
12
+ }
13
+ function visitMarkdownPaths(result, entryPath, fs) {
14
+ const entryStats = fs.statSync(entryPath);
15
+ if (entryStats.isDirectory()) {
16
+ for (const childName of fs.readdirSync(entryPath)) {
17
+ if (defaultSkipDirectoryNames.has(childName)) {
18
+ continue;
19
+ }
20
+ visitMarkdownPaths(result, path.join(entryPath, childName), fs);
21
+ }
22
+ return;
23
+ }
24
+ if (entryPath.endsWith(".md")) {
25
+ result.push(entryPath);
26
+ }
27
+ }
28
+ //# sourceMappingURL=markdown-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-walk.js","sourceRoot":"","sources":["../../../src/core/workspace/markdown-walk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,iBAAyB,EAAE,EAAkB;IAC7E,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAkB;IACtF,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -6,7 +6,7 @@ import { messageFrom } from "#/core/errors";
6
6
  import { createAnyGlobMatcher } from "#/core/glob";
7
7
  import { logger } from "#/core/logger";
8
8
  /**
9
- * Resolve the monorepo root (directory containing `pnpm-workspace.yaml`).
9
+ * Resolves the monorepo root (directory containing `pnpm-workspace.yaml`).
10
10
  *
11
11
  * @since 0.3.16-canary.0
12
12
  */
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Directory names every workspace walk skips: build output, vendored trees, and tool caches.
3
+ *
4
+ * @since 0.6.0
5
+ */
6
+ export const defaultSkipDirectoryNames = new Set([
7
+ "node_modules",
8
+ "dist",
9
+ ".git",
10
+ ".turbo",
11
+ ".next",
12
+ ".cache",
13
+ "out",
14
+ "build",
15
+ "coverage",
16
+ ".vercel",
17
+ ".output",
18
+ ]);
19
+ //# sourceMappingURL=skip-directories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-directories.js","sourceRoot":"","sources":["../../../src/core/workspace/skip-directories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IACpE,cAAc;IACd,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;CACV,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import path from "node:path";
2
+ import { defaultSkipDirectoryNames } from "#/core/workspace/skip-directories";
3
+ /**
4
+ * Every hand-written source file a comment convention applies to — `.ts`, `.tsx`, and `.css`.
5
+ *
6
+ * @remarks Emitted declarations are excluded: they carry whatever the compiler copied over,
7
+ * and rewriting them would be undone by the next build.
8
+ *
9
+ * @since 0.6.0
10
+ */
11
+ export function walkSourceFiles(rootDirectoryPath, fs) {
12
+ const result = [];
13
+ visitSourcePaths(result, rootDirectoryPath, fs);
14
+ return result;
15
+ }
16
+ /**
17
+ * Which comment syntax a path is written in, or `null` when the convention does not cover it.
18
+ *
19
+ * @since 0.6.0
20
+ */
21
+ export function sourceCommentLanguage(filePath) {
22
+ if (filePath.endsWith(".d.ts")) {
23
+ return null;
24
+ }
25
+ if (filePath.endsWith(".ts") || filePath.endsWith(".tsx")) {
26
+ return "js";
27
+ }
28
+ return filePath.endsWith(".css") ? "css" : null;
29
+ }
30
+ function visitSourcePaths(result, entryPath, fs) {
31
+ const entryStats = fs.statSync(entryPath);
32
+ if (entryStats.isDirectory()) {
33
+ for (const childName of fs.readdirSync(entryPath)) {
34
+ if (defaultSkipDirectoryNames.has(childName)) {
35
+ continue;
36
+ }
37
+ visitSourcePaths(result, path.join(entryPath, childName), fs);
38
+ }
39
+ return;
40
+ }
41
+ if (sourceCommentLanguage(entryPath) !== null) {
42
+ result.push(entryPath);
43
+ }
44
+ }
45
+ //# sourceMappingURL=source-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-walk.js","sourceRoot":"","sources":["../../../src/core/workspace/source-walk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,iBAAyB,EAAE,EAAkB;IAC3E,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAkB;IACpF,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,qBAAqB,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -1,17 +1,5 @@
1
1
  import path from "node:path";
2
- const defaultSkipDirectoryNames = new Set([
3
- "node_modules",
4
- "dist",
5
- ".git",
6
- ".turbo",
7
- ".next",
8
- ".cache",
9
- "out",
10
- "build",
11
- "coverage",
12
- ".vercel",
13
- ".output",
14
- ]);
2
+ import { defaultSkipDirectoryNames } from "#/core/workspace/skip-directories";
15
3
  /**
16
4
  * @since 0.3.16-canary.0
17
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-walk.js","sourceRoot":"","sources":["../../../src/core/workspace/typescript-walk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,cAAc;IACd,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,iBAAyB,EAAE,EAAkB;IACxE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAkB;IACjF,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"typescript-walk.js","sourceRoot":"","sources":["../../../src/core/workspace/typescript-walk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,iBAAyB,EAAE,EAAkB;IACxE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,MAAqB,EAAE,SAAiB,EAAE,EAAkB;IACjF,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,IAAI,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -183,7 +183,7 @@ async function generateCssExports(fileSystemService, distDir, cssConfig) {
183
183
  return cssExports;
184
184
  }
185
185
  /**
186
- * Compute `package.json#exports` from a built `dist/` tree. No logging; no writes.
186
+ * Computes `package.json#exports` from a built `dist/` tree. No logging; no writes.
187
187
  *
188
188
  * @since 0.3.16-canary.0
189
189
  */
@@ -142,7 +142,7 @@ export async function supplementExportsInPackageJson(fs, packageJsonPath, packag
142
142
  return { supplementedSpecifiers };
143
143
  }
144
144
  /**
145
- * Build a `resolveSourcePath` closure that checks the filesystem for `.tsx` before
145
+ * Builds a `resolveSourcePath` closure that checks the filesystem for `.tsx` before
146
146
  * falling back to `.ts`. Mirrors the logic used in normal (non-custom) mode.
147
147
  *
148
148
  * @since 0.3.16-canary.0
@@ -21,7 +21,7 @@ export async function writePackageJsonExportsAtomic(fs, packageJsonPath, mergeIn
21
21
  return false;
22
22
  }
23
23
  /**
24
- * Keep `./package.json` at the very end for aesthetics by default.
24
+ * Keeps `./package.json` at the very end for aesthetics by default.
25
25
  * If a catch-all `./*` exists, move `./package.json` before wildcards so it remains reachable.
26
26
  */
27
27
  function exportSpecifierRank(exportSpecifier, hasCatchAllWildcard) {