claude-spp 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -154,11 +154,12 @@ spp init
154
154
 
155
155
  ### Status line (optional)
156
156
 
157
- You can add SPP status to Claude Code's status line, showing how many commits you are ahead or behind your goal:
157
+ You can add SPP status to Claude Code's status line, showing how many more commits Claude can write before reaching the target ratio:
158
158
 
159
159
  ```
160
- 🟢 Matt is 11 commits ahead of goal
161
- 🔴 Matt is 2 commits behind goal
160
+ 🟢 Claude can write 9 more commits 🤖 > 🤖 > 🐵 > 🐵 > 🤖 > 🤖 > 🤖 > 🤖 > 🐵 > 🐵 > 🐵 > 🐵 > 🐵 > 🤖 > 🐵 ...
161
+
162
+ 🔴 Human needs to write 2 more commits 🤖 > 🤖 > 🤖 > 🤖 > 🤖 > 🤖 > 🤖 > 🤖 > 🐵 > 🤖 > 🐵 > 🤖 > 🤖 > 🤖 > 🐵 ...
162
163
  ```
163
164
 
164
165
  To enable, add to `~/.claude/settings.json`:
@@ -167,7 +168,7 @@ To enable, add to `~/.claude/settings.json`:
167
168
  {
168
169
  "statusLine": {
169
170
  "type": "command",
170
- "command": "spp hook:status-line",
171
+ "command": "spp hook:status-line"
171
172
  }
172
173
  }
