git-impact 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1 -1
- package/dist/init/templates.d.ts +1 -1
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +153 -19
- package/dist/init/templates.js.map +1 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +17 -6
- package/dist/report/render.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +47 -0
package/dist/cli/index.js
CHANGED
|
@@ -49,7 +49,7 @@ const program = new commander_1.Command();
|
|
|
49
49
|
program
|
|
50
50
|
.name("git-impact")
|
|
51
51
|
.description("Translate git commits into plain-English business impact")
|
|
52
|
-
.version("0.
|
|
52
|
+
.version("0.3.0");
|
|
53
53
|
// ─── today ────────────────────────────────────────────────────────────────────
|
|
54
54
|
program
|
|
55
55
|
.command("today")
|
package/dist/init/templates.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* This means the package works correctly after `npm install -g`
|
|
4
4
|
* without needing to locate template files on disk.
|
|
5
5
|
*/
|
|
6
|
-
export declare const CLAUDE_SKILL = "---\nname: git-impact\ndescription: >\n Translates git commits into plain-English business impact \u2014 for standups,\n manager updates, and performance reviews. Use this skill whenever the user\n says: \"do my standup\", \"translate my commits\", \"what did I ship today/this\n week\", \"write my standup\", \"show my impact\", \"git-impact\", \"/git-impact\",\n \"generate a performance review\", \"what have I done this quarter\", or any\n request to turn technical git output into something a non-technical manager\n can understand.\n---\n\n# git-impact\n\nTranslate git commits into plain-English business impact without an API key.\nRead git data with bash, load the repo's context file, and write the translation\ninline.\n\n## Sub-commands\n\n| User says | Mode |\n|---|---|\n| `do my standup`, `today`, no args | **today** |\n| `since yesterday`, `since 3d`, `since 2026-05-01` | **since \\<when\\>** |\n| `review`, `last 30 days`, `Q2 review` | **review** |\n| `init`, `set up context` | **init** |\n\n## Step 1 \u2014 Find the repo root\n\n```bash\ngit rev-parse --show-toplevel 2>/dev/null\n```\n\nIf it fails: *\"No git repository found. Open a project folder first.\"* Stop.\n\n## Step 2 \u2014 Load context\n\n```bash\ncat \"$REPO_ROOT/.git-impact/context.json\" 2>/dev/null || echo \"NONE\"\n```\n\nApply the glossary (technical term \u2192 plain English) and frame impact around\nmanager priorities. If no context file exists, use general language and\nsuggest running init.\n\n## Mode: today / since \\<when\\>\n\nFetch commits:\n```bash\n# today\ngit -C \"$REPO_ROOT\" log \\\n --since=\"$(date '+%Y-%m-%d') 00:00:00\" \\\n --format=\"%h|%s|%b|%an|%ad\" --date=short HEAD\n\n# since Nd \u2192 --since=\"N days ago 00:00:00\"\n# since YYYY-MM-DD \u2192 --since=\"YYYY-MM-DD 00:00:00\"\n```\n\nFetch files changed:\n```bash\nFIRST=$(git -C \"$REPO_ROOT\" log --since=\"...\" --format=\"%h\" HEAD | tail -1)\ngit -C \"$REPO_ROOT\" diff --stat \"$FIRST\"^ HEAD 2>/dev/null\n```\n\n**Translation rules:**\n1. Each bullet = what was done + WHY it matters to the business. Never restate the commit message.\n2. Apply glossary \u2014 replace every technical term listed in context.json.\n3. If impact can't be inferred \u2192 \"technical foundation work for [area]\". Never hallucinate.\n4. Group related commits \u2014 4 auth commits = 1 bullet.\n5. WIP commits \u2192 \"\u23F3 In progress: [what] \u2192 [expected outcome]\"\n6. Be specific \u2014 use numbers from commit messages when they exist.\n\n**Output:**\n```\n\uD83D\uDCC5 [Day, Date]\n\n\u2705 [Plain-English summary]\n \u2192 [Business impact \u2014 who it unblocks, what risk it reduces]\n\n\u23F3 In progress: [what]\n \u2192 [Expected outcome]\n\n\uD83D\uDCC1 [N] files changed across [areas]\n [N] commit(s) on [branch]\n```\n\nSave to history after printing:\n```bash\nmkdir -p \"$REPO_ROOT/.git-impact\"\nsqlite3 \"$REPO_ROOT/.git-impact/history.db\" \"\n CREATE TABLE IF NOT EXISTS impact_entries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n date TEXT NOT NULL, repo_name TEXT NOT NULL,\n total_commits INTEGER NOT NULL DEFAULT 0,\n total_files INTEGER NOT NULL DEFAULT 0,\n items_json TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n INSERT INTO impact_entries (date, repo_name, total_commits, total_files, items_json)\n VALUES ('$(date +%Y-%m-%d)', '$(basename $REPO_ROOT)', $COMMITS, $FILES, '$JSON');\n\" 2>/dev/null || true\n```\n\n## Step 4 \u2014 Generate the HTML report (REQUIRED, run this)\n\nThis step is mandatory, not optional. After saving to history, you **must\nactually execute** the following bash command \u2014 do not just describe it.\nWithout this step, the file:// link you print will 404.\n\n```bash\ncd \"$REPO_ROOT\" && npx --yes git-impact@latest view --no-open --date \"$(date +%Y-%m-%d)\"\n```\n\nThis uses npx, so the user does **not** need to have `git-impact` installed\nlocally. If the command errors, surface the error to the user \u2014 don't swallow\nit. If it succeeds, `.git-impact/result.html` will exist.\n\nThen, and only then, print the link as the very last line of your response:\n\n```\n\uD83D\uDD17 file://$REPO_ROOT/.git-impact/result.html?date=$(date +%Y-%m-%d)\n```\n\nIf the npx command failed, instead print:\n```\n\u26A0\uFE0F HTML report could not be generated: <paste the error message>\n Run `npx git-impact@latest view` from the repo to retry.\n```\n\n## Mode: review\n\nQuery history and synthesise a performance review:\n```bash\nsqlite3 \"$REPO_ROOT/.git-impact/history.db\" \\\n \"SELECT date, repo_name, total_commits, items_json\n FROM impact_entries WHERE date >= '$FROM' AND date <= '$TO'\n ORDER BY date ASC;\" 2>/dev/null\n```\n\nIf no history: *\"No saved history yet. Run the standup daily for a few weeks first.\"*\n\nFormat:\n```\nPerformance Review \u2014 [Period]\n[Headline sentence \u2014 biggest contribution]\n\n\uD83D\uDE80 [High-impact theme]\n \u2022 Specific achievement with numbers...\n\n\u2705 [Medium theme] ...\n\uD83D\uDD27 [Lower theme] ...\n\n\uD83D\uDCCA [N] commits across [N] working days\n```\n\n## Mode: init\n\nAsk one at a time:\n1. \"What does your company/product do? (1\u20132 sentences)\"\n2. \"What does your manager care most about?\"\n3. \"Technical terms to translate? e.g. RLS=data security (blank to skip)\"\n\nWrite `.git-impact/context.json` and confirm:\n*\"Saved. Commit context.json to share the glossary with your team.\"*\n\n## Tone\n\nNon-technical manager audience. Short sentences. No filler. Confident \u2014 if\nyou know the impact, state it. 2 accurate bullets > 5 vague ones.\n";
|
|
6
|
+
export declare const CLAUDE_SKILL = "---\nname: git-impact\ndescription: >\n Translates git commits into plain-English business impact \u2014 for standups,\n manager updates, and performance reviews. Use this skill whenever the user\n says: \"do my standup\", \"translate my commits\", \"what did I ship today/this\n week\", \"write my standup\", \"show my impact\", \"git-impact\", \"/git-impact\",\n \"generate a performance review\", \"what have I done this quarter\", or any\n request to turn technical git output into something a non-technical manager\n can understand.\n---\n\n# git-impact\n\nTranslate git commits into plain-English business impact without an API key.\nRead git data with bash, load the repo's context file, and write the translation\ninline.\n\n## Sub-commands\n\n| User says | Mode |\n|---|---|\n| `do my standup`, `today`, no args | **today** |\n| `since yesterday`, `since 3d`, `since 2026-05-01` | **since \\<when\\>** |\n| `review`, `last 30 days`, `Q2 review` | **review** |\n| `init`, `set up context` | **init** |\n\n## Step 1 \u2014 Find the repo root\n\n```bash\ngit rev-parse --show-toplevel 2>/dev/null\n```\n\nIf it fails: *\"No git repository found. Open a project folder first.\"* Stop.\n\n## Step 2 \u2014 Load context\n\n```bash\ncat \"$REPO_ROOT/.git-impact/context.json\" 2>/dev/null || echo \"NONE\"\n```\n\nApply the glossary (technical term \u2192 plain English) and frame impact around\nmanager priorities. If no context file exists, use general language and\nsuggest running init.\n\n## Mode: today / since \\<when\\>\n\nFetch commits:\n```bash\n# today\ngit -C \"$REPO_ROOT\" log \\\n --since=\"$(date '+%Y-%m-%d') 00:00:00\" \\\n --format=\"%h|%s|%b|%an|%ad\" --date=short HEAD\n\n# since Nd \u2192 --since=\"N days ago 00:00:00\"\n# since YYYY-MM-DD \u2192 --since=\"YYYY-MM-DD 00:00:00\"\n```\n\nFetch files changed:\n```bash\nFIRST=$(git -C \"$REPO_ROOT\" log --since=\"...\" --format=\"%h\" HEAD | tail -1)\ngit -C \"$REPO_ROOT\" diff --stat \"$FIRST\"^ HEAD 2>/dev/null\n```\n\n**Translation rules:**\n1. Each bullet = what was done + WHY it matters to the business. Never restate the commit message.\n2. Apply glossary \u2014 replace every technical term listed in context.json.\n3. If impact can't be inferred \u2192 \"technical foundation work for [area]\". Never hallucinate.\n4. Group related commits \u2014 4 auth commits = 1 bullet.\n5. WIP commits \u2192 \"\u23F3 In progress: [what] \u2192 [expected outcome]\"\n6. Be specific \u2014 use numbers from commit messages when they exist.\n\n**Output:**\n```\n\uD83D\uDCC5 [Day, Date]\n\n\u2705 [Plain-English summary]\n \u2192 [Business impact \u2014 who it unblocks, what risk it reduces]\n\n\u23F3 In progress: [what]\n \u2192 [Expected outcome]\n\n\uD83D\uDCC1 [N] files changed across [areas]\n [N] commit(s) on [branch]\n```\n\nSave to history after printing. **The items_json shape matters** \u2014 the HTML\nreport and performance review reader expect this exact structure:\n\n```json\n[\n {\n \"status\": \"done\", // \"done\" | \"in_progress\" | \"blocked\"\n \"summary\": \"Plain-English what\", // REQUIRED \u2014 the bullet text\n \"impact\": \"Why it matters\", // optional \u2014 what was unblocked\n \"technical_note\": \"files/PR #refs\" // optional \u2014 small grey note\n }\n]\n```\n\nUse `summary` (not `title` or `text`) and always include `status`.\n\n```bash\nmkdir -p \"$REPO_ROOT/.git-impact\"\nsqlite3 \"$REPO_ROOT/.git-impact/history.db\" \"\n CREATE TABLE IF NOT EXISTS impact_entries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n date TEXT NOT NULL, repo_name TEXT NOT NULL,\n total_commits INTEGER NOT NULL DEFAULT 0,\n total_files INTEGER NOT NULL DEFAULT 0,\n items_json TEXT NOT NULL DEFAULT '[]',\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n INSERT INTO impact_entries (date, repo_name, total_commits, total_files, items_json)\n VALUES ('$(date +%Y-%m-%d)', '$(basename $REPO_ROOT)', $COMMITS, $FILES, '$JSON');\n\" 2>/dev/null || true\n```\n\n## Step 4 \u2014 Compose a real HTML presentation (REQUIRED)\n\nAfter saving to history, **build a polished standalone HTML file using your\nWrite tool** \u2014 not a script, not a template. Each day's standup is bespoke.\nThe file should look like a manager-ready slide, not a bullet list with CSS.\n\n### Where\n- Write to: `$REPO_ROOT/.git-impact/standups/YYYY-MM-DD.html` (one file per day)\n- Then update: `$REPO_ROOT/.git-impact/standups/index.html` \u2014 link to every daily file (newest first)\n\n### Stack (all via CDN \u2014 no build step, no npm install)\n- **Tailwind CSS**: `<script src=\"https://cdn.tailwindcss.com\"></script>`\n- **Inter font**: `<link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">`\n- **Lucide icons** (when icons would help): `<script src=\"https://unpkg.com/lucide@latest\"></script>` then `lucide.createIcons()`\n- **Chart.js** (only if there are real numbers to chart): `<script src=\"https://cdn.jsdelivr.net/npm/chart.js\"></script>`\n- **Mermaid** (for architecture/flow diagrams when relevant): `<script type=\"module\">import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; mermaid.initialize({startOnLoad:true, theme:'dark'});</script>`\n\n### Required structure\n\n1. **Hero** \u2014 date, one bold headline that captures the day in plain English\n (not \"9 commits\" \u2014 something like \"Shipped safety analytics, hardened tenant isolation\")\n2. **Stats grid** \u2014 3-4 cards with the most meaningful numbers (commits, files, PRs merged, areas touched)\n3. **Achievement cards** \u2014 one card per \u2705 item:\n - Bold title with a status pill (\u2705 Shipped / \u23F3 In Progress / \uD83D\uDEAB Blocked)\n - 1-2 sentence plain-English summary\n - \"\u2192 Why it matters\" line in slightly muted text\n - Optional: relevant tags (PR #, area, file count)\n4. **Visual element when warranted** \u2014 pick ONE if the content supports it:\n - Mermaid flow diagram if the day involved architecture/data-flow changes\n - Chart.js bar or donut if there are quantities worth comparing\n - Code-style block with a key formula or snippet (e.g. the LTIF formula)\n - Skip entirely if the day was straightforward \u2014 don't force visuals\n5. **Footer** \u2014 file count, branch, commit count, link back to index\n\n### Design language\n\n- **Theme**: Dark mode by default, with `prefers-color-scheme: light` fallback\n- **Background**: `bg-slate-950` (dark) / `bg-white` (light), with a subtle radial gradient highlight\n- **Cards**: `bg-slate-900/50 border border-slate-800 rounded-2xl p-6` \u2014 generous padding, soft borders\n- **Typography**: Inter, tight letter-spacing on headlines, 1.6 line-height on body\n- **Color accents** by status:\n - Done \u2192 `emerald-400 / emerald-500/20` background pill\n - In progress \u2192 `amber-400 / amber-500/20`\n - Blocked \u2192 `rose-400 / rose-500/20`\n- **Spacing**: `max-w-4xl mx-auto px-8 py-12`, generous `space-y-6` between cards\n- **Print-friendly**: include a `@media print` block that hides the nav and uses light theme\n\n### Example skeleton (adapt the content to today's actual work)\n\n```html\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Standup \u2014 [Day, Date] \u00B7 [Repo]</title>\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\">\n <style>\n body { font-family: 'Inter', system-ui, sans-serif; }\n @media print { .no-print { display: none } body { background: white; color: black; } }\n </style>\n</head>\n<body class=\"bg-slate-950 text-slate-100 min-h-screen\">\n <div class=\"absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(56,189,248,0.08),transparent_50%)] pointer-events-none\"></div>\n\n <main class=\"relative max-w-4xl mx-auto px-8 py-16\">\n <!-- Hero -->\n <header class=\"mb-16\">\n <p class=\"text-sm uppercase tracking-widest text-slate-500 font-medium\">[Saturday, May 9, 2026]</p>\n <h1 class=\"mt-3 text-5xl font-bold tracking-tight leading-tight\">[Headline that captures the day]</h1>\n <p class=\"mt-4 text-xl text-slate-400 max-w-2xl\">[One-sentence subtitle \u2014 why this day mattered]</p>\n </header>\n\n <!-- Stats -->\n <section class=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-16\">\n <div class=\"bg-slate-900/50 border border-slate-800 rounded-2xl p-5\">\n <div class=\"text-3xl font-bold\">[N]</div>\n <div class=\"text-sm text-slate-400 mt-1\">commits</div>\n </div>\n <!-- ... 3 more stat cards -->\n </section>\n\n <!-- Achievements -->\n <section class=\"space-y-4 mb-16\">\n <h2 class=\"text-xs uppercase tracking-widest text-slate-500 font-semibold mb-4\">Shipped today</h2>\n <article class=\"bg-slate-900/50 border border-slate-800 rounded-2xl p-6 hover:border-slate-700 transition\">\n <div class=\"flex items-start gap-4\">\n <span class=\"px-2 py-1 rounded-md bg-emerald-500/20 text-emerald-400 text-xs font-medium\">\u2705 Shipped</span>\n <div class=\"flex-1\">\n <h3 class=\"text-lg font-semibold\">[Plain-English title]</h3>\n <p class=\"text-slate-300 mt-2 leading-relaxed\">[One-sentence summary]</p>\n <p class=\"text-slate-400 mt-3 text-sm\">\u2192 [Why it matters in business terms]</p>\n <div class=\"flex gap-2 mt-4\">\n <span class=\"text-xs text-slate-500\">[area] \u00B7 [PR #] \u00B7 [N files]</span>\n </div>\n </div>\n </div>\n </article>\n <!-- ... more cards -->\n </section>\n\n <!-- Optional: visual section. Only include when warranted. -->\n <!-- Example with Mermaid: -->\n <!--\n <section class=\"bg-slate-900/50 border border-slate-800 rounded-2xl p-6 mb-16\">\n <h2 class=\"text-xs uppercase tracking-widest text-slate-500 font-semibold mb-4\">Data flow</h2>\n <div class=\"mermaid\">\n flowchart LR\n Upload[Plant CSV] --> Parser\n Parser --> RLS[Row-level security]\n RLS --> Causal[Causal analytics dashboard]\n </div>\n </section>\n <script type=\"module\">\n import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';\n mermaid.initialize({ startOnLoad: true, theme: 'dark', themeVariables: { fontFamily: 'Inter' } });\n </script>\n -->\n\n <!-- Footer -->\n <footer class=\"pt-8 border-t border-slate-800 text-sm text-slate-500 flex justify-between\">\n <span>[N] files \u00B7 [N] commits \u00B7 [branch]</span>\n <a href=\"./index.html\" class=\"hover:text-slate-300\">\u2190 All standups</a>\n </footer>\n </main>\n</body>\n</html>\n```\n\n### Then build the index page\n\n`$REPO_ROOT/.git-impact/standups/index.html` should list every daily HTML file\nin the `standups/` directory (newest first). When updating it, list every `.html`\nfile you find in that directory except `index.html` itself. Use the same dark\ntheme \u2014 a clean grid of cards, each linking to its day. Keep it lightweight.\n\n### Then print the file URL on the last line\n\n```\n\uD83C\uDFAF file:///$REPO_ROOT/.git-impact/standups/$(date +%Y-%m-%d).html\n```\n\nReplace `$REPO_ROOT` with the real absolute path so the user can \u2318-click it.\n\n## Mode: review\n\nQuery history and synthesise a performance review:\n```bash\nsqlite3 \"$REPO_ROOT/.git-impact/history.db\" \\\n \"SELECT date, repo_name, total_commits, items_json\n FROM impact_entries WHERE date >= '$FROM' AND date <= '$TO'\n ORDER BY date ASC;\" 2>/dev/null\n```\n\nIf no history: *\"No saved history yet. Run the standup daily for a few weeks first.\"*\n\nFormat:\n```\nPerformance Review \u2014 [Period]\n[Headline sentence \u2014 biggest contribution]\n\n\uD83D\uDE80 [High-impact theme]\n \u2022 Specific achievement with numbers...\n\n\u2705 [Medium theme] ...\n\uD83D\uDD27 [Lower theme] ...\n\n\uD83D\uDCCA [N] commits across [N] working days\n```\n\n## Mode: init\n\nAsk one at a time:\n1. \"What does your company/product do? (1\u20132 sentences)\"\n2. \"What does your manager care most about?\"\n3. \"Technical terms to translate? e.g. RLS=data security (blank to skip)\"\n\nWrite `.git-impact/context.json` and confirm:\n*\"Saved. Commit context.json to share the glossary with your team.\"*\n\n## Tone\n\nNon-technical manager audience. Short sentences. No filler. Confident \u2014 if\nyou know the impact, state it. 2 accurate bullets > 5 vague ones.\n";
|
|
7
7
|
export declare const CLAUDE_MD_BLOCK = "\n## git-impact\n\nThis repo uses [git-impact](https://github.com/you/git-impact) for standup and\nperformance review generation.\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";
|
|
8
8
|
export declare const COPILOT_INSTRUCTIONS = "# git-impact\n\nTranslate git commits into plain-English standup bullets when the user asks\nto \"do my standup\", \"translate my commits\", \"what did I ship today\", or\n\"generate a performance review\".\n\n## How to translate commits\n\n1. Run `git log --since=\"today 00:00:00\" --format=\"%h|%s|%b\" HEAD` to get commits\n2. Read `.git-impact/context.json` for glossary and company context\n3. Translate into 2\u20135 bullets following these rules:\n - What was done + WHY it matters (never restate commit messages)\n - Apply glossary terms from context.json\n - Group related commits into one bullet\n - WIP commits \u2192 \"\u23F3 In progress: [what] \u2192 [expected outcome]\"\n - If impact can't be inferred \u2192 \"technical foundation work for [area]\"\n\n## Output format\n\n```\n\uD83D\uDCC5 [Date]\n\u2705 [Summary] \u2192 [Business impact]\n\u23F3 In progress: [What] \u2192 [Expected outcome]\n\uD83D\uDCC1 [N] files changed across [areas]\n```\n\nFor performance reviews, query `.git-impact/history.db` and group by theme.\n";
|
|
9
9
|
export declare const CURSOR_RULES = "---\ndescription: git-impact standup and performance review generation\nglobs: []\nalwaysApply: false\n---\n\n# git-impact\n\nWhen the user asks to \"do my standup\", \"translate commits\", \"what did I ship\",\nor \"generate a performance review\":\n\n1. Find repo root: `git rev-parse --show-toplevel`\n2. Load context: `cat .git-impact/context.json`\n3. Fetch commits: `git log --since=\"today 00:00:00\" --format=\"%h|%s|%b\" HEAD`\n4. Translate into 2\u20135 plain-English bullets:\n - Apply glossary from context.json\n - Each bullet = what + why it matters (never restate commit messages)\n - Group related commits, flag WIP with \u23F3\n5. Format: \u2705 [summary] \u2192 [business impact]\n6. Save to `.git-impact/history.db` via sqlite3\n\nFor reviews: query history.db and group by theme (Features, Security, Reliability, etc.)\n";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,YAAY,o/YA+SxB,CAAC;AAIF,eAAO,MAAM,eAAe,yjBAa3B,CAAC;AAIF,eAAO,MAAM,oBAAoB,miCA2BhC,CAAC;AAIF,eAAO,MAAM,YAAY,m1BAsBxB,CAAC;AAIF,eAAO,MAAM,cAAc,yhCA+B1B,CAAC;AAIF,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,EAC1B,mBAAmB,MAAM,EACzB,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/B,MAKO,CAAC"}
|
package/dist/init/templates.js
CHANGED
|
@@ -93,7 +93,22 @@ git -C "$REPO_ROOT" diff --stat "$FIRST"^ HEAD 2>/dev/null
|
|
|
93
93
|
[N] commit(s) on [branch]
|
|
94
94
|
\`\`\`
|
|
95
95
|
|
|
96
|
-
Save to history after printing
|
|
96
|
+
Save to history after printing. **The items_json shape matters** — the HTML
|
|
97
|
+
report and performance review reader expect this exact structure:
|
|
98
|
+
|
|
99
|
+
\`\`\`json
|
|
100
|
+
[
|
|
101
|
+
{
|
|
102
|
+
"status": "done", // "done" | "in_progress" | "blocked"
|
|
103
|
+
"summary": "Plain-English what", // REQUIRED — the bullet text
|
|
104
|
+
"impact": "Why it matters", // optional — what was unblocked
|
|
105
|
+
"technical_note": "files/PR #refs" // optional — small grey note
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
Use \`summary\` (not \`title\` or \`text\`) and always include \`status\`.
|
|
111
|
+
|
|
97
112
|
\`\`\`bash
|
|
98
113
|
mkdir -p "$REPO_ROOT/.git-impact"
|
|
99
114
|
sqlite3 "$REPO_ROOT/.git-impact/history.db" "
|
|
@@ -110,32 +125,151 @@ sqlite3 "$REPO_ROOT/.git-impact/history.db" "
|
|
|
110
125
|
" 2>/dev/null || true
|
|
111
126
|
\`\`\`
|
|
112
127
|
|
|
113
|
-
## Step 4 —
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
## Step 4 — Compose a real HTML presentation (REQUIRED)
|
|
129
|
+
|
|
130
|
+
After saving to history, **build a polished standalone HTML file using your
|
|
131
|
+
Write tool** — not a script, not a template. Each day's standup is bespoke.
|
|
132
|
+
The file should look like a manager-ready slide, not a bullet list with CSS.
|
|
133
|
+
|
|
134
|
+
### Where
|
|
135
|
+
- Write to: \`$REPO_ROOT/.git-impact/standups/YYYY-MM-DD.html\` (one file per day)
|
|
136
|
+
- Then update: \`$REPO_ROOT/.git-impact/standups/index.html\` — link to every daily file (newest first)
|
|
137
|
+
|
|
138
|
+
### Stack (all via CDN — no build step, no npm install)
|
|
139
|
+
- **Tailwind CSS**: \`<script src="https://cdn.tailwindcss.com"></script>\`
|
|
140
|
+
- **Inter font**: \`<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">\`
|
|
141
|
+
- **Lucide icons** (when icons would help): \`<script src="https://unpkg.com/lucide@latest"></script>\` then \`lucide.createIcons()\`
|
|
142
|
+
- **Chart.js** (only if there are real numbers to chart): \`<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>\`
|
|
143
|
+
- **Mermaid** (for architecture/flow diagrams when relevant): \`<script type="module">import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; mermaid.initialize({startOnLoad:true, theme:'dark'});</script>\`
|
|
144
|
+
|
|
145
|
+
### Required structure
|
|
146
|
+
|
|
147
|
+
1. **Hero** — date, one bold headline that captures the day in plain English
|
|
148
|
+
(not "9 commits" — something like "Shipped safety analytics, hardened tenant isolation")
|
|
149
|
+
2. **Stats grid** — 3-4 cards with the most meaningful numbers (commits, files, PRs merged, areas touched)
|
|
150
|
+
3. **Achievement cards** — one card per ✅ item:
|
|
151
|
+
- Bold title with a status pill (✅ Shipped / ⏳ In Progress / 🚫 Blocked)
|
|
152
|
+
- 1-2 sentence plain-English summary
|
|
153
|
+
- "→ Why it matters" line in slightly muted text
|
|
154
|
+
- Optional: relevant tags (PR #, area, file count)
|
|
155
|
+
4. **Visual element when warranted** — pick ONE if the content supports it:
|
|
156
|
+
- Mermaid flow diagram if the day involved architecture/data-flow changes
|
|
157
|
+
- Chart.js bar or donut if there are quantities worth comparing
|
|
158
|
+
- Code-style block with a key formula or snippet (e.g. the LTIF formula)
|
|
159
|
+
- Skip entirely if the day was straightforward — don't force visuals
|
|
160
|
+
5. **Footer** — file count, branch, commit count, link back to index
|
|
161
|
+
|
|
162
|
+
### Design language
|
|
163
|
+
|
|
164
|
+
- **Theme**: Dark mode by default, with \`prefers-color-scheme: light\` fallback
|
|
165
|
+
- **Background**: \`bg-slate-950\` (dark) / \`bg-white\` (light), with a subtle radial gradient highlight
|
|
166
|
+
- **Cards**: \`bg-slate-900/50 border border-slate-800 rounded-2xl p-6\` — generous padding, soft borders
|
|
167
|
+
- **Typography**: Inter, tight letter-spacing on headlines, 1.6 line-height on body
|
|
168
|
+
- **Color accents** by status:
|
|
169
|
+
- Done → \`emerald-400 / emerald-500/20\` background pill
|
|
170
|
+
- In progress → \`amber-400 / amber-500/20\`
|
|
171
|
+
- Blocked → \`rose-400 / rose-500/20\`
|
|
172
|
+
- **Spacing**: \`max-w-4xl mx-auto px-8 py-12\`, generous \`space-y-6\` between cards
|
|
173
|
+
- **Print-friendly**: include a \`@media print\` block that hides the nav and uses light theme
|
|
174
|
+
|
|
175
|
+
### Example skeleton (adapt the content to today's actual work)
|
|
176
|
+
|
|
177
|
+
\`\`\`html
|
|
178
|
+
<!doctype html>
|
|
179
|
+
<html lang="en">
|
|
180
|
+
<head>
|
|
181
|
+
<meta charset="utf-8">
|
|
182
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
183
|
+
<title>Standup — [Day, Date] · [Repo]</title>
|
|
184
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
185
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
|
186
|
+
<style>
|
|
187
|
+
body { font-family: 'Inter', system-ui, sans-serif; }
|
|
188
|
+
@media print { .no-print { display: none } body { background: white; color: black; } }
|
|
189
|
+
</style>
|
|
190
|
+
</head>
|
|
191
|
+
<body class="bg-slate-950 text-slate-100 min-h-screen">
|
|
192
|
+
<div class="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(56,189,248,0.08),transparent_50%)] pointer-events-none"></div>
|
|
193
|
+
|
|
194
|
+
<main class="relative max-w-4xl mx-auto px-8 py-16">
|
|
195
|
+
<!-- Hero -->
|
|
196
|
+
<header class="mb-16">
|
|
197
|
+
<p class="text-sm uppercase tracking-widest text-slate-500 font-medium">[Saturday, May 9, 2026]</p>
|
|
198
|
+
<h1 class="mt-3 text-5xl font-bold tracking-tight leading-tight">[Headline that captures the day]</h1>
|
|
199
|
+
<p class="mt-4 text-xl text-slate-400 max-w-2xl">[One-sentence subtitle — why this day mattered]</p>
|
|
200
|
+
</header>
|
|
201
|
+
|
|
202
|
+
<!-- Stats -->
|
|
203
|
+
<section class="grid grid-cols-2 md:grid-cols-4 gap-4 mb-16">
|
|
204
|
+
<div class="bg-slate-900/50 border border-slate-800 rounded-2xl p-5">
|
|
205
|
+
<div class="text-3xl font-bold">[N]</div>
|
|
206
|
+
<div class="text-sm text-slate-400 mt-1">commits</div>
|
|
207
|
+
</div>
|
|
208
|
+
<!-- ... 3 more stat cards -->
|
|
209
|
+
</section>
|
|
210
|
+
|
|
211
|
+
<!-- Achievements -->
|
|
212
|
+
<section class="space-y-4 mb-16">
|
|
213
|
+
<h2 class="text-xs uppercase tracking-widest text-slate-500 font-semibold mb-4">Shipped today</h2>
|
|
214
|
+
<article class="bg-slate-900/50 border border-slate-800 rounded-2xl p-6 hover:border-slate-700 transition">
|
|
215
|
+
<div class="flex items-start gap-4">
|
|
216
|
+
<span class="px-2 py-1 rounded-md bg-emerald-500/20 text-emerald-400 text-xs font-medium">✅ Shipped</span>
|
|
217
|
+
<div class="flex-1">
|
|
218
|
+
<h3 class="text-lg font-semibold">[Plain-English title]</h3>
|
|
219
|
+
<p class="text-slate-300 mt-2 leading-relaxed">[One-sentence summary]</p>
|
|
220
|
+
<p class="text-slate-400 mt-3 text-sm">→ [Why it matters in business terms]</p>
|
|
221
|
+
<div class="flex gap-2 mt-4">
|
|
222
|
+
<span class="text-xs text-slate-500">[area] · [PR #] · [N files]</span>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</article>
|
|
227
|
+
<!-- ... more cards -->
|
|
228
|
+
</section>
|
|
229
|
+
|
|
230
|
+
<!-- Optional: visual section. Only include when warranted. -->
|
|
231
|
+
<!-- Example with Mermaid: -->
|
|
232
|
+
<!--
|
|
233
|
+
<section class="bg-slate-900/50 border border-slate-800 rounded-2xl p-6 mb-16">
|
|
234
|
+
<h2 class="text-xs uppercase tracking-widest text-slate-500 font-semibold mb-4">Data flow</h2>
|
|
235
|
+
<div class="mermaid">
|
|
236
|
+
flowchart LR
|
|
237
|
+
Upload[Plant CSV] --> Parser
|
|
238
|
+
Parser --> RLS[Row-level security]
|
|
239
|
+
RLS --> Causal[Causal analytics dashboard]
|
|
240
|
+
</div>
|
|
241
|
+
</section>
|
|
242
|
+
<script type="module">
|
|
243
|
+
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
|
|
244
|
+
mermaid.initialize({ startOnLoad: true, theme: 'dark', themeVariables: { fontFamily: 'Inter' } });
|
|
245
|
+
</script>
|
|
246
|
+
-->
|
|
247
|
+
|
|
248
|
+
<!-- Footer -->
|
|
249
|
+
<footer class="pt-8 border-t border-slate-800 text-sm text-slate-500 flex justify-between">
|
|
250
|
+
<span>[N] files · [N] commits · [branch]</span>
|
|
251
|
+
<a href="./index.html" class="hover:text-slate-300">← All standups</a>
|
|
252
|
+
</footer>
|
|
253
|
+
</main>
|
|
254
|
+
</body>
|
|
255
|
+
</html>
|
|
121
256
|
\`\`\`
|
|
122
257
|
|
|
123
|
-
|
|
124
|
-
locally. If the command errors, surface the error to the user — don't swallow
|
|
125
|
-
it. If it succeeds, \`.git-impact/result.html\` will exist.
|
|
258
|
+
### Then build the index page
|
|
126
259
|
|
|
127
|
-
|
|
260
|
+
\`$REPO_ROOT/.git-impact/standups/index.html\` should list every daily HTML file
|
|
261
|
+
in the \`standups/\` directory (newest first). When updating it, list every \`.html\`
|
|
262
|
+
file you find in that directory except \`index.html\` itself. Use the same dark
|
|
263
|
+
theme — a clean grid of cards, each linking to its day. Keep it lightweight.
|
|
128
264
|
|
|
129
|
-
|
|
130
|
-
🔗 file://$REPO_ROOT/.git-impact/result.html?date=$(date +%Y-%m-%d)
|
|
131
|
-
\`\`\`
|
|
265
|
+
### Then print the file URL on the last line
|
|
132
266
|
|
|
133
|
-
If the npx command failed, instead print:
|
|
134
267
|
\`\`\`
|
|
135
|
-
|
|
136
|
-
Run \`npx git-impact@latest view\` from the repo to retry.
|
|
268
|
+
🎯 file:///$REPO_ROOT/.git-impact/standups/$(date +%Y-%m-%d).html
|
|
137
269
|
\`\`\`
|
|
138
270
|
|
|
271
|
+
Replace \`$REPO_ROOT\` with the real absolute path so the user can ⌘-click it.
|
|
272
|
+
|
|
139
273
|
## Mode: review
|
|
140
274
|
|
|
141
275
|
Query history and synthesise a performance review:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iFAAiF;AAEpE,QAAA,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iFAAiF;AAEpE,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+S3B,CAAC;AAEF,iFAAiF;AAEpE,QAAA,eAAe,GAAG;;;;;;;;;;;;;CAa9B,CAAC;AAEF,iFAAiF;AAEpE,QAAA,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BnC,CAAC;AAEF,iFAAiF;AAEpE,QAAA,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsB3B,CAAC;AAEF,iFAAiF;AAEpE,QAAA,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B7B,CAAC;AAEF,iFAAiF;AAE1E,MAAM,gBAAgB,GAAG,CAC9B,kBAA0B,EAC1B,iBAAyB,EACzB,QAAgC,EACxB,EAAE,CACV,IAAI,CAAC,SAAS,CACZ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EACnD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AATE,QAAA,gBAAgB,oBASlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CA+C9D"}
|
package/dist/report/render.js
CHANGED
|
@@ -49,18 +49,29 @@ function renderReport(opts) {
|
|
|
49
49
|
// rows is fine for inline-embedding in a single static file.
|
|
50
50
|
const entries = (0, db_1.getEntriesForRange)("0000-01-01", "9999-12-31", repoRoot);
|
|
51
51
|
const repoName = entries[0]?.repoName ?? path.basename(repoRoot);
|
|
52
|
+
// Be tolerant of historical shapes — earlier skill versions saved items as
|
|
53
|
+
// raw strings, {title, impact}, or {text, impact} instead of the canonical
|
|
54
|
+
// {summary, status, impact}. Coerce whatever's there into ReportItem so the
|
|
55
|
+
// report still renders.
|
|
52
56
|
const reportEntries = entries.map((e) => ({
|
|
53
57
|
date: e.date,
|
|
54
58
|
repoName: e.repoName,
|
|
55
59
|
totalCommits: e.totalCommits,
|
|
56
60
|
totalFiles: e.totalFiles,
|
|
57
61
|
filesSummary: e.filesSummary,
|
|
58
|
-
items: e.items.map((
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
items: e.items.map((raw) => {
|
|
63
|
+
// Plain string item — older skill runs saved arrays of strings.
|
|
64
|
+
if (typeof raw === "string") {
|
|
65
|
+
return { status: "done", summary: raw };
|
|
66
|
+
}
|
|
67
|
+
const it = (raw ?? {});
|
|
68
|
+
return {
|
|
69
|
+
status: it.status ?? "done",
|
|
70
|
+
summary: (it.summary ?? it.title ?? it.text ?? it.headline ?? "—"),
|
|
71
|
+
impact: it.impact,
|
|
72
|
+
technical_note: (it.technical_note ?? it.note),
|
|
73
|
+
};
|
|
74
|
+
}),
|
|
64
75
|
}));
|
|
65
76
|
const html = (0, html_1.renderReportHtml)(reportEntries, repoName);
|
|
66
77
|
const outDir = path.join(repoRoot, ".git-impact");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBH,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -168,6 +168,53 @@ VALUES ('$(date +%Y-%m-%d)', '$(basename $REPO_ROOT)', $COMMIT_COUNT, $FILE_COUN
|
|
|
168
168
|
|
|
169
169
|
If `sqlite3` is not available, skip silently.
|
|
170
170
|
|
|
171
|
+
### Build a polished HTML presentation
|
|
172
|
+
|
|
173
|
+
After saving to history, **use your Write tool to create a bespoke HTML
|
|
174
|
+
presentation** for today's standup. This is not a generic template — each day's
|
|
175
|
+
file should be tailored to the actual content, with custom layout, charts, or
|
|
176
|
+
diagrams when they help.
|
|
177
|
+
|
|
178
|
+
**Where to write:**
|
|
179
|
+
- `$REPO_ROOT/.git-impact/standups/YYYY-MM-DD.html` — today's file
|
|
180
|
+
- `$REPO_ROOT/.git-impact/standups/index.html` — list of all standups (regenerate it)
|
|
181
|
+
|
|
182
|
+
**Stack (all CDN, no install):**
|
|
183
|
+
- Tailwind CSS via `<script src="https://cdn.tailwindcss.com">`
|
|
184
|
+
- Inter font via Google Fonts
|
|
185
|
+
- Chart.js (`https://cdn.jsdelivr.net/npm/chart.js`) only if there are real numbers worth charting
|
|
186
|
+
- Mermaid (`https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs`) for flow/architecture diagrams when relevant
|
|
187
|
+
|
|
188
|
+
**Required structure:**
|
|
189
|
+
1. **Hero** — date label + a bold, plain-English headline that captures the day
|
|
190
|
+
("Shipped safety analytics, hardened tenant isolation" — not "9 commits")
|
|
191
|
+
2. **Stats grid** — 3-4 metric cards (commits, files, PRs merged, areas touched)
|
|
192
|
+
3. **Achievement cards** — one per ✅ item with status pill, title, summary,
|
|
193
|
+
"→ Why it matters" line, and tags (PR #, area, file count)
|
|
194
|
+
4. **Optional visual** — only when the content warrants one (a Mermaid flow
|
|
195
|
+
diagram for architecture changes, a Chart.js chart for ratios/comparisons,
|
|
196
|
+
a code-style block for a key formula). Skip if forced.
|
|
197
|
+
5. **Footer** — file count, branch, link back to `index.html`
|
|
198
|
+
|
|
199
|
+
**Design language:**
|
|
200
|
+
- Dark theme by default (`bg-slate-950`), generous spacing, max width 4xl
|
|
201
|
+
- Cards: `bg-slate-900/50 border border-slate-800 rounded-2xl p-6`
|
|
202
|
+
- Status pills: emerald for done, amber for in-progress, rose for blocked
|
|
203
|
+
- Print-friendly via `@media print`
|
|
204
|
+
|
|
205
|
+
**Status pill colors:**
|
|
206
|
+
- ✅ Shipped → `bg-emerald-500/20 text-emerald-400`
|
|
207
|
+
- ⏳ In Progress → `bg-amber-500/20 text-amber-400`
|
|
208
|
+
- 🚫 Blocked → `bg-rose-500/20 text-rose-400`
|
|
209
|
+
|
|
210
|
+
After writing both files, print the file URL on the very last line of your reply:
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
🎯 file://$REPO_ROOT/.git-impact/standups/YYYY-MM-DD.html
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Replace `$REPO_ROOT` with the real absolute path so the user can ⌘-click.
|
|
217
|
+
|
|
171
218
|
---
|
|
172
219
|
|
|
173
220
|
## Mode: review
|