@stilhq/core 0.6.0 → 0.6.1

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 (154) hide show
  1. package/dist/changeset/apply.d.ts +11 -0
  2. package/dist/changeset/apply.d.ts.map +1 -0
  3. package/dist/changeset/apply.js +239 -0
  4. package/dist/changeset/apply.js.map +1 -0
  5. package/dist/changeset/ci-report.d.ts +25 -0
  6. package/dist/changeset/ci-report.d.ts.map +1 -0
  7. package/dist/changeset/ci-report.js +206 -0
  8. package/dist/changeset/ci-report.js.map +1 -0
  9. package/dist/changeset/classify.d.ts +77 -0
  10. package/dist/changeset/classify.d.ts.map +1 -0
  11. package/dist/changeset/classify.js +285 -0
  12. package/dist/changeset/classify.js.map +1 -0
  13. package/dist/changeset/cli-gate.d.ts +46 -0
  14. package/dist/changeset/cli-gate.d.ts.map +1 -0
  15. package/dist/changeset/cli-gate.js +409 -0
  16. package/dist/changeset/cli-gate.js.map +1 -0
  17. package/dist/changeset/conflict.d.ts +11 -0
  18. package/dist/changeset/conflict.d.ts.map +1 -0
  19. package/dist/changeset/conflict.js +130 -0
  20. package/dist/changeset/conflict.js.map +1 -0
  21. package/dist/changeset/diff-components.d.ts +80 -0
  22. package/dist/changeset/diff-components.d.ts.map +1 -0
  23. package/dist/changeset/diff-components.js +264 -0
  24. package/dist/changeset/diff-components.js.map +1 -0
  25. package/dist/changeset/diff-text.d.ts +66 -0
  26. package/dist/changeset/diff-text.d.ts.map +1 -0
  27. package/dist/changeset/diff-text.js +284 -0
  28. package/dist/changeset/diff-text.js.map +1 -0
  29. package/dist/changeset/diff-tokens.d.ts +63 -0
  30. package/dist/changeset/diff-tokens.d.ts.map +1 -0
  31. package/dist/changeset/diff-tokens.js +483 -0
  32. package/dist/changeset/diff-tokens.js.map +1 -0
  33. package/dist/changeset/impact.d.ts +31 -0
  34. package/dist/changeset/impact.d.ts.map +1 -0
  35. package/dist/changeset/impact.js +188 -0
  36. package/dist/changeset/impact.js.map +1 -0
  37. package/dist/changeset/pr-body.d.ts +33 -0
  38. package/dist/changeset/pr-body.d.ts.map +1 -0
  39. package/dist/changeset/pr-body.js +421 -0
  40. package/dist/changeset/pr-body.js.map +1 -0
  41. package/dist/changeset/quality-gate.d.ts +10 -0
  42. package/dist/changeset/quality-gate.d.ts.map +1 -0
  43. package/dist/changeset/quality-gate.js +207 -0
  44. package/dist/changeset/quality-gate.js.map +1 -0
  45. package/dist/changeset/rollback.d.ts +19 -0
  46. package/dist/changeset/rollback.d.ts.map +1 -0
  47. package/dist/changeset/rollback.js +163 -0
  48. package/dist/changeset/rollback.js.map +1 -0
  49. package/dist/ci/template-generator.d.ts +22 -0
  50. package/dist/ci/template-generator.d.ts.map +1 -0
  51. package/dist/ci/template-generator.js +215 -0
  52. package/dist/ci/template-generator.js.map +1 -0
  53. package/dist/gate/engine.d.ts +20 -0
  54. package/dist/gate/engine.d.ts.map +1 -0
  55. package/dist/gate/engine.js +109 -0
  56. package/dist/gate/engine.js.map +1 -0
  57. package/dist/gate/types.d.ts +76 -0
  58. package/dist/gate/types.d.ts.map +1 -0
  59. package/dist/gate/types.js +6 -0
  60. package/dist/gate/types.js.map +1 -0
  61. package/dist/index.d.ts +54 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +144 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/pr/comment-manager.d.ts +33 -0
  66. package/dist/pr/comment-manager.d.ts.map +1 -0
  67. package/dist/pr/comment-manager.js +137 -0
  68. package/dist/pr/comment-manager.js.map +1 -0
  69. package/dist/pr/conflict.d.ts +34 -0
  70. package/dist/pr/conflict.d.ts.map +1 -0
  71. package/dist/pr/conflict.js +127 -0
  72. package/dist/pr/conflict.js.map +1 -0
  73. package/dist/pr/generator.d.ts +70 -0
  74. package/dist/pr/generator.d.ts.map +1 -0
  75. package/dist/pr/generator.js +241 -0
  76. package/dist/pr/generator.js.map +1 -0
  77. package/dist/pr/github-api.d.ts +122 -0
  78. package/dist/pr/github-api.d.ts.map +1 -0
  79. package/dist/pr/github-api.js +269 -0
  80. package/dist/pr/github-api.js.map +1 -0
  81. package/dist/report/changeset-report.d.ts +10 -0
  82. package/dist/report/changeset-report.d.ts.map +1 -0
  83. package/dist/report/changeset-report.js +14 -0
  84. package/dist/report/changeset-report.js.map +1 -0
  85. package/dist/report/classification-report.d.ts +12 -0
  86. package/dist/report/classification-report.d.ts.map +1 -0
  87. package/dist/report/classification-report.js +157 -0
  88. package/dist/report/classification-report.js.map +1 -0
  89. package/dist/report/impact-report.d.ts +10 -0
  90. package/dist/report/impact-report.d.ts.map +1 -0
  91. package/dist/report/impact-report.js +47 -0
  92. package/dist/report/impact-report.js.map +1 -0
  93. package/dist/report/summary-report.d.ts +10 -0
  94. package/dist/report/summary-report.d.ts.map +1 -0
  95. package/dist/report/summary-report.js +96 -0
  96. package/dist/report/summary-report.js.map +1 -0
  97. package/dist/report/writer.d.ts +17 -0
  98. package/dist/report/writer.d.ts.map +1 -0
  99. package/dist/report/writer.js +41 -0
  100. package/dist/report/writer.js.map +1 -0
  101. package/dist/rules/engine.d.ts +46 -0
  102. package/dist/rules/engine.d.ts.map +1 -0
  103. package/dist/rules/engine.js +200 -0
  104. package/dist/rules/engine.js.map +1 -0
  105. package/dist/rules/index.d.ts +10 -0
  106. package/dist/rules/index.d.ts.map +1 -0
  107. package/dist/rules/index.js +25 -0
  108. package/dist/rules/index.js.map +1 -0
  109. package/dist/rules/loader.d.ts +20 -0
  110. package/dist/rules/loader.d.ts.map +1 -0
  111. package/dist/rules/loader.js +93 -0
  112. package/dist/rules/loader.js.map +1 -0
  113. package/dist/rules/packs/core.d.ts +14 -0
  114. package/dist/rules/packs/core.d.ts.map +1 -0
  115. package/dist/rules/packs/core.js +377 -0
  116. package/dist/rules/packs/core.js.map +1 -0
  117. package/dist/rules/schema.d.ts +12 -0
  118. package/dist/rules/schema.d.ts.map +1 -0
  119. package/dist/rules/schema.js +149 -0
  120. package/dist/rules/schema.js.map +1 -0
  121. package/dist/rules/types.d.ts +86 -0
  122. package/dist/rules/types.d.ts.map +1 -0
  123. package/dist/rules/types.js +9 -0
  124. package/dist/rules/types.js.map +1 -0
  125. package/dist/types/changeset.d.ts +509 -0
  126. package/dist/types/changeset.d.ts.map +1 -0
  127. package/dist/types/changeset.js +14 -0
  128. package/dist/types/changeset.js.map +1 -0
  129. package/dist/w3c/__tests__/fixtures/tokens-studio-export.json +58 -0
  130. package/dist/w3c/parser.d.ts +44 -0
  131. package/dist/w3c/parser.d.ts.map +1 -0
  132. package/dist/w3c/parser.js +146 -0
  133. package/dist/w3c/parser.js.map +1 -0
  134. package/dist/w3c/types.d.ts +31 -0
  135. package/dist/w3c/types.d.ts.map +1 -0
  136. package/dist/w3c/types.js +7 -0
  137. package/dist/w3c/types.js.map +1 -0
  138. package/dist/w3c/validator.d.ts +14 -0
  139. package/dist/w3c/validator.d.ts.map +1 -0
  140. package/dist/w3c/validator.js +162 -0
  141. package/dist/w3c/validator.js.map +1 -0
  142. package/package.json +3 -2
  143. package/templates/stil-quality-gate.yml +122 -0
  144. package/templates/workspace/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  145. package/templates/workspace/.github/workflows/stil-gate.yml +42 -0
  146. package/templates/workspace/.github/workflows/stil-preview.yml +29 -0
  147. package/templates/workspace/.stil/components/snapshots/.gitkeep +0 -0
  148. package/templates/workspace/.stil/reports/.gitkeep +0 -0
  149. package/templates/workspace/.stil/rules/.gitkeep +0 -0
  150. package/templates/workspace/.stil/text/snapshots/.gitkeep +0 -0
  151. package/templates/workspace/.stil/tokens/config/mapping.json +16 -0
  152. package/templates/workspace/.stil/tokens/raw/.gitkeep +0 -0
  153. package/templates/workspace/README.md +40 -0
  154. package/templates/workspace/package.json +19 -0