173
174
  ```
@@ -4,8 +4,9 @@
4
4
  export declare function generateSystemPrompt(projectPath: string): string;
5
5
  /**
6
6
  * Generate a compact status line for the prompt
7
- * Format: 🟢 Matt is 11 commits ahead of goal
8
- * 🔴 Matt is 2 commits behind goal
7
+ * Format: 🟢 Claude can write 11 more commits (4+)
8
+ * ⚠️ Claude can write 3 more commits (1-3)
9
+ * 🔴 Human needs to write 2 more commits (0 or less)
9
10
  */
10
11
  export declare function generateStatusLine(projectPath: string): string;
11
12
  //# sourceMappingURL=system-prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/hooks/system-prompt.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA8DhE;AAiCD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAiC9D"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/hooks/system-prompt.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA8DhE;AAwBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA+C9D"}
@@ -1,7 +1,7 @@
1
1
  import { loadConfig, isSppInitialized } from "../config/loader.js";
2
2
  import { calculateRatio, isRatioHealthy } from "../stats.js";
3
- import { getEffectiveRatio, getCurrentMode } from "../config/schema.js";
4
- import { getLineCounts } from "../vcs/index.js";
3
+ import { getEffectiveRatio, getCurrentMode, getStatsWindowCutoff } from "../config/schema.js";
4
+ import { getLineCounts, getLineCountsWithWindow, getRecentCommitsClassified } from "../vcs/index.js";
5
5
  /**
6
6
  * Calculate how many more commits/lines the human needs to reach the target ratio
7
7
  */
@@ -71,39 +71,30 @@ export function generateSystemPrompt(projectPath) {
71
71
  return lines.join("\n");
72
72
  }
73
73
  /**
74
- * Calculate how many commits/lines ahead or behind the human is from the target
75
- * Positive = ahead, negative = behind
74
+ * Calculate how many Claude commits/lines can be added before hitting the target ratio.
75
+ * Positive = ahead (Claude commits remaining), negative = behind (human commits needed).
76
+ *
77
+ * Formula derivation for "ahead" case:
78
+ * humanValue / (humanValue + claudeValue + x) = targetRatio
79
+ * Solving for x: x = humanValue * (1 - targetRatio) / targetRatio - claudeValue
76
80
  */
77
81
  function calculateAheadBehind(humanValue, claudeValue, targetRatio) {
78
82
  const total = humanValue + claudeValue;
79
83
  if (total === 0)
80
84
  return 0;
81
- // Target human value = targetRatio * total
82
- const targetHumanValue = targetRatio * total;
83
- // How many ahead/behind
84
- return Math.round(humanValue - targetHumanValue);
85
- }
86
- /**
87
- * Get the current git user's name
88
- */
89
- function getGitUserName(projectPath) {
90
- try {
91
- const { execSync } = require("node:child_process");
92
- const name = execSync("git config user.name", {
93
- cwd: projectPath,
94
- encoding: "utf-8",
95
- }).trim();
96
- // Get first name only
97
- return name.split(" ")[0] || "You";
98
- }
99
- catch {
100
- return "You";
85
+ // Avoid division by zero for 100% human target
86
+ if (targetRatio >= 1) {
87
+ return -claudeValue; // Need to remove all Claude commits
101
88
  }
89
+ // How many more Claude commits until we hit exactly the target ratio
90
+ const claudeCommitsRemaining = humanValue * (1 - targetRatio) / targetRatio - claudeValue;
91
+ return Math.floor(claudeCommitsRemaining);
102
92
  }
103
93
  /**
104
94
  * Generate a compact status line for the prompt
105
- * Format: 🟢 Matt is 11 commits ahead of goal
106
- * 🔴 Matt is 2 commits behind goal
95
+ * Format: 🟢 Claude can write 11 more commits (4+)
96
+ * ⚠️ Claude can write 3 more commits (1-3)
97
+ * 🔴 Human needs to write 2 more commits (0 or less)
107
98
  */
108
99
  export function generateStatusLine(projectPath) {
109
100
  if (!isSppInitialized(projectPath)) {
@@ -113,7 +104,12 @@ export function generateStatusLine(projectPath) {
113
104
  if (!config.enabled) {
114
105
  return "";
115
106
  }
116
- const lineCounts = getLineCounts(projectPath);
107
+ const statsWindow = config.statsWindow ?? "oneWeek";
108
+ const statsWindowCutoff = getStatsWindowCutoff(statsWindow);
109
+ const lineCounts = getLineCountsWithWindow(projectPath, {
110
+ since: statsWindowCutoff,
111
+ afterCommit: config.trackingStartCommit,
112
+ });
117
113
  const trackingMode = config.trackingMode ?? "commits";
118
114
  const humanValue = trackingMode === "commits" ? lineCounts.humanCommits : lineCounts.humanLines;
119
115
  const claudeValue = trackingMode === "commits" ? lineCounts.claudeCommits : lineCounts.claudeLines;
@@ -123,14 +119,20 @@ export function generateStatusLine(projectPath) {
123
119
  if (total === 0) {
124
120
  return "⚪ SPP: no commits yet";
125
121
  }
126
- const username = getGitUserName(projectPath);
127
- const verb = username === "You" ? "are" : "is";
128
- const aheadBehind = calculateAheadBehind(humanValue, claudeValue, targetRatio);
129
- if (aheadBehind >= 0) {
130
- return `🟢 ${username} ${verb} ${aheadBehind} ${unit} ahead of goal`;
131
- }
132
- else {
133
- return `🔴 ${username} ${verb} ${Math.abs(aheadBehind)} ${unit} behind goal`;
134
- }
122
+ const claudeRemaining = calculateAheadBehind(humanValue, claudeValue, targetRatio);
123
+ // Generate emoji history for recent commits (newest on left)
124
+ const recentCommits = getRecentCommitsClassified(projectPath, {
125
+ since: statsWindowCutoff,
126
+ afterCommit: config.trackingStartCommit,
127
+ limit: 15,
128
+ });
129
+ const emojiHistory = recentCommits
130
+ .map((c) => (c.isClaude ? "🤖" : "🐵"))
131
+ .join(" > ");
132
+ const statusEmoji = claudeRemaining <= 0 ? "🔴" : claudeRemaining < 4 ? "⚠️" : "🟢";
133
+ const statusText = claudeRemaining > 0
134
+ ? `Claude can write ${claudeRemaining} more ${unit}`
135
+ : `Human needs to write ${Math.abs(claudeRemaining)} more ${unit}`;
136
+ return `${statusEmoji} ${statusText} ${emojiHistory} ...`;
135
137
  }
136
138
  //# sourceMappingURL=system-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/hooks/system-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/hooks/system-prompt.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { VcsProvider, VcsType, LineCounts, CommitInfo } from "./types.js";
2
- export type { VcsProvider, VcsType, LineCounts, CommitInfo } from "./types.js";
2
+ export type { VcsProvider, VcsType, LineCounts, CommitInfo, CommitWithParent } from "./types.js";
3
3
  /**
4
4
  * Get the appropriate VCS provider
5
5
  *
@@ -34,4 +34,15 @@ export declare function getCommitInfo(projectPath: string, commitHash: string, v
34
34
  * Clear cache using specified or auto-detected VCS
35
35
  */
36
36
  export declare function clearCache(projectPath: string, vcsType?: VcsType): void;
37
+ /**
38
+ * Get recent commits within window, newest first, with Claude/human classification
39
+ */
40
+ export declare function getRecentCommitsClassified(projectPath: string, options: {
41
+ since: Date | null;
42
+ afterCommit?: string | null;
43
+ limit?: number;
44
+ }, vcsType?: VcsType): Array<{
45
+ hash: string;
46
+ isClaude: boolean;
47
+ }>;
37
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vcs/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/E,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoB/E;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,WAAW,CAStF;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAEhF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC5D,OAAO,CAAC,EAAE,OAAO,GAChB,UAAU,CAEZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAElF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAE3G;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAMvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vcs/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/E,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAoBjG;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,OAAe,GAAG,WAAW,CAStF;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAEhF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC5D,OAAO,CAAC,EAAE,OAAO,GAChB,UAAU,CAEZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAElF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAE3G;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAMvE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5E,OAAO,CAAC,EAAE,OAAO,GAChB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB5C"}
package/dist/vcs/index.js CHANGED
@@ -73,4 +73,25 @@ export function clearCache(projectPath, vcsType) {
73
73
  // Ignore errors if VCS not detected
74
74
  }
75
75
  }
76
+ /**
77
+ * Get recent commits within window, newest first, with Claude/human classification
78
+ */
79
+ export function getRecentCommitsClassified(projectPath, options, vcsType) {
80
+ const provider = getProvider(projectPath, vcsType);
81
+ const head = provider.getHeadCommitHash(projectPath);
82
+ if (!head)
83
+ return [];
84
+ const commits = provider.getCommitRange(projectPath, options.afterCommit ?? null, head, options.since ?? undefined);
85
+ // Commits are returned oldest-first, reverse to get newest-first
86
+ const result = [];
87
+ for (let i = commits.length - 1; i >= 0; i--) {
88
+ const commit = commits[i];
89
+ const message = provider.getFullCommitMessage(projectPath, commit.hash);
90
+ const isClaude = /Co-Authored-By:.*Claude/i.test(message);
91
+ result.push({ hash: commit.hash, isClaude });
92
+ if (options.limit && result.length >= options.limit)
93
+ break;
94
+ }
95
+ return result;
96
+ }
76
97
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vcs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,sBAAsB;AACtB,IAAI,WAAW,GAAuB,IAAI,CAAC;AAC3C,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC,SAAS,cAAc;IACrB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAAmB,KAAK;IACvE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,cAAc,EAAE,CAAC;QAC1B,KAAK,IAAI;YACP,OAAO,aAAa,EAAE,CAAC;QACzB;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,0DAA0D;AAE1D;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,OAAiB;IAClE,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,OAA4D,EAC5D,OAAiB;IAEjB,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAAiB;IACtE,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAiB;IACxE,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,UAAkB,EAAE,OAAiB;IACtF,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,OAAiB;IAC/D,IAAI,CAAC;QACH,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vcs/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-spp",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Claude Code plugin for maintaining programming skills through guided learning",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",