intentpatch 0.0.0-stage → 0.1.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +452 -2
  3. package/dist/application/ports/analysis-rule.d.ts +23 -0
  4. package/dist/application/ports/analysis-rule.d.ts.map +1 -0
  5. package/dist/application/ports/analysis-rule.js +2 -0
  6. package/dist/application/ports/analysis-rule.js.map +1 -0
  7. package/dist/application/ports/change-impact-analyzer.d.ts +6 -0
  8. package/dist/application/ports/change-impact-analyzer.d.ts.map +1 -0
  9. package/dist/application/ports/change-impact-analyzer.js +2 -0
  10. package/dist/application/ports/change-impact-analyzer.js.map +1 -0
  11. package/dist/application/ports/change-source.d.ts +10 -0
  12. package/dist/application/ports/change-source.d.ts.map +1 -0
  13. package/dist/application/ports/change-source.js +2 -0
  14. package/dist/application/ports/change-source.js.map +1 -0
  15. package/dist/application/ports/code-structure-analyzer.d.ts +6 -0
  16. package/dist/application/ports/code-structure-analyzer.d.ts.map +1 -0
  17. package/dist/application/ports/code-structure-analyzer.js +2 -0
  18. package/dist/application/ports/code-structure-analyzer.js.map +1 -0
  19. package/dist/application/ports/code-structure-extractor.d.ts +33 -0
  20. package/dist/application/ports/code-structure-extractor.d.ts.map +1 -0
  21. package/dist/application/ports/code-structure-extractor.js +2 -0
  22. package/dist/application/ports/code-structure-extractor.js.map +1 -0
  23. package/dist/application/ports/file-snapshot-source.d.ts +10 -0
  24. package/dist/application/ports/file-snapshot-source.d.ts.map +1 -0
  25. package/dist/application/ports/file-snapshot-source.js +2 -0
  26. package/dist/application/ports/file-snapshot-source.js.map +1 -0
  27. package/dist/application/ports/module-reference-extractor.d.ts +13 -0
  28. package/dist/application/ports/module-reference-extractor.d.ts.map +1 -0
  29. package/dist/application/ports/module-reference-extractor.js +2 -0
  30. package/dist/application/ports/module-reference-extractor.js.map +1 -0
  31. package/dist/application/ports/project-file-source.d.ts +16 -0
  32. package/dist/application/ports/project-file-source.d.ts.map +1 -0
  33. package/dist/application/ports/project-file-source.js +2 -0
  34. package/dist/application/ports/project-file-source.js.map +1 -0
  35. package/dist/application/ports/source-symbol-extractor.d.ts +14 -0
  36. package/dist/application/ports/source-symbol-extractor.d.ts.map +1 -0
  37. package/dist/application/ports/source-symbol-extractor.js +2 -0
  38. package/dist/application/ports/source-symbol-extractor.js.map +1 -0
  39. package/dist/application/ports/symbol-change-analyzer.d.ts +6 -0
  40. package/dist/application/ports/symbol-change-analyzer.d.ts.map +1 -0
  41. package/dist/application/ports/symbol-change-analyzer.js +2 -0
  42. package/dist/application/ports/symbol-change-analyzer.js.map +1 -0
  43. package/dist/application/ports/test-change-analyzer.d.ts +6 -0
  44. package/dist/application/ports/test-change-analyzer.d.ts.map +1 -0
  45. package/dist/application/ports/test-change-analyzer.js +2 -0
  46. package/dist/application/ports/test-change-analyzer.js.map +1 -0
  47. package/dist/application/rules/change-budget-rule.d.ts +7 -0
  48. package/dist/application/rules/change-budget-rule.d.ts.map +1 -0
  49. package/dist/application/rules/change-budget-rule.js +42 -0
  50. package/dist/application/rules/change-budget-rule.js.map +1 -0
  51. package/dist/application/rules/duplicate-implementation-rule.d.ts +7 -0
  52. package/dist/application/rules/duplicate-implementation-rule.d.ts.map +1 -0
  53. package/dist/application/rules/duplicate-implementation-rule.js +20 -0
  54. package/dist/application/rules/duplicate-implementation-rule.js.map +1 -0
  55. package/dist/application/rules/expected-scope-rule.d.ts +7 -0
  56. package/dist/application/rules/expected-scope-rule.d.ts.map +1 -0
  57. package/dist/application/rules/expected-scope-rule.js +27 -0
  58. package/dist/application/rules/expected-scope-rule.js.map +1 -0
  59. package/dist/application/rules/missing-test-change-rule.d.ts +7 -0
  60. package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -0
  61. package/dist/application/rules/missing-test-change-rule.js +25 -0
  62. package/dist/application/rules/missing-test-change-rule.js.map +1 -0
  63. package/dist/application/rules/package-dependency-rule.d.ts +13 -0
  64. package/dist/application/rules/package-dependency-rule.d.ts.map +1 -0
  65. package/dist/application/rules/package-dependency-rule.js +174 -0
  66. package/dist/application/rules/package-dependency-rule.js.map +1 -0
  67. package/dist/application/rules/public-api-compatibility-rule.d.ts +7 -0
  68. package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -0
  69. package/dist/application/rules/public-api-compatibility-rule.js +92 -0
  70. package/dist/application/rules/public-api-compatibility-rule.js.map +1 -0
  71. package/dist/application/rules/public-api-removal-rule.d.ts +7 -0
  72. package/dist/application/rules/public-api-removal-rule.d.ts.map +1 -0
  73. package/dist/application/rules/public-api-removal-rule.js +45 -0
  74. package/dist/application/rules/public-api-removal-rule.js.map +1 -0
  75. package/dist/application/rules/single-implementation-abstraction-rule.d.ts +7 -0
  76. package/dist/application/rules/single-implementation-abstraction-rule.d.ts.map +1 -0
  77. package/dist/application/rules/single-implementation-abstraction-rule.js +20 -0
  78. package/dist/application/rules/single-implementation-abstraction-rule.js.map +1 -0
  79. package/dist/application/services/analyze-code-structure.d.ts +14 -0
  80. package/dist/application/services/analyze-code-structure.d.ts.map +1 -0
  81. package/dist/application/services/analyze-code-structure.js +113 -0
  82. package/dist/application/services/analyze-code-structure.js.map +1 -0
  83. package/dist/application/services/analyze-import-impact.d.ts +14 -0
  84. package/dist/application/services/analyze-import-impact.d.ts.map +1 -0
  85. package/dist/application/services/analyze-import-impact.js +142 -0
  86. package/dist/application/services/analyze-import-impact.js.map +1 -0
  87. package/dist/application/services/analyze-test-changes.d.ts +8 -0
  88. package/dist/application/services/analyze-test-changes.d.ts.map +1 -0
  89. package/dist/application/services/analyze-test-changes.js +41 -0
  90. package/dist/application/services/analyze-test-changes.js.map +1 -0
  91. package/dist/application/services/compare-source-symbols.d.ts +13 -0
  92. package/dist/application/services/compare-source-symbols.d.ts.map +1 -0
  93. package/dist/application/services/compare-source-symbols.js +103 -0
  94. package/dist/application/services/compare-source-symbols.js.map +1 -0
  95. package/dist/application/services/path-pattern.d.ts +3 -0
  96. package/dist/application/services/path-pattern.d.ts.map +1 -0
  97. package/dist/application/services/path-pattern.js +34 -0
  98. package/dist/application/services/path-pattern.js.map +1 -0
  99. package/dist/application/services/rule-engine.d.ts +9 -0
  100. package/dist/application/services/rule-engine.d.ts.map +1 -0
  101. package/dist/application/services/rule-engine.js +13 -0
  102. package/dist/application/services/rule-engine.js.map +1 -0
  103. package/dist/application/use-cases/analyze-changes.d.ts +28 -0
  104. package/dist/application/use-cases/analyze-changes.d.ts.map +1 -0
  105. package/dist/application/use-cases/analyze-changes.js +88 -0
  106. package/dist/application/use-cases/analyze-changes.js.map +1 -0
  107. package/dist/domain/change-contract.d.ts +33 -0
  108. package/dist/domain/change-contract.d.ts.map +1 -0
  109. package/dist/domain/change-contract.js +76 -0
  110. package/dist/domain/change-contract.js.map +1 -0
  111. package/dist/domain/change.d.ts +37 -0
  112. package/dist/domain/change.d.ts.map +1 -0
  113. package/dist/domain/change.js +61 -0
  114. package/dist/domain/change.js.map +1 -0
  115. package/dist/domain/code-structure.d.ts +38 -0
  116. package/dist/domain/code-structure.d.ts.map +1 -0
  117. package/dist/domain/code-structure.js +63 -0
  118. package/dist/domain/code-structure.js.map +1 -0
  119. package/dist/domain/finding.d.ts +24 -0
  120. package/dist/domain/finding.d.ts.map +1 -0
  121. package/dist/domain/finding.js +30 -0
  122. package/dist/domain/finding.js.map +1 -0
  123. package/dist/domain/impact.d.ts +45 -0
  124. package/dist/domain/impact.d.ts.map +1 -0
  125. package/dist/domain/impact.js +60 -0
  126. package/dist/domain/impact.js.map +1 -0
  127. package/dist/domain/report.d.ts +22 -0
  128. package/dist/domain/report.d.ts.map +1 -0
  129. package/dist/domain/report.js +2 -0
  130. package/dist/domain/report.js.map +1 -0
  131. package/dist/domain/symbol-change.d.ts +60 -0
  132. package/dist/domain/symbol-change.d.ts.map +1 -0
  133. package/dist/domain/symbol-change.js +79 -0
  134. package/dist/domain/symbol-change.js.map +1 -0
  135. package/dist/domain/test-change.d.ts +29 -0
  136. package/dist/domain/test-change.d.ts.map +1 -0
  137. package/dist/domain/test-change.js +35 -0
  138. package/dist/domain/test-change.js.map +1 -0
  139. package/dist/infrastructure/config/json-change-contract-loader.d.ts +6 -0
  140. package/dist/infrastructure/config/json-change-contract-loader.d.ts.map +1 -0
  141. package/dist/infrastructure/config/json-change-contract-loader.js +130 -0
  142. package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -0
  143. package/dist/infrastructure/filesystem/repository-path.d.ts +3 -0
  144. package/dist/infrastructure/filesystem/repository-path.d.ts.map +1 -0
  145. package/dist/infrastructure/filesystem/repository-path.js +11 -0
  146. package/dist/infrastructure/filesystem/repository-path.js.map +1 -0
  147. package/dist/infrastructure/git/diff-parser.d.ts +3 -0
  148. package/dist/infrastructure/git/diff-parser.d.ts.map +1 -0
  149. package/dist/infrastructure/git/diff-parser.js +124 -0
  150. package/dist/infrastructure/git/diff-parser.js.map +1 -0
  151. package/dist/infrastructure/git/git-change-source.d.ts +13 -0
  152. package/dist/infrastructure/git/git-change-source.d.ts.map +1 -0
  153. package/dist/infrastructure/git/git-change-source.js +43 -0
  154. package/dist/infrastructure/git/git-change-source.js.map +1 -0
  155. package/dist/infrastructure/git/git-file-snapshot-source.d.ts +14 -0
  156. package/dist/infrastructure/git/git-file-snapshot-source.d.ts.map +1 -0
  157. package/dist/infrastructure/git/git-file-snapshot-source.js +87 -0
  158. package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -0
  159. package/dist/infrastructure/git/git-project-file-source.d.ts +16 -0
  160. package/dist/infrastructure/git/git-project-file-source.d.ts.map +1 -0
  161. package/dist/infrastructure/git/git-project-file-source.js +113 -0
  162. package/dist/infrastructure/git/git-project-file-source.js.map +1 -0
  163. package/dist/infrastructure/git/untracked-file-collector.d.ts +4 -0
  164. package/dist/infrastructure/git/untracked-file-collector.d.ts.map +1 -0
  165. package/dist/infrastructure/git/untracked-file-collector.js +52 -0
  166. package/dist/infrastructure/git/untracked-file-collector.js.map +1 -0
  167. package/dist/infrastructure/process/command-runner.d.ts +17 -0
  168. package/dist/infrastructure/process/command-runner.d.ts.map +1 -0
  169. package/dist/infrastructure/process/command-runner.js +35 -0
  170. package/dist/infrastructure/process/command-runner.js.map +1 -0
  171. package/dist/infrastructure/typescript/parse-typescript-source.d.ts +11 -0
  172. package/dist/infrastructure/typescript/parse-typescript-source.d.ts.map +1 -0
  173. package/dist/infrastructure/typescript/parse-typescript-source.js +31 -0
  174. package/dist/infrastructure/typescript/parse-typescript-source.js.map +1 -0
  175. package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts +7 -0
  176. package/dist/infrastructure/typescript/typescript-code-structure-extractor.d.ts.map +1 -0
  177. package/dist/infrastructure/typescript/typescript-code-structure-extractor.js +80 -0
  178. package/dist/infrastructure/typescript/typescript-code-structure-extractor.js.map +1 -0
  179. package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts +7 -0
  180. package/dist/infrastructure/typescript/typescript-module-reference-extractor.d.ts.map +1 -0
  181. package/dist/infrastructure/typescript/typescript-module-reference-extractor.js +37 -0
  182. package/dist/infrastructure/typescript/typescript-module-reference-extractor.js.map +1 -0
  183. package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts +7 -0
  184. package/dist/infrastructure/typescript/typescript-symbol-extractor.d.ts.map +1 -0
  185. package/dist/infrastructure/typescript/typescript-symbol-extractor.js +206 -0
  186. package/dist/infrastructure/typescript/typescript-symbol-extractor.js.map +1 -0
  187. package/dist/presentation/analyze-repository.d.ts +10 -0
  188. package/dist/presentation/analyze-repository.d.ts.map +1 -0
  189. package/dist/presentation/analyze-repository.js +55 -0
  190. package/dist/presentation/analyze-repository.js.map +1 -0
  191. package/dist/presentation/cli/arguments.d.ts +26 -0
  192. package/dist/presentation/cli/arguments.d.ts.map +1 -0
  193. package/dist/presentation/cli/arguments.js +120 -0
  194. package/dist/presentation/cli/arguments.js.map +1 -0
  195. package/dist/presentation/cli/failure-policy.d.ts +3 -0
  196. package/dist/presentation/cli/failure-policy.d.ts.map +1 -0
  197. package/dist/presentation/cli/failure-policy.js +5 -0
  198. package/dist/presentation/cli/failure-policy.js.map +1 -0
  199. package/dist/presentation/cli/main.d.ts +3 -0
  200. package/dist/presentation/cli/main.d.ts.map +1 -0
  201. package/dist/presentation/cli/main.js +71 -0
  202. package/dist/presentation/cli/main.js.map +1 -0
  203. package/dist/presentation/cli/report-file-writer.d.ts +3 -0
  204. package/dist/presentation/cli/report-file-writer.d.ts.map +1 -0
  205. package/dist/presentation/cli/report-file-writer.js +9 -0
  206. package/dist/presentation/cli/report-file-writer.js.map +1 -0
  207. package/dist/presentation/cli/report-formatter.d.ts +5 -0
  208. package/dist/presentation/cli/report-formatter.d.ts.map +1 -0
  209. package/dist/presentation/cli/report-formatter.js +14 -0
  210. package/dist/presentation/cli/report-formatter.js.map +1 -0
  211. package/dist/presentation/cli/text-report.d.ts +3 -0
  212. package/dist/presentation/cli/text-report.d.ts.map +1 -0
  213. package/dist/presentation/cli/text-report.js +151 -0
  214. package/dist/presentation/cli/text-report.js.map +1 -0
  215. package/dist/presentation/github/action-inputs.d.ts +14 -0
  216. package/dist/presentation/github/action-inputs.d.ts.map +1 -0
  217. package/dist/presentation/github/action-inputs.js +24 -0
  218. package/dist/presentation/github/action-inputs.js.map +1 -0
  219. package/dist/presentation/github/action-main.d.ts +3 -0
  220. package/dist/presentation/github/action-main.d.ts.map +1 -0
  221. package/dist/presentation/github/action-main.js +20 -0
  222. package/dist/presentation/github/action-main.js.map +1 -0
  223. package/dist/presentation/github/action-runtime.d.ts +22 -0
  224. package/dist/presentation/github/action-runtime.d.ts.map +1 -0
  225. package/dist/presentation/github/action-runtime.js +58 -0
  226. package/dist/presentation/github/action-runtime.js.map +1 -0
  227. package/dist/presentation/github/comparison.d.ts +11 -0
  228. package/dist/presentation/github/comparison.d.ts.map +1 -0
  229. package/dist/presentation/github/comparison.js +35 -0
  230. package/dist/presentation/github/comparison.js.map +1 -0
  231. package/dist/presentation/github/markdown-summary.d.ts +4 -0
  232. package/dist/presentation/github/markdown-summary.d.ts.map +1 -0
  233. package/dist/presentation/github/markdown-summary.js +47 -0
  234. package/dist/presentation/github/markdown-summary.js.map +1 -0
  235. package/dist/presentation/github/run-action.d.ts +7 -0
  236. package/dist/presentation/github/run-action.d.ts.map +1 -0
  237. package/dist/presentation/github/run-action.js +81 -0
  238. package/dist/presentation/github/run-action.js.map +1 -0
  239. package/dist/presentation/html/html-report.d.ts +4 -0
  240. package/dist/presentation/html/html-report.d.ts.map +1 -0
  241. package/dist/presentation/html/html-report.js +362 -0
  242. package/dist/presentation/html/html-report.js.map +1 -0
  243. package/package.json +52 -4
