git-impact 0.3.0 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +125 -78
  2. package/dist/cli/index.js +32 -211
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/init/installer.d.ts +6 -0
  5. package/dist/init/installer.d.ts.map +1 -1
  6. package/dist/init/installer.js +58 -5
  7. package/dist/init/installer.js.map +1 -1
  8. package/dist/init/installer.test.d.ts +2 -0
  9. package/dist/init/installer.test.d.ts.map +1 -0
  10. package/dist/init/installer.test.js +127 -0
  11. package/dist/init/installer.test.js.map +1 -0
  12. package/dist/init/templates.d.ts +8 -7
  13. package/dist/init/templates.d.ts.map +1 -1
  14. package/dist/init/templates.js +73 -371
  15. package/dist/init/templates.js.map +1 -1
  16. package/dist/mcp/repo.d.ts +8 -3
  17. package/dist/mcp/repo.d.ts.map +1 -1
  18. package/dist/mcp/repo.js +27 -9
  19. package/dist/mcp/repo.js.map +1 -1
  20. package/dist/mcp/repo.test.d.ts +2 -0
  21. package/dist/mcp/repo.test.d.ts.map +1 -0
  22. package/dist/mcp/repo.test.js +133 -0
  23. package/dist/mcp/repo.test.js.map +1 -0
  24. package/dist/mcp/resources.js +0 -1
  25. package/dist/mcp/resources.js.map +1 -1
  26. package/dist/mcp/tools.d.ts.map +1 -1
  27. package/dist/mcp/tools.js +100 -12
  28. package/dist/mcp/tools.js.map +1 -1
  29. package/dist/mcp/tools.test.d.ts +2 -0
  30. package/dist/mcp/tools.test.d.ts.map +1 -0
  31. package/dist/mcp/tools.test.js +123 -0
  32. package/dist/mcp/tools.test.js.map +1 -0
  33. package/dist/readers/git.d.ts +2 -1
  34. package/dist/readers/git.d.ts.map +1 -1
  35. package/dist/readers/git.js +12 -6
  36. package/dist/readers/git.js.map +1 -1
  37. package/dist/readers/redact.d.ts +29 -0
  38. package/dist/readers/redact.d.ts.map +1 -0
  39. package/dist/readers/redact.js +82 -0
  40. package/dist/readers/redact.js.map +1 -0
  41. package/dist/readers/redact.test.d.ts +2 -0
  42. package/dist/readers/redact.test.d.ts.map +1 -0
  43. package/dist/readers/redact.test.js +72 -0
  44. package/dist/readers/redact.test.js.map +1 -0
  45. package/dist/report/html.d.ts +2 -0
  46. package/dist/report/html.d.ts.map +1 -1
  47. package/dist/report/html.js +35 -1
  48. package/dist/report/html.js.map +1 -1
  49. package/dist/report/render.d.ts.map +1 -1
  50. package/dist/report/render.js +2 -0
  51. package/dist/report/render.js.map +1 -1
  52. package/dist/storage/db.d.ts +23 -2
  53. package/dist/storage/db.d.ts.map +1 -1
  54. package/dist/storage/db.js +12 -0
  55. package/dist/storage/db.js.map +1 -1
  56. package/dist/storage/db.test.d.ts +2 -0
  57. package/dist/storage/db.test.d.ts.map +1 -0
  58. package/dist/storage/db.test.js +152 -0
  59. package/dist/storage/db.test.js.map +1 -0
  60. package/package.json +7 -6
  61. package/skill/SKILL.md +142 -205
  62. package/skill/references/html-template.md +131 -0
  63. package/skill/references/translation-rules.md +87 -0
  64. package/dist/translator/prompt.d.ts +0 -21
  65. package/dist/translator/prompt.d.ts.map +0 -1
  66. package/dist/translator/prompt.js +0 -117
  67. package/dist/translator/prompt.js.map +0 -1
  68. package/dist/translator/translate.d.ts +0 -36
  69. package/dist/translator/translate.d.ts.map +0 -1
  70. package/dist/translator/translate.js +0 -73
  71. package/dist/translator/translate.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.test.js","sourceRoot":"","sources":["../../src/init/installer.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  /**
2
- * All template content is embedded here as strings.
3
- * This means the package works correctly after `npm install -g`
4
- * without needing to locate template files on disk.
2
+ * Editor-specific template content (Copilot, Cursor, Gemini).
3
+ *
4
+ * Note: the Claude Code skill is NOT embedded here — it's copied directly
5
+ * from the shipped `skill/` directory at install time so SKILL.md and its
6
+ * `references/` sub-files stay single-source. See `installer.ts`.
5
7
  */
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
8
  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
