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
package/dist/mcp/server.js
CHANGED
|
@@ -11,6 +11,39 @@
|
|
|
11
11
|
* Prompts — computed templates: fetch live data + embed translation instructions
|
|
12
12
|
* so Claude Code does the AI work inside its own session, no API key needed
|
|
13
13
|
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
14
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
48
|
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
16
49
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
@@ -18,8 +51,12 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
18
51
|
const tools_js_1 = require("./tools.js");
|
|
19
52
|
const resources_js_1 = require("./resources.js");
|
|
20
53
|
const prompts_js_1 = require("./prompts.js");
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
// Read version from package.json so it never drifts from the published package.
|
|
56
|
+
// __dirname is dist/mcp/ at runtime → ../../package.json is the package root.
|
|
57
|
+
const { version: PKG_VERSION } = require(path.resolve(__dirname, "..", "..", "package.json"));
|
|
21
58
|
// ─── Server setup ────────────────────────────────────────────────────────────
|
|
22
|
-
const server = new index_js_1.Server({ name: "git-impact", version:
|
|
59
|
+
const server = new index_js_1.Server({ name: "git-impact", version: PKG_VERSION }, {
|
|
23
60
|
capabilities: {
|
|
24
61
|
tools: {},
|
|
25
62
|
resources: {},
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;GAUG
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,iEAO4C;AAE5C,yCAA0D;AAC1D,iDAA0E;AAC1E,6CAAmE;AAEnE,2CAA6B;AAC7B,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;AAE9F,gFAAgF;AAEhF,MAAM,MAAM,GAAG,IAAI,iBAAM,CACvB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,EAC5C;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;KACZ;CACF,CACF,CAAC;AAEF,gFAAgF;AAEhF,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,2BAAgB;CACxB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,gCAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,IAAA,qBAAU,EAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,MAAM,CAAC,iBAAiB,CAAC,qCAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAChE,SAAS,EAAE,mCAAoB;CAChC,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,oCAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACpE,OAAO,IAAA,iCAAkB,EAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,MAAM,CAAC,iBAAiB,CAAC,mCAAwB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,+BAAkB;CAC5B,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,iCAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACjE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,IAAA,4BAAe,EAAC,IAAI,EAAE,IAA0C,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/storage/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,aAAa,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,uFAAuF;IACvF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAuED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQpE;AAID,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAmBtE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,WAAW,EAAE,CAMf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAMlF"}
|
package/dist/storage/db.js
CHANGED
|
@@ -56,7 +56,6 @@ const fs = __importStar(require("fs"));
|
|
|
56
56
|
const GIT_IMPACT_DIR = ".git-impact";
|
|
57
57
|
const CONTEXT_FILE = "context.json";
|
|
58
58
|
const HISTORY_FILE = "history.db";
|
|
59
|
-
const GITIGNORE_ENTRY = ".git-impact/history.db";
|
|
60
59
|
// ─── DB (per-repo, cached by repo root) ──────────────────────────────────────
|
|
61
60
|
const _dbs = new Map();
|
|
62
61
|
function getDb(repoRoot) {
|
|
@@ -64,7 +63,6 @@ function getDb(repoRoot) {
|
|
|
64
63
|
return _dbs.get(repoRoot);
|
|
65
64
|
const dir = gitImpactDir(repoRoot);
|
|
66
65
|
fs.mkdirSync(dir, { recursive: true });
|
|
67
|
-
ensureGitignore(repoRoot);
|
|
68
66
|
const db = new better_sqlite3_1.default(path.join(dir, HISTORY_FILE));
|
|
69
67
|
db.exec(`
|
|
70
68
|
CREATE TABLE IF NOT EXISTS impact_entries (
|
|
@@ -131,7 +129,6 @@ function loadContext(repoRoot) {
|
|
|
131
129
|
function saveContext(ctx, repoRoot) {
|
|
132
130
|
const dir = gitImpactDir(repoRoot);
|
|
133
131
|
fs.mkdirSync(dir, { recursive: true });
|
|
134
|
-
ensureGitignore(repoRoot);
|
|
135
132
|
fs.writeFileSync(path.join(dir, CONTEXT_FILE), JSON.stringify(ctx, null, 2) + "\n", "utf-8");
|
|
136
133
|
}
|
|
137
134
|
// ─── Entries ──────────────────────────────────────────────────────────────────
|
|
@@ -184,17 +181,6 @@ function getEntriesForDaysAgo(days, repoRoot) {
|
|
|
184
181
|
function gitImpactDir(repoRoot) {
|
|
185
182
|
return path.join(repoRoot, GIT_IMPACT_DIR);
|
|
186
183
|
}
|
|
187
|
-
/** Add history.db to .gitignore automatically — only the DB, not context.json */
|
|
188
|
-
function ensureGitignore(repoRoot) {
|
|
189
|
-
const gitignorePath = path.join(repoRoot, ".gitignore");
|
|
190
|
-
const existing = fs.existsSync(gitignorePath)
|
|
191
|
-
? fs.readFileSync(gitignorePath, "utf-8")
|
|
192
|
-
: "";
|
|
193
|
-
if (!existing.includes(GITIGNORE_ENTRY)) {
|
|
194
|
-
const addition = `\n# git-impact local history (private, per-machine)\n${GITIGNORE_ENTRY}\n`;
|
|
195
|
-
fs.appendFileSync(gitignorePath, addition, "utf-8");
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
184
|
function rowToEntry(row) {
|
|
199
185
|
return {
|
|
200
186
|
id: row.id,
|
package/dist/storage/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/storage/db.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -10,8 +10,9 @@ description: >
|
|
|
10
10
|
review", "performance review prep", "review my commits", "what's blocked",
|
|
11
11
|
"weekly summary". Trigger on any request to turn raw git output into
|
|
12
12
|
something a non-technical manager can read. The skill orchestrates MCP
|
|
13
|
-
tools (get_git_activity, get_last_standup_date, save_impact_entry,
|
|
14
|
-
|
|
13
|
+
tools (get_git_activity, get_last_standup_date, save_impact_entry,
|
|
14
|
+
render_dashboard, get_history, update_context) — it does not run sqlite3
|
|
15
|
+
or other DB commands directly.
|
|
15
16
|
---
|
|
16
17
|
|
|
17
18
|
# git-impact
|
|
@@ -23,217 +24,31 @@ rules, and produce the output. The MCP server owns all data access (git, DB).
|
|
|
23
24
|
You own the language.
|
|
24
25
|
|
|
25
26
|
If the `git-impact` MCP server is not available in this conversation, tell
|
|
26
|
-
the user: *"The git-impact MCP server isn't connected. Add it to
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
and you'll diverge from the canonical writer.
|
|
31
|
-
|
|
32
|
-
**Pass `repo_path` explicitly to every tool call after the first.** The
|
|
33
|
-
first `get_git_activity` call returns `_repo_root` in its response. Save
|
|
34
|
-
that value and pass it as `repo_path` to every subsequent call
|
|
35
|
-
(`save_impact_entry`, `render_dashboard`, etc.). The MCP server caches
|
|
36
|
-
the resolved path within a session, but explicit passing is more reliable
|
|
37
|
-
when the server's cwd shifts.
|
|
38
|
-
|
|
39
|
-
---
|
|
27
|
+
the user: *"The git-impact MCP server isn't connected. Add it to your
|
|
28
|
+
editor's MCP config (`command = "npx"`, `args = ["git-impact-mcp"]`) and
|
|
29
|
+
restart."* Don't try to emulate the workflow with raw bash — the SQLite
|
|
30
|
+
schema is non-trivial and you'll diverge from the canonical writer.
|
|
40
31
|
|
|
41
32
|
## Pick a mode from the user's message
|
|
42
33
|
|
|
43
|
-
| User says | Mode |
|
|
44
|
-
|
|
45
|
-
| "do my standup", "today", "/git-impact", no args | **standup** (default) |
|
|
46
|
-
| "since yesterday", "since 3d", "since 2026-05-01" | **standup**
|
|
47
|
-
| "review", "performance review", "last 90 days", "Q2 review" | **review** |
|
|
48
|
-
| "init", "set up context", "configure for this repo" | **init** |
|
|
49
|
-
| "make a presentation", "make a slide", "make me a shareable" | **standup** +
|
|
50
|
-
|
|
51
|
-
The default standup writes to the rolling HTML dashboard at
|
|
52
|
-
`.git-impact/result.html` (regenerated in step 7 via the
|
|
53
|
-
`render_dashboard` MCP tool — *not* by asking the user to run a CLI).
|
|
54
|
-
The per-day bespoke HTML is only created when the user explicitly asks
|
|
55
|
-
for a presentation — don't write one by default; it's expensive and
|
|
56
|
-
most days don't need it.
|
|
57
|
-
|
|
58
|
-
If the message is ambiguous, default to **standup**.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Mode: standup
|
|
63
|
-
|
|
64
|
-
### 0. Resolve the repo path FIRST (before any MCP call)
|
|
65
|
-
|
|
66
|
-
The MCP server's cwd is not your editor's cwd — it usually lives inside
|
|
67
|
-
the npx cache. Every tool call needs an explicit `repo_path`. Get it once
|
|
68
|
-
at the top of the standup:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
pwd # returns the absolute path of the open project in Claude Code
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Save that as `REPO_PATH` and pass it as `repo_path` to every MCP tool call
|
|
75
|
-
in this standup. If the user's message names a specific project ("for
|
|
76
|
-
~/code/foo"), use that instead.
|
|
77
|
-
|
|
78
|
-
### 1. Resolve the lookback window
|
|
79
|
-
|
|
80
|
-
- If the user said an explicit "since X", convert to an ISO timestamp and use it.
|
|
81
|
-
- Otherwise call **`get_last_standup_date`**. If it returns a date, use the
|
|
82
|
-
start of the day after that date as `since_iso`. If it returns null,
|
|
83
|
-
default to start-of-today.
|
|
84
|
-
|
|
85
|
-
This is the "since last standup" default — it survives weekends and days off.
|
|
86
|
-
|
|
87
|
-
### 2. Fetch git activity
|
|
88
|
-
|
|
89
|
-
Call **`get_git_activity`** with `since_iso` and (optionally) `until_iso`.
|
|
90
|
-
You'll get back commits, file stats, branch, and `_repo_root` — the
|
|
91
|
-
absolute path the MCP server resolved.
|
|
92
|
-
|
|
93
|
-
> **CRITICAL: capture `_repo_root` from this response and pass it as
|
|
94
|
-
> `repo_path` to every subsequent tool call** (`save_impact_entry`,
|
|
95
|
-
> `render_dashboard`, `get_history`). The MCP server caches it after
|
|
96
|
-
> the first successful call, but threading it explicitly is the safe
|
|
97
|
-
> belt-and-suspenders move and removes any chance the second tool call
|
|
98
|
-
> resolves to a different directory.
|
|
99
|
-
|
|
100
|
-
If there are no commits in the window: tell the user clearly and stop. Do
|
|
101
|
-
NOT save an empty entry.
|
|
102
|
-
|
|
103
|
-
### 3. Optional: enrich with GitHub PR data
|
|
104
|
-
|
|
105
|
-
If the user has a `github_token` saved in their context (the
|
|
106
|
-
`get_git_activity` response or a prior `get_github_activity` call will tell
|
|
107
|
-
you), call **`get_github_activity`** to pull PR titles and descriptions.
|
|
108
|
-
PR descriptions are the single best source for accurate "why it matters"
|
|
109
|
-
text — strongly prefer them over inference.
|
|
110
|
-
|
|
111
|
-
### 4. Translate
|
|
112
|
-
|
|
113
|
-
Read **`references/translation-rules.md`** for the prompt-engineering details.
|
|
114
|
-
Key rules at a glance:
|
|
115
|
-
|
|
116
|
-
- **What + why**, not what + how
|
|
117
|
-
- **Apply the glossary** from `context.json` (returned by the context resource
|
|
118
|
-
or visible in `get_git_activity` output)
|
|
119
|
-
- **Provenance is mandatory** — every saved bullet gets `pr` / `commit_body` /
|
|
120
|
-
`commit_message` / `ticket` / `inferred`
|
|
121
|
-
- **Group related commits** into one bullet, not many
|
|
122
|
-
- **2-5 bullets total**, never more
|
|
123
|
-
|
|
124
|
-
### 5. Print the user-facing output
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
📅 [Day, Date or date range]
|
|
128
|
-
|
|
129
|
-
✅ [Summary]
|
|
130
|
-
→ [Why it matters]
|
|
131
|
-
|
|
132
|
-
⏳ In progress: [What]
|
|
133
|
-
→ [Expected outcome]
|
|
34
|
+
| User says | Mode | Read |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| "do my standup", "today", "/git-impact", no args | **standup** (default) | `references/mode-standup.md` |
|
|
37
|
+
| "since yesterday", "since 3d", "since 2026-05-01" | **standup** + explicit `since_iso` | `references/mode-standup.md` |
|
|
38
|
+
| "review", "performance review", "last 90 days", "Q2 review" | **review** | `references/mode-review.md` |
|
|
39
|
+
| "init", "set up context", "configure for this repo" | **init** | `references/mode-init.md` |
|
|
40
|
+
| "make a presentation", "make a slide", "make me a shareable" | **standup** + bespoke HTML | `references/mode-standup.md` + `references/html-template.md` |
|
|
134
41
|
|
|
135
|
-
|
|
136
|
-
|
|
42
|
+
If the message is ambiguous, default to **standup**. Load only the
|
|
43
|
+
reference file(s) for the chosen mode — don't read all of them.
|
|
137
44
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
Call **`save_impact_entry`** with the structured items including
|
|
145
|
-
`provenance` for each. The MCP tool handles the SQLite write — never run
|
|
146
|
-
`sqlite3` directly. Required fields per item: `status`, `summary`,
|
|
147
|
-
`provenance`. Recommended: `impact`, `refs`.
|
|
148
|
-
|
|
149
|
-
Example item:
|
|
150
|
-
```json
|
|
151
|
-
{
|
|
152
|
-
"status": "done",
|
|
153
|
-
"summary": "Shipped multi-tenant data isolation",
|
|
154
|
-
"impact": "Unblocks SOC2 sign-off, prevents cross-company data leaks",
|
|
155
|
-
"provenance": "pr",
|
|
156
|
-
"refs": ["PR #142", "ENG-1234"]
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### 7. Regenerate the rolling dashboard, then print its URL
|
|
161
|
-
|
|
162
|
-
Call **`render_dashboard`** with the same `repo_path`. It rewrites
|
|
163
|
-
`.git-impact/result.html` so today's entry is included, and returns
|
|
164
|
-
the `file://` URL.
|
|
165
|
-
|
|
166
|
-
End your reply with that URL on its own last line so the user can
|
|
167
|
-
⌘-click to open:
|
|
168
|
-
|
|
169
|
-
```
|
|
170
|
-
🎯 file:///<absolute-repo-path>/.git-impact/result.html
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Don't try to open a browser yourself — printing the URL is enough.
|
|
174
|
-
|
|
175
|
-
**Only if the user explicitly asked for a "presentation", "slide",
|
|
176
|
-
"shareable", or "screenshot-friendly" output**, ALSO read
|
|
177
|
-
`references/html-template.md` and use your `Write` tool to create
|
|
178
|
-
`<repo>/.git-impact/standups/YYYY-MM-DD.html` (plus update
|
|
179
|
-
`standups/index.html`). Most days don't need this — skip by default.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## Mode: review
|
|
184
|
-
|
|
185
|
-
1. Parse the period from the user's message:
|
|
186
|
-
- "last 30 days" / "30d" → `last_days: 30`
|
|
187
|
-
- "last 90 days" / "90d" / no arg → `last_days: 90`
|
|
188
|
-
- "Q2-2026" → `from_date: 2026-04-01`, `to_date: 2026-06-30`
|
|
189
|
-
2. Call **`get_history`** with the parsed window.
|
|
190
|
-
3. If no entries returned: tell the user
|
|
191
|
-
*"No saved history yet for this period. Use the standup mode daily to
|
|
192
|
-
build up history, then come back."* and stop.
|
|
193
|
-
4. Synthesise themes (Features, Reliability, Security, Code review,
|
|
194
|
-
Infrastructure). Only include themes that apply.
|
|
195
|
-
5. Frame as **performance review prep** (evidence pack), not a finished
|
|
196
|
-
review — bullets should include dates and refs the user can paste into
|
|
197
|
-
their own writing.
|
|
198
|
-
|
|
199
|
-
Output:
|
|
200
|
-
```
|
|
201
|
-
Performance Review Prep — [Period]
|
|
202
|
-
|
|
203
|
-
[One headline sentence — biggest contribution]
|
|
204
|
-
|
|
205
|
-
🚀 [High-impact theme]
|
|
206
|
-
• Specific achievement [date, refs]
|
|
207
|
-
|
|
208
|
-
✅ [Medium-impact theme]
|
|
209
|
-
• ...
|
|
210
|
-
|
|
211
|
-
🔧 [Lower-impact theme]
|
|
212
|
-
• ...
|
|
213
|
-
|
|
214
|
-
📊 [N] commits across [N] working days
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
## Mode: init
|
|
220
|
-
|
|
221
|
-
Ask one at a time:
|
|
222
|
-
|
|
223
|
-
1. *"What does your company/product do? (1–2 sentences)"*
|
|
224
|
-
2. *"What does your manager care most about?"*
|
|
225
|
-
3. *"Technical terms to translate? Format: RLS=data security, MFA=login security (blank to skip)"*
|
|
226
|
-
|
|
227
|
-
Then call **`update_context`** with the answers. Tell the user:
|
|
228
|
-
*"Saved to `.git-impact/context.json`. Commit this to share the glossary with your team."*
|
|
229
|
-
|
|
230
|
-
If the install also wrote slash command files for other editors (Cursor,
|
|
231
|
-
Copilot, Gemini), point that out so they know the same workflow works
|
|
232
|
-
elsewhere.
|
|
233
|
-
|
|
234
|
-
---
|
|
45
|
+
The default standup writes to the rolling HTML dashboard at
|
|
46
|
+
`.git-impact/result.html` (regenerated via the `render_dashboard` MCP tool
|
|
47
|
+
— *not* by asking the user to run a CLI). The per-day bespoke HTML is only
|
|
48
|
+
created when the user explicitly asks for a presentation — don't write one
|
|
49
|
+
by default; it's expensive and most days don't need it.
|
|
235
50
|
|
|
236
|
-
## Tone
|
|
51
|
+
## Tone (applies to every mode)
|
|
237
52
|
|
|
238
53
|
- Write for a non-technical manager. No jargon that isn't in the glossary.
|
|
239
54
|
- Short sentences. No filler. Skip "this change" / "this commit" constructions.
|
|
@@ -243,5 +58,4 @@ elsewhere.
|
|
|
243
58
|
- 2 accurate bullets beat 5 vague ones.
|
|
244
59
|
|
|
245
60
|
For prompt details, anti-patterns, and the full output format, see
|
|
246
|
-
`references/translation-rules.md`.
|
|
247
|
-
`references/html-template.md`.
|
|
61
|
+
`references/translation-rules.md`.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Mode: init
|
|
2
|
+
|
|
3
|
+
Configure or update the repo's `context.json` interactively. Ask one
|
|
4
|
+
question at a time:
|
|
5
|
+
|
|
6
|
+
1. *"What does your company/product do? (1–2 sentences)"*
|
|
7
|
+
2. *"What does your manager care most about?"*
|
|
8
|
+
3. *"Technical terms to translate? Format: RLS=data security, MFA=login security (blank to skip)"*
|
|
9
|
+
|
|
10
|
+
Then call **`update_context`** with the answers. Tell the user:
|
|
11
|
+
*"Saved to `.git-impact/context.json`. Commit this to share the glossary with your team."*
|
|
12
|
+
|
|
13
|
+
If the install also wrote SKILL.md folders for other editors (Cursor,
|
|
14
|
+
Copilot, Gemini, OpenCode, and any Agent Skills adopter that reads
|
|
15
|
+
`.agents/skills/` — Goose, Amp, Codex, Letta, Roo), point that out so
|
|
16
|
+
they know the same workflow works elsewhere.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Mode: review
|
|
2
|
+
|
|
3
|
+
Synthesise saved standup history into a performance-review evidence pack.
|
|
4
|
+
Not a finished review — bullets carry dates and refs the user can paste
|
|
5
|
+
into their own writing.
|
|
6
|
+
|
|
7
|
+
## Steps
|
|
8
|
+
|
|
9
|
+
1. Parse the period from the user's message:
|
|
10
|
+
- "last 30 days" / "30d" → `last_days: 30`
|
|
11
|
+
- "last 90 days" / "90d" / no arg → `last_days: 90`
|
|
12
|
+
- "Q2-2026" → `from_date: 2026-04-01`, `to_date: 2026-06-30`
|
|
13
|
+
2. Call **`get_history`** with the parsed window.
|
|
14
|
+
3. If no entries returned: tell the user
|
|
15
|
+
*"No saved history yet for this period. Use the standup mode daily to
|
|
16
|
+
build up history, then come back."* and stop.
|
|
17
|
+
4. Synthesise themes (Features, Reliability, Security, Code review,
|
|
18
|
+
Infrastructure). Only include themes that apply.
|
|
19
|
+
5. Frame as **performance review prep** (evidence pack), not a finished
|
|
20
|
+
review — bullets should include dates and refs the user can paste into
|
|
21
|
+
their own writing.
|
|
22
|
+
|
|
23
|
+
## Output
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Performance Review Prep — [Period]
|
|
27
|
+
|
|
28
|
+
[One headline sentence — biggest contribution]
|
|
29
|
+
|
|
30
|
+
🚀 [High-impact theme]
|
|
31
|
+
• Specific achievement [date, refs]
|
|
32
|
+
|
|
33
|
+
✅ [Medium-impact theme]
|
|
34
|
+
• ...
|
|
35
|
+
|
|
36
|
+
🔧 [Lower-impact theme]
|
|
37
|
+
• ...
|
|
38
|
+
|
|
39
|
+
📊 [N] commits across [N] working days
|
|
40
|
+
```
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Mode: standup
|
|
2
|
+
|
|
3
|
+
The default mode. Translates commits since the user's last standup into
|
|
4
|
+
2–5 plain-English bullets, prints them, saves to history, regenerates the
|
|
5
|
+
rolling HTML dashboard.
|
|
6
|
+
|
|
7
|
+
## 0. Resolve the repo path FIRST (before any MCP call)
|
|
8
|
+
|
|
9
|
+
The MCP server's cwd is not your editor's cwd — it usually lives inside
|
|
10
|
+
the npx cache. Every tool call needs an explicit `repo_path`. Get it once
|
|
11
|
+
at the top of the standup:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pwd # returns the absolute path of the open project
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Save that as `REPO_PATH` and pass it as `repo_path` to every MCP tool call
|
|
18
|
+
in this standup. If the user's message names a specific project ("for
|
|
19
|
+
~/code/foo"), use that instead.
|
|
20
|
+
|
|
21
|
+
## 1. Resolve the lookback window
|
|
22
|
+
|
|
23
|
+
- If the user said an explicit "since X", convert to an ISO timestamp and use it.
|
|
24
|
+
- Otherwise call **`get_last_standup_date`**. If it returns a date, use the
|
|
25
|
+
start of the day after that date as `since_iso`. If it returns null,
|
|
26
|
+
default to start-of-today.
|
|
27
|
+
|
|
28
|
+
This is the "since last standup" default — it survives weekends and days off.
|
|
29
|
+
|
|
30
|
+
## 2. Fetch git activity
|
|
31
|
+
|
|
32
|
+
Call **`get_git_activity`** with `since_iso` and (optionally) `until_iso`.
|
|
33
|
+
You'll get back commits, file stats, branch, and `_repo_root` — the
|
|
34
|
+
absolute path the MCP server resolved.
|
|
35
|
+
|
|
36
|
+
> **CRITICAL: capture `_repo_root` from this response and pass it as
|
|
37
|
+
> `repo_path` to every subsequent tool call** (`save_impact_entry`,
|
|
38
|
+
> `render_dashboard`, `get_history`). The MCP server caches it after
|
|
39
|
+
> the first successful call, but threading it explicitly is the safe
|
|
40
|
+
> belt-and-suspenders move and removes any chance the second tool call
|
|
41
|
+
> resolves to a different directory.
|
|
42
|
+
|
|
43
|
+
If there are no commits in the window: tell the user clearly and stop. Do
|
|
44
|
+
NOT save an empty entry.
|
|
45
|
+
|
|
46
|
+
## 3. Optional: enrich with GitHub PR data
|
|
47
|
+
|
|
48
|
+
If the user has a `github_token` saved in their context (the
|
|
49
|
+
`get_git_activity` response or a prior `get_github_activity` call will tell
|
|
50
|
+
you), call **`get_github_activity`** to pull PR titles and descriptions.
|
|
51
|
+
PR descriptions are the single best source for accurate "why it matters"
|
|
52
|
+
text — strongly prefer them over inference.
|
|
53
|
+
|
|
54
|
+
## 4. Translate
|
|
55
|
+
|
|
56
|
+
Read **`references/translation-rules.md`** for the prompt-engineering details.
|
|
57
|
+
Key rules at a glance:
|
|
58
|
+
|
|
59
|
+
- **What + why**, not what + how
|
|
60
|
+
- **Apply the glossary** from `context.json` (returned by the context resource
|
|
61
|
+
or visible in `get_git_activity` output)
|
|
62
|
+
- **Provenance is mandatory** — every saved bullet gets `pr` / `commit_body` /
|
|
63
|
+
`commit_message` / `ticket` / `inferred`
|
|
64
|
+
- **Group related commits** into one bullet, not many
|
|
65
|
+
- **2-5 bullets total**, never more
|
|
66
|
+
|
|
67
|
+
## 5. Print the user-facing output
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
📅 [Day, Date or date range]
|
|
71
|
+
|
|
72
|
+
✅ [Summary]
|
|
73
|
+
→ [Why it matters]
|
|
74
|
+
|
|
75
|
+
⏳ In progress: [What]
|
|
76
|
+
→ [Expected outcome]
|
|
77
|
+
|
|
78
|
+
🚫 Blocked: [What] (only if applicable)
|
|
79
|
+
→ [What's needed]
|
|
80
|
+
|
|
81
|
+
📁 [N] files across [areas]
|
|
82
|
+
[N] commit(s) on [branch]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 6. Save to history
|
|
86
|
+
|
|
87
|
+
Call **`save_impact_entry`** with the structured items including
|
|
88
|
+
`provenance` for each. The MCP tool handles the SQLite write — never run
|
|
89
|
+
`sqlite3` directly. Required fields per item: `status`, `summary`,
|
|
90
|
+
`provenance`. Recommended: `impact`, `refs`.
|
|
91
|
+
|
|
92
|
+
Example item:
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"status": "done",
|
|
96
|
+
"summary": "Shipped multi-tenant data isolation",
|
|
97
|
+
"impact": "Unblocks SOC2 sign-off, prevents cross-company data leaks",
|
|
98
|
+
"provenance": "pr",
|
|
99
|
+
"refs": ["PR #142", "ENG-1234"]
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 7. Regenerate the rolling dashboard, then print its URL
|
|
104
|
+
|
|
105
|
+
Call **`render_dashboard`** with the same `repo_path`. It rewrites
|
|
106
|
+
`.git-impact/result.html` so today's entry is included, and returns
|
|
107
|
+
the `file://` URL.
|
|
108
|
+
|
|
109
|
+
End your reply with that URL on its own last line so the user can
|
|
110
|
+
⌘-click to open:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
🎯 file:///<absolute-repo-path>/.git-impact/result.html
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Don't try to open a browser yourself — printing the URL is enough.
|
|
117
|
+
|
|
118
|
+
**Only if the user explicitly asked for a "presentation", "slide",
|
|
119
|
+
"shareable", or "screenshot-friendly" output**, ALSO read
|
|
120
|
+
`references/html-template.md` and use your `Write` tool to create
|
|
121
|
+
`<repo>/.git-impact/standups/YYYY-MM-DD.html` (plus update
|
|
122
|
+
`standups/index.html`). Most days don't need this — skip by default.
|