@promptci/core 0.0.1 → 0.2.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 (253) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +29 -30
  3. package/dist/action-pinning.d.ts +37 -0
  4. package/dist/action-pinning.d.ts.map +1 -0
  5. package/dist/action-pinning.js +277 -0
  6. package/dist/action-pinning.js.map +1 -0
  7. package/dist/agent-practices.d.ts +3 -1
  8. package/dist/agent-practices.d.ts.map +1 -1
  9. package/dist/agent-practices.js +198 -94
  10. package/dist/agent-practices.js.map +1 -1
  11. package/dist/ai-config.d.ts +178 -0
  12. package/dist/ai-config.d.ts.map +1 -0
  13. package/dist/ai-config.js +721 -0
  14. package/dist/ai-config.js.map +1 -0
  15. package/dist/alias-files.d.ts +33 -0
  16. package/dist/alias-files.d.ts.map +1 -0
  17. package/dist/alias-files.js +60 -0
  18. package/dist/alias-files.js.map +1 -0
  19. package/dist/baseline.d.ts +17 -1
  20. package/dist/baseline.d.ts.map +1 -1
  21. package/dist/baseline.js +5 -1
  22. package/dist/baseline.js.map +1 -1
  23. package/dist/buried-critical.d.ts +17 -0
  24. package/dist/buried-critical.d.ts.map +1 -0
  25. package/dist/buried-critical.js +107 -0
  26. package/dist/buried-critical.js.map +1 -0
  27. package/dist/canonical-owner.d.ts.map +1 -1
  28. package/dist/canonical-owner.js +60 -30
  29. package/dist/canonical-owner.js.map +1 -1
  30. package/dist/ci-alignment.d.ts.map +1 -1
  31. package/dist/ci-alignment.js +3 -2
  32. package/dist/ci-alignment.js.map +1 -1
  33. package/dist/command-validity.d.ts +16 -0
  34. package/dist/command-validity.d.ts.map +1 -1
  35. package/dist/command-validity.js +387 -134
  36. package/dist/command-validity.js.map +1 -1
  37. package/dist/conflicts.d.ts.map +1 -1
  38. package/dist/conflicts.js +4 -44
  39. package/dist/conflicts.js.map +1 -1
  40. package/dist/context-analysis.d.ts.map +1 -1
  41. package/dist/context-analysis.js +13 -2
  42. package/dist/context-analysis.js.map +1 -1
  43. package/dist/context-bloat.d.ts +20 -1
  44. package/dist/context-bloat.d.ts.map +1 -1
  45. package/dist/context-bloat.js +99 -15
  46. package/dist/context-bloat.js.map +1 -1
  47. package/dist/context-optimizer.d.ts.map +1 -1
  48. package/dist/context-optimizer.js +18 -54
  49. package/dist/context-optimizer.js.map +1 -1
  50. package/dist/copilot-instructions-detector.d.ts +24 -0
  51. package/dist/copilot-instructions-detector.d.ts.map +1 -0
  52. package/dist/copilot-instructions-detector.js +145 -0
  53. package/dist/copilot-instructions-detector.js.map +1 -0
  54. package/dist/cursor-rules-detector.d.ts +17 -0
  55. package/dist/cursor-rules-detector.d.ts.map +1 -0
  56. package/dist/cursor-rules-detector.js +110 -0
  57. package/dist/cursor-rules-detector.js.map +1 -0
  58. package/dist/custom-rules.d.ts +52 -0
  59. package/dist/custom-rules.d.ts.map +1 -0
  60. package/dist/custom-rules.js +303 -0
  61. package/dist/custom-rules.js.map +1 -0
  62. package/dist/dead-references.d.ts +8 -2
  63. package/dist/dead-references.d.ts.map +1 -1
  64. package/dist/dead-references.js +315 -68
  65. package/dist/dead-references.js.map +1 -1
  66. package/dist/dependency-staleness.d.ts +35 -0
  67. package/dist/dependency-staleness.d.ts.map +1 -0
  68. package/dist/dependency-staleness.js +1001 -0
  69. package/dist/dependency-staleness.js.map +1 -0
  70. package/dist/detectors.d.ts +1 -3
  71. package/dist/detectors.d.ts.map +1 -1
  72. package/dist/detectors.js +74 -56
  73. package/dist/detectors.js.map +1 -1
  74. package/dist/duplicates.d.ts.map +1 -1
  75. package/dist/duplicates.js +15 -9
  76. package/dist/duplicates.js.map +1 -1
  77. package/dist/evidence.d.ts +39 -0
  78. package/dist/evidence.d.ts.map +1 -0
  79. package/dist/evidence.js +78 -0
  80. package/dist/evidence.js.map +1 -0
  81. package/dist/finding-id.d.ts +21 -0
  82. package/dist/finding-id.d.ts.map +1 -0
  83. package/dist/finding-id.js +31 -0
  84. package/dist/finding-id.js.map +1 -0
  85. package/dist/fix-engine.d.ts +11 -0
  86. package/dist/fix-engine.d.ts.map +1 -1
  87. package/dist/fix-engine.js +88 -71
  88. package/dist/fix-engine.js.map +1 -1
  89. package/dist/frameworks/dotnet.js +2 -2
  90. package/dist/frameworks/dotnet.js.map +1 -1
  91. package/dist/frameworks/python.d.ts.map +1 -1
  92. package/dist/frameworks/python.js +5 -2
  93. package/dist/frameworks/python.js.map +1 -1
  94. package/dist/frameworks/rust.d.ts.map +1 -1
  95. package/dist/frameworks/rust.js +2 -1
  96. package/dist/frameworks/rust.js.map +1 -1
  97. package/dist/git-symlinks.d.ts +30 -0
  98. package/dist/git-symlinks.d.ts.map +1 -0
  99. package/dist/git-symlinks.js +161 -0
  100. package/dist/git-symlinks.js.map +1 -0
  101. package/dist/gitignore.d.ts +22 -0
  102. package/dist/gitignore.d.ts.map +1 -0
  103. package/dist/gitignore.js +157 -0
  104. package/dist/gitignore.js.map +1 -0
  105. package/dist/health-score.d.ts.map +1 -1
  106. package/dist/health-score.js +35 -5
  107. package/dist/health-score.js.map +1 -1
  108. package/dist/hooks-settings-detector.d.ts +17 -0
  109. package/dist/hooks-settings-detector.d.ts.map +1 -0
  110. package/dist/hooks-settings-detector.js +228 -0
  111. package/dist/hooks-settings-detector.js.map +1 -0
  112. package/dist/index.d.ts +29 -8
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +21 -6
  115. package/dist/index.js.map +1 -1
  116. package/dist/makefile.d.ts +37 -0
  117. package/dist/makefile.d.ts.map +1 -0
  118. package/dist/makefile.js +156 -0
  119. package/dist/makefile.js.map +1 -0
  120. package/dist/manifest-consistency.d.ts +6 -0
  121. package/dist/manifest-consistency.d.ts.map +1 -1
  122. package/dist/manifest-consistency.js +75 -10
  123. package/dist/manifest-consistency.js.map +1 -1
  124. package/dist/markdown-fences.d.ts +112 -0
  125. package/dist/markdown-fences.d.ts.map +1 -0
  126. package/dist/markdown-fences.js +174 -0
  127. package/dist/markdown-fences.js.map +1 -0
  128. package/dist/mcp-config-detector.d.ts +20 -0
  129. package/dist/mcp-config-detector.d.ts.map +1 -0
  130. package/dist/mcp-config-detector.js +237 -0
  131. package/dist/mcp-config-detector.js.map +1 -0
  132. package/dist/missing-context.d.ts.map +1 -1
  133. package/dist/missing-context.js +2 -52
  134. package/dist/missing-context.js.map +1 -1
  135. package/dist/model-budgets.d.ts +69 -0
  136. package/dist/model-budgets.d.ts.map +1 -0
  137. package/dist/model-budgets.js +110 -0
  138. package/dist/model-budgets.js.map +1 -0
  139. package/dist/negative-instructions.d.ts +26 -0
  140. package/dist/negative-instructions.d.ts.map +1 -0
  141. package/dist/negative-instructions.js +169 -0
  142. package/dist/negative-instructions.js.map +1 -0
  143. package/dist/path-containment.d.ts +41 -0
  144. package/dist/path-containment.d.ts.map +1 -0
  145. package/dist/path-containment.js +123 -0
  146. package/dist/path-containment.js.map +1 -0
  147. package/dist/project-type.d.ts +12 -2
  148. package/dist/project-type.d.ts.map +1 -1
  149. package/dist/project-type.js +25 -12
  150. package/dist/project-type.js.map +1 -1
  151. package/dist/prompt-cache.d.ts.map +1 -1
  152. package/dist/prompt-cache.js +33 -24
  153. package/dist/prompt-cache.js.map +1 -1
  154. package/dist/promptci-gitignore.d.ts +34 -0
  155. package/dist/promptci-gitignore.d.ts.map +1 -0
  156. package/dist/promptci-gitignore.js +42 -0
  157. package/dist/promptci-gitignore.js.map +1 -0
  158. package/dist/repo-context.d.ts +80 -0
  159. package/dist/repo-context.d.ts.map +1 -1
  160. package/dist/repo-context.js +170 -16
  161. package/dist/repo-context.js.map +1 -1
  162. package/dist/report.d.ts +8 -0
  163. package/dist/report.d.ts.map +1 -1
  164. package/dist/report.js +163 -63
  165. package/dist/report.js.map +1 -1
  166. package/dist/scan.d.ts.map +1 -1
  167. package/dist/scan.js +47 -4
  168. package/dist/scan.js.map +1 -1
  169. package/dist/scanner.d.ts +61 -1
  170. package/dist/scanner.d.ts.map +1 -1
  171. package/dist/scanner.js +367 -70
  172. package/dist/scanner.js.map +1 -1
  173. package/dist/security-pack.d.ts +20 -0
  174. package/dist/security-pack.d.ts.map +1 -1
  175. package/dist/security-pack.js +33 -14
  176. package/dist/security-pack.js.map +1 -1
  177. package/dist/skill-supply-chain.d.ts +132 -0
  178. package/dist/skill-supply-chain.d.ts.map +1 -0
  179. package/dist/skill-supply-chain.js +2954 -0
  180. package/dist/skill-supply-chain.js.map +1 -0
  181. package/dist/skills-detector.d.ts +23 -0
  182. package/dist/skills-detector.d.ts.map +1 -0
  183. package/dist/skills-detector.js +279 -0
  184. package/dist/skills-detector.js.map +1 -0
  185. package/dist/stale-instructions.d.ts +4 -1
  186. package/dist/stale-instructions.d.ts.map +1 -1
  187. package/dist/stale-instructions.js +53 -55
  188. package/dist/stale-instructions.js.map +1 -1
  189. package/dist/subagents-detector.d.ts +19 -0
  190. package/dist/subagents-detector.d.ts.map +1 -0
  191. package/dist/subagents-detector.js +155 -0
  192. package/dist/subagents-detector.js.map +1 -0
  193. package/dist/suppression.d.ts +2 -0
  194. package/dist/suppression.d.ts.map +1 -1
  195. package/dist/suppression.js +16 -47
  196. package/dist/suppression.js.map +1 -1
  197. package/dist/types.d.ts +62 -4
  198. package/dist/types.d.ts.map +1 -1
  199. package/dist/types.js +47 -1
  200. package/dist/types.js.map +1 -1
  201. package/dist/vague-guidance.d.ts +15 -2
  202. package/dist/vague-guidance.d.ts.map +1 -1
  203. package/dist/vague-guidance.js +44 -41
  204. package/dist/vague-guidance.js.map +1 -1
  205. package/dist/windsurf-detector.d.ts +22 -0
  206. package/dist/windsurf-detector.d.ts.map +1 -0
  207. package/dist/windsurf-detector.js +96 -0
  208. package/dist/windsurf-detector.js.map +1 -0
  209. package/dist/within-section-dedup.d.ts +16 -0
  210. package/dist/within-section-dedup.d.ts.map +1 -0
  211. package/dist/within-section-dedup.js +148 -0
  212. package/dist/within-section-dedup.js.map +1 -0
  213. package/dist/workspace-manifests.d.ts +80 -0
  214. package/dist/workspace-manifests.d.ts.map +1 -0
  215. package/dist/workspace-manifests.js +333 -0
  216. package/dist/workspace-manifests.js.map +1 -0
  217. package/package.json +11 -8
  218. package/dist/cheap-model-routing.d.ts +0 -4
  219. package/dist/cheap-model-routing.d.ts.map +0 -1
  220. package/dist/cheap-model-routing.js +0 -43
  221. package/dist/cheap-model-routing.js.map +0 -1
  222. package/dist/cli-output-filter.d.ts +0 -16
  223. package/dist/cli-output-filter.d.ts.map +0 -1
  224. package/dist/cli-output-filter.js +0 -88
  225. package/dist/cli-output-filter.js.map +0 -1
  226. package/dist/context-cost.d.ts +0 -4
  227. package/dist/context-cost.d.ts.map +0 -1
  228. package/dist/context-cost.js +0 -70
  229. package/dist/context-cost.js.map +0 -1
  230. package/dist/context-recommender.d.ts +0 -3
  231. package/dist/context-recommender.d.ts.map +0 -1
  232. package/dist/context-recommender.js +0 -329
  233. package/dist/context-recommender.js.map +0 -1
  234. package/dist/llm.d.ts +0 -6
  235. package/dist/llm.d.ts.map +0 -1
  236. package/dist/llm.js +0 -67
  237. package/dist/llm.js.map +0 -1
  238. package/dist/mcp-detector.d.ts +0 -4
  239. package/dist/mcp-detector.d.ts.map +0 -1
  240. package/dist/mcp-detector.js +0 -131
  241. package/dist/mcp-detector.js.map +0 -1
  242. package/dist/native-tool-preference.d.ts +0 -20
  243. package/dist/native-tool-preference.d.ts.map +0 -1
  244. package/dist/native-tool-preference.js +0 -94
  245. package/dist/native-tool-preference.js.map +0 -1
  246. package/dist/output-verbosity.d.ts +0 -3
  247. package/dist/output-verbosity.d.ts.map +0 -1
  248. package/dist/output-verbosity.js +0 -83
  249. package/dist/output-verbosity.js.map +0 -1
  250. package/dist/product-boundary.d.ts +0 -11
  251. package/dist/product-boundary.d.ts.map +0 -1
  252. package/dist/product-boundary.js +0 -301
  253. package/dist/product-boundary.js.map +0 -1
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Shared support for the AI-setup config detectors (issue #23).
3
+ *
4
+ * These detectors audit the non-markdown surfaces of a 2026 AI setup — skills,
5
+ * subagents, hooks/permissions, MCP servers, and Cursor rules — against
6
+ * filesystem reality, the same way `command-validity` verifies documented
7
+ * commands. Everything here is deterministic and offline: no network, no LLM,
8
+ * identical output for identical input.
9
+ *
10
+ * This module holds the pieces every one of those detectors needs: a minimal
11
+ * YAML-frontmatter parser, root-relative path helpers that refuse to escape the
12
+ * repo, a stable file lister, and issue path normalization.
13
+ */
14
+ import { resolveReadableWithinRoot, resolveWithinRoot } from './path-containment.js';
15
+ import type { PromptCiIssue, ScanInput } from './types.js';
16
+ /** Convert a filesystem path to forward-slash form for stable, portable output. */
17
+ export declare function toPosix(p: string): string;
18
+ export { resolveWithinRoot, resolveReadableWithinRoot };
19
+ /** True when a repo-relative path exists and is a regular file. */
20
+ export declare function isFileWithinRoot(repoRoot: string, relativePath: string): boolean;
21
+ /** Read a repo-relative text file, or `undefined` if it is absent/unreadable. */
22
+ export declare function readTextWithinRoot(repoRoot: string, relativePath: string): string | undefined;
23
+ /**
24
+ * List files under `repoRoot` matching `patterns`, returned as repo-relative
25
+ * POSIX paths in sorted order. Dotfiles are included (these configs all live in
26
+ * dot-directories). Pass `ignore` to override the default discovery excludes.
27
+ */
28
+ export declare function listFiles(repoRoot: string, patterns: string[], ignore?: string[]): string[];
29
+ /** Pre-discovered config files per surface, as sorted repo-relative POSIX paths. */
30
+ export type AiConfigFiles = {
31
+ /**
32
+ * Agent Skills audited structurally by the skills detector, in every
33
+ * supported skill location: `.claude/**\/SKILL.md`, `.agents/skills/**`,
34
+ * plugin `skills/*` and marketplace `plugins/*\/skills/*`. Subject to the
35
+ * size/binary guards.
36
+ */
37
+ skills: string[];
38
+ /**
39
+ * Every SKILL.md in the same locations as `skills`, read by the skill
40
+ * supply-chain scan. Honors include/exclude but NOT the size/binary guards:
41
+ * the supply-chain scan must see — and report — an oversized or NUL-bearing
42
+ * SKILL.md rather than silently lose the skill.
43
+ * Optional so hand-built contexts from older releases keep working.
44
+ */
45
+ allSkills?: string[];
46
+ /**
47
+ * Files bundled alongside a skill in `allSkills` (scripts, references,
48
+ * manifests): every file under the skill's directory except SKILL.md files,
49
+ * include/exclude applied, capped per skill BEFORE any file I/O. Read as text
50
+ * by the supply-chain scan — never executed. Optional (see `allSkills`).
51
+ */
52
+ skillFiles?: string[];
53
+ /** Bundled files dropped by the per-skill cap — reported, never silently lost. */
54
+ skillFilesOverCap?: string[];
55
+ /**
56
+ * Parts of a skill bundle the listing did not enumerate, so the supply-chain
57
+ * scan can name them: dependency/VCS directories, files an `include` config
58
+ * left out, and bundles too large to list.
59
+ */
60
+ skillBundleSkips?: SkillBundleSkip[];
61
+ /** Subagent definitions: `.claude/agents/**\/*.md`. */
62
+ agents: string[];
63
+ /** Claude Code settings: `.claude/settings.json` and `.claude/settings.local.json`. */
64
+ settings: string[];
65
+ /** Project MCP servers: `.mcp.json`. */
66
+ mcp: string[];
67
+ /** Cursor project rules: `.cursor/rules/**\/*.mdc`. */
68
+ cursorRules: string[];
69
+ /** GitHub Copilot per-file instructions: `.github/instructions/**\/*.md`. */
70
+ copilotInstructions: string[];
71
+ };
72
+ export type SkillBundleSkip = {
73
+ /** Repo-relative path: the skipped directory, or the skill directory for counts. */
74
+ path: string;
75
+ kind: 'dependency-dir' | 'include' | 'listing-limit';
76
+ /** Files affected, when known. */
77
+ count?: number;
78
+ };
79
+ /** An AiConfigFiles with every surface empty — for contexts built without discovery. */
80
+ export declare function emptyAiConfigFiles(): AiConfigFiles;
81
+ export declare function isSkillContainerDir(dir: string): boolean;
82
+ /** Upper bound on bundled files read per skill, so one huge skill cannot stall a scan. */
83
+ export declare const MAX_BUNDLED_FILES_PER_SKILL = 200;
84
+ export declare function isPriorityBundleFile(rel: string): boolean;
85
+ /**
86
+ * Discover the config files the ai_config detectors audit, honoring the same
87
+ * user-facing scan policy the markdown scanner applies: `exclude` patterns
88
+ * always remove files, an explicit `include` list bounds the scan scope (when
89
+ * unset, each surface's own globs are the scope — these configs are not in the
90
+ * scanner's DEFAULT_PATTERNS), and oversized or binary files are skipped.
91
+ *
92
+ * Called from buildRepoContext so detectors consume pre-discovered lists; a
93
+ * `--exclude` that silences a markdown finding for a file silences that file's
94
+ * ai_config findings too, instead of the detectors re-walking the repo with a
95
+ * policy of their own.
96
+ */
97
+ export declare function discoverAiConfigFiles(repoRoot: string, policy?: Pick<ScanInput, 'include' | 'exclude'>): AiConfigFiles;
98
+ /** Stable short hash for building per-finding IDs. */
99
+ export declare function shortHash(input: string): string;
100
+ /**
101
+ * Rewrite an issue's `filePaths`/`locations` from the detectors' repo-relative
102
+ * POSIX form to the absolute form the scanner stores in `InstructionFile.path`.
103
+ * Inline `promptci-ignore` suppressions match on exact path equality with the
104
+ * scanned file, so detector output must speak the same dialect or the
105
+ * `ai_config` category is unsuppressable. Display strings (titles, summaries,
106
+ * evidence) keep the friendly relative form; baseline fingerprints re-normalize
107
+ * absolute paths back to repo-relative, so they are unaffected.
108
+ */
109
+ export declare function withScannerPaths(repoRoot: string, issues: PromptCiIssue[]): PromptCiIssue[];
110
+ /** Extensions treated as invokable local scripts in hook/MCP command strings. */
111
+ export declare const SCRIPT_EXT_RE: RegExp;
112
+ /**
113
+ * 1-based line where `needle` first appears in `raw`, or 1 when not found.
114
+ * JSON sources store strings escaped, so a parsed command containing quotes or
115
+ * backslashes never appears verbatim — fall back to the JSON-escaped form
116
+ * before giving up on a real line number.
117
+ */
118
+ export declare function lineOf(raw: string, needle: string): number;
119
+ export type FrontmatterValue = string | string[] | boolean | number | null;
120
+ export type Frontmatter = {
121
+ /** An opening `---` fence was present on the first content line. */
122
+ present: boolean;
123
+ /** A closing `---` (or `...`) fence was found. */
124
+ closed: boolean;
125
+ /** Top-level key → parsed value. Last write wins on duplicate keys. */
126
+ data: Record<string, FrontmatterValue>;
127
+ /** 1-based line of each top-level key (first occurrence). */
128
+ keyLines: Record<string, number>;
129
+ /** 1-based line of the closing fence, or -1 when unterminated. */
130
+ fenceEndLine: number;
131
+ /** 1-based first line of the document body after the closing fence. */
132
+ bodyStartLine: number;
133
+ /** Structural problems found while parsing (duplicate keys, etc.). */
134
+ errors: string[];
135
+ };
136
+ /**
137
+ * Parse a minimal YAML frontmatter block from the top of a document.
138
+ *
139
+ * Handles the subset these config files actually use: top-level `key: value`
140
+ * scalars, quoted strings, booleans/numbers, inline `[a, b]` sequences, block
141
+ * lists (` - item`), and `|`/`>` block scalars. Nested mappings are recorded
142
+ * as errors rather than silently dropped, since none of the audited surfaces
143
+ * use them and a nested block is far more likely to be a mistake.
144
+ *
145
+ * This is deliberately not a full YAML engine — it exists to answer "is the
146
+ * frontmatter structurally sane and what are its top-level keys", not to load
147
+ * arbitrary YAML.
148
+ */
149
+ export declare function parseFrontmatter(content: string): Frontmatter;
150
+ /** Coerce a frontmatter value that may be a list or comma/newline string into a string[]. */
151
+ export declare function asStringList(value: FrontmatterValue): string[];
152
+ /** Fill in the defaults every ai_config finding shares. */
153
+ export declare function aiConfigIssue(issue: Omit<PromptCiIssue, 'severity' | 'category' | 'confidence'> & Partial<Pick<PromptCiIssue, 'severity' | 'category' | 'confidence'>>): PromptCiIssue;
154
+ /** Per-surface wording for the shared frontmatter-structure findings. */
155
+ export type FrontmatterSurface = {
156
+ /** Id segment: findings get ids of the form `ai-config-<idPrefix>-<kind>-<hash>`. */
157
+ idPrefix: string;
158
+ /** Noun opening each finding title, e.g. 'Skill' or 'Cursor rule'. */
159
+ noun: string;
160
+ /** No-frontmatter summary tail: what a valid frontmatter block provides. */
161
+ why: string;
162
+ /** Recommendation for the no-frontmatter finding. */
163
+ recommendation: string;
164
+ /** Title override when the default `<noun> is missing YAML frontmatter` is wrong. */
165
+ noFrontmatterTitle?: string;
166
+ /** A missing block defaults to 'high' — Cursor rules soften it (metadata is optional-ish). */
167
+ noFrontmatterSeverity?: PromptCiIssue['severity'];
168
+ noFrontmatterConfidence?: number;
169
+ };
170
+ /**
171
+ * The three structural frontmatter findings every frontmatter-bearing surface
172
+ * (skills, subagents, Cursor rules) shares: block missing entirely, block never
173
+ * closed, and parse errors inside the block. When the block is missing the
174
+ * caller should skip its per-surface field checks, keyed off `fm.present` as
175
+ * before — this helper only builds the findings.
176
+ */
177
+ export declare function frontmatterStructureIssues(filePath: string, content: string, fm: Frontmatter, surface: FrontmatterSurface): PromptCiIssue[];
178
+ //# sourceMappingURL=ai-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../src/ai-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI3D,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAMD,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,CAAC;AAExD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAQhF;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS7F;AAaD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAM,EAAqB,GAAG,MAAM,EAAE,CAc7G;AAmCD,oFAAoF;AACpF,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,uDAAuD;IACvD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,wCAAwC;IACxC,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,uDAAuD;IACvD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,6EAA6E;IAC7E,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,eAAe,CAAC;IACrD,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,kBAAkB,IAAI,aAAa,CAKlD;AAcD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,0FAA0F;AAC1F,eAAO,MAAM,2BAA2B,MAAM,CAAC;AA6B/C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEzD;AA2ID;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAM,GAClD,aAAa,CAwBf;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAO3F;AAED,iFAAiF;AACjF,eAAO,MAAM,aAAa,QAA8C,CAAC;AAEzE;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAID,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AA4FF;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA4H7D;AAED,6FAA6F;AAC7F,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAQ9D;AAID,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC,GAC9F,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,aAAa,CAOrF;AAED,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8FAA8F;IAC9F,qBAAqB,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAClD,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,kBAAkB,GAC1B,aAAa,EAAE,CA+DjB"}