git-impact 0.6.6 → 0.7.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.
- package/README.md +32 -24
- package/dist/cli/index.js +9 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/init/installer.d.ts +29 -5
- package/dist/init/installer.d.ts.map +1 -1
- package/dist/init/installer.js +150 -75
- package/dist/init/installer.js.map +1 -1
- package/dist/init/installer.test.js +279 -13
- package/dist/init/installer.test.js.map +1 -1
- package/dist/init/templates.d.ts +12 -9
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +18 -99
- package/dist/init/templates.js.map +1 -1
- package/dist/mcp/server.js +38 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +0 -14
- package/dist/storage/db.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +23 -209
- package/skill/references/mode-init.md +16 -0
- package/skill/references/mode-review.md +40 -0
- package/skill/references/mode-standup.md +122 -0
|
@@ -53,7 +53,7 @@ let tmp;
|
|
|
53
53
|
fs.mkdirSync(path.join(tmp, ".claude"));
|
|
54
54
|
(0, vitest_1.expect)((0, installer_1.detectEditors)(tmp)).toContain("claude");
|
|
55
55
|
});
|
|
56
|
-
(0, vitest_1.it)("finds multiple editors in
|
|
56
|
+
(0, vitest_1.it)("finds multiple editors in catalog order", () => {
|
|
57
57
|
fs.mkdirSync(path.join(tmp, ".cursor"));
|
|
58
58
|
fs.mkdirSync(path.join(tmp, ".gemini"));
|
|
59
59
|
fs.mkdirSync(path.join(tmp, ".claude"));
|
|
@@ -63,17 +63,32 @@ let tmp;
|
|
|
63
63
|
fs.mkdirSync(path.join(tmp, ".github"));
|
|
64
64
|
(0, vitest_1.expect)((0, installer_1.detectEditors)(tmp)).toEqual(["copilot"]);
|
|
65
65
|
});
|
|
66
|
+
(0, vitest_1.it)("detects OpenCode", () => {
|
|
67
|
+
fs.mkdirSync(path.join(tmp, ".opencode"));
|
|
68
|
+
(0, vitest_1.expect)((0, installer_1.detectEditors)(tmp)).toEqual(["opencode"]);
|
|
69
|
+
});
|
|
70
|
+
(0, vitest_1.it)("never returns `agents` (it's always written as a baseline, not user-selectable)", () => {
|
|
71
|
+
fs.mkdirSync(path.join(tmp, ".agents"));
|
|
72
|
+
// `agents` is not part of the public Integration type, so detection
|
|
73
|
+
// must not surface it as an editor to install for.
|
|
74
|
+
(0, vitest_1.expect)((0, installer_1.detectEditors)(tmp)).not.toContain("agents");
|
|
75
|
+
});
|
|
66
76
|
});
|
|
67
|
-
(0, vitest_1.describe)("install", () => {
|
|
68
|
-
(0, vitest_1.it)("writes
|
|
77
|
+
(0, vitest_1.describe)("install — canonical SKILL.md layout", () => {
|
|
78
|
+
(0, vitest_1.it)("always writes the .agents/skills/git-impact/ baseline", () => {
|
|
69
79
|
(0, installer_1.install)({
|
|
70
80
|
repoRoot: tmp,
|
|
71
81
|
integrations: ["claude"],
|
|
72
|
-
context: {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
83
|
+
silent: true,
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".agents", "skills", "git-impact", "SKILL.md"))).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
(0, vitest_1.it)("writes context.json, .gitignore, and CLAUDE.md for claude integration", () => {
|
|
88
|
+
(0, installer_1.install)({
|
|
89
|
+
repoRoot: tmp,
|
|
90
|
+
integrations: ["claude"],
|
|
91
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
77
92
|
silent: true,
|
|
78
93
|
});
|
|
79
94
|
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".git-impact", "context.json"))).toBe(true);
|
|
@@ -91,9 +106,12 @@ let tmp;
|
|
|
91
106
|
const skillDir = path.join(tmp, ".claude", "skills", "git-impact");
|
|
92
107
|
(0, vitest_1.expect)(fs.existsSync(path.join(skillDir, "references", "translation-rules.md"))).toBe(true);
|
|
93
108
|
(0, vitest_1.expect)(fs.existsSync(path.join(skillDir, "references", "html-template.md"))).toBe(true);
|
|
109
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(skillDir, "references", "mode-standup.md"))).toBe(true);
|
|
110
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(skillDir, "references", "mode-review.md"))).toBe(true);
|
|
111
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(skillDir, "references", "mode-init.md"))).toBe(true);
|
|
94
112
|
const skillContent = fs.readFileSync(path.join(skillDir, "SKILL.md"), "utf-8");
|
|
95
113
|
(0, vitest_1.expect)(skillContent).toContain("name: git-impact");
|
|
96
|
-
(0, vitest_1.expect)(skillContent).toContain("
|
|
114
|
+
(0, vitest_1.expect)(skillContent).toContain("references/mode-standup.md");
|
|
97
115
|
});
|
|
98
116
|
(0, vitest_1.it)("is idempotent — running twice does not duplicate gitignore entries", () => {
|
|
99
117
|
(0, installer_1.install)({
|
|
@@ -112,16 +130,264 @@ let tmp;
|
|
|
112
130
|
const matches = gitignore.match(/\.git-impact\/history\.db/g) ?? [];
|
|
113
131
|
(0, vitest_1.expect)(matches.length).toBe(1);
|
|
114
132
|
});
|
|
115
|
-
(0, vitest_1.it)("
|
|
133
|
+
(0, vitest_1.it)("gitignores all regenerable per-machine files, not just history.db", () => {
|
|
134
|
+
(0, installer_1.install)({
|
|
135
|
+
repoRoot: tmp,
|
|
136
|
+
integrations: ["claude"],
|
|
137
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
138
|
+
silent: true,
|
|
139
|
+
});
|
|
140
|
+
const gitignore = fs.readFileSync(path.join(tmp, ".gitignore"), "utf-8");
|
|
141
|
+
(0, vitest_1.expect)(gitignore).toContain(".git-impact/history.db");
|
|
142
|
+
(0, vitest_1.expect)(gitignore).toContain(".git-impact/result.html");
|
|
143
|
+
(0, vitest_1.expect)(gitignore).toContain(".git-impact/standups/");
|
|
144
|
+
});
|
|
145
|
+
(0, vitest_1.it)("fills in missing gitignore entries on re-run without duplicating existing ones", () => {
|
|
146
|
+
// Simulate a repo whose .gitignore already lists only history.db (the
|
|
147
|
+
// pre-0.7.1 installer's single entry). The re-run should append the two
|
|
148
|
+
// newly-tracked entries without re-adding history.db.
|
|
149
|
+
fs.writeFileSync(path.join(tmp, ".gitignore"), "node_modules/\n.git-impact/history.db\n");
|
|
150
|
+
(0, installer_1.install)({
|
|
151
|
+
repoRoot: tmp,
|
|
152
|
+
integrations: ["claude"],
|
|
153
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
154
|
+
silent: true,
|
|
155
|
+
});
|
|
156
|
+
const gitignore = fs.readFileSync(path.join(tmp, ".gitignore"), "utf-8");
|
|
157
|
+
(0, vitest_1.expect)((gitignore.match(/\.git-impact\/history\.db/g) ?? []).length).toBe(1);
|
|
158
|
+
(0, vitest_1.expect)(gitignore).toContain(".git-impact/result.html");
|
|
159
|
+
(0, vitest_1.expect)(gitignore).toContain(".git-impact/standups/");
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.it)("includes manifest.json in the install summary so the CLI reports it", () => {
|
|
162
|
+
const installed = (0, installer_1.install)({
|
|
163
|
+
repoRoot: tmp,
|
|
164
|
+
integrations: ["claude"],
|
|
165
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
166
|
+
silent: true,
|
|
167
|
+
});
|
|
168
|
+
const manifestEntry = installed.find((f) => f.path.endsWith("manifest.json"));
|
|
169
|
+
(0, vitest_1.expect)(manifestEntry).toBeDefined();
|
|
170
|
+
(0, vitest_1.expect)(manifestEntry?.action).toBe("created");
|
|
171
|
+
// Re-running should report it as updated rather than created again.
|
|
172
|
+
const second = (0, installer_1.install)({
|
|
173
|
+
repoRoot: tmp,
|
|
174
|
+
integrations: ["claude"],
|
|
175
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
176
|
+
silent: true,
|
|
177
|
+
});
|
|
178
|
+
(0, vitest_1.expect)(second.find((f) => f.path.endsWith("manifest.json"))?.action).toBe("updated");
|
|
179
|
+
});
|
|
180
|
+
(0, vitest_1.it)("writes the published package version into the manifest (no drift)", () => {
|
|
181
|
+
(0, installer_1.install)({
|
|
182
|
+
repoRoot: tmp,
|
|
183
|
+
integrations: ["claude"],
|
|
184
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
185
|
+
silent: true,
|
|
186
|
+
});
|
|
187
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(tmp, ".git-impact", "manifest.json"), "utf-8"));
|
|
188
|
+
const pkg = JSON.parse(fs.readFileSync(path.resolve(__dirname, "..", "..", "package.json"), "utf-8"));
|
|
189
|
+
(0, vitest_1.expect)(manifest.version).toBe(pkg.version);
|
|
190
|
+
});
|
|
191
|
+
(0, vitest_1.it)("writes SKILL.md to every requested editor's project-local skills root", () => {
|
|
192
|
+
(0, installer_1.install)({
|
|
193
|
+
repoRoot: tmp,
|
|
194
|
+
integrations: ["claude", "copilot", "cursor", "gemini", "opencode"],
|
|
195
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
196
|
+
silent: true,
|
|
197
|
+
});
|
|
198
|
+
const skill = (p) => path.join(tmp, p, "git-impact", "SKILL.md");
|
|
199
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".agents/skills"))).toBe(true);
|
|
200
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".claude/skills"))).toBe(true);
|
|
201
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".github/skills"))).toBe(true);
|
|
202
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".cursor/skills"))).toBe(true);
|
|
203
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".gemini/skills"))).toBe(true);
|
|
204
|
+
(0, vitest_1.expect)(fs.existsSync(skill(".opencode/skills"))).toBe(true);
|
|
205
|
+
});
|
|
206
|
+
(0, vitest_1.it)("never writes the legacy per-editor instruction files", () => {
|
|
116
207
|
(0, installer_1.install)({
|
|
117
208
|
repoRoot: tmp,
|
|
118
209
|
integrations: ["claude", "copilot", "cursor", "gemini"],
|
|
119
210
|
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
120
211
|
silent: true,
|
|
121
212
|
});
|
|
122
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"))).toBe(
|
|
123
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".cursor", "rules", "git-impact.mdc"))).toBe(
|
|
124
|
-
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".gemini", "commands", "git-impact.md"))).toBe(
|
|
213
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"))).toBe(false);
|
|
214
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".cursor", "rules", "git-impact.mdc"))).toBe(false);
|
|
215
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".gemini", "commands", "git-impact.md"))).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
(0, vitest_1.describe)("install — preserves on-disk context fields the wizard doesn't collect", () => {
|
|
219
|
+
(0, vitest_1.it)("keeps an existing githubToken across a re-run of init", () => {
|
|
220
|
+
fs.mkdirSync(path.join(tmp, ".git-impact"), { recursive: true });
|
|
221
|
+
fs.writeFileSync(path.join(tmp, ".git-impact", "context.json"), JSON.stringify({
|
|
222
|
+
companyDescription: "old",
|
|
223
|
+
managerPriorities: "old",
|
|
224
|
+
glossary: {},
|
|
225
|
+
githubToken: "ghp_secret_from_previous_init",
|
|
226
|
+
}) + "\n");
|
|
227
|
+
(0, installer_1.install)({
|
|
228
|
+
repoRoot: tmp,
|
|
229
|
+
integrations: ["claude"],
|
|
230
|
+
context: { companyDescription: "new", managerPriorities: "new", glossary: {} },
|
|
231
|
+
silent: true,
|
|
232
|
+
});
|
|
233
|
+
const written = JSON.parse(fs.readFileSync(path.join(tmp, ".git-impact", "context.json"), "utf-8"));
|
|
234
|
+
(0, vitest_1.expect)(written.githubToken).toBe("ghp_secret_from_previous_init");
|
|
235
|
+
(0, vitest_1.expect)(written.companyDescription).toBe("new");
|
|
236
|
+
(0, vitest_1.expect)(written.managerPriorities).toBe("new");
|
|
237
|
+
});
|
|
238
|
+
(0, vitest_1.it)("keeps an existing privacy block across a re-run of init", () => {
|
|
239
|
+
fs.mkdirSync(path.join(tmp, ".git-impact"), { recursive: true });
|
|
240
|
+
fs.writeFileSync(path.join(tmp, ".git-impact", "context.json"), JSON.stringify({
|
|
241
|
+
companyDescription: "X",
|
|
242
|
+
managerPriorities: "Y",
|
|
243
|
+
glossary: {},
|
|
244
|
+
privacy: { redact: false },
|
|
245
|
+
}) + "\n");
|
|
246
|
+
(0, installer_1.install)({
|
|
247
|
+
repoRoot: tmp,
|
|
248
|
+
integrations: ["claude"],
|
|
249
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
250
|
+
silent: true,
|
|
251
|
+
});
|
|
252
|
+
const written = JSON.parse(fs.readFileSync(path.join(tmp, ".git-impact", "context.json"), "utf-8"));
|
|
253
|
+
(0, vitest_1.expect)(written.privacy).toEqual({ redact: false });
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
(0, vitest_1.describe)("install — legacy migration", () => {
|
|
257
|
+
(0, vitest_1.it)("removes pre-0.7 per-editor instruction files when present", () => {
|
|
258
|
+
fs.mkdirSync(path.join(tmp, ".github", "instructions"), { recursive: true });
|
|
259
|
+
fs.mkdirSync(path.join(tmp, ".cursor", "rules"), { recursive: true });
|
|
260
|
+
fs.mkdirSync(path.join(tmp, ".gemini", "commands"), { recursive: true });
|
|
261
|
+
fs.writeFileSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"), "legacy");
|
|
262
|
+
fs.writeFileSync(path.join(tmp, ".cursor", "rules", "git-impact.mdc"), "legacy");
|
|
263
|
+
fs.writeFileSync(path.join(tmp, ".gemini", "commands", "git-impact.md"), "legacy");
|
|
264
|
+
const result = (0, installer_1.install)({
|
|
265
|
+
repoRoot: tmp,
|
|
266
|
+
integrations: ["claude"],
|
|
267
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
268
|
+
silent: true,
|
|
269
|
+
});
|
|
270
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"))).toBe(false);
|
|
271
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".cursor", "rules", "git-impact.mdc"))).toBe(false);
|
|
272
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".gemini", "commands", "git-impact.md"))).toBe(false);
|
|
273
|
+
const removed = result.filter((r) => r.action === "removed");
|
|
274
|
+
(0, vitest_1.expect)(removed).toHaveLength(3);
|
|
275
|
+
});
|
|
276
|
+
(0, vitest_1.it)("removes the now-empty parent dirs after migration", () => {
|
|
277
|
+
fs.mkdirSync(path.join(tmp, ".cursor", "rules"), { recursive: true });
|
|
278
|
+
fs.writeFileSync(path.join(tmp, ".cursor", "rules", "git-impact.mdc"), "legacy");
|
|
279
|
+
(0, installer_1.install)({
|
|
280
|
+
repoRoot: tmp,
|
|
281
|
+
integrations: ["claude"],
|
|
282
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
283
|
+
silent: true,
|
|
284
|
+
});
|
|
285
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".cursor", "rules"))).toBe(false);
|
|
286
|
+
});
|
|
287
|
+
(0, vitest_1.it)("leaves sibling files in the legacy dirs alone", () => {
|
|
288
|
+
fs.mkdirSync(path.join(tmp, ".github", "instructions"), { recursive: true });
|
|
289
|
+
fs.writeFileSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"), "legacy");
|
|
290
|
+
fs.writeFileSync(path.join(tmp, ".github", "instructions", "other.md"), "keep me");
|
|
291
|
+
(0, installer_1.install)({
|
|
292
|
+
repoRoot: tmp,
|
|
293
|
+
integrations: ["claude"],
|
|
294
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
295
|
+
silent: true,
|
|
296
|
+
});
|
|
297
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, ".github", "instructions", "other.md"))).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
(0, vitest_1.it)("is a no-op when no legacy files are present", () => {
|
|
300
|
+
const result = (0, installer_1.install)({
|
|
301
|
+
repoRoot: tmp,
|
|
302
|
+
integrations: ["claude"],
|
|
303
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
304
|
+
silent: true,
|
|
305
|
+
});
|
|
306
|
+
const removed = result.filter((r) => r.action === "removed");
|
|
307
|
+
(0, vitest_1.expect)(removed).toHaveLength(0);
|
|
308
|
+
});
|
|
309
|
+
(0, vitest_1.it)("runs migration BEFORE the install step (so legacy files can't shadow new ones)", () => {
|
|
310
|
+
fs.mkdirSync(path.join(tmp, ".github", "instructions"), { recursive: true });
|
|
311
|
+
fs.writeFileSync(path.join(tmp, ".github", "instructions", "git-impact.instructions.md"), "legacy");
|
|
312
|
+
const result = (0, installer_1.install)({
|
|
313
|
+
repoRoot: tmp,
|
|
314
|
+
integrations: ["claude"],
|
|
315
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
316
|
+
silent: true,
|
|
317
|
+
});
|
|
318
|
+
// The InstalledFile[] array preserves operation order. A `removed`
|
|
319
|
+
// entry must appear BEFORE any `created` entry under a SKILL.md path.
|
|
320
|
+
const indexOfFirstRemove = result.findIndex((r) => r.action === "removed");
|
|
321
|
+
const indexOfFirstCreate = result.findIndex((r) => r.action === "created" && r.path.includes("SKILL.md"));
|
|
322
|
+
(0, vitest_1.expect)(indexOfFirstRemove).toBeGreaterThan(-1);
|
|
323
|
+
(0, vitest_1.expect)(indexOfFirstCreate).toBeGreaterThan(-1);
|
|
324
|
+
(0, vitest_1.expect)(indexOfFirstRemove).toBeLessThan(indexOfFirstCreate);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
(0, vitest_1.describe)("install — CLAUDE.md guard", () => {
|
|
328
|
+
(0, vitest_1.it)("writes CLAUDE.md when `claude` is in integrations", () => {
|
|
329
|
+
(0, installer_1.install)({
|
|
330
|
+
repoRoot: tmp,
|
|
331
|
+
integrations: ["claude"],
|
|
332
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
333
|
+
silent: true,
|
|
334
|
+
});
|
|
335
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, "CLAUDE.md"))).toBe(true);
|
|
336
|
+
});
|
|
337
|
+
(0, vitest_1.it)("does NOT write CLAUDE.md for non-Claude integrations on a fresh repo", () => {
|
|
338
|
+
(0, installer_1.install)({
|
|
339
|
+
repoRoot: tmp,
|
|
340
|
+
integrations: ["cursor"],
|
|
341
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
342
|
+
silent: true,
|
|
343
|
+
});
|
|
344
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, "CLAUDE.md"))).toBe(false);
|
|
345
|
+
});
|
|
346
|
+
(0, vitest_1.it)("DOES write CLAUDE.md for a non-claude integration when `.claude/` already exists", () => {
|
|
347
|
+
// A user who already has Claude Code configured (even though they're
|
|
348
|
+
// running init for a different editor today) should still get the
|
|
349
|
+
// CLAUDE.md block so Claude Code can find the skill later.
|
|
350
|
+
fs.mkdirSync(path.join(tmp, ".claude"));
|
|
351
|
+
(0, installer_1.install)({
|
|
352
|
+
repoRoot: tmp,
|
|
353
|
+
integrations: ["cursor"],
|
|
354
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
355
|
+
silent: true,
|
|
356
|
+
});
|
|
357
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(tmp, "CLAUDE.md"))).toBe(true);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
(0, vitest_1.describe)("SKILL.md frontmatter — strict-editor compatibility", () => {
|
|
361
|
+
(0, vitest_1.it)("description fits within OpenCode's 1024-char cap", () => {
|
|
362
|
+
(0, installer_1.install)({
|
|
363
|
+
repoRoot: tmp,
|
|
364
|
+
integrations: ["claude"],
|
|
365
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
366
|
+
silent: true,
|
|
367
|
+
});
|
|
368
|
+
const content = fs.readFileSync(path.join(tmp, ".claude", "skills", "git-impact", "SKILL.md"), "utf-8");
|
|
369
|
+
const m = content.match(/description:\s*>\s*\n([\s\S]+?)\n---/);
|
|
370
|
+
(0, vitest_1.expect)(m, "description block not found in SKILL.md frontmatter").toBeTruthy();
|
|
371
|
+
const desc = m[1].replace(/\s+/g, " ").trim();
|
|
372
|
+
// OpenCode caps description at 1024 chars per their published Agent
|
|
373
|
+
// Skills docs. GitHub Copilot's name regex is strict but doesn't cap
|
|
374
|
+
// description — OpenCode is the tightest constraint.
|
|
375
|
+
(0, vitest_1.expect)(desc.length).toBeLessThanOrEqual(1024);
|
|
376
|
+
});
|
|
377
|
+
(0, vitest_1.it)("name matches the strict regex used by OpenCode + GitHub Copilot", () => {
|
|
378
|
+
(0, installer_1.install)({
|
|
379
|
+
repoRoot: tmp,
|
|
380
|
+
integrations: ["claude"],
|
|
381
|
+
context: { companyDescription: "X", managerPriorities: "Y", glossary: {} },
|
|
382
|
+
silent: true,
|
|
383
|
+
});
|
|
384
|
+
const content = fs.readFileSync(path.join(tmp, ".claude", "skills", "git-impact", "SKILL.md"), "utf-8");
|
|
385
|
+
const m = content.match(/^name:\s*(\S+)/m);
|
|
386
|
+
(0, vitest_1.expect)(m).toBeTruthy();
|
|
387
|
+
// lowercase letters/digits/hyphens, ≤64 chars, no leading/trailing/
|
|
388
|
+
// consecutive hyphens. Anything else and Copilot silently fails to
|
|
389
|
+
// register the skill.
|
|
390
|
+
(0, vitest_1.expect)(m[1]).toMatch(/^[a-z0-9](?!.*--)[a-z0-9-]{0,62}[a-z0-9]$/);
|
|
125
391
|
});
|
|
126
392
|
});
|
|
127
393
|
//# sourceMappingURL=installer.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../../src/init/installer.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../../src/init/installer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/init/templates.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Static, editor-agnostic templates used by the installer.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* from the shipped `skill/` directory at install time so
|
|
6
|
-
*
|
|
4
|
+
* The skill itself (SKILL.md + references/) is NOT embedded here — it's
|
|
5
|
+
* copied directly from the shipped `skill/` directory at install time so
|
|
6
|
+
* the SKILL.md, references/, and any future assets/ stay single-source.
|
|
7
|
+
* See `installer.ts#installSkillFolder`.
|
|
7
8
|
*/
|
|
8
|
-
export declare const CLAUDE_MD_BLOCK = "\n## git-impact\n\nThis repo uses [git-impact](https://github.com/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
export declare const CLAUDE_MD_BLOCK = "\n## git-impact\n\nThis repo uses [git-impact](https://github.com/efraimnafady/git-impact) for\nstandup and performance review generation. The skill works in any editor that\nsupports the [Agent Skills](https://agentskills.io) format \u2014 Claude Code,\nCursor, GitHub Copilot, Gemini CLI, OpenCode, and Antigravity get\nvendor-specific mirrors; Goose, Amp, Codex, Letta, Roo pick up the same skill\nfrom `.agents/skills/`.\n\n- Say **\"do my standup\"** to translate today's commits into business impact\n- Say **\"git-impact since 3d\"** to look back further\n- Say **\"generate a performance review\"** after a few weeks of standups\n- Say **\"set up context for this repo\"** to configure the glossary\n\nContext is stored in `.git-impact/context.json` (committed, team-shared).\nHistory is stored in `.git-impact/history.db` (gitignored, per-machine).\n";
|
|
10
|
+
/**
|
|
11
|
+
* Serialize the full UserContext to context.json. Pre-existing optional fields
|
|
12
|
+
* (githubToken, privacy, …) flow through verbatim so a re-run of `init` never
|
|
13
|
+
* drops state that wasn't collected by the wizard.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CONTEXT_TEMPLATE: (ctx: object) => string;
|
|
13
16
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,eAAe,g2BAiB3B,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,MACV,CAAC"}
|
package/dist/init/templates.js
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Static, editor-agnostic templates used by the installer.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* from the shipped `skill/` directory at install time so
|
|
7
|
-
*
|
|
5
|
+
* The skill itself (SKILL.md + references/) is NOT embedded here — it's
|
|
6
|
+
* copied directly from the shipped `skill/` directory at install time so
|
|
7
|
+
* the SKILL.md, references/, and any future assets/ stay single-source.
|
|
8
|
+
* See `installer.ts#installSkillFolder`.
|
|
8
9
|
*/
|
|
9
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.CONTEXT_TEMPLATE = exports.
|
|
11
|
+
exports.CONTEXT_TEMPLATE = exports.CLAUDE_MD_BLOCK = void 0;
|
|
11
12
|
// ─── CLAUDE.md managed block ──────────────────────────────────────────────────
|
|
12
13
|
exports.CLAUDE_MD_BLOCK = `
|
|
13
14
|
## git-impact
|
|
14
15
|
|
|
15
|
-
This repo uses [git-impact](https://github.com/
|
|
16
|
-
performance review generation.
|
|
16
|
+
This repo uses [git-impact](https://github.com/efraimnafady/git-impact) for
|
|
17
|
+
standup and performance review generation. The skill works in any editor that
|
|
18
|
+
supports the [Agent Skills](https://agentskills.io) format — Claude Code,
|
|
19
|
+
Cursor, GitHub Copilot, Gemini CLI, OpenCode, and Antigravity get
|
|
20
|
+
vendor-specific mirrors; Goose, Amp, Codex, Letta, Roo pick up the same skill
|
|
21
|
+
from \`.agents/skills/\`.
|
|
17
22
|
|
|
18
23
|
- Say **"do my standup"** to translate today's commits into business impact
|
|
19
24
|
- Say **"git-impact since 3d"** to look back further
|
|
@@ -23,98 +28,12 @@ performance review generation.
|
|
|
23
28
|
Context is stored in \`.git-impact/context.json\` (committed, team-shared).
|
|
24
29
|
History is stored in \`.git-impact/history.db\` (gitignored, per-machine).
|
|
25
30
|
`;
|
|
26
|
-
// Shared instruction body used by Copilot, Cursor, Gemini.
|
|
27
|
-
// These editors don't auto-execute MCP tools the way Claude Code does, so
|
|
28
|
-
// the instructions here describe the bash fallback path. If the editor
|
|
29
|
-
// supports MCP, prefer the git-impact MCP server's tools over bash.
|
|
30
|
-
const SHARED_INSTRUCTIONS = `## When to trigger
|
|
31
|
-
|
|
32
|
-
User says any of: "do my standup", "/git-impact", "what did I ship today",
|
|
33
|
-
"translate my commits", "since yesterday", "since 3d", "since last standup",
|
|
34
|
-
"weekly summary", "performance review prep", "generate a review".
|
|
35
|
-
|
|
36
|
-
## Preferred path: MCP
|
|
37
|
-
|
|
38
|
-
If the \`git-impact\` MCP server is configured for this editor, use its tools:
|
|
39
|
-
|
|
40
|
-
1. \`get_last_standup_date\` — find the lookback start
|
|
41
|
-
2. \`get_git_activity\` (since_iso = day-after last standup, or start-of-today)
|
|
42
|
-
3. \`get_github_activity\` if a github_token exists in context
|
|
43
|
-
4. Translate using the rules below
|
|
44
|
-
5. \`save_impact_entry\` with each item including \`provenance\`
|
|
45
|
-
(\`pr\` | \`commit_body\` | \`commit_message\` | \`ticket\` | \`inferred\`)
|
|
46
|
-
|
|
47
|
-
## Fallback path: bash
|
|
48
|
-
|
|
49
|
-
If MCP isn't available, run:
|
|
50
|
-
\`\`\`bash
|
|
51
|
-
REPO=$(git rev-parse --show-toplevel)
|
|
52
|
-
cat "$REPO/.git-impact/context.json" # glossary, manager priorities
|
|
53
|
-
git -C "$REPO" log --since="today 00:00:00" --format="%h|%s|%b|%an|%ad" --date=short HEAD
|
|
54
|
-
git -C "$REPO" diff --stat HEAD~5 HEAD
|
|
55
|
-
\`\`\`
|
|
56
|
-
|
|
57
|
-
Then translate, then ask the user to run \`git-impact view\` to see the saved
|
|
58
|
-
HTML report (the bash path can't write to history.db safely from this editor).
|
|
59
|
-
|
|
60
|
-
## Translation rules
|
|
61
|
-
|
|
62
|
-
1. **What + why**, not what + how. Never restate commit messages.
|
|
63
|
-
2. **Apply the glossary** from context.json — replace technical terms with
|
|
64
|
-
plain-English equivalents.
|
|
65
|
-
3. **Provenance is mandatory** for every saved item:
|
|
66
|
-
- \`pr\` — quoted from the linked PR description
|
|
67
|
-
- \`commit_body\` — pulled from a multi-line commit body
|
|
68
|
-
- \`commit_message\` — visible in the subject line
|
|
69
|
-
- \`ticket\` — pulled from a linked Linear/Jira ticket
|
|
70
|
-
- \`inferred\` — guessed without explicit text. Use this honestly.
|
|
71
|
-
4. **Group related commits** into one bullet.
|
|
72
|
-
5. WIP → \`status: "in_progress"\` with **expected outcome**, not progress so far.
|
|
73
|
-
6. Blocked → \`status: "blocked"\`.
|
|
74
|
-
7. **Be specific with numbers** — pull them from commits/PRs, never invent them.
|
|
75
|
-
|
|
76
|
-
## Output
|
|
77
|
-
|
|
78
|
-
\`\`\`
|
|
79
|
-
📅 [Date or range]
|
|
80
|
-
✅ [Plain-English summary]
|
|
81
|
-
→ [Why it matters]
|
|
82
|
-
⏳ In progress: [What] → [Expected outcome]
|
|
83
|
-
🚫 Blocked: [What] → [What's needed]
|
|
84
|
-
📁 [N] files across [areas] · [N] commit(s) on [branch]
|
|
85
|
-
\`\`\`
|
|
86
|
-
|
|
87
|
-
## Tone
|
|
88
|
-
|
|
89
|
-
Non-technical-manager audience. Short sentences. No filler. 2 accurate bullets
|
|
90
|
-
beat 5 vague ones. If you guessed the impact, label \`provenance: inferred\`
|
|
91
|
-
and use phrasing like "technical foundation work for X" — never hedge with
|
|
92
|
-
"might potentially".
|
|
93
|
-
`;
|
|
94
|
-
// ─── GitHub Copilot instructions ──────────────────────────────────────────────
|
|
95
|
-
exports.COPILOT_INSTRUCTIONS = `# git-impact
|
|
96
|
-
|
|
97
|
-
Translate git commits into plain-English business impact for standups,
|
|
98
|
-
manager updates, and performance review prep.
|
|
99
|
-
|
|
100
|
-
${SHARED_INSTRUCTIONS}`;
|
|
101
|
-
// ─── Cursor rules ─────────────────────────────────────────────────────────────
|
|
102
|
-
exports.CURSOR_RULES = `---
|
|
103
|
-
description: git-impact — turn git commits into plain-English standup bullets
|
|
104
|
-
globs: []
|
|
105
|
-
alwaysApply: false
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
# git-impact
|
|
109
|
-
|
|
110
|
-
${SHARED_INSTRUCTIONS}`;
|
|
111
|
-
// ─── Gemini CLI commands ──────────────────────────────────────────────────────
|
|
112
|
-
exports.GEMINI_COMMAND = `# git-impact
|
|
113
|
-
|
|
114
|
-
Translate git commits into plain-English business impact.
|
|
115
|
-
|
|
116
|
-
${SHARED_INSTRUCTIONS}`;
|
|
117
31
|
// ─── context.json template ────────────────────────────────────────────────────
|
|
118
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Serialize the full UserContext to context.json. Pre-existing optional fields
|
|
34
|
+
* (githubToken, privacy, …) flow through verbatim so a re-run of `init` never
|
|
35
|
+
* drops state that wasn't collected by the wizard.
|
|
36
|
+
*/
|
|
37
|
+
const CONTEXT_TEMPLATE = (ctx) => JSON.stringify(ctx, null, 2) + "\n";
|
|
119
38
|
exports.CONTEXT_TEMPLATE = CONTEXT_TEMPLATE;
|
|
120
39
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,iFAAiF;AAEpE,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;CAiB9B,CAAC;AAEF,iFAAiF;AAEjF;;;;GAIG;AACI,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAU,EAAE,CACtD,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AADzB,QAAA,gBAAgB,oBACS"}
|