- 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
- 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";
10
- export declare const GEMINI_COMMAND = "# git-impact\n\nTranslate git commits into plain-English standup bullets.\n\n## When to use\n\nUser says: \"do my standup\", \"translate my commits\", \"what did I ship today/this week\",\n\"generate a performance review\", or \"git-impact\".\n\n## Steps\n\n1. `git rev-parse --show-toplevel` \u2192 get repo root\n2. `cat .git-impact/context.json` \u2192 load glossary and company context\n3. `git log --since=\"today 00:00:00\" --format=\"%h|%s|%b\" HEAD` \u2192 get commits\n4. Translate into 2\u20135 bullets:\n - Apply glossary (replace technical terms with plain-English equivalents)\n - What was done + why it matters to the business\n - Group related commits\n - WIP commits: \u23F3 In progress: [what] \u2192 [expected outcome]\n5. End with: \uD83D\uDCC1 [N] files changed across [areas]\n6. Save to .git-impact/history.db\n\n## Context file format (.git-impact/context.json)\n\n```json\n{\n \"companyDescription\": \"...\",\n \"managerPriorities\": \"...\",\n \"glossary\": { \"TERM\": \"plain English meaning\" }\n}\n```\n";
9
+ export declare const COPILOT_INSTRUCTIONS = "# git-impact\n\nTranslate git commits into plain-English business impact for standups,\nmanager updates, and performance review prep.\n\n## When to trigger\n\nUser says any of: \"do my standup\", \"/git-impact\", \"what did I ship today\",\n\"translate my commits\", \"since yesterday\", \"since 3d\", \"since last standup\",\n\"weekly summary\", \"performance review prep\", \"generate a review\".\n\n## Preferred path: MCP\n\nIf the `git-impact` MCP server is configured for this editor, use its tools:\n\n1. `get_last_standup_date` \u2014 find the lookback start\n2. `get_git_activity` (since_iso = day-after last standup, or start-of-today)\n3. `get_github_activity` if a github_token exists in context\n4. Translate using the rules below\n5. `save_impact_entry` with each item including `provenance`\n (`pr` | `commit_body` | `commit_message` | `ticket` | `inferred`)\n\n## Fallback path: bash\n\nIf MCP isn't available, run:\n```bash\nREPO=$(git rev-parse --show-toplevel)\ncat \"$REPO/.git-impact/context.json\" # glossary, manager priorities\ngit -C \"$REPO\" log --since=\"today 00:00:00\" --format=\"%h|%s|%b|%an|%ad\" --date=short HEAD\ngit -C \"$REPO\" diff --stat HEAD~5 HEAD\n```\n\nThen translate, then ask the user to run `git-impact view` to see the saved\nHTML report (the bash path can't write to history.db safely from this editor).\n\n## Translation rules\n\n1. **What + why**, not what + how. Never restate commit messages.\n2. **Apply the glossary** from context.json \u2014 replace technical terms with\n plain-English equivalents.\n3. **Provenance is mandatory** for every saved item:\n - `pr` \u2014 quoted from the linked PR description\n - `commit_body` \u2014 pulled from a multi-line commit body\n - `commit_message` \u2014 visible in the subject line\n - `ticket` \u2014 pulled from a linked Linear/Jira ticket\n - `inferred` \u2014 guessed without explicit text. Use this honestly.\n4. **Group related commits** into one bullet.\n5. WIP \u2192 `status: \"in_progress\"` with **expected outcome**, not progress so far.\n6. Blocked \u2192 `status: \"blocked\"`.\n7. **Be specific with numbers** \u2014 pull them from commits/PRs, never invent them.\n\n## Output\n\n```\n\uD83D\uDCC5 [Date or range]\n\u2705 [Plain-English summary]\n \u2192 [Why it matters]\n\u23F3 In progress: [What] \u2192 [Expected outcome]\n\uD83D\uDEAB Blocked: [What] \u2192 [What's needed]\n\uD83D\uDCC1 [N] files across [areas] \u00B7 [N] commit(s) on [branch]\n```\n\n## Tone\n\nNon-technical-manager audience. Short sentences. No filler. 2 accurate bullets\nbeat 5 vague ones. If you guessed the impact, label `provenance: inferred`\nand use phrasing like \"technical foundation work for X\" \u2014 never hedge with\n\"might potentially\".\n";
10
+ export declare const CURSOR_RULES = "---\ndescription: git-impact \u2014 turn git commits into plain-English standup bullets\nglobs: []\nalwaysApply: false\n---\n\n# git-impact\n\n## When to trigger\n\nUser says any of: \"do my standup\", \"/git-impact\", \"what did I ship today\",\n\"translate my commits\", \"since yesterday\", \"since 3d\", \"since last standup\",\n\"weekly summary\", \"performance review prep\", \"generate a review\".\n\n## Preferred path: MCP\n\nIf the `git-impact` MCP server is configured for this editor, use its tools:\n\n1. `get_last_standup_date` \u2014 find the lookback start\n2. `get_git_activity` (since_iso = day-after last standup, or start-of-today)\n3. `get_github_activity` if a github_token exists in context\n4. Translate using the rules below\n5. `save_impact_entry` with each item including `provenance`\n (`pr` | `commit_body` | `commit_message` | `ticket` | `inferred`)\n\n## Fallback path: bash\n\nIf MCP isn't available, run:\n```bash\nREPO=$(git rev-parse --show-toplevel)\ncat \"$REPO/.git-impact/context.json\" # glossary, manager priorities\ngit -C \"$REPO\" log --since=\"today 00:00:00\" --format=\"%h|%s|%b|%an|%ad\" --date=short HEAD\ngit -C \"$REPO\" diff --stat HEAD~5 HEAD\n```\n\nThen translate, then ask the user to run `git-impact view` to see the saved\nHTML report (the bash path can't write to history.db safely from this editor).\n\n## Translation rules\n\n1. **What + why**, not what + how. Never restate commit messages.\n2. **Apply the glossary** from context.json \u2014 replace technical terms with\n plain-English equivalents.\n3. **Provenance is mandatory** for every saved item:\n - `pr` \u2014 quoted from the linked PR description\n - `commit_body` \u2014 pulled from a multi-line commit body\n - `commit_message` \u2014 visible in the subject line\n - `ticket` \u2014 pulled from a linked Linear/Jira ticket\n - `inferred` \u2014 guessed without explicit text. Use this honestly.\n4. **Group related commits** into one bullet.\n5. WIP \u2192 `status: \"in_progress\"` with **expected outcome**, not progress so far.\n6. Blocked \u2192 `status: \"blocked\"`.\n7. **Be specific with numbers** \u2014 pull them from commits/PRs, never invent them.\n\n## Output\n\n```\n\uD83D\uDCC5 [Date or range]\n\u2705 [Plain-English summary]\n \u2192 [Why it matters]\n\u23F3 In progress: [What] \u2192 [Expected outcome]\n\uD83D\uDEAB Blocked: [What] \u2192 [What's needed]\n\uD83D\uDCC1 [N] files across [areas] \u00B7 [N] commit(s) on [branch]\n```\n\n## Tone\n\nNon-technical-manager audience. Short sentences. No filler. 2 accurate bullets\nbeat 5 vague ones. If you guessed the impact, label `provenance: inferred`\nand use phrasing like \"technical foundation work for X\" \u2014 never hedge with\n\"might potentially\".\n";
11
+ export declare const GEMINI_COMMAND = "# git-impact\n\nTranslate git commits into plain-English business impact.\n\n## When to trigger\n\nUser says any of: \"do my standup\", \"/git-impact\", \"what did I ship today\",\n\"translate my commits\", \"since yesterday\", \"since 3d\", \"since last standup\",\n\"weekly summary\", \"performance review prep\", \"generate a review\".\n\n## Preferred path: MCP\n\nIf the `git-impact` MCP server is configured for this editor, use its tools:\n\n1. `get_last_standup_date` \u2014 find the lookback start\n2. `get_git_activity` (since_iso = day-after last standup, or start-of-today)\n3. `get_github_activity` if a github_token exists in context\n4. Translate using the rules below\n5. `save_impact_entry` with each item including `provenance`\n (`pr` | `commit_body` | `commit_message` | `ticket` | `inferred`)\n\n## Fallback path: bash\n\nIf MCP isn't available, run:\n```bash\nREPO=$(git rev-parse --show-toplevel)\ncat \"$REPO/.git-impact/context.json\" # glossary, manager priorities\ngit -C \"$REPO\" log --since=\"today 00:00:00\" --format=\"%h|%s|%b|%an|%ad\" --date=short HEAD\ngit -C \"$REPO\" diff --stat HEAD~5 HEAD\n```\n\nThen translate, then ask the user to run `git-impact view` to see the saved\nHTML report (the bash path can't write to history.db safely from this editor).\n\n## Translation rules\n\n1. **What + why**, not what + how. Never restate commit messages.\n2. **Apply the glossary** from context.json \u2014 replace technical terms with\n plain-English equivalents.\n3. **Provenance is mandatory** for every saved item:\n - `pr` \u2014 quoted from the linked PR description\n - `commit_body` \u2014 pulled from a multi-line commit body\n - `commit_message` \u2014 visible in the subject line\n - `ticket` \u2014 pulled from a linked Linear/Jira ticket\n - `inferred` \u2014 guessed without explicit text. Use this honestly.\n4. **Group related commits** into one bullet.\n5. WIP \u2192 `status: \"in_progress\"` with **expected outcome**, not progress so far.\n6. Blocked \u2192 `status: \"blocked\"`.\n7. **Be specific with numbers** \u2014 pull them from commits/PRs, never invent them.\n\n## Output\n\n```\n\uD83D\uDCC5 [Date or range]\n\u2705 [Plain-English summary]\n \u2192 [Why it matters]\n\u23F3 In progress: [What] \u2192 [Expected outcome]\n\uD83D\uDEAB Blocked: [What] \u2192 [What's needed]\n\uD83D\uDCC1 [N] files across [areas] \u00B7 [N] commit(s) on [branch]\n```\n\n## Tone\n\nNon-technical-manager audience. Short sentences. No filler. 2 accurate bullets\nbeat 5 vague ones. If you guessed the impact, label `provenance: inferred`\nand use phrasing like \"technical foundation work for X\" \u2014 never hedge with\n\"might potentially\".\n";
11
12
  export declare const CONTEXT_TEMPLATE: (companyDescription: string, managerPriorities: string, glossary: Record<string, string>) => string;