@@ -0,0 +1,11 @@
1
+ import type { ChangeSet, ApplyOptions, ApplyResult } from "../types/changeset";
2
+ /**
3
+ * ChangeSet から ApplyResult を生成する。
4
+ *
5
+ * - classification が blocked → status: 'blocked'
6
+ * - classification が review → Apply 可能だが確認メッセージ付き
7
+ * - dryRun: true → status: 'dry-run-complete'
8
+ * - maxItems 超過 → status: 'blocked'
9
+ */
10
+ export declare function generateApplyPlan(changeset: ChangeSet, options: ApplyOptions): ApplyResult;
11
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/changeset/apply.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,SAAS,EAIT,YAAY,EACZ,WAAW,EAKZ,MAAM,oBAAoB,CAAC;AAa5B;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAY,GACpB,WAAW,CAgEb"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ // apply.ts — Apply Plan Generator
3
+ //
4
+ // ChangeSet から ApplyPlan を生成するロジック。
5
+ // ApplyPlan は「何を、どの順で適用するか」のステップリスト。
6
+ //
7
+ // ARCHITECTURE_V1.md Section 4 に基づく安全ガード:
8
+ // - dry-run 必須化
9
+ // - 大量変更ブロック
10
+ // - before 値記録(rollback 用)
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.generateApplyPlan = generateApplyPlan;
13
+ const rollback_1 = require("./rollback");
14
+ // ========================================
15
+ // Constants
16
+ // ========================================
17
+ const DEFAULT_MAX_ITEMS = 50;
18
+ // ========================================
19
+ // Core: generateApplyPlan
20
+ // ========================================
21
+ /**
22
+ * ChangeSet から ApplyResult を生成する。
23
+ *
24
+ * - classification が blocked → status: 'blocked'
25
+ * - classification が review → Apply 可能だが確認メッセージ付き
26
+ * - dryRun: true → status: 'dry-run-complete'
27
+ * - maxItems 超過 → status: 'blocked'
28
+ */
29
+ function generateApplyPlan(changeset, options) {
30
+ const maxItems = options.maxItems ?? DEFAULT_MAX_ITEMS;
31
+ const blockedReasons = [];
32
+ // 1. Classification check
33
+ if (changeset.classification === "blocked") {
34
+ blockedReasons.push(...extractBlockedReasons(changeset));
35
+ return buildBlockedResult(changeset, blockedReasons);
36
+ }
37
+ // 2. Max items check
38
+ const itemCount = changeset.items.length;
39
+ if (itemCount > maxItems) {
40
+ blockedReasons.push(`変更件数が閾値を超過しています (${itemCount} > ${maxItems})。分割して適用してください。`);
41
+ return buildBlockedResult(changeset, blockedReasons);
42
+ }
43
+ // 3. Text lane: file-wide scope is blocked
44
+ if (changeset.lane === "text" && options.scope === "file") {
45
+ blockedReasons.push("ファイル全体の Text 置換はブロックされています。selection / frame / page を指定してください。");
46
+ return buildBlockedResult(changeset, blockedReasons);
47
+ }
48
+ // 4. Generate steps
49
+ const steps = generateSteps(changeset, options);
50
+ // 5. Build plan
51
+ const plan = {
52
+ steps,
53
+ estimatedChanges: steps.length,
54
+ requiresReview: changeset.classification === "review",
55
+ blockedReasons: [],
56
+ };
57
+ // 6. Build summary
58
+ const summary = buildSummary(changeset, steps);
59
+ // 7. Build rollback data
60
+ const rollbackData = (0, rollback_1.createRollbackData)(changeset);
61
+ // 8. Determine status
62
+ if (options.dryRun) {
63
+ return {
64
+ status: "dry-run-complete",
65
+ plan,
66
+ summary,
67
+ blockedReasons: [],
68
+ rollbackData,
69
+ };
70
+ }
71
+ return {
72
+ status: "ready",
73
+ plan,
74
+ summary,
75
+ blockedReasons: [],
76
+ rollbackData,
77
+ };
78
+ }
79
+ // ========================================
80
+ // Step generation per lane
81
+ // ========================================
82
+ function generateSteps(changeset, options) {
83
+ switch (changeset.lane) {
84
+ case "tokens":
85
+ return generateTokenSteps(changeset.items, changeset.direction, options);
86
+ case "text":
87
+ return generateTextSteps(changeset.items, changeset.direction, options);
88
+ case "components":
89
+ return generateComponentSteps(changeset.items, changeset.direction, options);
90
+ }
91
+ }
92
+ function generateTokenSteps(items, direction, options) {
93
+ return items.map((item) => {
94
+ const action = resolveTokenAction(item, direction, options);
95
+ const before = item.before ?? "(new)";
96
+ const after = item.after ?? "(deleted)";
97
+ return {
98
+ action,
99
+ target: item.tokenKey,
100
+ preview: `${before} → ${after}`,
101
+ };
102
+ });
103
+ }
104
+ function resolveTokenAction(item, direction, options) {
105
+ if (item.changeType === "RENAME")
106
+ return "rename-token";
107
+ if (item.changeType === "MOVE")
108
+ return "move-token";
109
+ if (item.changeType === "ALIAS")
110
+ return "update-alias";
111
+ if (direction === "code-to-figma") {
112
+ return options.enterprise
113
+ ? "rest-api-variable-write"
114
+ : "plugin-api-variable-write";
115
+ }
116
+ return "update-token-value";
117
+ }
118
+ function generateTextSteps(items, direction, _options) {
119
+ return items.map((item) => {
120
+ const action = direction === "code-to-figma"
121
+ ? "replace-figma-text"
122
+ : item.changeType === "KEY_BINDING"
123
+ ? "bind-i18n-key"
124
+ : "update-text-content";
125
+ const before = item.before ?? "(new)";
126
+ const after = item.after ?? "(deleted)";
127
+ return {
128
+ action,
129
+ target: `${item.i18nKey}#${item.locale}`,
130
+ preview: `${before} → ${after}`,
131
+ };
132
+ });
133
+ }
134
+ function generateComponentSteps(items, direction, _options) {
135
+ return items.map((item) => {
136
+ const action = resolveComponentAction(item, direction);
137
+ const preview = describeVariantChange(item);
138
+ return {
139
+ action,
140
+ target: item.componentId,
141
+ preview,
142
+ };
143
+ });
144
+ }
145
+ function resolveComponentAction(item, direction) {
146
+ if (direction === "code-to-figma") {
147
+ switch (item.changeType) {
148
+ case "VARIANT_ADD":
149
+ return "add-figma-variant";
150
+ case "VARIANT_REMOVE":
151
+ return "propose-remove-variant";
152
+ case "VARIANT_RENAME":
153
+ return "propose-rename-variant";
154
+ }
155
+ }
156
+ switch (item.changeType) {
157
+ case "VARIANT_ADD":
158
+ return "add-code-variant";
159
+ case "VARIANT_REMOVE":
160
+ return "remove-code-variant";
161
+ case "VARIANT_RENAME":
162
+ return "rename-code-variant";
163
+ }
164
+ }
165
+ function describeVariantChange(item) {
166
+ const parts = [];
167
+ for (const [prop, values] of Object.entries(item.variantProps.added)) {
168
+ parts.push(`+${prop}: [${values.join(", ")}]`);
169
+ }
170
+ for (const [prop, values] of Object.entries(item.variantProps.removed)) {
171
+ parts.push(`-${prop}: [${values.join(", ")}]`);
172
+ }
173
+ for (const [oldName, newName] of Object.entries(item.variantProps.renamed)) {
174
+ parts.push(`${oldName} → ${newName}`);
175
+ }
176
+ return parts.join("; ") || item.changeType;
177
+ }
178
+ // ========================================
179
+ // Helpers
180
+ // ========================================
181
+ function extractBlockedReasons(changeset) {
182
+ const reasons = [];
183
+ // Extract from checksSummary errors
184
+ if (changeset.checksSummary.errors > 0) {
185
+ for (const check of changeset.checksSummary.checks) {
186
+ if (check.severity === "error") {
187
+ reasons.push(check.message);
188
+ }
189
+ }
190
+ }
191
+ // Extract from existing applyPlan blocked reasons
192
+ if (changeset.applyPlan.blockedReasons.length > 0) {
193
+ reasons.push(...changeset.applyPlan.blockedReasons);
194
+ }
195
+ if (reasons.length === 0) {
196
+ reasons.push("ChangeSet の classification が blocked です。手動修正が必要です。");
197
+ }
198
+ return reasons;
199
+ }
200
+ function buildBlockedResult(changeset, blockedReasons) {
201
+ return {
202
+ status: "blocked",
203
+ plan: {
204
+ steps: [],
205
+ estimatedChanges: 0,
206
+ requiresReview: false,
207
+ blockedReasons,
208
+ },
209
+ summary: {
210
+ totalItems: changeset.items.length,
211
+ byAction: {},
212
+ reviewMessages: [],
213
+ },
214
+ blockedReasons,
215
+ };
216
+ }
217
+ function buildSummary(changeset, steps) {
218
+ const byAction = {};
219
+ for (const step of steps) {
220
+ byAction[step.action] = (byAction[step.action] || 0) + 1;
221
+ }
222
+ const reviewMessages = [];
223
+ if (changeset.classification === "review") {
224
+ reviewMessages.push(`この ChangeSet は review 分類です。${steps.length} 件の変更を確認してください。`);
225
+ if (changeset.checksSummary.warnings > 0) {
226
+ for (const check of changeset.checksSummary.checks) {
227
+ if (check.severity === "warning") {
228
+ reviewMessages.push(`⚠️ ${check.message}`);
229
+ }
230
+ }
231
+ }
232
+ }
233
+ return {
234
+ totalItems: steps.length,
235
+ byAction,
236
+ reviewMessages,
237
+ };
238
+ }
239
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/changeset/apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { QualityGateResult } from "../types/changeset";
2
+ import type { GateResult } from "../gate/types";
3
+ /**
4
+ * Quality Gate 結果を CI ログ用テキスト形式にフォーマットする。
5
+ */
6
+ export declare function formatCILog(result: QualityGateResult): string;
7
+ /**
8
+ * Quality Gate 結果を PR コメント用 Markdown にフォーマットする。
9
+ */
10
+ export declare function formatPRComment(result: QualityGateResult): string;
11
+ /**
12
+ * Quality Gate 結果を GitHub Actions annotation 形式にフォーマットする。
13
+ *
14
+ * ::error / ::warning の形式で出力。
15
+ * GitHub Actions が自動的にアノテーションとして表示する。
16
+ */
17
+ export declare function formatGHAnnotations(result: QualityGateResult): string;
18
+ /**
19
+ * Format GateResult as GitHub Actions annotations.
20
+ *
21
+ * Uses ::error / ::warning / ::notice format.
22
+ * This is an alternative to formatGHAnnotations() which takes QualityGateResult.
23
+ */
24
+ export declare function formatAsGitHubAnnotations(gateResult: GateResult): string;
25
+ //# sourceMappingURL=ci-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-report.d.ts","sourceRoot":"","sources":["../../src/changeset/ci-report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA4C7D;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAqEjE;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiDrE;AAuBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAyCxE"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ // ci-report.ts — CI Report Formatter
3
+ //
4
+ // Quality Gate の結果を CI ログ、PR コメント、GitHub Actions annotation 用に
5
+ // フォーマットするユーティリティ。
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.formatCILog = formatCILog;
8
+ exports.formatPRComment = formatPRComment;
9
+ exports.formatGHAnnotations = formatGHAnnotations;
10
+ exports.formatAsGitHubAnnotations = formatAsGitHubAnnotations;
11
+ // ========================================
12
+ // CI Log format(テキスト形式)
13
+ // ========================================
14
+ /**
15
+ * Quality Gate 結果を CI ログ用テキスト形式にフォーマットする。
16
+ */
17
+ function formatCILog(result) {
18
+ const lines = [];
19
+ lines.push("═══ Stil Quality Gate ═══");
20
+ lines.push(`Result: ${result.passed ? "PASS ✅" : "FAIL ❌"}`);
21
+ lines.push("");
22
+ // Summary
23
+ lines.push("Summary:");
24
+ lines.push(` Total ChangeSets: ${result.summary.total}`);
25
+ lines.push(` Safe: ${result.summary.safe} ✅`);
26
+ lines.push(` Review: ${result.summary.review} ⚠️`);
27
+ lines.push(` Blocked: ${result.summary.blocked} 🚫`);
28
+ // Failed checks
29
+ if (result.summary.failed.length > 0) {
30
+ lines.push("");
31
+ lines.push("Failed checks:");
32
+ for (const reason of result.summary.failed) {
33
+ lines.push(` ${reason}`);
34
+ }
35
+ }
36
+ // Details per changeset
37
+ if (result.details.length > 0) {
38
+ lines.push("");
39
+ lines.push("Details:");
40
+ for (const detail of result.details) {
41
+ const icon = detail.passed ? "✅" : "❌";
42
+ lines.push(` ${icon} ${detail.changesetId} [${detail.lane}] → ${detail.classification}`);
43
+ if (detail.reason) {
44
+ lines.push(` Reason: ${detail.reason}`);
45
+ }
46
+ }
47
+ }
48
+ lines.push("");
49
+ lines.push("═══════════════════════════");
50
+ return lines.join("\n");
51
+ }
52
+ // ========================================
53
+ // PR Comment format(Markdown 形式)
54
+ // ========================================
55
+ /**
56
+ * Quality Gate 結果を PR コメント用 Markdown にフォーマットする。
57
+ */
58
+ function formatPRComment(result) {
59
+ const lines = [];
60
+ // Header
61
+ const statusBadge = result.passed ? "✅ PASS" : "❌ FAIL";
62
+ lines.push(`## Stil Quality Gate: ${statusBadge}`);
63
+ lines.push("");
64
+ // Summary table
65
+ lines.push("### Summary");
66
+ lines.push("| Metric | Count |");
67
+ lines.push("|--------|-------|");
68
+ lines.push(`| Total ChangeSets | ${result.summary.total} |`);
69
+ lines.push(`| Safe ✅ | ${result.summary.safe} |`);
70
+ lines.push(`| Review ⚠️ | ${result.summary.review} |`);
71
+ lines.push(`| Blocked 🚫 | ${result.summary.blocked} |`);
72
+ // Failed checks
73
+ if (result.summary.failed.length > 0) {
74
+ lines.push("");
75
+ lines.push("### Failed Checks");
76
+ for (const reason of result.summary.failed) {
77
+ lines.push(`- ${reason}`);
78
+ }
79
+ }
80
+ // Details
81
+ if (result.details.length > 0) {
82
+ lines.push("");
83
+ lines.push("### Details");
84
+ lines.push("| ChangeSet | Lane | Classification | Status |");
85
+ lines.push("|-----------|------|----------------|--------|");
86
+ for (const detail of result.details) {
87
+ const status = detail.passed ? "✅ Pass" : "❌ Fail";
88
+ lines.push(`| \`${detail.changesetId}\` | ${detail.lane} | ${formatClassification(detail.classification)} | ${status} |`);
89
+ }
90
+ }
91
+ // Error details with checks
92
+ const failedDetails = result.details.filter((d) => !d.passed);
93
+ if (failedDetails.length > 0) {
94
+ lines.push("");
95
+ lines.push("### Error Details");
96
+ for (const detail of failedDetails) {
97
+ lines.push(`\n**\`${detail.changesetId}\`** [${detail.lane}]`);
98
+ if (detail.reason) {
99
+ lines.push(`> ${detail.reason}`);
100
+ }
101
+ const errorChecks = detail.checks.filter((c) => c.severity === "error");
102
+ if (errorChecks.length > 0) {
103
+ for (const check of errorChecks) {
104
+ lines.push(`- ❌ ${check.message}${check.target ? ` (\`${check.target}\`)` : ""}`);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ lines.push("");
110
+ lines.push("---\nGenerated by [Stil Quality Gate](https://github.com/techang/stil-systems)");
111
+ return lines.join("\n");
112
+ }
113
+ // ========================================
114
+ // GitHub Actions Annotations format
115
+ // ========================================
116
+ /**
117
+ * Quality Gate 結果を GitHub Actions annotation 形式にフォーマットする。
118
+ *
119
+ * ::error / ::warning の形式で出力。
120
+ * GitHub Actions が自動的にアノテーションとして表示する。
121
+ */
122
+ function formatGHAnnotations(result) {
123
+ const lines = [];
124
+ for (const detail of result.details) {
125
+ if (detail.classification === "blocked") {
126
+ lines.push(`::error title=Stil Quality Gate::Blocked ChangeSet detected: ${detail.changesetId} [${detail.lane}]${detail.reason ? " - " + detail.reason : ""}`);
127
+ }
128
+ if (detail.classification === "review") {
129
+ lines.push(`::warning title=Stil Quality Gate::Review required: ${detail.changesetId} [${detail.lane}] needs manual approval`);
130
+ }
131
+ // Individual error checks
132
+ const errorChecks = detail.checks.filter((c) => c.severity === "error");
133
+ for (const check of errorChecks) {
134
+ lines.push(`::error title=Stil Quality Gate [${check.lane}]::${check.message}${check.target ? " (" + check.target + ")" : ""}`);
135
+ }
136
+ // Individual warning checks
137
+ const warningChecks = detail.checks.filter((c) => c.severity === "warning");
138
+ for (const check of warningChecks) {
139
+ lines.push(`::warning title=Stil Quality Gate [${check.lane}]::${check.message}${check.target ? " (" + check.target + ")" : ""}`);
140
+ }
141
+ }
142
+ // Overall result
143
+ if (result.passed) {
144
+ lines.push(`::notice title=Stil Quality Gate::Quality gate passed (${result.summary.total} changeset(s) checked)`);
145
+ }
146
+ else {
147
+ lines.push(`::error title=Stil Quality Gate::Quality gate FAILED - ${result.summary.failed.length} issue(s) found`);
148
+ }
149
+ return lines.join("\n");
150
+ }
151
+ // ========================================
152
+ // Helpers
153
+ // ========================================
154
+ function formatClassification(classification) {
155
+ switch (classification) {
156
+ case "safe":
157
+ return "safe ✅";
158
+ case "review":
159
+ return "review ⚠️";
160
+ case "blocked":
161
+ return "blocked 🚫";
162
+ default:
163
+ return classification;
164
+ }
165
+ }
166
+ // ========================================
167
+ // GitHub Annotations from GateResult
168
+ // ========================================
169
+ /**
170
+ * Format GateResult as GitHub Actions annotations.
171
+ *
172
+ * Uses ::error / ::warning / ::notice format.
173
+ * This is an alternative to formatGHAnnotations() which takes QualityGateResult.
174
+ */
175
+ function formatAsGitHubAnnotations(gateResult) {
176
+ const lines = [];
177
+ const cls = gateResult.classification;
178
+ // Blocked items
179
+ for (const item of cls.items) {
180
+ if (item.classification === "blocked") {
181
+ const reasons = item.reasons.length > 0
182
+ ? ` - ${item.reasons.join(", ")}`
183
+ : "";
184
+ lines.push(`::error title=Stil Gate::Blocked: ${item.itemId}${reasons}`);
185
+ }
186
+ }
187
+ // Review items
188
+ for (const item of cls.items) {
189
+ if (item.classification === "review") {
190
+ const reasons = item.reasons.length > 0
191
+ ? ` - ${item.reasons.join(", ")}`
192
+ : "";
193
+ lines.push(`::warning title=Stil Gate::Review required: ${item.itemId}${reasons}`);
194
+ }
195
+ }
196
+ // Overall result
197
+ if (gateResult.passed) {
198
+ lines.push(`::notice title=Stil Gate::Gate PASSED (mode: ${gateResult.mode})`);
199
+ }
200
+ else {
201
+ const failReasons = gateResult.reasons.join(", ");
202
+ lines.push(`::error title=Stil Gate::Gate FAILED (mode: ${gateResult.mode}) - ${failReasons}`);
203
+ }
204
+ return lines.join("\n");
205
+ }
206
+ //# sourceMappingURL=ci-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-report.js","sourceRoot":"","sources":["../../src/changeset/ci-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { ChangeSet, ChangeSetTokenItem, ChangeSetTextItem, ChangeSetComponentItem, Classification, ClassificationThresholds, TokenClassificationContext, TextClassificationContext, ComponentClassificationContext, ClassificationContext } from "../types/changeset";
2
+ import type { RulePack } from "../rules/types";
3
+ /**
4
+ * Tokens レーンの分類判定
5
+ *
6
+ * 判定フロー(CHANGESET_SPEC.md 付録参照):
7
+ * 1. alias 参照先が存在しない → BLOCKED
8
+ * 2. key が衝突 → BLOCKED
9
+ * 3. RENAME/MOVE で参照が壊れる → BLOCKED
10
+ * 4. collection/mode の構造変更 → BLOCKED
11
+ * 5. critical tag (foundation.*, brand.*) → REVIEW
12
+ * 6. alias 参照先の変更 → REVIEW
13
+ * 7. 影響ノード > 閾値 → REVIEW
14
+ * 8. それ以外 → SAFE
15
+ */
16
+ export declare function classifyTokens(ctx: TokenClassificationContext, thresholds?: ClassificationThresholds): Classification;
17
+ /**
18
+ * Text レーンの分類判定
19
+ *
20
+ * 判定フロー(CHANGESET_SPEC.md 付録参照):
21
+ * 1. placeholder 不一致 → BLOCKED
22
+ * 2. スコープ内に未バインドノード → BLOCKED
23
+ * 3. locale が定義されていない → BLOCKED
24
+ * 4. i18nKey 衝突 → BLOCKED
25
+ * 5. 文字列長差分 > 閾値 → REVIEW
26
+ * 6. 改行の増減がある → REVIEW
27
+ * 7. 新規 placeholder 追加 → REVIEW
28
+ * 8. それ以外 → SAFE
29
+ */
30
+ export declare function classifyText(ctx: TextClassificationContext, thresholds?: ClassificationThresholds): Classification;
31
+ /**
32
+ * Components レーンの分類判定
33
+ *
34
+ * 判定フロー(CHANGESET_SPEC.md 付録参照):
35
+ * 1. figmaComponentKey が Figma に存在しない → BLOCKED
36
+ * 2. componentId マッピングが存在しない → BLOCKED
37
+ * 3. variant の型定義が壊れる → BLOCKED
38
+ * 4. variant 値の削除 → REVIEW
39
+ * 5. variant 値のリネーム → REVIEW
40
+ * 6. slot 追加/削除 → REVIEW
41
+ * 7. それ以外 → SAFE
42
+ */
43
+ export declare function classifyComponents(ctx: ComponentClassificationContext): Classification;
44
+ /**
45
+ * ClassificationContext からレーン別に分類を判定する
46
+ */
47
+ export declare function classifyByContext(classCtx: ClassificationContext, thresholds?: ClassificationThresholds): Classification;
48
+ /**
49
+ * TokenItem 配列から TokenClassificationContext を推定
50
+ *
51
+ * 外部からの参照情報(alias 存在確認等)は引数で渡す。
52
+ * items のみから判定できるフィールドを自動推定する。
53
+ */
54
+ export declare function buildTokenContext(items: ChangeSetTokenItem[], overrides?: Partial<TokenClassificationContext>): TokenClassificationContext;
55
+ /**
56
+ * TextItem 配列から TextClassificationContext を推定
57
+ */
58
+ export declare function buildTextContext(items: ChangeSetTextItem[], overrides?: Partial<TextClassificationContext>): TextClassificationContext;
59
+ /**
60
+ * ComponentItem 配列から ComponentClassificationContext を推定
61
+ */
62
+ export declare function buildComponentContext(items: ChangeSetComponentItem[], overrides?: Partial<ComponentClassificationContext>): ComponentClassificationContext;
63
+ /**
64
+ * ChangeSet を分類する統合関数
65
+ *
66
+ * items の内容からコンテキストを自動推定し、分類を判定する。
67
+ * 外部コンテキスト(alias 存在確認、影響ノード数等)は overrides で渡す。
68
+ *
69
+ * rulePacks が指定された場合は Rule Engine 経由で評価する。
70
+ * 未指定時は既存のハードコードロジックを使用(後方互換性維持)。
71
+ */
72
+ export declare function classifyChangeSet(changeset: ChangeSet, overrides?: {
73
+ tokenContext?: Partial<TokenClassificationContext>;
74
+ textContext?: Partial<TextClassificationContext>;
75
+ componentContext?: Partial<ComponentClassificationContext>;
76
+ }, thresholds?: ClassificationThresholds, rulePacks?: RulePack[]): Classification;
77
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/changeset/classify.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAO5D;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,0BAA0B,EAC/B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAahB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,yBAAyB,EAC9B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAchB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,8BAA8B,GAClC,cAAc,CAYhB;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAShB;AASD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,kBAAkB,EAAE,EAC3B,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,0BAA0B,CAqB5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,yBAAyB,CAyC3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,sBAAsB,EAAE,EAC/B,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,8BAA8B,CAiBhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,SAAS,CAAC,EAAE;IACV,YAAY,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC5D,EACD,UAAU,GAAE,wBAA6C,EACzD,SAAS,CAAC,EAAE,QAAQ,EAAE,GACrB,cAAc,CAwChB"}