git-impact 0.2.2 → 0.6.2
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 +124 -78
- package/dist/cli/index.js +32 -211
- package/dist/cli/index.js.map +1 -1
- package/dist/init/installer.d.ts +6 -0
- package/dist/init/installer.d.ts.map +1 -1
- package/dist/init/installer.js +58 -5
- package/dist/init/installer.js.map +1 -1
- package/dist/init/installer.test.d.ts +2 -0
- package/dist/init/installer.test.d.ts.map +1 -0
- package/dist/init/installer.test.js +127 -0
- package/dist/init/installer.test.js.map +1 -0
- package/dist/init/templates.d.ts +8 -7
- package/dist/init/templates.d.ts.map +1 -1
- package/dist/init/templates.js +73 -252
- package/dist/init/templates.js.map +1 -1
- package/dist/mcp/resources.js +0 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +64 -12
- package/dist/mcp/tools.js.map +1 -1
- package/dist/readers/git.d.ts +2 -1
- package/dist/readers/git.d.ts.map +1 -1
- package/dist/readers/git.js +12 -6
- package/dist/readers/git.js.map +1 -1
- package/dist/readers/redact.d.ts +29 -0
- package/dist/readers/redact.d.ts.map +1 -0
- package/dist/readers/redact.js +82 -0
- package/dist/readers/redact.js.map +1 -0
- package/dist/readers/redact.test.d.ts +2 -0
- package/dist/readers/redact.test.d.ts.map +1 -0
- package/dist/readers/redact.test.js +72 -0
- package/dist/readers/redact.test.js.map +1 -0
- package/dist/report/html.d.ts +2 -0
- package/dist/report/html.d.ts.map +1 -1
- package/dist/report/html.js +35 -1
- package/dist/report/html.js.map +1 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +18 -8
- package/dist/report/render.js.map +1 -1
- package/dist/storage/db.d.ts +23 -2
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +12 -0
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/db.test.d.ts +2 -0
- package/dist/storage/db.test.d.ts.map +1 -0
- package/dist/storage/db.test.js +152 -0
- package/dist/storage/db.test.js.map +1 -0
- package/package.json +7 -6
- package/skill/SKILL.md +132 -160
- package/skill/references/html-template.md +131 -0
- package/skill/references/translation-rules.md +87 -0
- package/dist/translator/prompt.d.ts +0 -21
- package/dist/translator/prompt.d.ts.map +0 -1
- package/dist/translator/prompt.js +0 -117
- package/dist/translator/prompt.js.map +0 -1
- package/dist/translator/translate.d.ts +0 -36
- package/dist/translator/translate.d.ts.map +0 -1
- package/dist/translator/translate.js +0 -73
- package/dist/translator/translate.js.map +0 -1
package/dist/mcp/tools.js
CHANGED
|
@@ -80,8 +80,11 @@ exports.TOOL_DEFINITIONS = [
|
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
name: "save_impact_entry",
|
|
83
|
-
description: "Persist a completed impact translation to this repo's local history
|
|
84
|
-
"
|
|
83
|
+
description: "Persist a completed impact translation to this repo's local history " +
|
|
84
|
+
"(.git-impact/history.db). Always call this after translating commits into " +
|
|
85
|
+
"business impact bullets — replaces any prior bash/sqlite3 invocations. " +
|
|
86
|
+
"Each item must include a `provenance` so the UI can mark inferred bullets " +
|
|
87
|
+
"differently from claims grounded in PRs or commit bodies.",
|
|
85
88
|
inputSchema: {
|
|
86
89
|
type: "object",
|
|
87
90
|
required: ["date", "repo_name", "items"],
|
|
@@ -97,18 +100,48 @@ exports.TOOL_DEFINITIONS = [
|
|
|
97
100
|
description: "The translated impact bullets.",
|
|
98
101
|
items: {
|
|
99
102
|
type: "object",
|
|
100
|
-
required: ["status", "summary", "
|
|
103
|
+
required: ["status", "summary", "provenance"],
|
|
101
104
|
properties: {
|
|
102
|
-
status: {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
status: {
|
|
106
|
+
type: "string",
|
|
107
|
+
enum: ["done", "in_progress", "blocked"],
|
|
108
|
+
description: "Outcome state of the work item.",
|
|
109
|
+
},
|
|
110
|
+
summary: { type: "string", description: "Plain-English what." },
|
|
111
|
+
impact: { type: "string", description: "Why it matters — who/what it unblocks." },
|
|
112
|
+
technical_note: { type: "string", description: "Small grey aside (file refs, PR #s)." },
|
|
113
|
+
provenance: {
|
|
114
|
+
type: "string",
|
|
115
|
+
enum: ["pr", "commit_body", "commit_message", "ticket", "inferred"],
|
|
116
|
+
description: "Where the impact claim came from. Use 'pr' if quoted from a PR description, " +
|
|
117
|
+
"'commit_body' if from a multi-line commit body, 'commit_message' if only the " +
|
|
118
|
+
"subject line supported it, 'ticket' if pulled from a linked Linear/Jira ticket, " +
|
|
119
|
+
"'inferred' if you guessed without explicit text. NEVER invent a non-inferred provenance.",
|
|
120
|
+
},
|
|
121
|
+
refs: {
|
|
122
|
+
type: "array",
|
|
123
|
+
items: { type: "string" },
|
|
124
|
+
description: "Supporting refs e.g. ['PR #142', 'a1b2c3d', 'ENG-1234'].",
|
|
125
|
+
},
|
|
106
126
|
},
|
|
107
127
|
},
|
|
108
128
|
},
|
|
109
129
|
},
|
|
110
130
|
},
|
|
111
131
|
},
|
|
132
|
+
{
|
|
133
|
+
name: "get_last_standup_date",
|
|
134
|
+
description: "Return the date (YYYY-MM-DD) of the most recently saved standup entry, or null " +
|
|
135
|
+
"if none exists yet. Call this at the start of every standup to default the " +
|
|
136
|
+
"lookback window to 'since last standup' — so days off, weekends, and holidays " +
|
|
137
|
+
"don't drop work on the floor.",
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: "object",
|
|
140
|
+
properties: {
|
|
141
|
+
repo_path: { type: "string", description: "Override the repo path." },
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
},
|
|
112
145
|
{
|
|
113
146
|
name: "get_history",
|
|
114
147
|
description: "Retrieve saved impact entries from this repo's history. " +
|
|
@@ -141,7 +174,6 @@ exports.TOOL_DEFINITIONS = [
|
|
|
141
174
|
additionalProperties: { type: "string" },
|
|
142
175
|
},
|
|
143
176
|
github_token: { type: "string" },
|
|
144
|
-
anthropic_api_key: { type: "string" },
|
|
145
177
|
},
|
|
146
178
|
},
|
|
147
179
|
},
|
|
@@ -151,6 +183,7 @@ async function handleTool(name, args) {
|
|
|
151
183
|
case "get_git_activity": return handleGetGitActivity(args);
|
|
152
184
|
case "get_github_activity": return handleGetGitHubActivity(args);
|
|
153
185
|
case "save_impact_entry": return handleSaveImpactEntry(args);
|
|
186
|
+
case "get_last_standup_date": return handleGetLastStandupDate(args);
|
|
154
187
|
case "get_history": return handleGetHistory(args);
|
|
155
188
|
case "update_context": return handleUpdateContext(args);
|
|
156
189
|
default: return error(`Unknown tool: ${name}`);
|
|
@@ -163,9 +196,18 @@ async function handleGetGitActivity(args) {
|
|
|
163
196
|
return error(repo.error);
|
|
164
197
|
const since = args.since_iso ? new Date(args.since_iso) : (0, git_1.startOfDay)();
|
|
165
198
|
const until = args.until_iso ? new Date(args.until_iso) : new Date();
|
|
199
|
+
// Pull privacy config from context.json so filenames like .env / .aws/credentials
|
|
200
|
+
// and obvious-looking secrets in commit bodies are redacted before they reach
|
|
201
|
+
// the translator. Default-on; users can opt out via { privacy: { redact: false } }.
|
|
202
|
+
const ctx = (0, db_1.loadContext)(repo.path);
|
|
203
|
+
const redactCfg = {
|
|
204
|
+
enabled: ctx?.privacy?.redact !== false,
|
|
205
|
+
filePatterns: ctx?.privacy?.filePatterns,
|
|
206
|
+
valuePatterns: ctx?.privacy?.valuePatterns,
|
|
207
|
+
};
|
|
166
208
|
try {
|
|
167
|
-
const git = await (0, git_1.readGitActivity)(repo.path, since, until);
|
|
168
|
-
return ok(JSON.stringify({ ...git, _repo_root: repo.path }, null, 2));
|
|
209
|
+
const git = await (0, git_1.readGitActivity)(repo.path, since, until, redactCfg);
|
|
210
|
+
return ok(JSON.stringify({ ...git, _repo_root: repo.path, _redacted: redactCfg.enabled }, null, 2));
|
|
169
211
|
}
|
|
170
212
|
catch (err) {
|
|
171
213
|
return error(`Could not read git history: ${err.message}`);
|
|
@@ -219,6 +261,18 @@ function handleSaveImpactEntry(args) {
|
|
|
219
261
|
return error(`Failed to save entry: ${err.message}`);
|
|
220
262
|
}
|
|
221
263
|
}
|
|
264
|
+
function handleGetLastStandupDate(args) {
|
|
265
|
+
const repo = resolveRepo(args.repo_path);
|
|
266
|
+
if ("error" in repo)
|
|
267
|
+
return error(repo.error);
|
|
268
|
+
try {
|
|
269
|
+
const date = (0, db_1.getLastEntryDate)(repo.path);
|
|
270
|
+
return ok(JSON.stringify({ last_standup_date: date }));
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
return error(`Failed to read last standup date: ${err.message}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
222
276
|
function handleGetHistory(args) {
|
|
223
277
|
const repo = resolveRepo(args.repo_path);
|
|
224
278
|
if ("error" in repo)
|
|
@@ -247,7 +301,6 @@ function handleUpdateContext(args) {
|
|
|
247
301
|
managerPriorities: args.manager_priorities ?? existing.managerPriorities,
|
|
248
302
|
glossary: args.glossary ?? existing.glossary,
|
|
249
303
|
githubToken: args.github_token ?? existing.githubToken,
|
|
250
|
-
anthropicApiKey: args.anthropic_api_key ?? existing.anthropicApiKey,
|
|
251
304
|
};
|
|
252
305
|
try {
|
|
253
306
|
(0, db_1.saveContext)(updated, repo.path);
|
|
@@ -257,7 +310,6 @@ function handleUpdateContext(args) {
|
|
|
257
310
|
context: {
|
|
258
311
|
...updated,
|
|
259
312
|
githubToken: updated.githubToken ? "***" : undefined,
|
|
260
|
-
anthropicApiKey: updated.anthropicApiKey ? "***" : undefined,
|
|
261
313
|
},
|
|
262
314
|
}, null, 2));
|
|
263
315
|
}
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwKA,gCAaC;AApLD,wCAA6D;AAC7D,8CAAuD;AACvD,sCASuB;AACvB,iCAAyC;AAEzC,gFAAgF;AAEnE,QAAA,gBAAgB,GAAW;IACtC;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,qEAAqE;YACrE,2DAA2D;YAC3D,wFAAwF;YACxF,uEAAuE;QACzE,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oEAAoE;iBACvE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAChE;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qCAAqC;iBACnD;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,4EAA4E;YAC5E,+EAA+E;QACjF,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACrE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kDAAkD,EAAE;gBAC9F,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;aAClF;SACF;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,sEAAsE;YACtE,4EAA4E;YAC5E,yEAAyE;YACzE,4EAA4E;YAC5E,2DAA2D;QAC7D,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC;YACxC,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACrE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAC7D,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBAClF,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC/B,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACjC,KAAK,EAAE;oBACL,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,gCAAgC;oBAC7C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC;wBAC7C,UAAU,EAAE;4BACV,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC;gCACxC,WAAW,EAAE,iCAAiC;6BAC/C;4BACD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;4BAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;4BACjF,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;4BACvF,UAAU,EAAE;gCACV,IAAI,EAAE,QAAQ;gCACd,IAAI,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,CAAC;gCACnE,WAAW,EACT,8EAA8E;oCAC9E,+EAA+E;oCAC/E,kFAAkF;oCAClF,0FAA0F;6BAC7F;4BACD,IAAI,EAAE;gCACJ,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACzB,WAAW,EAAE,0DAA0D;6BACxE;yBACF;qBACF;iBACF;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,iFAAiF;YACjF,6EAA6E;YAC7E,gFAAgF;YAChF,+BAA+B;QACjC,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;aACtE;SACF;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,0DAA0D;YAC1D,iFAAiF;QACnF,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACrE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBAC1E,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAClE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;aACjE;SACF;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,gEAAgE;YAChE,6EAA6E;YAC7E,kEAAkE;YAClE,kEAAkE;QACpE,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACrE,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACvC,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtC,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,uEAAuE;oBACpF,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACzC;gBACD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACjC;SACF;KACF;CACF,CAAC;AAMK,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,IAA6B;IAE7B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,CAAK,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/D,KAAK,qBAAqB,CAAC,CAAE,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAClE,KAAK,mBAAmB,CAAC,CAAI,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAChE,KAAK,uBAAuB,CAAC,CAAA,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACnE,KAAK,aAAa,CAAC,CAAU,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,gBAAgB,CAAC,CAAO,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAqB,OAAO,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,oBAAoB,CAAC,IAA6B;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,IAAA,gBAAU,GAAE,CAAC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE/E,kFAAkF;IAClF,8EAA8E;IAC9E,oFAAoF;IACpF,MAAM,GAAG,GAAG,IAAA,gBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG;QAChB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK;QACvC,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY;QACxC,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa;KAC3C,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAe,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAA6B;IAClE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QAC1B,OAAO,KAAK,CACV,+CAA+C;YAC/C,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,IAAA,gBAAU,GAAE,CAAC;IACjF,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE/E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,wDAAa,YAAY,GAAC,CAAC,CAAC,OAAO,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;QACxE,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAkB,EAAC,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAE1E,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAA6B;IAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,cAAS,EAClB;YACE,IAAI,EAAE,IAAI,CAAC,IAAc;YACzB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,SAAmB;YAClC,YAAY,EAAG,IAAI,CAAC,aAAwB,IAAI,CAAC;YACjD,UAAU,EAAG,IAAI,CAAC,WAAsB,IAAI,CAAC;YAC7C,YAAY,EAAG,IAAI,CAAC,aAAwB,IAAI,EAAE;YAClD,KAAK,EAAG,IAAI,CAAC,KAAsB,IAAI,EAAE;YACzC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,EACD,IAAI,CAAC,IAAI,CACV,CAAC;QACF,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,yBAA0B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAA6B;IAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,qBAAgB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,qCAAsC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA6B;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,OAAO,GACX,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO;YAC5B,CAAC,CAAC,IAAA,uBAAkB,EAAC,IAAI,CAAC,SAAmB,EAAE,IAAI,CAAC,OAAiB,EAAE,IAAI,CAAC,IAAI,CAAC;YACjF,CAAC,CAAC,IAAA,yBAAoB,EAAE,IAAI,CAAC,SAAoB,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAExE,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA6B;IACxD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,SAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAA,gBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QACzC,kBAAkB,EAAE,EAAE;QACtB,iBAAiB,EAAE,EAAE;QACrB,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,MAAM,OAAO,GAAgB;QAC3B,kBAAkB,EAAG,IAAI,CAAC,mBAA8B,IAAI,QAAQ,CAAC,kBAAkB;QACvF,iBAAiB,EAAI,IAAI,CAAC,kBAA6B,IAAK,QAAQ,CAAC,iBAAiB;QACtF,QAAQ,EAAa,IAAI,CAAC,QAAmC,IAAI,QAAQ,CAAC,QAAQ;QAClF,WAAW,EAAU,IAAI,CAAC,YAAuB,IAAY,QAAQ,CAAC,WAAW;KAClF,CAAC;IAEF,IAAI,CAAC;QACH,IAAA,gBAAW,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,EAAE,CACP,IAAI,CAAC,SAAS,CAAC;YACb,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,2BAA2B;YACjD,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACrD;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,CACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,2BAA4B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,WAAW,CAAC,YAAqB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,sBAAe,EAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,EAAE,CAAC,IAAY;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,CAAC"}
|
package/dist/readers/git.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RedactConfig } from "./redact";
|
|
1
2
|
export interface CommitInfo {
|
|
2
3
|
hash: string;
|
|
3
4
|
date: string;
|
|
@@ -17,7 +18,7 @@ export interface GitSummary {
|
|
|
17
18
|
to: string;
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
|
-
export declare function readGitActivity(repoPath: string, since: Date, until?: Date): Promise<GitSummary>;
|
|
21
|
+
export declare function readGitActivity(repoPath: string, since: Date, until?: Date, redactCfg?: RedactConfig): Promise<GitSummary>;
|
|
21
22
|
export declare function startOfDay(date?: Date): Date;
|
|
22
23
|
export declare function startOfDaysAgo(days: number): Date;
|
|
23
24
|
//# sourceMappingURL=git.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,YAAY,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAaD,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,EACX,KAAK,GAAE,IAAiB,EACxB,SAAS,GAAE,YAAgC,GAC1C,OAAO,CAAC,UAAU,CAAC,CAqErB;AAED,wBAAgB,UAAU,CAAC,IAAI,GAAE,IAAiB,GAAG,IAAI,CAIxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKjD"}
|
package/dist/readers/git.js
CHANGED
|
@@ -41,6 +41,7 @@ exports.startOfDay = startOfDay;
|
|
|
41
41
|
exports.startOfDaysAgo = startOfDaysAgo;
|
|
42
42
|
const simple_git_1 = __importDefault(require("simple-git"));
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
|
+
const redact_1 = require("./redact");
|
|
44
45
|
function stripCredentials(url) {
|
|
45
46
|
try {
|
|
46
47
|
const parsed = new URL(url);
|
|
@@ -52,7 +53,7 @@ function stripCredentials(url) {
|
|
|
52
53
|
return url.replace(/\/\/[^@]+@/, "//");
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
|
-
async function readGitActivity(repoPath, since, until = new Date()) {
|
|
56
|
+
async function readGitActivity(repoPath, since, until = new Date(), redactCfg = { enabled: true }) {
|
|
56
57
|
const git = (0, simple_git_1.default)(repoPath);
|
|
57
58
|
const sinceStr = since.toISOString();
|
|
58
59
|
const untilStr = until.toISOString();
|
|
@@ -73,7 +74,11 @@ async function readGitActivity(repoPath, since, until = new Date()) {
|
|
|
73
74
|
.join("/") || path.basename(repoPath);
|
|
74
75
|
const branch = await git.revparse(["--abbrev-ref", "HEAD"]);
|
|
75
76
|
const commits = await Promise.all(log.all.map(async (entry) => {
|
|
76
|
-
|
|
77
|
+
// Root commits don't have a parent; `<hash>^` blows up. Fall back to
|
|
78
|
+
// `git show --stat` which works for both root and non-root commits.
|
|
79
|
+
const diff = await git
|
|
80
|
+
.diff([`${entry.hash}^`, entry.hash, "--stat"])
|
|
81
|
+
.catch(() => git.show(["--stat", "--format=", entry.hash]));
|
|
77
82
|
const showOutput = await git.show([
|
|
78
83
|
"--stat",
|
|
79
84
|
"--name-only",
|
|
@@ -83,14 +88,15 @@ async function readGitActivity(repoPath, since, until = new Date()) {
|
|
|
83
88
|
const filesChanged = showOutput
|
|
84
89
|
.split("\n")
|
|
85
90
|
.map((l) => l.trim())
|
|
86
|
-
.filter((l) => l && !l.includes("|") && !l.startsWith("=>") && !l.match(/^\d+ file/))
|
|
91
|
+
.filter((l) => l && !l.includes("|") && !l.startsWith("=>") && !l.match(/^\d+ file/))
|
|
92
|
+
.map((f) => (0, redact_1.redactFilename)(f, redactCfg));
|
|
87
93
|
return {
|
|
88
94
|
hash: entry.hash.slice(0, 8),
|
|
89
95
|
date: entry.date,
|
|
90
|
-
message: entry.message,
|
|
96
|
+
message: (0, redact_1.redactText)(entry.message, redactCfg),
|
|
91
97
|
author: entry.author_name,
|
|
92
|
-
body: entry.body || "",
|
|
93
|
-
diff,
|
|
98
|
+
body: (0, redact_1.redactText)(entry.body || "", redactCfg),
|
|
99
|
+
diff: (0, redact_1.redactText)(diff, redactCfg),
|
|
94
100
|
filesChanged,
|
|
95
101
|
};
|
|
96
102
|
}));
|
package/dist/readers/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/readers/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy filter: scrubs sensitive paths and obvious secret-looking values
|
|
3
|
+
* from git activity before it reaches the translator.
|
|
4
|
+
*
|
|
5
|
+
* Default-on. Users can disable via `context.json` { "privacy": { "redact": false } }
|
|
6
|
+
* or extend the file/value patterns there.
|
|
7
|
+
*
|
|
8
|
+
* Why this exists: a manager update that leaks an API key, a customer name,
|
|
9
|
+
* or an internal-only filename is a real career incident. The defaults here
|
|
10
|
+
* are conservative — better to redact a benign filename than to leak.
|
|
11
|
+
*/
|
|
12
|
+
export interface RedactConfig {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
/** Extra file glob-ish patterns the user wants redacted. */
|
|
15
|
+
filePatterns?: string[];
|
|
16
|
+
/** Extra string patterns to redact from commit bodies. */
|
|
17
|
+
valuePatterns?: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Replace a filename with `[redacted-secret-file]` if it matches any sensitive
|
|
21
|
+
* pattern. Otherwise return as-is. Pure function — safe to map over arrays.
|
|
22
|
+
*/
|
|
23
|
+
export declare function redactFilename(file: string, cfg?: RedactConfig): string;
|
|
24
|
+
/**
|
|
25
|
+
* Scrub obvious-looking secrets from a free-text string (commit body, PR text).
|
|
26
|
+
* Filenames are not redacted here — use `redactFilename` for those.
|
|
27
|
+
*/
|
|
28
|
+
export declare function redactText(text: string, cfg?: RedactConfig): string;
|
|
29
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/readers/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2BH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,YAA6B,GAAG,MAAM,CAOvF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,YAA6B,GAAG,MAAM,CAWnF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Privacy filter: scrubs sensitive paths and obvious secret-looking values
|
|
4
|
+
* from git activity before it reaches the translator.
|
|
5
|
+
*
|
|
6
|
+
* Default-on. Users can disable via `context.json` { "privacy": { "redact": false } }
|
|
7
|
+
* or extend the file/value patterns there.
|
|
8
|
+
*
|
|
9
|
+
* Why this exists: a manager update that leaks an API key, a customer name,
|
|
10
|
+
* or an internal-only filename is a real career incident. The defaults here
|
|
11
|
+
* are conservative — better to redact a benign filename than to leak.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.redactFilename = redactFilename;
|
|
15
|
+
exports.redactText = redactText;
|
|
16
|
+
const DEFAULT_FILE_PATTERNS = [
|
|
17
|
+
/(^|\/)\.env(\..+)?$/i, // .env, .env.local, .env.production
|
|
18
|
+
/(^|\/)\.npmrc$/i, // npm auth token file
|
|
19
|
+
/(^|\/)\.pypirc$/i, // PyPI auth
|
|
20
|
+
/(^|\/)\.netrc$/i, // generic auth tokens
|
|
21
|
+
/(^|\/)\.aws\//i, // .aws/credentials etc.
|
|
22
|
+
/(^|\/)\.ssh\//i, // private keys, known_hosts
|
|
23
|
+
/(^|\/).*credentials.*$/i, // anything literally named credentials
|
|
24
|
+
/(^|\/).*secret.*$/i, // anything with "secret" in the name
|
|
25
|
+
/(^|\/).*\.pem$/i, // PEM private keys
|
|
26
|
+
/(^|\/).*\.p12$/i, // PKCS12 keys
|
|
27
|
+
/(^|\/).*\.key$/i, // generic .key files
|
|
28
|
+
];
|
|
29
|
+
// Things that look like leaked secrets in a commit message body or PR text.
|
|
30
|
+
// Conservative — we'd rather redact legit text than leak a token.
|
|
31
|
+
const DEFAULT_VALUE_PATTERNS = [
|
|
32
|
+
/\b(?:sk|pk)_(?:live|test)_[A-Za-z0-9]{16,}\b/g, // Stripe keys
|
|
33
|
+
/\bAKIA[0-9A-Z]{16}\b/g, // AWS access key id
|
|
34
|
+
/\bghp_[A-Za-z0-9]{36}\b/g, // GitHub personal access token
|
|
35
|
+
/\bgithub_pat_[A-Za-z0-9_]{40,}\b/g, // GitHub fine-grained PAT
|
|
36
|
+
/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, // Slack tokens
|
|
37
|
+
/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, // JWT-shaped strings
|
|
38
|
+
];
|
|
39
|
+
const DEFAULT_CONFIG = { enabled: true };
|
|
40
|
+
/**
|
|
41
|
+
* Replace a filename with `[redacted-secret-file]` if it matches any sensitive
|
|
42
|
+
* pattern. Otherwise return as-is. Pure function — safe to map over arrays.
|
|
43
|
+
*/
|
|
44
|
+
function redactFilename(file, cfg = DEFAULT_CONFIG) {
|
|
45
|
+
if (!cfg.enabled)
|
|
46
|
+
return file;
|
|
47
|
+
const patterns = [
|
|
48
|
+
...DEFAULT_FILE_PATTERNS,
|
|
49
|
+
...(cfg.filePatterns ?? []).map(globishToRegex),
|
|
50
|
+
];
|
|
51
|
+
return patterns.some((p) => p.test(file)) ? "[redacted-secret-file]" : file;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Scrub obvious-looking secrets from a free-text string (commit body, PR text).
|
|
55
|
+
* Filenames are not redacted here — use `redactFilename` for those.
|
|
56
|
+
*/
|
|
57
|
+
function redactText(text, cfg = DEFAULT_CONFIG) {
|
|
58
|
+
if (!cfg.enabled || !text)
|
|
59
|
+
return text;
|
|
60
|
+
const patterns = [
|
|
61
|
+
...DEFAULT_VALUE_PATTERNS,
|
|
62
|
+
...(cfg.valuePatterns ?? []).map((s) => new RegExp(s, "g")),
|
|
63
|
+
];
|
|
64
|
+
let out = text;
|
|
65
|
+
for (const p of patterns) {
|
|
66
|
+
out = out.replace(p, "[redacted-secret]");
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Convert a simple glob (*.env, foo/**, secret-*) into a RegExp. Not full glob —
|
|
72
|
+
* just `*` (any chars except slash) and `**` (any chars). Anchored to full path.
|
|
73
|
+
*/
|
|
74
|
+
function globishToRegex(glob) {
|
|
75
|
+
const escaped = glob
|
|
76
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
77
|
+
.replace(/\*\*/g, "::DOUBLESTAR::")
|
|
78
|
+
.replace(/\*/g, "[^/]*")
|
|
79
|
+
.replace(/::DOUBLESTAR::/g, ".*");
|
|
80
|
+
return new RegExp(`(^|/)${escaped}$`, "i");
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/readers/redact.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAyCH,wCAOC;AAMD,gCAWC;AA/DD,MAAM,qBAAqB,GAAa;IACtC,sBAAsB,EAAwB,oCAAoC;IAClF,iBAAiB,EAA6B,sBAAsB;IACpE,kBAAkB,EAA4B,YAAY;IAC1D,iBAAiB,EAA6B,sBAAsB;IACpE,gBAAgB,EAA8B,wBAAwB;IACtE,gBAAgB,EAA8B,4BAA4B;IAC1E,yBAAyB,EAAqB,uCAAuC;IACrF,oBAAoB,EAA0B,qCAAqC;IACnF,iBAAiB,EAA6B,mBAAmB;IACjE,iBAAiB,EAA6B,cAAc;IAC5D,iBAAiB,EAA6B,qBAAqB;CACpE,CAAC;AAEF,4EAA4E;AAC5E,kEAAkE;AAClE,MAAM,sBAAsB,GAAa;IACvC,+CAA+C,EAAc,cAAc;IAC3E,uBAAuB,EAAsC,oBAAoB;IACjF,0BAA0B,EAAmC,+BAA+B;IAC5F,mCAAmC,EAA0B,0BAA0B;IACvF,mCAAmC,EAA0B,eAAe;IAC5E,wDAAwD,EAAK,qBAAqB;CACnF,CAAC;AAUF,MAAM,cAAc,GAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEvD;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,MAAoB,cAAc;IAC7E,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG;QACf,GAAG,qBAAqB;QACxB,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;KAChD,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY,EAAE,MAAoB,cAAc;IACzE,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG;QACf,GAAG,sBAAsB;QACzB,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KAC5D,CAAC;IACF,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,MAAM,CAAC,QAAQ,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.test.d.ts","sourceRoot":"","sources":["../../src/readers/redact.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const redact_1 = require("./redact");
|
|
5
|
+
(0, vitest_1.describe)("redactFilename — defaults", () => {
|
|
6
|
+
const cases = [
|
|
7
|
+
[".env", "redacted"],
|
|
8
|
+
[".env.local", "redacted"],
|
|
9
|
+
[".env.production", "redacted"],
|
|
10
|
+
["src/.env.staging", "redacted"],
|
|
11
|
+
[".npmrc", "redacted"],
|
|
12
|
+
[".aws/credentials", "redacted"],
|
|
13
|
+
[".ssh/id_rsa", "redacted"],
|
|
14
|
+
["config/credentials.yml", "redacted"],
|
|
15
|
+
["lib/secret-helper.ts", "redacted"],
|
|
16
|
+
["certs/tls.pem", "redacted"],
|
|
17
|
+
["keys/server.key", "redacted"],
|
|
18
|
+
// benign — should pass through
|
|
19
|
+
["src/index.ts", "kept"],
|
|
20
|
+
["README.md", "kept"],
|
|
21
|
+
["package.json", "kept"],
|
|
22
|
+
["src/utils/helpers.ts", "kept"],
|
|
23
|
+
["docs/architecture.md", "kept"],
|
|
24
|
+
];
|
|
25
|
+
for (const [file, expected] of cases) {
|
|
26
|
+
(0, vitest_1.it)(`${expected === "redacted" ? "redacts" : "keeps"} ${file}`, () => {
|
|
27
|
+
const out = (0, redact_1.redactFilename)(file);
|
|
28
|
+
if (expected === "redacted") {
|
|
29
|
+
(0, vitest_1.expect)(out).toBe("[redacted-secret-file]");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
(0, vitest_1.expect)(out).toBe(file);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
(0, vitest_1.it)("respects enabled: false", () => {
|
|
37
|
+
(0, vitest_1.expect)((0, redact_1.redactFilename)(".env", { enabled: false })).toBe(".env");
|
|
38
|
+
});
|
|
39
|
+
(0, vitest_1.it)("supports user-supplied glob patterns", () => {
|
|
40
|
+
(0, vitest_1.expect)((0, redact_1.redactFilename)("config/internal-only.yml", {
|
|
41
|
+
enabled: true,
|
|
42
|
+
filePatterns: ["*internal*"],
|
|
43
|
+
})).toBe("[redacted-secret-file]");
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.describe)("redactText — defaults", () => {
|
|
47
|
+
(0, vitest_1.it)("redacts Stripe live keys", () => {
|
|
48
|
+
const out = (0, redact_1.redactText)("token sk_live_abcdef0123456789xyz123 was leaked");
|
|
49
|
+
(0, vitest_1.expect)(out).toContain("[redacted-secret]");
|
|
50
|
+
(0, vitest_1.expect)(out).not.toContain("sk_live_");
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)("redacts AWS access key ids", () => {
|
|
53
|
+
(0, vitest_1.expect)((0, redact_1.redactText)("AKIAIOSFODNN7EXAMPLE used")).toBe("[redacted-secret] used");
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)("redacts GitHub PATs", () => {
|
|
56
|
+
const out = (0, redact_1.redactText)("ghp_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa pushed");
|
|
57
|
+
(0, vitest_1.expect)(out).toContain("[redacted-secret]");
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)("redacts JWT-shaped strings", () => {
|
|
60
|
+
const out = (0, redact_1.redactText)("header eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.abcDEF received");
|
|
61
|
+
(0, vitest_1.expect)(out).toContain("[redacted-secret]");
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)("respects enabled: false", () => {
|
|
64
|
+
(0, vitest_1.expect)((0, redact_1.redactText)("ghp_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", { enabled: false }))
|
|
65
|
+
.toBe("ghp_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)("preserves benign text", () => {
|
|
68
|
+
const benign = "Refactored auth middleware to support multi-tenant queries.";
|
|
69
|
+
(0, vitest_1.expect)((0, redact_1.redactText)(benign)).toBe(benign);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=redact.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.test.js","sourceRoot":"","sources":["../../src/readers/redact.test.ts"],"names":[],"mappings":"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"}
|
package/dist/report/html.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,IAAI,GAAG,aAAa,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC7E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqQjF"}
|
package/dist/report/html.js
CHANGED
|
@@ -127,6 +127,29 @@ function renderReportHtml(entries, repoName) {
|
|
|
127
127
|
margin-top: 4px;
|
|
128
128
|
font-family: ui-monospace, "SF Mono", Menlo, monospace;
|
|
129
129
|
}
|
|
130
|
+
.item .meta {
|
|
131
|
+
margin-top: 8px;
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-wrap: wrap;
|
|
134
|
+
gap: 6px;
|
|
135
|
+
align-items: center;
|
|
136
|
+
}
|
|
137
|
+
.chip {
|
|
138
|
+
display: inline-block;
|
|
139
|
+
padding: 2px 8px;
|
|
140
|
+
border-radius: 999px;
|
|
141
|
+
font-size: 11px;
|
|
142
|
+
border: 1px solid var(--border);
|
|
143
|
+
color: var(--muted);
|
|
144
|
+
background: transparent;
|
|
145
|
+
}
|
|
146
|
+
.chip.inferred {
|
|
147
|
+
border-color: var(--amber);
|
|
148
|
+
color: var(--amber);
|
|
149
|
+
}
|
|
150
|
+
.chip.ref {
|
|
151
|
+
font-family: ui-monospace, "SF Mono", Menlo, monospace;
|
|
152
|
+
}
|
|
130
153
|
footer {
|
|
131
154
|
color: var(--muted);
|
|
132
155
|
font-size: 12px;
|
|
@@ -182,9 +205,20 @@ function renderReportHtml(entries, repoName) {
|
|
|
182
205
|
? '<div class="note">' + escape(item.technical_note) + '</div>' : '';
|
|
183
206
|
const impact = item.impact
|
|
184
207
|
? '<div class="impact">' + escape(item.impact) + '</div>' : '';
|
|
208
|
+
const chips = [];
|
|
209
|
+
if (item.provenance === "inferred") {
|
|
210
|
+
chips.push('<span class="chip inferred" title="Impact inferred — not stated explicitly in PR or commit body">inferred</span>');
|
|
211
|
+
}
|
|
212
|
+
if (Array.isArray(item.refs)) {
|
|
213
|
+
for (const ref of item.refs) {
|
|
214
|
+
chips.push('<span class="chip ref">' + escape(ref) + '</span>');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const meta = chips.length
|
|
218
|
+
? '<div class="meta">' + chips.join("") + '</div>' : '';
|
|
185
219
|
return '<div class="item ' + cls + '">' +
|
|
186
220
|
'<div class="summary">' + escape(item.summary) + '</div>' +
|
|
187
|
-
impact + note +
|
|
221
|
+
impact + note + meta +
|
|
188
222
|
'</div>';
|
|
189
223
|
}).join("");
|
|
190
224
|
|
package/dist/report/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAoBH,4CAqQC;AArQD,SAAgB,gBAAgB,CAAC,OAAsB,EAAE,QAAgB;IACvE,8BAA8B;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEjE,OAAO;;;;;sBAKa,UAAU,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA4JnB,UAAU,CAAC,QAAQ,CAAC;;;;;;oBAMvB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwFpB,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,OAAO;KACb,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AACV,CAAC"}
|
|
@@ -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,CAiD9D"}
|
package/dist/report/render.js
CHANGED
|
@@ -50,20 +50,30 @@ function renderReport(opts) {
|
|
|
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
52
|
// Be tolerant of historical shapes — earlier skill versions saved items as
|
|
53
|
-
// {title, impact} or {text, impact} instead of the canonical
|
|
54
|
-
// Coerce whatever
|
|
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.
|
|
55
56
|
const reportEntries = entries.map((e) => ({
|
|
56
57
|
date: e.date,
|
|
57
58
|
repoName: e.repoName,
|
|
58
59
|
totalCommits: e.totalCommits,
|
|
59
60
|
totalFiles: e.totalFiles,
|
|
60
61
|
filesSummary: e.filesSummary,
|
|
61
|
-
items: e.items.map((
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
+
provenance: it.provenance,
|
|
74
|
+
refs: Array.isArray(it.refs) ? it.refs : undefined,
|
|
75
|
+
};
|
|
76
|
+
}),
|
|
67
77
|
}));
|
|
68
78
|
const html = (0, html_1.renderReportHtml)(reportEntries, repoName);
|
|
69
79
|
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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"}
|