12
13
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,eAAO,MAAM,eAAe,yjBAa3B,CAAC;AAyEF,eAAO,MAAM,oBAAoB,mtFAKV,CAAC;AAIxB,eAAO,MAAM,YAAY,ytFAQF,CAAC;AAIxB,eAAO,MAAM,cAAc,upFAIJ,CAAC;AAIxB,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,EAC1B,mBAAmB,MAAM,EACzB,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC/B,MAKO,CAAC"}
@@ -1,417 +1,119 @@
1
1
  "use strict";
2
2
  /**
3
- * All template content is embedded here as strings.
4
- * This means the package works correctly after `npm install -g`
5
- * without needing to locate template files on disk.
3
+ * Editor-specific template content (Copilot, Cursor, Gemini).
4
+ *
5
+ * Note: the Claude Code skill is NOT embedded here — it's copied directly
6
+ * from the shipped `skill/` directory at install time so SKILL.md and its
7
+ * `references/` sub-files stay single-source. See `installer.ts`.
6
8
  */
7
9
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.CONTEXT_TEMPLATE = exports.GEMINI_COMMAND = exports.CURSOR_RULES = exports.COPILOT_INSTRUCTIONS = exports.CLAUDE_MD_BLOCK = exports.CLAUDE_SKILL = void 0;
9
- // ─── Claude Code skill ────────────────────────────────────────────────────────
10
- exports.CLAUDE_SKILL = `---
11
- name: git-impact
12
- description: >
13
- Translates git commits into plain-English business impact — for standups,
14
- manager updates, and performance reviews. Use this skill whenever the user
15
- says: "do my standup", "translate my commits", "what did I ship today/this
16
- week", "write my standup", "show my impact", "git-impact", "/git-impact",
17
- "generate a performance review", "what have I done this quarter", or any
18
- request to turn technical git output into something a non-technical manager
19
- can understand.
20
- ---
10
+ exports.CONTEXT_TEMPLATE = exports.GEMINI_COMMAND = exports.CURSOR_RULES = exports.COPILOT_INSTRUCTIONS = exports.CLAUDE_MD_BLOCK = void 0;
11
+ // ─── CLAUDE.md managed block ──────────────────────────────────────────────────
12
+ exports.CLAUDE_MD_BLOCK = `
13
+ ## git-impact
21
14
 
