@thebushidocollective/han 1.2.0 → 1.3.1
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 +61 -2
- package/dist/lib/align-progress.d.ts +9 -0
- package/dist/lib/align-progress.d.ts.map +1 -0
- package/dist/lib/align-progress.js +58 -0
- package/dist/lib/align-progress.js.map +1 -0
- package/dist/lib/align.d.ts +20 -0
- package/dist/lib/align.d.ts.map +1 -0
- package/dist/lib/align.js +208 -0
- package/dist/lib/align.js.map +1 -0
- package/dist/lib/detect-plugins-prompt.d.ts +5 -0
- package/dist/lib/detect-plugins-prompt.d.ts.map +1 -0
- package/dist/lib/detect-plugins-prompt.js +81 -0
- package/dist/lib/detect-plugins-prompt.js.map +1 -0
- package/dist/lib/install-progress.d.ts +1 -1
- package/dist/lib/install-progress.d.ts.map +1 -1
- package/dist/lib/install-progress.js +20 -20
- package/dist/lib/install-progress.js.map +1 -1
- package/dist/lib/install.d.ts +2 -2
- package/dist/lib/install.d.ts.map +1 -1
- package/dist/lib/install.js +64 -67
- package/dist/lib/install.js.map +1 -1
- package/dist/lib/main.js +49 -22
- package/dist/lib/main.js.map +1 -1
- package/dist/lib/markdown-wrapper.d.ts +1 -1
- package/dist/lib/markdown-wrapper.d.ts.map +1 -1
- package/dist/lib/markdown-wrapper.js +4 -4
- package/dist/lib/markdown-wrapper.js.map +1 -1
- package/dist/lib/uninstall.js +18 -18
- package/dist/lib/uninstall.js.map +1 -1
- package/dist/lib/validate.d.ts.map +1 -1
- package/dist/lib/validate.js +15 -15
- package/dist/lib/validate.js.map +1 -1
- package/dist/test/han.test.js +54 -54
- package/dist/test/han.test.js.map +1 -1
- package/package.json +62 -62
package/dist/lib/validate.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { execSync } from
|
|
2
|
-
import { readdirSync } from
|
|
3
|
-
import { join } from
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { readdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
4
|
// Check if a filename matches a pattern (supports * wildcard)
|
|
5
5
|
function matchesPattern(filename, pattern) {
|
|
6
6
|
// Convert glob pattern to regex
|
|
7
7
|
const regexPattern = pattern
|
|
8
|
-
.replace(/\./g,
|
|
9
|
-
.replace(/\*/g,
|
|
10
|
-
.replace(/\?/g,
|
|
8
|
+
.replace(/\./g, '\\.')
|
|
9
|
+
.replace(/\*/g, '.*')
|
|
10
|
+
.replace(/\?/g, '.');
|
|
11
11
|
const regex = new RegExp(`^${regexPattern}$`);
|
|
12
12
|
return regex.test(filename);
|
|
13
13
|
}
|
|
@@ -33,8 +33,8 @@ function findDirectoriesWithMarker(rootDir, markerPatterns) {
|
|
|
33
33
|
const dirs = [];
|
|
34
34
|
function searchDir(dir) {
|
|
35
35
|
// Skip hidden directories and node_modules
|
|
36
|
-
const basename = dir.split(
|
|
37
|
-
if (basename.startsWith(
|
|
36
|
+
const basename = dir.split('/').pop() || '';
|
|
37
|
+
if (basename.startsWith('.') || basename === 'node_modules') {
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
try {
|
|
@@ -62,8 +62,8 @@ function runCommand(dir, cmd) {
|
|
|
62
62
|
try {
|
|
63
63
|
execSync(cmd, {
|
|
64
64
|
cwd: dir,
|
|
65
|
-
stdio:
|
|
66
|
-
encoding:
|
|
65
|
+
stdio: 'inherit',
|
|
66
|
+
encoding: 'utf8',
|
|
67
67
|
});
|
|
68
68
|
return true;
|
|
69
69
|
}
|
|
@@ -76,11 +76,11 @@ export function validate(options) {
|
|
|
76
76
|
// Main execution
|
|
77
77
|
const rootDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
78
78
|
if (!dirsWith) {
|
|
79
|
-
console.error(
|
|
79
|
+
console.error('Error: --dirs-with <file> is required');
|
|
80
80
|
process.exit(1);
|
|
81
81
|
}
|
|
82
82
|
// Parse comma-delimited patterns
|
|
83
|
-
const patterns = dirsWith.split(
|
|
83
|
+
const patterns = dirsWith.split(',').map((p) => p.trim());
|
|
84
84
|
const targetDirs = findDirectoriesWithMarker(rootDir, patterns);
|
|
85
85
|
if (targetDirs.length === 0) {
|
|
86
86
|
console.log(`No directories found with ${dirsWith}`);
|
|
@@ -90,7 +90,7 @@ export function validate(options) {
|
|
|
90
90
|
for (const dir of targetDirs) {
|
|
91
91
|
const success = runCommand(dir, commandToRun);
|
|
92
92
|
if (!success) {
|
|
93
|
-
const relativePath = dir.replace(`${rootDir}/`,
|
|
93
|
+
const relativePath = dir.replace(`${rootDir}/`, '');
|
|
94
94
|
failures.push(relativePath);
|
|
95
95
|
console.error(`\nFailed when trying to run \`${commandToRun}\` in directory: \`${relativePath}\`\n`);
|
|
96
96
|
if (failFast) {
|
|
@@ -99,13 +99,13 @@ export function validate(options) {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
if (failures.length > 0) {
|
|
102
|
-
console.error(`\n❌ ${failures.length} director${failures.length === 1 ?
|
|
102
|
+
console.error(`\n❌ ${failures.length} director${failures.length === 1 ? 'y' : 'ies'} failed validation:\n`);
|
|
103
103
|
for (const dir of failures) {
|
|
104
104
|
console.error(` - ${dir}`);
|
|
105
105
|
}
|
|
106
106
|
process.exit(2);
|
|
107
107
|
}
|
|
108
|
-
console.log(`\n✅ All ${targetDirs.length} director${targetDirs.length === 1 ?
|
|
108
|
+
console.log(`\n✅ All ${targetDirs.length} director${targetDirs.length === 1 ? 'y' : 'ies'} passed validation`);
|
|
109
109
|
process.exit(0);
|
|
110
110
|
}
|
|
111
111
|
//# sourceMappingURL=validate.js.map
|
package/dist/lib/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../lib/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../lib/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/test/han.test.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { strictEqual } from
|
|
2
|
-
import { execSync, } from
|
|
3
|
-
import { mkdirSync, rmSync, writeFileSync } from
|
|
4
|
-
import { dirname, join } from
|
|
5
|
-
import { fileURLToPath } from
|
|
1
|
+
import { strictEqual } from 'node:assert';
|
|
2
|
+
import { execSync, } from 'node:child_process';
|
|
3
|
+
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
6
|
// Get __dirname equivalent in ES modules
|
|
7
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
8
8
|
const __dirname = dirname(__filename);
|
|
9
9
|
// Test runs from dist/test, so go up to dist, then to lib/main.js
|
|
10
|
-
const binPath = join(__dirname,
|
|
10
|
+
const binPath = join(__dirname, '..', 'lib', 'main.js');
|
|
11
11
|
function setup() {
|
|
12
|
-
const testDir = join(__dirname,
|
|
12
|
+
const testDir = join(__dirname, 'fixtures');
|
|
13
13
|
rmSync(testDir, { recursive: true, force: true });
|
|
14
14
|
mkdirSync(testDir, { recursive: true });
|
|
15
15
|
return testDir;
|
|
16
16
|
}
|
|
17
17
|
function teardown() {
|
|
18
|
-
const testDir = join(__dirname,
|
|
18
|
+
const testDir = join(__dirname, 'fixtures');
|
|
19
19
|
rmSync(testDir, { recursive: true, force: true });
|
|
20
20
|
}
|
|
21
21
|
function test(name, fn) {
|
|
@@ -30,90 +30,90 @@ function test(name, fn) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
// Test: shows help when no command provided
|
|
33
|
-
test(
|
|
33
|
+
test('shows help when no command provided', () => {
|
|
34
34
|
try {
|
|
35
|
-
execSync(`node ${binPath} --help`, { encoding:
|
|
35
|
+
execSync(`node ${binPath} --help`, { encoding: 'utf8' });
|
|
36
36
|
// Help command should exit with 0
|
|
37
37
|
}
|
|
38
38
|
catch (error) {
|
|
39
39
|
const execError = error;
|
|
40
|
-
const stdout = execError.message ||
|
|
41
|
-
strictEqual(stdout.includes(
|
|
40
|
+
const stdout = execError.message || '';
|
|
41
|
+
strictEqual(stdout.includes('Usage:') || stdout.includes('han'), true);
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
// Test: shows error when validate has no command argument
|
|
45
|
-
test(
|
|
45
|
+
test('shows error when validate has no command argument', () => {
|
|
46
46
|
try {
|
|
47
|
-
execSync(`node ${binPath} validate`, { encoding:
|
|
48
|
-
throw new Error(
|
|
47
|
+
execSync(`node ${binPath} validate`, { encoding: 'utf8' });
|
|
48
|
+
throw new Error('Should have failed');
|
|
49
49
|
}
|
|
50
50
|
catch (error) {
|
|
51
51
|
const execError = error;
|
|
52
52
|
strictEqual(execError.status, 1);
|
|
53
|
-
const stderr = execError.stderr?.toString() ||
|
|
54
|
-
strictEqual(stderr.includes(
|
|
55
|
-
stderr.includes(
|
|
53
|
+
const stderr = execError.stderr?.toString() || '';
|
|
54
|
+
strictEqual(stderr.includes('missing required argument') ||
|
|
55
|
+
stderr.includes('error') ||
|
|
56
56
|
stderr.length > 0, true);
|
|
57
57
|
}
|
|
58
58
|
});
|
|
59
59
|
// Test: passes when no directories match filter
|
|
60
|
-
test(
|
|
60
|
+
test('passes when no directories match filter', () => {
|
|
61
61
|
const testDir = setup();
|
|
62
62
|
try {
|
|
63
|
-
const output = execSync(`node ${binPath} validate --dirs-with nonexistent.txt echo test`, { cwd: testDir, encoding:
|
|
64
|
-
strictEqual(output.includes(
|
|
63
|
+
const output = execSync(`node ${binPath} validate --dirs-with nonexistent.txt echo test`, { cwd: testDir, encoding: 'utf8' });
|
|
64
|
+
strictEqual(output.includes('No directories found with nonexistent.txt'), true);
|
|
65
65
|
}
|
|
66
66
|
finally {
|
|
67
67
|
teardown();
|
|
68
68
|
}
|
|
69
69
|
});
|
|
70
70
|
// Test: runs command in matching directories
|
|
71
|
-
test(
|
|
71
|
+
test('runs command in matching directories', () => {
|
|
72
72
|
const testDir = setup();
|
|
73
73
|
try {
|
|
74
74
|
// Create test structure
|
|
75
|
-
mkdirSync(join(testDir,
|
|
76
|
-
mkdirSync(join(testDir,
|
|
77
|
-
writeFileSync(join(testDir,
|
|
78
|
-
writeFileSync(join(testDir,
|
|
75
|
+
mkdirSync(join(testDir, 'pkg1'));
|
|
76
|
+
mkdirSync(join(testDir, 'pkg2'));
|
|
77
|
+
writeFileSync(join(testDir, 'pkg1', 'package.json'), '{}');
|
|
78
|
+
writeFileSync(join(testDir, 'pkg2', 'package.json'), '{}');
|
|
79
79
|
// Initialize git repo so directories are discovered
|
|
80
|
-
execSync(
|
|
81
|
-
execSync(
|
|
80
|
+
execSync('git init', { cwd: testDir });
|
|
81
|
+
execSync('git add .', { cwd: testDir });
|
|
82
82
|
const output = execSync(`node ${binPath} validate --dirs-with package.json echo success`, {
|
|
83
83
|
cwd: testDir,
|
|
84
|
-
encoding:
|
|
85
|
-
stdio: [
|
|
84
|
+
encoding: 'utf8',
|
|
85
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
86
86
|
});
|
|
87
|
-
strictEqual(output.includes(
|
|
88
|
-
strictEqual(output.includes(
|
|
87
|
+
strictEqual(output.includes('success'), true);
|
|
88
|
+
strictEqual(output.includes('passed validation'), true);
|
|
89
89
|
}
|
|
90
90
|
finally {
|
|
91
91
|
teardown();
|
|
92
92
|
}
|
|
93
93
|
});
|
|
94
94
|
// Test: fails with exit code 2 when command fails
|
|
95
|
-
test(
|
|
95
|
+
test('fails with exit code 2 when command fails', () => {
|
|
96
96
|
const testDir = setup();
|
|
97
97
|
try {
|
|
98
|
-
mkdirSync(join(testDir,
|
|
99
|
-
writeFileSync(join(testDir,
|
|
98
|
+
mkdirSync(join(testDir, 'pkg1'));
|
|
99
|
+
writeFileSync(join(testDir, 'pkg1', 'package.json'), '{}');
|
|
100
100
|
// Initialize git repo
|
|
101
|
-
execSync(
|
|
102
|
-
execSync(
|
|
101
|
+
execSync('git init', { cwd: testDir });
|
|
102
|
+
execSync('git add .', { cwd: testDir });
|
|
103
103
|
try {
|
|
104
104
|
execSync(`node ${binPath} validate --dirs-with package.json exit 1`, {
|
|
105
105
|
cwd: testDir,
|
|
106
|
-
encoding:
|
|
107
|
-
stdio:
|
|
106
|
+
encoding: 'utf8',
|
|
107
|
+
stdio: 'pipe',
|
|
108
108
|
});
|
|
109
|
-
throw new Error(
|
|
109
|
+
throw new Error('Should have failed');
|
|
110
110
|
}
|
|
111
111
|
catch (error) {
|
|
112
112
|
const execError = error;
|
|
113
113
|
const exitCode = execError.status || execError.code;
|
|
114
114
|
strictEqual(exitCode, 2, `Expected exit code 2, got ${exitCode}`);
|
|
115
|
-
const stderr = execError.stderr?.toString() ||
|
|
116
|
-
strictEqual(stderr.includes(
|
|
115
|
+
const stderr = execError.stderr?.toString() || '';
|
|
116
|
+
strictEqual(stderr.includes('failed validation') || stderr.includes('Failed when'), true);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
finally {
|
|
@@ -121,31 +121,31 @@ test("fails with exit code 2 when command fails", () => {
|
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
123
|
// Test: stops on first failure with --fail-fast
|
|
124
|
-
test(
|
|
124
|
+
test('stops on first failure with --fail-fast', () => {
|
|
125
125
|
const testDir = setup();
|
|
126
126
|
try {
|
|
127
|
-
mkdirSync(join(testDir,
|
|
128
|
-
mkdirSync(join(testDir,
|
|
129
|
-
writeFileSync(join(testDir,
|
|
130
|
-
writeFileSync(join(testDir,
|
|
127
|
+
mkdirSync(join(testDir, 'pkg1'));
|
|
128
|
+
mkdirSync(join(testDir, 'pkg2'));
|
|
129
|
+
writeFileSync(join(testDir, 'pkg1', 'package.json'), '{}');
|
|
130
|
+
writeFileSync(join(testDir, 'pkg2', 'package.json'), '{}');
|
|
131
131
|
// Initialize git repo
|
|
132
|
-
execSync(
|
|
133
|
-
execSync(
|
|
132
|
+
execSync('git init', { cwd: testDir });
|
|
133
|
+
execSync('git add .', { cwd: testDir });
|
|
134
134
|
try {
|
|
135
|
-
execSync(`node ${binPath} validate --fail-fast --dirs-with package.json exit 1`, { cwd: testDir, encoding:
|
|
136
|
-
throw new Error(
|
|
135
|
+
execSync(`node ${binPath} validate --fail-fast --dirs-with package.json exit 1`, { cwd: testDir, encoding: 'utf8', stdio: 'pipe' });
|
|
136
|
+
throw new Error('Should have failed');
|
|
137
137
|
}
|
|
138
138
|
catch (error) {
|
|
139
139
|
const execError = error;
|
|
140
140
|
const exitCode = execError.status || execError.code;
|
|
141
141
|
strictEqual(exitCode, 2, `Expected exit code 2, got ${exitCode}`);
|
|
142
|
-
const stderr = execError.stderr?.toString() ||
|
|
143
|
-
strictEqual(stderr.includes(
|
|
142
|
+
const stderr = execError.stderr?.toString() || '';
|
|
143
|
+
strictEqual(stderr.includes('Failed when trying to run'), true);
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
finally {
|
|
147
147
|
teardown();
|
|
148
148
|
}
|
|
149
149
|
});
|
|
150
|
-
console.log(
|
|
150
|
+
console.log('\nAll tests passed! ✓');
|
|
151
151
|
//# sourceMappingURL=han.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"han.test.js","sourceRoot":"","sources":["../../test/han.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"han.test.js","sourceRoot":"","sources":["../../test/han.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
2
|
+
"name": "@thebushidocollective/han",
|
|
3
|
+
"version": "1.3.1",
|
|
4
|
+
"description": "Monorepo validation tool for Claude Code hooks",
|
|
5
|
+
"main": "dist/lib/main.js",
|
|
6
|
+
"types": "dist/lib/main.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"han": "dist/lib/main.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"postbuild": "chmod +x dist/lib/main.js",
|
|
14
|
+
"typecheck": "tsc --noEmit",
|
|
15
|
+
"test": "node dist/test/han.test.js",
|
|
16
|
+
"lint": "biome check .",
|
|
17
|
+
"lint:fix": "biome check --write .",
|
|
18
|
+
"prepack": "npm run build && npm test"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/thebushidocollective/han.git"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/thebushidocollective/han",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/thebushidocollective/han/issues"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"bushido",
|
|
30
|
+
"monorepo",
|
|
31
|
+
"validation",
|
|
32
|
+
"hooks",
|
|
33
|
+
"claude",
|
|
34
|
+
"claude-code",
|
|
35
|
+
"testing",
|
|
36
|
+
"ci"
|
|
37
|
+
],
|
|
38
|
+
"author": "The Bushido Collective",
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=24"
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist/",
|
|
45
|
+
"README.md"
|
|
46
|
+
],
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@biomejs/biome": "2.3.6",
|
|
49
|
+
"@types/commander": "2.12.0",
|
|
50
|
+
"@types/marked-terminal": "6.1.1",
|
|
51
|
+
"@types/node": "20.19.25",
|
|
52
|
+
"@types/react": "19.2.6",
|
|
53
|
+
"typescript": "5.9.3"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@anthropic-ai/claude-agent-sdk": "0.1.47",
|
|
57
|
+
"commander": "14.0.2",
|
|
58
|
+
"ink": "6.5.1",
|
|
59
|
+
"ink-spinner": "5.0.0",
|
|
60
|
+
"marked": "15.0.12",
|
|
61
|
+
"marked-terminal": "7.3.0",
|
|
62
|
+
"react": "19.2.0"
|
|
63
|
+
}
|
|
64
64
|
}
|