repo-wrapped 0.0.6 → 0.0.9

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 (176) hide show
  1. package/.github/agents/complete.agent.md +257 -0
  2. package/.github/agents/feature-scaffold.agent.md +248 -0
  3. package/.github/agents/jsdoc.agent.md +243 -0
  4. package/.github/agents/plan.agent.md +202 -0
  5. package/.github/agents/spec-writer.agent.md +169 -0
  6. package/.github/agents/test-writer.agent.md +169 -0
  7. package/.stylelintrc.json +27 -0
  8. package/README.md +94 -94
  9. package/coverage/base.css +224 -0
  10. package/coverage/block-navigation.js +87 -0
  11. package/coverage/favicon.png +0 -0
  12. package/coverage/index.html +446 -0
  13. package/coverage/lcov-report/base.css +224 -0
  14. package/coverage/lcov-report/block-navigation.js +87 -0
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +446 -0
  17. package/coverage/lcov-report/prettify.css +1 -0
  18. package/coverage/lcov-report/prettify.js +2 -0
  19. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  20. package/coverage/lcov-report/sorter.js +210 -0
  21. package/coverage/lcov.info +7039 -0
  22. package/coverage/prettify.css +1 -0
  23. package/coverage/prettify.js +2 -0
  24. package/coverage/sort-arrow-sprite.png +0 -0
  25. package/coverage/sorter.js +210 -0
  26. package/dist/commands/generate.js +262 -5
  27. package/dist/config/defaults.js +158 -0
  28. package/dist/config/index.js +10 -0
  29. package/dist/features/achievements/data/achievements.json +284 -0
  30. package/dist/features/achievements/engine.js +140 -0
  31. package/dist/features/achievements/evaluators.js +246 -0
  32. package/dist/features/achievements/helpers.js +58 -0
  33. package/dist/features/achievements/index.js +57 -0
  34. package/dist/features/achievements/loader.js +88 -0
  35. package/dist/features/achievements/template.js +155 -0
  36. package/dist/features/achievements/types.js +7 -0
  37. package/dist/features/commit-quality/analyzer.js +378 -0
  38. package/dist/features/commit-quality/analyzer.test.js +484 -0
  39. package/dist/features/commit-quality/index.js +28 -0
  40. package/dist/features/commit-quality/template.js +114 -0
  41. package/dist/features/commit-quality/types.js +2 -0
  42. package/dist/features/comparison/analyzer.js +222 -0
  43. package/dist/features/comparison/index.js +28 -0
  44. package/dist/features/comparison/template.js +119 -0
  45. package/dist/features/comparison/types.js +2 -0
  46. package/dist/features/contribution-graph/index.js +9 -0
  47. package/dist/features/contribution-graph/template.js +89 -0
  48. package/dist/features/events/index.js +31 -0
  49. package/dist/features/events/parser.js +253 -0
  50. package/dist/features/events/template.js +113 -0
  51. package/dist/features/events/types.js +2 -0
  52. package/dist/features/executive-summary/generator.js +275 -0
  53. package/dist/features/executive-summary/index.js +27 -0
  54. package/dist/features/executive-summary/template.js +80 -0
  55. package/dist/features/executive-summary/types.js +2 -0
  56. package/dist/features/gaps/analyzer.js +298 -0
  57. package/dist/features/gaps/analyzer.test.js +517 -0
  58. package/dist/features/gaps/index.js +27 -0
  59. package/dist/features/gaps/template.js +190 -0
  60. package/dist/features/gaps/types.js +2 -0
  61. package/dist/features/impact/analyzer.js +248 -0
  62. package/dist/features/impact/index.js +26 -0
  63. package/dist/features/impact/template.js +118 -0
  64. package/dist/features/impact/types.js +2 -0
  65. package/dist/features/index.js +40 -0
  66. package/dist/features/knowledge/analyzer.js +385 -0
  67. package/dist/features/knowledge/index.js +26 -0
  68. package/dist/features/knowledge/template.js +239 -0
  69. package/dist/features/knowledge/types.js +2 -0
  70. package/dist/features/streaks/calculator.js +184 -0
  71. package/dist/features/streaks/calculator.test.js +366 -0
  72. package/dist/features/streaks/index.js +36 -0
  73. package/dist/features/streaks/template.js +41 -0
  74. package/dist/features/streaks/types.js +9 -0
  75. package/dist/features/team/analyzer.js +316 -0
  76. package/dist/features/team/index.js +30 -0
  77. package/dist/features/team/template.js +146 -0
  78. package/dist/features/team/types.js +2 -0
  79. package/dist/features/time-patterns/analyzer.js +319 -0
  80. package/dist/features/time-patterns/analyzer.test.js +278 -0
  81. package/dist/features/time-patterns/index.js +37 -0
  82. package/dist/features/time-patterns/template.js +109 -0
  83. package/dist/features/time-patterns/types.js +9 -0
  84. package/dist/features/velocity/analyzer.js +257 -0
  85. package/dist/features/velocity/analyzer.test.js +383 -0
  86. package/dist/features/velocity/index.js +27 -0
  87. package/dist/features/velocity/template.js +189 -0
  88. package/dist/features/velocity/types.js +2 -0
  89. package/dist/generators/html/scripts/knowledge.js +17 -0
  90. package/dist/generators/html/styles/base.css +10 -6
  91. package/dist/generators/html/styles/components.css +121 -1
  92. package/dist/generators/html/styles/knowledge.css +21 -0
  93. package/dist/generators/html/styles/leaddev.css +1335 -0
  94. package/dist/generators/html/styles/strategic-insights.css +1337 -0
  95. package/dist/generators/html/templates/commitQualitySection.js +28 -2
  96. package/dist/generators/html/templates/comparisonSection.js +119 -0
  97. package/dist/generators/html/templates/eventsSection.js +113 -0
  98. package/dist/generators/html/templates/executiveSummarySection.js +80 -0
  99. package/dist/generators/html/templates/gapSection.js +190 -0
  100. package/dist/generators/html/templates/impactSection.js +8 -6
  101. package/dist/generators/html/templates/knowledgeSection.js +16 -2
  102. package/dist/generators/html/templates/teamSection.js +146 -0
  103. package/dist/generators/html/templates/velocitySection.js +189 -0
  104. package/dist/generators/html/types.js +7 -0
  105. package/dist/generators/html/utils/analysisRunner.js +93 -0
  106. package/dist/generators/html/utils/cardBuilder.js +47 -0
  107. package/dist/generators/html/utils/contextBuilder.js +54 -0
  108. package/dist/generators/html/utils/htmlDocumentBuilder.js +396 -0
  109. package/dist/generators/html/utils/kpiBuilder.js +76 -0
  110. package/dist/generators/html/utils/sectionWrapper.js +71 -0
  111. package/dist/generators/html/utils/styleLoader.js +2 -1
  112. package/dist/html/analysisRunner.js +93 -0
  113. package/dist/html/htmlDocumentBuilder.js +396 -0
  114. package/dist/html/index.js +29 -0
  115. package/dist/html/shared/colorUtils.js +61 -0
  116. package/dist/html/shared/commitMapBuilder.js +23 -0
  117. package/dist/html/shared/components/cardBuilder.js +47 -0
  118. package/dist/html/shared/components/index.js +18 -0
  119. package/dist/html/shared/components/kpiBuilder.js +76 -0
  120. package/dist/html/shared/components/sectionWrapper.js +71 -0
  121. package/dist/html/shared/contextBuilder.js +54 -0
  122. package/dist/html/shared/dateRangeCalculator.js +56 -0
  123. package/dist/html/shared/developerStatsCalculator.js +28 -0
  124. package/dist/html/shared/index.js +39 -0
  125. package/dist/html/shared/scriptLoader.js +15 -0
  126. package/dist/html/shared/scripts/export.js +125 -0
  127. package/dist/html/shared/scripts/knowledge.js +137 -0
  128. package/dist/html/shared/scripts/modal.js +68 -0
  129. package/dist/html/shared/scripts/navigation.js +156 -0
  130. package/dist/html/shared/scripts/tabs.js +18 -0
  131. package/dist/html/shared/scripts/tooltip.js +21 -0
  132. package/dist/html/shared/styleLoader.js +18 -0
  133. package/dist/html/shared/styles/achievements.css +387 -0
  134. package/dist/html/shared/styles/base.css +822 -0
  135. package/dist/html/shared/styles/components.css +1511 -0
  136. package/dist/html/shared/styles/knowledge.css +242 -0
  137. package/dist/html/shared/styles/strategic-insights.css +1337 -0
  138. package/dist/html/shared/weekGrouper.js +27 -0
  139. package/dist/html/types.js +7 -0
  140. package/dist/index.js +54 -21
  141. package/dist/test/helpers/commitFactory.js +166 -0
  142. package/dist/test/helpers/dateUtils.js +101 -0
  143. package/dist/test/helpers/index.js +29 -0
  144. package/dist/test/setup.js +17 -0
  145. package/dist/test/smoke.test.js +94 -0
  146. package/dist/types/achievements.js +7 -0
  147. package/dist/types/analysis.js +7 -0
  148. package/dist/types/core.js +7 -0
  149. package/dist/types/index.js +38 -0
  150. package/dist/types/options.js +7 -0
  151. package/dist/types/shared.js +7 -0
  152. package/dist/types/strategic.js +7 -0
  153. package/dist/types/summary.js +7 -0
  154. package/dist/utils/achievementDefinitions.js +22 -22
  155. package/dist/utils/analyzerContextBuilder.js +124 -0
  156. package/dist/utils/commitQualityAnalyzer.js +13 -2
  157. package/dist/utils/emptyResults.js +95 -0
  158. package/dist/utils/eventAnnotationParser.js +253 -0
  159. package/dist/utils/executiveSummaryGenerator.js +275 -0
  160. package/dist/utils/fileHotspotAnalyzer.js +4 -12
  161. package/dist/utils/gapAnalyzer.js +298 -0
  162. package/dist/utils/gitParser.test.js +363 -0
  163. package/dist/utils/htmlGenerator.js +126 -450
  164. package/dist/utils/impactAnalyzer.js +20 -19
  165. package/dist/utils/knowledgeDistributionAnalyzer.js +32 -27
  166. package/dist/utils/matrixGenerator.js +13 -13
  167. package/dist/utils/rangeComparisonAnalyzer.js +222 -0
  168. package/dist/utils/streakCalculator.js +77 -27
  169. package/dist/utils/teamAnalyzer.js +316 -0
  170. package/dist/utils/timePatternAnalyzer.js +18 -3
  171. package/dist/utils/velocityAnalyzer.js +257 -0
  172. package/dist/utils/wrappedGenerator.js +8 -8
  173. package/package.json +74 -55
  174. package/vitest.config.ts +46 -0
  175. package/dist/cli.js +0 -24
  176. package/dist/commands/index.js +0 -24
