@nektarlabs/pushguard 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -5
- package/dist/cli.js +10 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +13 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/setup/install.d.ts +4 -1
- package/dist/setup/install.d.ts.map +1 -1
- package/dist/setup/install.js +79 -11
- package/dist/setup/install.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,16 +11,35 @@ Pre-push hook that analyzes your code changes with [Claude Code](https://docs.an
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
|
|
14
|
+
npm install -g @nektarlabs/pushguard
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
## Setup
|
|
18
18
|
|
|
19
|
+
### Global (recommended)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pushguard init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This installs a global git `pre-push` hook at `~/.pushguard/hooks/` and configures `core.hooksPath` so pushguard runs on every push in any repository. No per-repo setup or dependencies required.
|
|
26
|
+
|
|
27
|
+
If the repository has local hooks (`.husky/pre-push` or `.git/hooks/pre-push.local`), they are chained automatically and run before pushguard.
|
|
28
|
+
|
|
29
|
+
To uninstall:
|
|
30
|
+
|
|
19
31
|
```bash
|
|
20
|
-
|
|
32
|
+
pushguard uninstall
|
|
21
33
|
```
|
|
22
34
|
|
|
23
|
-
|
|
35
|
+
### With Husky (per-project)
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pnpm add -D @nektarlabs/pushguard husky
|
|
39
|
+
npx pushguard init --husky
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This creates a `.husky/pre-push` hook that runs pushguard before every push in that project.
|
|
24
43
|
|
|
25
44
|
## How it works
|
|
26
45
|
|
|
@@ -35,14 +54,21 @@ This creates a `.husky/pre-push` hook that runs pushguard before every push.
|
|
|
35
54
|
You can run the analysis manually at any time without pushing:
|
|
36
55
|
|
|
37
56
|
```bash
|
|
38
|
-
|
|
57
|
+
pushguard analyze
|
|
39
58
|
```
|
|
40
59
|
|
|
41
60
|
This diffs your unpushed commits against the remote tracking branch (or `origin/main` as fallback) and runs the same analysis as the pre-push hook.
|
|
42
61
|
|
|
43
62
|
## Configuration
|
|
44
63
|
|
|
45
|
-
|
|
64
|
+
Pushguard loads configuration with the following priority (highest first):
|
|
65
|
+
|
|
66
|
+
1. `.pushguard.json` in the repo root
|
|
67
|
+
2. `"pushguard"` key in the repo's `package.json`
|
|
68
|
+
3. `~/.pushguard/config.json` (global config, shared across all repos)
|
|
69
|
+
4. Built-in defaults
|
|
70
|
+
|
|
71
|
+
Add a `"pushguard"` key to your `package.json`, create a `.pushguard.json` file, or set global defaults in `~/.pushguard/config.json`:
|
|
46
72
|
|
|
47
73
|
```json
|
|
48
74
|
{
|
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
3
|
async function main() {
|
|
4
|
-
const { positionals } = parseArgs({
|
|
4
|
+
const { positionals, values } = parseArgs({
|
|
5
5
|
allowPositionals: true,
|
|
6
6
|
strict: false,
|
|
7
|
+
options: {
|
|
8
|
+
husky: { type: "boolean", default: false },
|
|
9
|
+
},
|
|
7
10
|
});
|
|
8
11
|
const command = positionals[0];
|
|
9
12
|
switch (command) {
|
|
10
13
|
case "init": {
|
|
11
14
|
const { init } = await import("./setup/install.js");
|
|
12
|
-
await init();
|
|
15
|
+
await init(process.cwd(), { husky: values.husky });
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
case "uninstall": {
|
|
19
|
+
const { uninstall } = await import("./setup/install.js");
|
|
20
|
+
await uninstall();
|
|
13
21
|
break;
|
|
14
22
|
}
|
|
15
23
|
case "analyze": {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACxC,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SAC3C;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAE/B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAgB,EAAE,CAAC,CAAC;YAC9D,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACzD,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,gCAAgC;YAChC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,UAAU,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrD,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAKxF"}
|
package/dist/config/loader.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { DEFAULTS } from "./defaults.js";
|
|
4
5
|
export async function loadConfig(cwd = process.cwd()) {
|
|
5
|
-
const
|
|
6
|
-
|
|
6
|
+
const localOverrides = (await loadFromRc(cwd)) ?? (await loadFromPackageJson(cwd));
|
|
7
|
+
const globalOverrides = await loadFromGlobalConfig();
|
|
8
|
+
return { ...DEFAULTS, ...globalOverrides, ...localOverrides };
|
|
7
9
|
}
|
|
8
10
|
async function loadFromRc(cwd) {
|
|
9
11
|
try {
|
|
@@ -27,4 +29,13 @@ async function loadFromPackageJson(cwd) {
|
|
|
27
29
|
return null;
|
|
28
30
|
}
|
|
29
31
|
}
|
|
32
|
+
async function loadFromGlobalConfig() {
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(resolve(homedir(), ".pushguard", "config.json"), "utf-8");
|
|
35
|
+
return JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
30
41
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,cAAc,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,eAAe,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAErD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,eAAe,EAAE,GAAG,cAAc,EAAE,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA+B,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC3D,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,GAAG,CAAC,WAAW,CAA+B,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA+B,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/setup/install.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"AAwCA,wBAAsB,IAAI,CAAC,GAAG,GAAE,MAAsB,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxG;AAuCD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB/C"}
|
package/dist/setup/install.js
CHANGED
|
@@ -1,14 +1,64 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { writeFile, mkdir, rm } from "node:fs/promises";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { execFile } from "node:child_process";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
|
+
import { homedir } from "node:os";
|
|
6
7
|
import { log } from "../output/reporter.js";
|
|
7
8
|
const exec = promisify(execFile);
|
|
8
|
-
const
|
|
9
|
-
|
|
9
|
+
const HUSKY_HOOK_CONTENT = `npx pushguard\n`;
|
|
10
|
+
const GLOBAL_HOOK_CONTENT = `#!/bin/sh
|
|
11
|
+
|
|
12
|
+
# pushguard global pre-push hook
|
|
13
|
+
# Runs pushguard on every git push
|
|
14
|
+
|
|
15
|
+
# Chain local hooks if they exist
|
|
16
|
+
LOCAL_HOOK="$(git rev-parse --git-dir 2>/dev/null)/hooks/pre-push.local"
|
|
17
|
+
if [ -f "$LOCAL_HOOK" ]; then
|
|
18
|
+
"$LOCAL_HOOK" "$@"
|
|
19
|
+
EXIT_CODE=$?
|
|
20
|
+
if [ $EXIT_CODE -ne 0 ]; then
|
|
21
|
+
exit $EXIT_CODE
|
|
22
|
+
fi
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# Chain husky hook if it exists
|
|
26
|
+
HUSKY_HOOK=".husky/pre-push"
|
|
27
|
+
if [ -f "$HUSKY_HOOK" ]; then
|
|
28
|
+
sh "$HUSKY_HOOK" "$@"
|
|
29
|
+
EXIT_CODE=$?
|
|
30
|
+
if [ $EXIT_CODE -ne 0 ]; then
|
|
31
|
+
exit $EXIT_CODE
|
|
32
|
+
fi
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
pushguard "$@"
|
|
36
|
+
`;
|
|
37
|
+
export async function init(cwd = process.cwd(), options = {}) {
|
|
38
|
+
if (options.husky) {
|
|
39
|
+
await initHusky(cwd);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await initGlobal();
|
|
43
|
+
}
|
|
44
|
+
log("pushguard will now analyze changes before each push.");
|
|
45
|
+
console.error("");
|
|
46
|
+
console.error(" Configuration (optional):");
|
|
47
|
+
console.error(' Add a "pushguard" key to package.json or create .pushguard.json');
|
|
48
|
+
console.error("");
|
|
49
|
+
}
|
|
50
|
+
async function initGlobal() {
|
|
51
|
+
const hooksDir = resolve(homedir(), ".pushguard", "hooks");
|
|
52
|
+
await mkdir(hooksDir, { recursive: true });
|
|
53
|
+
const hookPath = resolve(hooksDir, "pre-push");
|
|
54
|
+
await writeFile(hookPath, GLOBAL_HOOK_CONTENT, { mode: 0o755 });
|
|
55
|
+
// Set global core.hooksPath
|
|
56
|
+
await exec("git", ["config", "--global", "core.hooksPath", hooksDir]);
|
|
57
|
+
log(`Created global pre-push hook at ${hookPath}`);
|
|
58
|
+
log("Set git global core.hooksPath to " + hooksDir);
|
|
59
|
+
}
|
|
60
|
+
async function initHusky(cwd) {
|
|
10
61
|
const huskyDir = resolve(cwd, ".husky");
|
|
11
|
-
// Check if husky is set up
|
|
12
62
|
if (!existsSync(huskyDir)) {
|
|
13
63
|
log("Husky not found. Initializing...");
|
|
14
64
|
try {
|
|
@@ -20,14 +70,32 @@ export async function init(cwd = process.cwd()) {
|
|
|
20
70
|
process.exit(1);
|
|
21
71
|
}
|
|
22
72
|
}
|
|
23
|
-
// Create the pre-push hook
|
|
24
73
|
const hookPath = resolve(huskyDir, "pre-push");
|
|
25
|
-
await writeFile(hookPath,
|
|
74
|
+
await writeFile(hookPath, HUSKY_HOOK_CONTENT, { mode: 0o755 });
|
|
26
75
|
log("Created .husky/pre-push hook");
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
76
|
+
}
|
|
77
|
+
export async function uninstall() {
|
|
78
|
+
const hooksDir = resolve(homedir(), ".pushguard", "hooks");
|
|
79
|
+
const pushguardDir = resolve(homedir(), ".pushguard");
|
|
80
|
+
// Check if core.hooksPath points to our directory
|
|
81
|
+
try {
|
|
82
|
+
const { stdout } = await exec("git", ["config", "--global", "core.hooksPath"]);
|
|
83
|
+
if (stdout.trim() === hooksDir) {
|
|
84
|
+
await exec("git", ["config", "--global", "--unset", "core.hooksPath"]);
|
|
85
|
+
log("Removed global core.hooksPath setting");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
log("core.hooksPath points to " + stdout.trim() + " (not pushguard) — skipping");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
log("No global core.hooksPath configured — skipping");
|
|
93
|
+
}
|
|
94
|
+
// Remove ~/.pushguard directory
|
|
95
|
+
if (existsSync(pushguardDir)) {
|
|
96
|
+
await rm(pushguardDir, { recursive: true });
|
|
97
|
+
log("Removed " + pushguardDir);
|
|
98
|
+
}
|
|
99
|
+
log("pushguard global hook uninstalled.");
|
|
32
100
|
}
|
|
33
101
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"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"}
|