aiblueprint-cli 1.4.21 → 1.4.23
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/claude-code-config/scripts/command-validator/README.md +2 -2
- package/claude-code-config/scripts/statusline/CLAUDE.md +1 -1
- package/claude-code-config/scripts/statusline/README.md +1 -1
- package/claude-code-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -4
- package/claude-code-config/scripts/statusline/fixtures/test-input.json +4 -4
- package/claude-code-config/skills/setup-ralph/steps/step-00-init.md +3 -2
- package/dist/cli.js +46 -3
- package/package.json +1 -1
|
@@ -31,7 +31,7 @@ The validator is configured as a PreToolUse hook in Claude Code settings:
|
|
|
31
31
|
"hooks": [
|
|
32
32
|
{
|
|
33
33
|
"type": "command",
|
|
34
|
-
"command": "bun
|
|
34
|
+
"command": "bun ~/.claude/scripts/command-validator/src/cli.ts"
|
|
35
35
|
}
|
|
36
36
|
]
|
|
37
37
|
}
|
|
@@ -81,7 +81,7 @@ The test suite includes:
|
|
|
81
81
|
- Sensitive file access: /etc/passwd, /etc/shadow, /etc/sudoers
|
|
82
82
|
|
|
83
83
|
### Special Cases
|
|
84
|
-
- rm -rf safety: Allows deletions in safe paths (
|
|
84
|
+
- rm -rf safety: Allows deletions in safe paths (~/Developer/, /tmp/)
|
|
85
85
|
- Protected paths: Blocks dangerous operations on /etc, /usr, /bin, etc.
|
|
86
86
|
- Binary content detection
|
|
87
87
|
- Command length limits
|
|
@@ -159,7 +159,7 @@ Update your `~/.claude/settings.json`:
|
|
|
159
159
|
{
|
|
160
160
|
"statusLine": {
|
|
161
161
|
"type": "command",
|
|
162
|
-
"command": "bun
|
|
162
|
+
"command": "bun ~/.claude/scripts/statusline/src/index.ts",
|
|
163
163
|
"padding": 0
|
|
164
164
|
}
|
|
165
165
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"parentUuid":null,"isSidechain":false,"userType":"external","cwd":"/
|
|
2
|
-
{"parentUuid":"uuid-1","isSidechain":false,"userType":"external","cwd":"/
|
|
3
|
-
{"parentUuid":"uuid-2","isSidechain":false,"userType":"external","cwd":"/
|
|
4
|
-
{"parentUuid":"uuid-3","isSidechain":false,"userType":"external","cwd":"/
|
|
1
|
+
{"parentUuid":null,"isSidechain":false,"userType":"external","cwd":"/tmp/test-project","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:00:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_01","type":"message","role":"user","content":[{"type":"text","text":"Hello"}],"usage":{"input_tokens":1000,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":100}},"uuid":"uuid-1"}
|
|
2
|
+
{"parentUuid":"uuid-1","isSidechain":false,"userType":"external","cwd":"/tmp/test-project","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:05:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_02","type":"message","role":"assistant","content":[{"type":"text","text":"Hi there!"}],"usage":{"input_tokens":50000,"cache_creation_input_tokens":30000,"cache_read_input_tokens":0,"output_tokens":200}},"uuid":"uuid-2"}
|
|
3
|
+
{"parentUuid":"uuid-2","isSidechain":false,"userType":"external","cwd":"/tmp/test-project","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:10:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_03","type":"message","role":"user","content":[{"type":"text","text":"Can you help me?"}],"usage":{"input_tokens":20000,"cache_creation_input_tokens":0,"cache_read_input_tokens":40000,"output_tokens":150}},"uuid":"uuid-3"}
|
|
4
|
+
{"parentUuid":"uuid-3","isSidechain":false,"userType":"external","cwd":"/tmp/test-project","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:15:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_04","type":"message","role":"assistant","content":[{"type":"text","text":"Of course! What do you need?"}],"usage":{"input_tokens":30000,"cache_creation_input_tokens":0,"cache_read_input_tokens":45000,"output_tokens":300}},"uuid":"uuid-4"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"session_id": "06a7b019-03f8-4083-a9db-410d95cb01e6",
|
|
3
|
-
"transcript_path": "/
|
|
4
|
-
"cwd": "/
|
|
3
|
+
"transcript_path": "/tmp/test-fixtures/mock-transcript.jsonl",
|
|
4
|
+
"cwd": "/tmp/test-project",
|
|
5
5
|
"model": {
|
|
6
6
|
"id": "claude-sonnet-4-5-20250929",
|
|
7
7
|
"display_name": "Sonnet 4.5"
|
|
8
8
|
},
|
|
9
9
|
"workspace": {
|
|
10
|
-
"current_dir": "/
|
|
11
|
-
"project_dir": "/
|
|
10
|
+
"current_dir": "/tmp/test-project",
|
|
11
|
+
"project_dir": "/tmp/test-project"
|
|
12
12
|
},
|
|
13
13
|
"version": "2.0.68",
|
|
14
14
|
"output_style": {
|
|
@@ -134,8 +134,9 @@ fi
|
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
136
|
# Make script executable and run it
|
|
137
|
-
|
|
138
|
-
/
|
|
137
|
+
# Note: Use the skill_dir variable which resolves to ~/.claude/skills/setup-ralph
|
|
138
|
+
chmod +x {skill_dir}/scripts/setup.sh
|
|
139
|
+
{skill_dir}/scripts/setup.sh "{project_path}" "{feature_name}"
|
|
139
140
|
```
|
|
140
141
|
|
|
141
142
|
The setup script creates:
|
package/dist/cli.js
CHANGED
|
@@ -33100,6 +33100,43 @@ function transformHook(hook, claudeDir) {
|
|
|
33100
33100
|
}
|
|
33101
33101
|
return transformed;
|
|
33102
33102
|
}
|
|
33103
|
+
var TEXT_FILE_EXTENSIONS = new Set([
|
|
33104
|
+
".ts",
|
|
33105
|
+
".tsx",
|
|
33106
|
+
".js",
|
|
33107
|
+
".jsx",
|
|
33108
|
+
".mjs",
|
|
33109
|
+
".cjs",
|
|
33110
|
+
".json",
|
|
33111
|
+
".jsonl",
|
|
33112
|
+
".md",
|
|
33113
|
+
".mdx",
|
|
33114
|
+
".txt",
|
|
33115
|
+
".sh",
|
|
33116
|
+
".bash",
|
|
33117
|
+
".zsh",
|
|
33118
|
+
".yaml",
|
|
33119
|
+
".yml",
|
|
33120
|
+
".toml",
|
|
33121
|
+
".ini",
|
|
33122
|
+
".cfg",
|
|
33123
|
+
".html",
|
|
33124
|
+
".css",
|
|
33125
|
+
".scss",
|
|
33126
|
+
".less"
|
|
33127
|
+
]);
|
|
33128
|
+
function isTextFile(filePath) {
|
|
33129
|
+
const ext = filePath.toLowerCase().slice(filePath.lastIndexOf("."));
|
|
33130
|
+
return TEXT_FILE_EXTENSIONS.has(ext);
|
|
33131
|
+
}
|
|
33132
|
+
function transformFileContent(content, claudeDir) {
|
|
33133
|
+
let transformed = content;
|
|
33134
|
+
for (const pattern of KNOWN_CLAUDE_PATHS) {
|
|
33135
|
+
transformed = transformed.replace(new RegExp(pattern.source, "g"), `${claudeDir}/`);
|
|
33136
|
+
}
|
|
33137
|
+
transformed = transformed.replace(/\\/g, "/");
|
|
33138
|
+
return transformed;
|
|
33139
|
+
}
|
|
33103
33140
|
|
|
33104
33141
|
// src/commands/setup/settings.ts
|
|
33105
33142
|
function toPosixPath(p) {
|
|
@@ -35389,7 +35426,7 @@ async function analyzeSyncChanges(claudeDir, githubToken) {
|
|
|
35389
35426
|
unchangedCount: allItems.filter((i) => i.status === "unchanged").length
|
|
35390
35427
|
};
|
|
35391
35428
|
}
|
|
35392
|
-
async function downloadFromPrivateGitHub2(relativePath, targetPath, githubToken) {
|
|
35429
|
+
async function downloadFromPrivateGitHub2(relativePath, targetPath, githubToken, claudeDir) {
|
|
35393
35430
|
try {
|
|
35394
35431
|
const url = `https://raw.githubusercontent.com/${PREMIUM_REPO2}/${PREMIUM_BRANCH2}/claude-code-config/${relativePath}`;
|
|
35395
35432
|
const response = await fetch(url, {
|
|
@@ -35403,7 +35440,13 @@ async function downloadFromPrivateGitHub2(relativePath, targetPath, githubToken)
|
|
|
35403
35440
|
}
|
|
35404
35441
|
const content = await response.arrayBuffer();
|
|
35405
35442
|
await import_fs_extra11.default.ensureDir(path13.dirname(targetPath));
|
|
35406
|
-
|
|
35443
|
+
if (isTextFile(relativePath)) {
|
|
35444
|
+
const textContent = Buffer.from(content).toString("utf-8");
|
|
35445
|
+
const transformedContent = transformFileContent(textContent, claudeDir);
|
|
35446
|
+
await import_fs_extra11.default.writeFile(targetPath, transformedContent, "utf-8");
|
|
35447
|
+
} else {
|
|
35448
|
+
await import_fs_extra11.default.writeFile(targetPath, Buffer.from(content));
|
|
35449
|
+
}
|
|
35407
35450
|
return true;
|
|
35408
35451
|
} catch {
|
|
35409
35452
|
return false;
|
|
@@ -35463,7 +35506,7 @@ async function syncSelectedItems(claudeDir, items, githubToken, onProgress) {
|
|
|
35463
35506
|
}
|
|
35464
35507
|
} else {
|
|
35465
35508
|
onProgress?.(item.relativePath, item.status === "new" ? "adding" : "updating");
|
|
35466
|
-
const ok = await downloadFromPrivateGitHub2(item.relativePath, targetPath, githubToken);
|
|
35509
|
+
const ok = await downloadFromPrivateGitHub2(item.relativePath, targetPath, githubToken, claudeDir);
|
|
35467
35510
|
if (ok) {
|
|
35468
35511
|
success++;
|
|
35469
35512
|
} else {
|