@@ -0,0 +1,257 @@
1
+ ```chatagent
2
+ ---
3
+ description: "Completes the spec lifecycle after implementation: verifies acceptance criteria, updates spec status, moves to implemented/, and commits with a descriptive message."
4
+ tools:
5
+ [
6
+ "vscode",
7
+ "execute",
8
+ "read",
9
+ "edit",
10
+ "search",
11
+ ]
12
+ model: Claude Opus 4.5 (copilot)
13
+ ---
14
+
15
+ You are the spec completion agent for the git-wrapped project. Your job is to finalize the spec lifecycle AFTER implementation is done.
16
+
17
+ ## When to Use This Agent
18
+
19
+ After you (or agent mode) have implemented a spec, invoke this agent to:
20
+ 1. Verify the implementation
21
+ 2. Update the spec document
22
+ 3. Move it to the completed folder
23
+ 4. Commit everything properly
24
+
25
+ ## Usage
26
+
27
+ ```
28
+ @complete TEST-03
29
+ @complete FEAT-01
30
+ @complete REFACTOR-05
31
+ ```
32
+
33
+ ## Workflow
34
+
35
+ ### Step 1: Find the Spec
36
+
37
+ Search for the spec file in `.spec/plan/`:
38
+ - Look for files matching the spec ID pattern (e.g., `TEST-03-*.md`)
39
+ - If not found, report error and stop
40
+
41
+ ### Step 2: Read & Verify
42
+
43
+ 1. Read the spec file completely
44
+ 2. Check the **Files to Create/Modify** section
45
+ 3. Verify those files exist
46
+ 4. Run `npx tsc --noEmit` to check for TypeScript errors
47
+ 5. Run `npm test` to execute the test suite (if tests exist)
48
+ - If no test script or tests not configured yet, note it and continue
49
+ - If tests fail, report failures and stop — do not complete a spec with failing tests
50
+
51
+ Report verification status:
52
+ ```
53
+ ✅ Files verified:
54
+ - src/test/helpers/commitFactory.ts (exists)
55
+ - src/test/helpers/dateUtils.ts (exists)
56
+ - vitest.config.ts (exists)
57
+
58
+ ✅ TypeScript: No errors
59
+ ✅ Tests: 42 passed, 0 failed
60
+ ```
61
+
62
+ Or if tests aren't set up yet:
63
+ ```
64
+ ✅ Files verified: 3/3
65
+ ✅ TypeScript: No errors
66
+ ⚠️ Tests: No test script configured (acceptable for TEST-03 infrastructure spec)
67
+ ```
68
+
69
+ ### Step 3: Update Spec Status
70
+
71
+ In the spec file, change:
72
+ ```markdown
73
+ **Status**: 📋 PLANNED
74
+ ```
75
+ to:
76
+ ```markdown
77
+ **Status**: ✅ COMPLETE
78
+ ```
79
+
80
+ ### Step 4: Commit the Implementation
81
+
82
+ Stage all implementation files and commit with a descriptive message.
83
+
84
+ **Commit Message Format:**
85
+ ```
86
+ {type}({SPEC-ID}): {what was implemented}
87
+
88
+ {Brief list of key changes}
89
+
90
+ Implements: {SPEC-ID}
91
+ ```
92
+
93
+ **Type Mapping:**
94
+ | Spec Prefix | Commit Type |
95
+ |-------------|-------------|
96
+ | FEAT | feat |
97
+ | REFACTOR | refactor |
98
+ | BUG | fix |
99
+ | ENHANCE | feat |
100
+ | DOCS | docs |
101
+ | PERF | perf |
102
+ | SEC | fix |
103
+ | TEST | test |
104
+
105
+ **Example Commit Messages:**
106
+
107
+ ```
108
+ test(TEST-03): set up Vitest infrastructure and test helpers
109
+
110
+ - Add vitest.config.ts with coverage configuration
111
+ - Create commitFactory.ts with createCommit() and createCommitSequence()
112
+ - Create dateUtils.ts with date testing helpers
113
+ - Add test setup file with beforeEach hooks
114
+
115
+ Implements: TEST-03
116
+ ```
117
+
118
+ ```
119
+ feat(FEAT-05): add multi-repo analysis support
120
+
121
+ - New MultiRepoAnalyzer class for aggregating across repos
122
+ - CLI --repos flag for specifying multiple paths
123
+ - Combined report generation with repo breakdown
124
+
125
+ Implements: FEAT-05
126
+ ```
127
+
128
+ ```
129
+ fix(BUG-02): resolve timezone offset in streak calculation
130
+
131
+ - Use UTC dates consistently in calculateStreaks()
132
+ - Add timezone normalization in date comparison
133
+ - Fix off-by-one error at day boundaries
134
+
135
+ Implements: BUG-02
136
+ ```
137
+
138
+ ### Step 5: Move Spec to Implemented
139
+
140
+ ```bash
141
+ git mv .spec/plan/{SPEC-ID}-*.md .spec/implemented/
142
+ ```
143
+
144
+ ### Step 6: Final Commit for Spec Move
145
+
146
+ ```bash
147
+ git add .spec/
148
+ git commit -m "docs({SPEC-ID}): mark as complete"
149
+ ```
150
+
151
+ ## Verification Checklist
152
+
153
+ Before completing, verify:
154
+
155
+ - [ ] All files mentioned in spec exist
156
+ - [ ] TypeScript compiles without errors (`npx tsc --noEmit`)
157
+ - [ ] All tests pass (`npm test`) — or tests not yet configured
158
+ - [ ] No obvious runtime issues
159
+ - [ ] Spec status updated to ✅ COMPLETE
160
+ - [ ] Implementation committed with descriptive message
161
+ - [ ] Spec moved to `implemented/`
162
+ - [ ] Move committed
163
+
164
+ ## Error Handling
165
+
166
+ ### Spec Not Found
167
+ ```
168
+ ❌ Could not find spec matching "TEST-99" in .spec/plan/
169
+ Available specs: TEST-01, TEST-02, TEST-03, ...
170
+ ```
171
+
172
+ ### Files Missing
173
+ ```
174
+ ❌ Verification failed - missing files:
175
+ - src/test/helpers/commitFactory.ts (NOT FOUND)
176
+
177
+ Implementation may be incomplete. Please implement missing files first.
178
+ ```
179
+
180
+ ### Test Failures
181
+ ```
182
+ ❌ Tests failed: 3 failing, 39 passing
183
+
184
+ FAIL src/features/streaks/__tests__/calculator.test.ts
185
+ ✕ handles weekend correctly (5ms)
186
+
187
+ Please fix failing tests before completing the spec.
188
+ ```
189
+
190
+ ### TypeScript Errors
191
+ ```
192
+ ❌ TypeScript errors found:
193
+ src/test/helpers/commitFactory.ts:15:3 - error TS2322: ...
194
+
195
+ Please fix errors before completing the spec.
196
+ ```
197
+
198
+ ### Already Completed
199
+ ```
200
+ ⚠️ Spec TEST-03 is already in .spec/implemented/
201
+ Nothing to do.
202
+ ```
203
+
204
+ ## What This Agent Does NOT Do
205
+
206
+ - **Does not implement code** — That's your job (or agent mode)
207
+ - **Does not write tests** — Use `@test-writer` first
208
+ - **Does not create specs** — Use `@spec-writer` first
209
+ - **Does not make judgments** — It verifies mechanically
210
+
211
+ ## Example Full Run
212
+
213
+ ```
214
+ User: @complete TEST-03
215
+
216
+ Agent:
217
+ 📋 Found spec: .spec/plan/TEST-03-test-infrastructure-setup.md
218
+
219
+ 🔍 Verifying implementation...
220
+ ✅ vitest.config.ts exists
221
+ ✅ src/test/helpers/commitFactory.ts exists
222
+ ✅ src/test/helpers/dateUtils.ts exists
223
+ ✅ src/test/helpers/index.ts exists
224
+ ✅ src/test/setup.ts exists
225
+ ✅ package.json has test scripts
226
+ ✅ TypeScript: No errors
227
+
228
+ 📝 Updating spec status to COMPLETE...
229
+ ✅ Status updated
230
+
231
+ 💾 Committing implementation...
232
+ ✅ Committed: test(TEST-03): set up Vitest infrastructure and test helpers
233
+
234
+ 📁 Moving spec to implemented/...
235
+ ✅ Moved to .spec/implemented/TEST-03-test-infrastructure-setup.md
236
+
237
+ 💾 Committing spec move...
238
+ ✅ Committed: docs(TEST-03): mark as complete
239
+
240
+ 🎉 TEST-03 completed successfully!
241
+ ```
242
+
243
+ ## Commit Quality Guidelines
244
+
245
+ Make the implementation commit message **descriptive and useful**:
246
+
247
+ ❌ Bad: `test(TEST-03): implement spec`
248
+ ❌ Bad: `test(TEST-03): done`
249
+ ❌ Bad: `implement TEST-03`
250
+
251
+ ✅ Good: `test(TEST-03): set up Vitest infrastructure and test helpers`
252
+ ✅ Good: `feat(FEAT-01): add dashboard view with contributor comparison charts`
253
+ ✅ Good: `fix(BUG-03): handle empty commit arrays in streak calculation`
254
+
255
+ The commit message should make sense to someone who hasn't read the spec.
256
+
257
+ ```
@@ -0,0 +1,248 @@
1
+ ```chatagent
2
+ ---
3
+ description: "Scaffolds new feature modules with the standard structure: analyzer, types, template, and index files. Wires the feature into the main exports."
4
+ tools:
5
+ [
6
+ "vscode",
7
+ "read",
8
+ "edit",
9
+ "search",
10
+ "agent",
11
+ ]
12
+ model: Claude Opus 4.5 (copilot)
13
+ ---
14
+
15
+ You are a feature scaffolder for the git-wrapped project. Your job is to create new feature modules following the established patterns.
16
+
17
+ ## Feature Structure
18
+
19
+ Every feature in `src/features/` follows this structure:
20
+
21
+ ```
22
+
23
+ src/features/{feature-name}/
24
+ ├── analyzer.ts # Core analysis logic
25
+ ├── types.ts # Type re-exports (from src/types)
26
+ ├── template.ts # HTML rendering function
27
+ └── index.ts # Public exports
28
+
29
+ ````
30
+
31
+ ## Workflow
32
+
33
+ 1. **Get feature details** from the user:
34
+ - Feature name (kebab-case for folder, PascalCase for types)
35
+ - What it analyzes (commits, files, dates, etc.)
36
+ - What metrics/data it produces
37
+ - If unclear, ask clarifying questions
38
+
39
+ 2. **Research similar features** for patterns:
40
+ - Read an existing feature like `src/features/streaks/` or `src/features/velocity/`
41
+ - Check `src/types/index.ts` for type patterns
42
+ - Check `src/html/shared/emptyResults.ts` for empty result patterns
43
+
44
+ 3. **Create the feature files** in order:
45
+ - First add types to `src/types/index.ts`
46
+ - Create `analyzer.ts` with analysis logic
47
+ - Create `types.ts` with re-exports
48
+ - Create `template.ts` with HTML builder
49
+ - Create `index.ts` with public exports
50
+ - Add empty result factory to `src/html/shared/emptyResults.ts`
51
+ - Export from `src/features/index.ts`
52
+
53
+ ## File Templates
54
+
55
+ ### analyzer.ts
56
+
57
+ ```typescript
58
+ /**
59
+ * {Feature Name} Analyzer
60
+ *
61
+ * {Description of what this analyzer does}
62
+ *
63
+ * @module features/{feature-name}
64
+ */
65
+
66
+ import type { Commit, {FeatureName}Analysis, AnalysisContext } from '../../types';
67
+
68
+ /**
69
+ * Analyzes commits for {feature description}.
70
+ *
71
+ * @param context - Analysis context containing commits and options
72
+ * @returns {FeatureName} analysis results
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const result = analyze{FeatureName}({ commits, startDate, endDate });
77
+ * console.log(result.{mainMetric});
78
+ * ```
79
+ */
80
+ export function analyze{FeatureName}(context: AnalysisContext): {FeatureName}Analysis;
81
+
82
+ /**
83
+ * @deprecated Use context-based signature instead
84
+ */
85
+ export function analyze{FeatureName}(
86
+ commits: Commit[],
87
+ startDate?: Date,
88
+ endDate?: Date
89
+ ): {FeatureName}Analysis;
90
+
91
+ export function analyze{FeatureName}(
92
+ contextOrCommits: AnalysisContext | Commit[],
93
+ startDate?: Date,
94
+ endDate?: Date
95
+ ): {FeatureName}Analysis {
96
+ // Normalize to context-based calling
97
+ const context: AnalysisContext = Array.isArray(contextOrCommits)
98
+ ? { commits: contextOrCommits, startDate, endDate }
99
+ : contextOrCommits;
100
+
101
+ const { commits } = context;
102
+
103
+ if (commits.length === 0) {
104
+ return createEmpty{FeatureName}Analysis();
105
+ }
106
+
107
+ // TODO: Implement analysis logic
108
+
109
+ return {
110
+ // Return analysis results
111
+ };
112
+ }
113
+
114
+ function createEmpty{FeatureName}Analysis(): {FeatureName}Analysis {
115
+ return {
116
+ // Empty result shape
117
+ };
118
+ }
119
+ ````
120
+
121
+ ### types.ts
122
+
123
+ ```typescript
124
+ /**
125
+ * Type re-exports for {Feature Name} feature
126
+ * @module features/{feature-name}/types
127
+ */
128
+
129
+ export type {
130
+ {FeatureName}Analysis,
131
+ // Other related types
132
+ } from '../../types';
133
+ ```
134
+
135
+ ### template.ts
136
+
137
+ ```typescript
138
+ /**
139
+ * {Feature Name} HTML Template
140
+ *
141
+ * Renders the {feature name} section for the HTML report.
142
+ *
143
+ * @module features/{feature-name}
144
+ */
145
+
146
+ import type { {FeatureName}Analysis } from '../../types';
147
+
148
+ /**
149
+ * Builds the HTML section for {feature name} data.
150
+ *
151
+ * @param analysis - The {feature name} analysis results
152
+ * @returns HTML string for the section
153
+ */
154
+ export function build{FeatureName}Section(analysis: {FeatureName}Analysis): string {
155
+ if (!analysis || /* check for empty */) {
156
+ return `
157
+ <section class="{feature-name}-section">
158
+ <h2>{Feature Title}</h2>
159
+ <p class="no-data">No {feature} data available</p>
160
+ </section>
161
+ `;
162
+ }
163
+
164
+ return `
165
+ <section class="{feature-name}-section">
166
+ <h2>{Feature Title}</h2>
167
+ <div class="{feature-name}-content">
168
+ <!-- Render analysis data -->
169
+ </div>
170
+ </section>
171
+ `;
172
+ }
173
+ ```
174
+
175
+ ### index.ts
176
+
177
+ ````typescript
178
+ /**
179
+ * {Feature Name} Feature Module
180
+ *
181
+ * {Description}
182
+ *
183
+ * @module features/{feature-name}
184
+ * @example
185
+ * ```typescript
186
+ * import { analyze{FeatureName}, build{FeatureName}Section } from './features/{feature-name}';
187
+ *
188
+ * const analysis = analyze{FeatureName}({ commits });
189
+ * const html = build{FeatureName}Section(analysis);
190
+ * ```
191
+ */
192
+
193
+ export { analyze{FeatureName} } from './analyzer';
194
+ export { build{FeatureName}Section } from './template';
195
+ export type { {FeatureName}Analysis } from './types';
196
+ ````
197
+
198
+ ## Wiring Up
199
+
200
+ ### Add to `src/types/index.ts`
201
+
202
+ ```typescript
203
+ /** {Feature Name} analysis results */
204
+ export interface {FeatureName}Analysis {
205
+ /** {Description of field} */
206
+ fieldName: FieldType;
207
+ // ... other fields
208
+ }
209
+ ```
210
+
211
+ ### Add to `src/html/shared/emptyResults.ts`
212
+
213
+ ```typescript
214
+ export function createEmpty{FeatureName}Analysis(): {FeatureName}Analysis {
215
+ return {
216
+ // Default empty values
217
+ };
218
+ }
219
+ ```
220
+
221
+ ### Add to `src/features/index.ts`
222
+
223
+ ```typescript
224
+ // {Feature Name}
225
+ export { analyze{FeatureName}, build{FeatureName}Section } from './{feature-name}';
226
+ export type { {FeatureName}Analysis } from './{feature-name}';
227
+ ```
228
+
229
+ ## Naming Conventions
230
+
231
+ | Item | Convention | Example |
232
+ | ----------------- | -------------------------- | --------------------------- |
233
+ | Folder | kebab-case | `commit-quality` |
234
+ | Analyzer function | `analyze{PascalCase}` | `analyzeCommitQuality` |
235
+ | Template function | `build{PascalCase}Section` | `buildCommitQualitySection` |
236
+ | Type | `{PascalCase}Analysis` | `CommitQualityAnalysis` |
237
+ | CSS class | `{kebab-case}-section` | `commit-quality-section` |
238
+
239
+ ## After Scaffolding
240
+
241
+ 1. List all created files
242
+ 2. Remind user to implement the TODO sections
243
+ 3. Suggest creating a spec with `@spec-writer` for detailed requirements
244
+ 4. Suggest creating tests with `@test-writer`
245
+
246
+ ```
247
+
248
+ ```