@@ -0,0 +1,362 @@
1
+ /** ChangeReport를 외부 리소스가 필요 없는 정적 HTML 문서로 변환한다. */
2
+ export function formatHtmlReport(report) {
3
+ const target = report.target.headRef === undefined
4
+ ? `${report.target.baseRef} → working tree`
5
+ : `${report.target.baseRef} → ${report.target.headRef}`;
6
+ const newDependencies = report.findings.items.filter((finding) => finding.ruleId.startsWith("dependency/new-")).length;
7
+ const riskyApiChanges = report.findings.items.filter((finding) => finding.ruleId.startsWith("api/")).length;
8
+ return `<!doctype html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="utf-8">
12
+ <meta name="viewport" content="width=device-width, initial-scale=1">
13
+ <meta name="color-scheme" content="dark">
14
+ <title>IntentPatch · Change Report</title>
15
+ <style>${styles}</style>
16
+ </head>
17
+ <body>
18
+ <main class="shell">
19
+ <header class="hero">
20
+ <div>
21
+ <p class="eyebrow">IntentPatch / deterministic analysis</p>
22
+ <h1>Agent Change Report</h1>
23
+ <p class="target">${escapeHtml(target)}</p>
24
+ </div>
25
+ <div class="report-state ${report.findings.summary.total === 0 ? "clear" : "attention"}">
26
+ <span>${report.findings.summary.total === 0 ? "Clear" : "Review"}</span>
27
+ <strong>${report.findings.summary.total} findings</strong>
28
+ </div>
29
+ </header>
30
+
31
+ ${renderIntent(report.contract)}
32
+ ${renderSummary(report, newDependencies, riskyApiChanges)}
33
+ ${renderSeverityBar(report)}
34
+ ${renderContract(report.contract)}
35
+ ${renderImpact(report.impact.changedModules, report.impact.impactedFiles)}
36
+ ${renderFindings(report.findings.items)}
37
+ ${renderTestCoverage(report.testChanges.sourceCoverage)}
38
+ ${renderFiles(report.changes.files)}
39
+ ${renderSymbols(report.symbolChanges.changes)}
40
+ ${renderAnalysisNotes(report)}
41
+
42
+ <footer>
43
+ <span>IntentPatch</span>
44
+ <span>Evidence over claims · LLM optional</span>
45
+ </footer>
46
+ </main>
47
+ </body>
48
+ </html>
49
+ `;
50
+ }
51
+ function renderIntent(contract) {
52
+ if (contract?.intent === undefined) {
53
+ return "";
54
+ }
55
+ return `<section class="intent" aria-label="Change intent">
56
+ <span>REQUEST</span>
57
+ <p>${escapeHtml(contract.intent)}</p>
58
+ </section>`;
59
+ }
60
+ function renderSummary(report, newDependencies, riskyApiChanges) {
61
+ const { summary } = report.changes;
62
+ const metrics = [
63
+ ["Files changed", summary.filesChanged, "files"],
64
+ ["Lines changed", `+${summary.additions} / -${summary.deletions}`, "diff"],
65
+ ["Changed symbols", report.symbolChanges.summary.total, "symbols"],
66
+ ["Direct impact", report.impact.summary.directDependents, "dependents"],
67
+ ["Transitive impact", report.impact.summary.transitiveDependents, "dependents"],
68
+ ["Tests changed", report.testChanges.summary.testsChanged, "tests"],
69
+ ["Missing tests", report.testChanges.summary.sourceFilesWithoutTestChanges, "signals"],
70
+ ["New dependencies", newDependencies, "packages"],
71
+ ["Risky API changes", riskyApiChanges, "public APIs"],
72
+ [
73
+ "Structure signals",
74
+ report.codeStructure.summary.duplicateCandidates +
75
+ report.codeStructure.summary.singleImplementationAbstractions,
76
+ "review candidates",
77
+ ],
78
+ ];
79
+ return `<section class="metrics" aria-label="Change summary">
80
+ ${metrics
81
+ .map(([label, value, unit]) => `<article class="metric">
82
+ <span>${escapeHtml(label)}</span>
83
+ <strong>${escapeHtml(String(value))}</strong>
84
+ <small>${escapeHtml(unit)}</small>
85
+ </article>`)
86
+ .join("\n ")}
87
+ </section>`;
88
+ }
89
+ function renderSeverityBar(report) {
90
+ const { bySeverity } = report.findings.summary;
91
+ return `<section class="severity-bar" aria-label="Finding severity summary">
92
+ <span class="severity high"><i></i>High <strong>${bySeverity.high}</strong></span>
93
+ <span class="severity medium"><i></i>Medium <strong>${bySeverity.medium}</strong></span>
94
+ <span class="severity low"><i></i>Low <strong>${bySeverity.low}</strong></span>
95
+ </section>`;
96
+ }
97
+ function renderContract(contract) {
98
+ if (contract === undefined) {
99
+ return "";
100
+ }
101
+ const budgets = [
102
+ contract.scope.maxFiles === undefined ? undefined : `${contract.scope.maxFiles} files`,
103
+ contract.scope.maxLines === undefined ? undefined : `${contract.scope.maxLines} lines`,
104
+ ].filter((value) => value !== undefined);
105
+ const testPolicy = contract.tests;
106
+ const rows = [
107
+ ["Expected", contract.scope.include.join(", ") || "Not configured"],
108
+ ["Allowed", contract.scope.allow.join(", ") || "None"],
109
+ ["Budget", budgets.join(" · ") || "Not configured"],
110
+ ...(testPolicy === undefined
111
+ ? []
112
+ : [
113
+ ["Test sources", testPolicy.requireFor.join(", ")],
114
+ ["Test files", testPolicy.include.join(", ")],
115
+ ["Test excludes", testPolicy.exclude.join(", ") || "None"],
116
+ ]),
117
+ ];
118
+ return renderSection("Change contract", "Declared boundaries", `<dl class="contract-grid">${rows
119
+ .map(([label, value]) => `<div><dt>${escapeHtml(label ?? "")}</dt><dd>${escapeHtml(value ?? "")}</dd></div>`)
120
+ .join("")}</dl>`);
121
+ }
122
+ function renderFindings(findings) {
123
+ const body = findings.length === 0
124
+ ? renderEmpty("No potential issues were detected by the enabled rules.")
125
+ : `<div class="finding-list">${findings
126
+ .map((finding) => `<article class="finding ${finding.severity}">
127
+ <div class="finding-heading">
128
+ <span>${escapeHtml(finding.severity)}</span>
129
+ <div><h3>${escapeHtml(finding.title)}</h3><code>${escapeHtml(finding.file)}</code></div>
130
+ </div>
131
+ <p>${escapeHtml(finding.description)}</p>
132
+ <details><summary>${escapeHtml(finding.ruleId)} · evidence</summary>
133
+ <dl>${Object.entries(finding.evidence)
134
+ .map(([key, value]) => `<div><dt>${escapeHtml(key)}</dt><dd>${escapeHtml(String(value))}</dd></div>`)
135
+ .join("")}</dl>
136
+ </details>
137
+ </article>`)
138
+ .join("")}</div>`;
139
+ return renderSection("Potential issues", `${findings.length} findings`, body);
140
+ }
141
+ function renderImpact(changedModules, files) {
142
+ const body = files.length === 0
143
+ ? renderEmpty("No dependent files were reached from changed modules.")
144
+ : `${renderImpactGraph(changedModules, files)}
145
+ <div class="impact-list">${files
146
+ .map((file) => `<article>
147
+ <span class="distance">${file.distance === 1 ? "DIRECT" : `${file.distance} HOPS`}</span>
148
+ <code>${escapeHtml(file.path)}</code>
149
+ <small>from ${escapeHtml(file.changedModules.join(", "))}</small>
150
+ </article>`)
151
+ .join("")}</div>`;
152
+ return renderSection("Impact reach", `${files.length} affected files`, body);
153
+ }
154
+ function renderImpactGraph(changedModules, impactedFiles) {
155
+ const rowHeight = 64;
156
+ const top = 54;
157
+ const nodeHeight = 42;
158
+ const height = Math.max(changedModules.length, impactedFiles.length) * rowHeight + 76;
159
+ const moduleIndexes = new Map(changedModules.map((path, index) => [path, index]));
160
+ const edges = impactedFiles.flatMap((file, fileIndex) => file.changedModules.flatMap((module) => {
161
+ const moduleIndex = moduleIndexes.get(module);
162
+ if (moduleIndex === undefined) {
163
+ return [];
164
+ }
165
+ const startY = top + moduleIndex * rowHeight + nodeHeight / 2;
166
+ const endY = top + fileIndex * rowHeight + nodeHeight / 2;
167
+ return [
168
+ `<path class="graph-edge ${file.distance === 1 ? "direct" : "transitive"}" d="M 390 ${startY} C 480 ${startY}, 520 ${endY}, 610 ${endY}" />`,
169
+ ];
170
+ }));
171
+ return `<div class="impact-graph-wrap">
172
+ <svg class="impact-graph" viewBox="0 0 1000 ${height}" role="img" aria-label="Dependency impact graph">
173
+ <defs><marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="5" markerHeight="5" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs>
174
+ <text class="graph-column-label" x="40" y="24">CHANGED MODULES</text>
175
+ <text class="graph-column-label" x="610" y="24">AFFECTED FILES</text>
176
+ ${edges.join("\n ")}
177
+ ${changedModules
178
+ .map((path, index) => renderGraphNode(path, 40, top + index * rowHeight, "changed"))
179
+ .join("\n ")}
180
+ ${impactedFiles
181
+ .map((file, index) => renderGraphNode(file.path, 610, top + index * rowHeight, file.distance === 1 ? "direct" : "transitive"))
182
+ .join("\n ")}
183
+ </svg>
184
+ </div>`;
185
+ }
186
+ function renderGraphNode(path, x, y, kind) {
187
+ return `<g class="graph-node ${kind}"><title>${escapeHtml(path)}</title><rect x="${x}" y="${y}" width="350" height="42" rx="9"></rect><text x="${x + 16}" y="${y + 26}">${escapeHtml(shortenPath(path))}</text></g>`;
188
+ }
189
+ function shortenPath(path) {
190
+ const maximumLength = 46;
191
+ if (path.length <= maximumLength) {
192
+ return path;
193
+ }
194
+ const retainedLength = Math.floor((maximumLength - 1) / 2);
195
+ return `${path.slice(0, retainedLength)}…${path.slice(-retainedLength)}`;
196
+ }
197
+ function renderTestCoverage(coverage) {
198
+ if (coverage.length === 0) {
199
+ return "";
200
+ }
201
+ return renderSection("Test change signals", `${coverage.length} source files checked`, `<div class="table-wrap"><table>
202
+ <thead><tr><th>Source</th><th>Change</th><th>Matching changed tests</th></tr></thead>
203
+ <tbody>${coverage
204
+ .map((item) => `<tr>
205
+ <td><code>${escapeHtml(item.sourcePath)}</code></td>
206
+ <td>${renderTag(item.sourceChangeKind)}</td>
207
+ <td class="${item.matchingTests.length === 0 ? "missing" : "matched"}">${item.matchingTests.length === 0
208
+ ? "No matching change"
209
+ : item.matchingTests.map((path) => `<code>${escapeHtml(path)}</code>`).join("<br>")}</td>
210
+ </tr>`)
211
+ .join("")}</tbody>
212
+ </table></div>`);
213
+ }
214
+ function renderFiles(files) {
215
+ const body = files.length === 0
216
+ ? renderEmpty("No changed files were found for this comparison.")
217
+ : `<div class="table-wrap"><table>
218
+ <thead><tr><th>File</th><th>Status</th><th>Line delta</th></tr></thead>
219
+ <tbody>${files
220
+ .map((file) => `<tr>
221
+ <td><code>${escapeHtml(file.previousPath === undefined ? file.path : `${file.previousPath} → ${file.path}`)}</code></td>
222
+ <td>${renderTag(file.kind)}</td>
223
+ <td>${escapeHtml(formatLineDelta(file.lines))}</td>
224
+ </tr>`)
225
+ .join("")}</tbody>
226
+ </table></div>`;
227
+ return renderSection("Changed files", `${files.length} files`, body);
228
+ }
229
+ function renderSymbols(changes) {
230
+ if (changes.length === 0) {
231
+ return "";
232
+ }
233
+ return renderSection("Changed symbols", `${changes.length} declarations`, `<div class="table-wrap"><table>
234
+ <thead><tr><th>Symbol</th><th>Kind</th><th>Change</th><th>Location</th></tr></thead>
235
+ <tbody>${changes
236
+ .map((change) => {
237
+ const line = change.afterLine ?? change.beforeLine;
238
+ const location = line === undefined ? change.path : `${change.path}:${line}`;
239
+ return `<tr>
240
+ <td><strong>${escapeHtml(change.name)}</strong></td>
241
+ <td>${escapeHtml(change.symbolKind)}</td>
242
+ <td>${renderTag(change.changeKind)}</td>
243
+ <td><code>${escapeHtml(location)}</code></td>
244
+ </tr>`;
245
+ })
246
+ .join("")}</tbody>
247
+ </table></div>`);
248
+ }
249
+ function renderAnalysisNotes(report) {
250
+ const notes = [
251
+ ...report.symbolChanges.issues.map((issue) => `Symbol · ${issue.path} · ${issue.reason}`),
252
+ ...report.impact.issues.map((issue) => `Impact · ${issue.path} · ${issue.reason}`),
253
+ ...report.codeStructure.issues.map((issue) => `Structure · ${issue.path} · ${issue.reason}`),
254
+ ...report.impact.unresolvedReferences.map((reference) => `Import · ${reference.importer} → ${reference.specifier}`),
255
+ ];
256
+ if (notes.length === 0) {
257
+ return "";
258
+ }
259
+ return renderSection("Analysis notes", `${notes.length} uncertainty signals`, `<ul class="notes">${notes.map((note) => `<li>${escapeHtml(note)}</li>`).join("")}</ul>`);
260
+ }
261
+ function renderSection(title, eyebrow, body) {
262
+ return `<section class="panel">
263
+ <div class="section-heading"><div><span>${escapeHtml(eyebrow)}</span><h2>${escapeHtml(title)}</h2></div></div>
264
+ ${body}
265
+ </section>`;
266
+ }
267
+ function renderEmpty(message) {
268
+ return `<p class="empty">${escapeHtml(message)}</p>`;
269
+ }
270
+ function renderTag(value) {
271
+ return `<span class="tag">${escapeHtml(value)}</span>`;
272
+ }
273
+ function formatLineDelta(lines) {
274
+ switch (lines.kind) {
275
+ case "measured":
276
+ return `+${lines.additions} / -${lines.deletions}`;
277
+ case "binary":
278
+ return "Binary";
279
+ case "unavailable":
280
+ return `Not measured · ${lines.reason}`;
281
+ }
282
+ }
283
+ function escapeHtml(value) {
284
+ return value.replace(/[&<>"']/gu, (character) => htmlEntities[character] ?? character);
285
+ }
286
+ const htmlEntities = {
287
+ "&": "&amp;",
288
+ "<": "&lt;",
289
+ ">": "&gt;",
290
+ '"': "&quot;",
291
+ "'": "&#39;",
292
+ };
293
+ const styles = `
294
+ :root { color-scheme: dark; --bg:#080a0f; --panel:#10141d; --panel-2:#151b26; --line:#252d3b; --text:#f4f6fb; --muted:#8d98aa; --cyan:#58e6d9; --violet:#a890ff; --high:#ff647c; --medium:#ffb45b; --low:#6d8cff; }
295
+ * { box-sizing:border-box; }
296
+ body { margin:0; background:radial-gradient(circle at 15% 0%,#172535 0,transparent 32rem),var(--bg); color:var(--text); font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
297
+ .shell { width:min(1180px,calc(100% - 40px)); margin:0 auto; padding:64px 0 40px; }
298
+ .hero { display:flex; align-items:flex-end; justify-content:space-between; gap:32px; margin-bottom:28px; }
299
+ .eyebrow,.section-heading span { color:var(--cyan); font-size:12px; font-weight:800; letter-spacing:.16em; text-transform:uppercase; }
300
+ h1 { margin:8px 0 10px; font-size:clamp(36px,7vw,72px); line-height:.98; letter-spacing:-.055em; }
301
+ .target { margin:0; color:var(--muted); font:14px ui-monospace,SFMono-Regular,Menlo,monospace; }
302
+ .report-state { min-width:150px; padding:18px 20px; border:1px solid var(--line); border-radius:16px; background:rgba(16,20,29,.82); }
303
+ .report-state span { display:block; color:var(--muted); font-size:11px; letter-spacing:.14em; text-transform:uppercase; }
304
+ .report-state strong { display:block; margin-top:5px; font-size:19px; }
305
+ .report-state.attention { border-color:color-mix(in srgb,var(--medium) 55%,var(--line)); }
306
+ .report-state.clear { border-color:color-mix(in srgb,var(--cyan) 55%,var(--line)); }
307
+ .intent { display:grid; grid-template-columns:90px 1fr; gap:18px; align-items:start; padding:20px 22px; border:1px solid #29404b; border-radius:16px; background:linear-gradient(105deg,rgba(88,230,217,.1),rgba(168,144,255,.06)); }
308
+ .intent span { color:var(--cyan); font-size:11px; font-weight:800; letter-spacing:.14em; }
309
+ .intent p { margin:0; font-size:18px; font-weight:650; }
310
+ .metrics { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr)); gap:12px; margin:18px 0 12px; }
311
+ .metric { min-height:124px; padding:18px; border:1px solid var(--line); border-radius:16px; background:linear-gradient(145deg,var(--panel-2),var(--panel)); }
312
+ .metric span { display:block; color:var(--muted); font-size:12px; }
313
+ .metric strong { display:block; margin-top:14px; font-size:27px; letter-spacing:-.035em; }
314
+ .metric small { color:#5e6a7d; font-size:11px; text-transform:uppercase; letter-spacing:.08em; }
315
+ .severity-bar { display:flex; gap:20px; padding:14px 18px; border:1px solid var(--line); border-radius:14px; background:rgba(16,20,29,.78); }
316
+ .severity { display:flex; align-items:center; gap:7px; color:var(--muted); font-size:12px; text-transform:uppercase; letter-spacing:.08em; }
317
+ .severity i { width:7px; height:7px; border-radius:50%; background:currentColor; }
318
+ .severity strong { color:var(--text); }
319
+ .severity.high { color:var(--high); }.severity.medium { color:var(--medium); }.severity.low { color:var(--low); }
320
+ .panel { margin-top:18px; padding:24px; border:1px solid var(--line); border-radius:18px; background:rgba(16,20,29,.88); box-shadow:0 18px 70px rgba(0,0,0,.12); }
321
+ .section-heading { display:flex; align-items:center; justify-content:space-between; margin-bottom:20px; }
322
+ .section-heading span { color:var(--muted); font-size:10px; }
323
+ h2 { margin:5px 0 0; font-size:23px; letter-spacing:-.025em; }
324
+ h3 { margin:0; font-size:16px; }
325
+ .contract-grid { display:grid; grid-template-columns:repeat(2,1fr); gap:1px; overflow:hidden; padding:1px; border-radius:12px; background:var(--line); }
326
+ .contract-grid div { padding:16px; background:var(--panel-2); }
327
+ .contract-grid dt { color:var(--muted); font-size:11px; text-transform:uppercase; letter-spacing:.08em; }
328
+ .contract-grid dd { margin:7px 0 0; overflow-wrap:anywhere; font:13px ui-monospace,SFMono-Regular,Menlo,monospace; }
329
+ .finding-list { display:grid; gap:10px; }
330
+ .finding { padding:18px; border:1px solid var(--line); border-left:3px solid var(--low); border-radius:12px; background:var(--panel-2); }
331
+ .finding.high { border-left-color:var(--high); }.finding.medium { border-left-color:var(--medium); }
332
+ .finding-heading { display:flex; gap:13px; align-items:flex-start; }
333
+ .finding-heading>span { min-width:64px; padding:5px 7px; border-radius:7px; background:#232b39; color:var(--muted); font-size:10px; font-weight:800; text-align:center; text-transform:uppercase; }
334
+ .finding code { display:block; margin-top:5px; color:var(--muted); }
335
+ .finding p { margin:14px 0; color:#c3cad6; line-height:1.55; }
336
+ details { color:var(--muted); font-size:12px; } summary { cursor:pointer; }
337
+ details dl { display:grid; gap:7px; margin:12px 0 0; } details dl div { display:grid; grid-template-columns:150px 1fr; gap:12px; } details dt { color:#667287; } details dd { margin:0; overflow-wrap:anywhere; color:#aeb7c6; }
338
+ .impact-list { display:grid; grid-template-columns:repeat(2,1fr); gap:10px; }
339
+ .impact-list article { display:grid; grid-template-columns:70px 1fr; gap:5px 12px; padding:15px; border:1px solid var(--line); border-radius:11px; background:var(--panel-2); }
340
+ .impact-list .distance { grid-row:1/3; color:var(--violet); font-size:10px; font-weight:800; letter-spacing:.08em; }
341
+ .impact-list small { color:var(--muted); overflow-wrap:anywhere; }
342
+ .impact-graph-wrap { overflow-x:auto; margin-bottom:14px; border:1px solid var(--line); border-radius:12px; background:#0c1017; }
343
+ .impact-graph { display:block; width:100%; min-width:820px; height:auto; }
344
+ .graph-column-label { fill:#68758a; font:700 10px ui-monospace,SFMono-Regular,Menlo,monospace; letter-spacing:.12em; }
345
+ .graph-edge { fill:none; stroke:#56627a; stroke-width:1.5; marker-end:url(#arrow); }
346
+ #arrow path { fill:#7a879e; }
347
+ .graph-edge.direct { stroke:var(--cyan); }.graph-edge.transitive { stroke:var(--violet); stroke-dasharray:5 5; }
348
+ .graph-node rect { fill:#151b26; stroke:#303a4b; }.graph-node.changed rect { stroke:#537b7b; }.graph-node.direct rect { stroke:#3d716f; }.graph-node.transitive rect { stroke:#615787; }
349
+ .graph-node text { fill:#cbd5e5; font:12px ui-monospace,SFMono-Regular,Menlo,monospace; }
350
+ .table-wrap { overflow-x:auto; }
351
+ table { width:100%; border-collapse:collapse; font-size:13px; }
352
+ th { padding:10px 12px; border-bottom:1px solid var(--line); color:var(--muted); font-size:10px; letter-spacing:.1em; text-align:left; text-transform:uppercase; }
353
+ td { padding:14px 12px; border-bottom:1px solid #202735; vertical-align:top; } tbody tr:last-child td { border-bottom:0; }
354
+ code { overflow-wrap:anywhere; color:#c8d2e2; font:12px ui-monospace,SFMono-Regular,Menlo,monospace; }
355
+ .tag { display:inline-block; padding:4px 7px; border:1px solid #344052; border-radius:6px; color:#aeb9ca; font-size:10px; font-weight:750; letter-spacing:.06em; text-transform:uppercase; }
356
+ .missing { color:var(--medium); }.matched { color:var(--cyan); }
357
+ .notes { display:grid; gap:8px; margin:0; padding-left:18px; color:#b9c2d0; }
358
+ .empty { margin:0; padding:28px; border:1px dashed #303949; border-radius:12px; color:var(--muted); text-align:center; }
359
+ footer { display:flex; justify-content:space-between; padding:26px 4px 0; color:#536074; font-size:11px; letter-spacing:.05em; text-transform:uppercase; }
360
+ @media (max-width:760px) { .shell{width:min(100% - 24px,1180px);padding-top:32px}.hero{align-items:flex-start;flex-direction:column}.metrics{grid-template-columns:repeat(2,1fr)}.contract-grid,.impact-list{grid-template-columns:1fr}.severity-bar{flex-wrap:wrap}.panel{padding:18px}.intent{grid-template-columns:1fr}.report-state{width:100%} }
361
+ `;
362
+ //# sourceMappingURL=html-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-report.js","sourceRoot":"","sources":["../../../src/presentation/html/html-report.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,54 @@
1
1
  {
2
2
  "name": "intentpatch",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Evidence-based change scope analysis for AI-authored code patches.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/xx2xxjaeil/intent-patch.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/xx2xxjaeil/intent-patch/issues"
12
+ },
13
+ "homepage": "https://github.com/xx2xxjaeil/intent-patch#readme",
14
+ "keywords": [
15
+ "ai-coding-agent",
16
+ "code-review",
17
+ "git-diff",
18
+ "static-analysis"
19
+ ],
20
+ "type": "module",
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
25
+ ],
26
+ "bin": {
27
+ "intentpatch": "./dist/presentation/cli/main.js"
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.build.json",
31
+ "build:action": "esbuild src/presentation/github/action-main.ts --bundle --platform=node --target=node24 --format=cjs --outfile=action-dist/index.cjs --minify",
32
+ "check": "npm run typecheck && npm run lint && npm run test && npm run check:action",
33
+ "check:action": "npm run build:action && git diff --exit-code -- action-dist/index.cjs",
34
+ "dev": "node --import tsx src/presentation/cli/main.ts",
35
+ "lint": "biome check .",
36
+ "lint:fix": "biome check --write .",
37
+ "prepack": "npm run build",
38
+ "test": "node --import tsx --test tests/**/*.test.ts",
39
+ "test:watch": "node --import tsx --test --watch tests/**/*.test.ts",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "dependencies": {
46
+ "typescript": "^5.9.3"
47
+ },
48
+ "devDependencies": {
49
+ "@biomejs/biome": "^2.2.4",
50
+ "@types/node": "^20.19.17",
51
+ "esbuild": "^0.28.2",
52
+ "tsx": "^4.20.5"
53
+ }
54
+ }