22
- # git-impact
15
+ This repo uses [git-impact](https://github.com/you/git-impact) for standup and
16
+ performance review generation.
23
17
 
24
- Translate git commits into plain-English business impact without an API key.
25
- Read git data with bash, load the repo's context file, and write the translation
26
- inline.
18
+ - Say **"do my standup"** to translate today's commits into business impact
19
+ - Say **"git-impact since 3d"** to look back further
20
+ - Say **"generate a performance review"** after a few weeks of standups
21
+ - Say **"set up context for this repo"** to configure the glossary
27
22
 
28
- ## Sub-commands
23
+ Context is stored in \`.git-impact/context.json\` (committed, team-shared).
24
+ History is stored in \`.git-impact/history.db\` (gitignored, per-machine).
25
+ `;
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
29
31
 
30
- | User says | Mode |
31
- |---|---|
32
- | \`do my standup\`, \`today\`, no args | **today** |
33
- | \`since yesterday\`, \`since 3d\`, \`since 2026-05-01\` | **since \\<when\\>** |
34
- | \`review\`, \`last 30 days\`, \`Q2 review\` | **review** |
35
- | \`init\`, \`set up context\` | **init** |
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".
36
35
 
37
- ## Step 1 — Find the repo root
36
+ ## Preferred path: MCP
38
37
 
39
- \`\`\`bash
40
- git rev-parse --show-toplevel 2>/dev/null
41
- \`\`\`
38
+ If the \`git-impact\` MCP server is configured for this editor, use its tools:
42
39
 
43
- If it fails: *"No git repository found. Open a project folder first."* Stop.
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\`)
44
46
 
45
- ## Step 2 — Load context
47
+ ## Fallback path: bash
46
48
 
49
+ If MCP isn't available, run:
47
50
  \`\`\`bash
48
- cat "$REPO_ROOT/.git-impact/context.json" 2>/dev/null || echo "NONE"
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
49
55
  \`\`\`
50
56
 
51
- Apply the glossary (technical term plain English) and frame impact around
52
- manager priorities. If no context file exists, use general language and
53
- suggest running init.
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).
54
59
 
55
- ## Mode: today / since \\<when\\>
60
+ ## Translation rules
56
61
 
57
- Fetch commits:
58
- \`\`\`bash
59
- # today
60
- git -C "$REPO_ROOT" log \\
61
- --since="$(date '+%Y-%m-%d') 00:00:00" \\
62
- --format="%h|%s|%b|%an|%ad" --date=short HEAD
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.
63
75
 
64
- # since Nd → --since="N days ago 00:00:00"
65
- # since YYYY-MM-DD → --since="YYYY-MM-DD 00:00:00"
66
- \`\`\`
76
+ ## Output
67
77
 
68
- Fetch files changed:
69
- \`\`\`bash
70
- FIRST=$(git -C "$REPO_ROOT" log --since="..." --format="%h" HEAD | tail -1)
71
- git -C "$REPO_ROOT" diff --stat "$FIRST"^ HEAD 2>/dev/null
72
78
  \`\`\`
73
-
74
- **Translation rules:**
75
- 1. Each bullet = what was done + WHY it matters to the business. Never restate the commit message.
76
- 2. Apply glossary — replace every technical term listed in context.json.
77
- 3. If impact can't be inferred → "technical foundation work for [area]". Never hallucinate.
78
- 4. Group related commits — 4 auth commits = 1 bullet.
79
- 5. WIP commits → "⏳ In progress: [what] → [expected outcome]"
80
- 6. Be specific — use numbers from commit messages when they exist.
81
-
82
- **Output:**
83
- \`\`\`
84
- 📅 [Day, Date]
85
-
79
+ 📅 [Date or range]
86
80
  ✅ [Plain-English summary]
87
- → [Business impact — who it unblocks, what risk it reduces]
88
-
89
- In progress: [what]
90
- [Expected outcome]
91
-
92
- 📁 [N] files changed across [areas]
93
- [N] commit(s) on [branch]
94
- \`\`\`
95
-
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
-
112
- \`\`\`bash
113
- mkdir -p "$REPO_ROOT/.git-impact"
114
- sqlite3 "$REPO_ROOT/.git-impact/history.db" "
115
- CREATE TABLE IF NOT EXISTS impact_entries (
116
- id INTEGER PRIMARY KEY AUTOINCREMENT,
117
- date TEXT NOT NULL, repo_name TEXT NOT NULL,
118
- total_commits INTEGER NOT NULL DEFAULT 0,
119
- total_files INTEGER NOT NULL DEFAULT 0,
120
- items_json TEXT NOT NULL DEFAULT '[]',
121
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
122
- );
123
- INSERT INTO impact_entries (date, repo_name, total_commits, total_files, items_json)
124
- VALUES ('$(date +%Y-%m-%d)', '$(basename $REPO_ROOT)', $COMMITS, $FILES, '$JSON');
125
- " 2>/dev/null || true
126
- \`\`\`
127
-
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>
256
- \`\`\`
257
-
258
- ### Then build the index page
259
-
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.
264
-
265
- ### Then print the file URL on the last line
266
-
267
- \`\`\`
268
- 🎯 file:///$REPO_ROOT/.git-impact/standups/$(date +%Y-%m-%d).html
269
- \`\`\`
270
-
271
- Replace \`$REPO_ROOT\` with the real absolute path so the user can ⌘-click it.
272
-
273
- ## Mode: review
274
-
275
- Query history and synthesise a performance review:
276
- \`\`\`bash
277
- sqlite3 "$REPO_ROOT/.git-impact/history.db" \\
278
- "SELECT date, repo_name, total_commits, items_json
279
- FROM impact_entries WHERE date >= '$FROM' AND date <= '$TO'
280
- ORDER BY date ASC;" 2>/dev/null
281
- \`\`\`
282
-
283
- If no history: *"No saved history yet. Run the standup daily for a few weeks first."*
284
-
285
- Format:
286
- \`\`\`
287
- Performance Review — [Period]
288
- [Headline sentence — biggest contribution]
289
-
290
- 🚀 [High-impact theme]
291
- • Specific achievement with numbers...
292
-
293
- ✅ [Medium theme] ...
294
- 🔧 [Lower theme] ...
295
-
296
- 📊 [N] commits across [N] working days
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]
297
85
  \`\`\`
298
86
 
299
- ## Mode: init
300
-
301
- Ask one at a time:
302
- 1. "What does your company/product do? (1–2 sentences)"
303
- 2. "What does your manager care most about?"
304
- 3. "Technical terms to translate? e.g. RLS=data security (blank to skip)"
305
-
306
- Write \`.git-impact/context.json\` and confirm:
307
- *"Saved. Commit context.json to share the glossary with your team."*
308
-
309
87
  ## Tone
310
88
 
311
- Non-technical manager audience. Short sentences. No filler. Confident if
312
- you know the impact, state it. 2 accurate bullets > 5 vague ones.
313
- `;
314
- // ─── CLAUDE.md managed block ──────────────────────────────────────────────────
315
- exports.CLAUDE_MD_BLOCK = `
316
- ## git-impact
317
-
318
- This repo uses [git-impact](https://github.com/you/git-impact) for standup and
319
- performance review generation.
320
-
321
- - Say **"do my standup"** to translate today's commits into business impact
322
- - Say **"git-impact since 3d"** to look back further
323
- - Say **"generate a performance review"** after a few weeks of standups
324
- - Say **"set up context for this repo"** to configure the glossary
325
-
326
- Context is stored in \`.git-impact/context.json\` (committed, team-shared).
327
- History is stored in \`.git-impact/history.db\` (gitignored, per-machine).
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".
328
93
  `;
329
94
  // ─── GitHub Copilot instructions ──────────────────────────────────────────────
330
95
  exports.COPILOT_INSTRUCTIONS = `# git-impact
331
96
 
332
- Translate git commits into plain-English standup bullets when the user asks
333
- to "do my standup", "translate my commits", "what did I ship today", or
334
- "generate a performance review".
97
+ Translate git commits into plain-English business impact for standups,
98
+ manager updates, and performance review prep.
335
99
 
336
- ## How to translate commits
337
-
338
- 1. Run \`git log --since="today 00:00:00" --format="%h|%s|%b" HEAD\` to get commits
339
- 2. Read \`.git-impact/context.json\` for glossary and company context
340
- 3. Translate into 2–5 bullets following these rules:
341
- - What was done + WHY it matters (never restate commit messages)
342
- - Apply glossary terms from context.json
343
- - Group related commits into one bullet
344
- - WIP commits → "⏳ In progress: [what] → [expected outcome]"
345
- - If impact can't be inferred → "technical foundation work for [area]"
346
-
347
- ## Output format
348
-
349
- \`\`\`
350
- 📅 [Date]
351
- ✅ [Summary] → [Business impact]
352
- ⏳ In progress: [What] → [Expected outcome]
353
- 📁 [N] files changed across [areas]
354
- \`\`\`
355
-
356
- For performance reviews, query \`.git-impact/history.db\` and group by theme.
357
- `;
100
+ ${SHARED_INSTRUCTIONS}`;
358
101
  // ─── Cursor rules ─────────────────────────────────────────────────────────────
359
102
  exports.CURSOR_RULES = `---
360
- description: git-impact standup and performance review generation
103
+ description: git-impact turn git commits into plain-English standup bullets
361
104
  globs: []
362
105
  alwaysApply: false
363
106
  ---
364
107
 
365
108
  # git-impact
366
109
 
367
- When the user asks to "do my standup", "translate commits", "what did I ship",
368
- or "generate a performance review":
369
-
370
- 1. Find repo root: \`git rev-parse --show-toplevel\`
371
- 2. Load context: \`cat .git-impact/context.json\`
372
- 3. Fetch commits: \`git log --since="today 00:00:00" --format="%h|%s|%b" HEAD\`
373
- 4. Translate into 2–5 plain-English bullets:
374
- - Apply glossary from context.json
375
- - Each bullet = what + why it matters (never restate commit messages)
376
- - Group related commits, flag WIP with ⏳
377
- 5. Format: ✅ [summary] → [business impact]
378
- 6. Save to \`.git-impact/history.db\` via sqlite3
379
-
380
- For reviews: query history.db and group by theme (Features, Security, Reliability, etc.)
381
- `;
110
+ ${SHARED_INSTRUCTIONS}`;
382
111
  // ─── Gemini CLI commands ──────────────────────────────────────────────────────
383
112
  exports.GEMINI_COMMAND = `# git-impact
384
113
 
385
- Translate git commits into plain-English standup bullets.
386
-
387
- ## When to use
114
+ Translate git commits into plain-English business impact.
388
115
 
389
- User says: "do my standup", "translate my commits", "what did I ship today/this week",
390
- "generate a performance review", or "git-impact".
391
-
392
- ## Steps
393
-
394
- 1. \`git rev-parse --show-toplevel\` → get repo root
395
- 2. \`cat .git-impact/context.json\` → load glossary and company context
396
- 3. \`git log --since="today 00:00:00" --format="%h|%s|%b" HEAD\` → get commits
397
- 4. Translate into 2–5 bullets:
398
- - Apply glossary (replace technical terms with plain-English equivalents)
399
- - What was done + why it matters to the business
400
- - Group related commits
401
- - WIP commits: ⏳ In progress: [what] → [expected outcome]
402
- 5. End with: 📁 [N] files changed across [areas]
403
- 6. Save to .git-impact/history.db
404
-
405
- ## Context file format (.git-impact/context.json)
406
-
407
- \`\`\`json
408
- {
409
- "companyDescription": "...",
410
- "managerPriorities": "...",
411
- "glossary": { "TERM": "plain English meaning" }
412
- }
413
- \`\`\`
414
- `;
116
+ ${SHARED_INSTRUCTIONS}`;
415
117
  // ─── context.json template ────────────────────────────────────────────────────
416
118
  const CONTEXT_TEMPLATE = (companyDescription, managerPriorities, glossary) => JSON.stringify({ companyDescription, managerPriorities, glossary }, null, 2) + "\n";
417
119
  exports.CONTEXT_TEMPLATE = CONTEXT_TEMPLATE;
@@ -1 +1 @@
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
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/init/templates.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,iFAAiF;AAEpE,QAAA,eAAe,GAAG;;;;;;;;;;;;;CAa9B,CAAC;AAEF,2DAA2D;AAC3D,0EAA0E;AAC1E,uEAAuE;AACvE,oEAAoE;AACpE,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D3B,CAAC;AAEF,iFAAiF;AAEpE,QAAA,oBAAoB,GAAG;;;;;EAKlC,mBAAmB,EAAE,CAAC;AAExB,iFAAiF;AAEpE,QAAA,YAAY,GAAG;;;;;;;;EAQ1B,mBAAmB,EAAE,CAAC;AAExB,iFAAiF;AAEpE,QAAA,cAAc,GAAG;;;;EAI5B,mBAAmB,EAAE,CAAC;AAExB,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,12 +1,17 @@
1
1
  /**
2
2
  * Repo path resolution — priority order:
3
3
  *
4
- * 1. Explicit arg passed by Claude (user said "~/code/my-app")
5
- * 2. Default repo saved in user context (set once, reused forever)
4
+ * 1. Explicit arg passed by the model ("~/code/my-app")
5
+ * 2. **Sticky cache** the path we resolved last time on this process.
6
+ * The skill calls 3-5 MCP tools per standup; resolving once and
7
+ * reusing avoids the bug where get_git_activity finds a repo via
8
+ * cwd but save_impact_entry — called moments later — gets a
9
+ * different cwd and fails.
6
10
  * 3. Walk up from process.cwd() until a .git folder is found
7
- * → works in Claude Code CLI where cwd = open project
8
11
  * 4. Fail with a clear message asking the user to set a default
9
12
  */
13
+ /** Reset the cached path. Used by tests; not part of the public API. */
14
+ export declare function _resetStickyRepoForTests(): void;
10
15
  export declare function resolveRepoPath(explicitPath?: string): {
11
16
  path: string;
12
17
  source: string;
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/mcp/repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsBvF"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/mcp/repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,wEAAwE;AACxE,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgCvF"}