oh-my-customcode 0.48.3 → 0.48.4
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 +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/hooks/hooks.json +10 -0
- package/templates/.claude/hooks/scripts/git-delegation-guard.sh +1 -0
- package/templates/.claude/hooks/scripts/stale-todo-scanner.sh +82 -0
- package/templates/manifest.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ npm install -g oh-my-customcode && cd your-project && omcustom init
|
|
|
29
29
|
| **Skill Effort Override** | Skills can set `effort` frontmatter to override model effort level at invocation time |
|
|
30
30
|
| **Multi-project Web UI** | `omcustom serve` supports multi-project management with sidebar project selector |
|
|
31
31
|
| **Batch Update UI** | Web dashboard supports visual project update status and batch updates |
|
|
32
|
-
| **CC v2.1.72~v2.1.
|
|
32
|
+
| **CC v2.1.72~v2.1.81 Compatibility** | Rate limits statusline, skill effort frontmatter, settings-based plugin source; `--bare` flag (harness disabled in bare mode), `--channels` permission relay (no changes required) |
|
|
33
33
|
| **SDD Workflow** | Spec-Driven Development with `sdd/` folder hierarchy and planning-first gates |
|
|
34
34
|
| **Ambiguity Gate** | Pre-routing clarity scoring and clarification questions |
|
|
35
35
|
|
package/dist/cli/index.js
CHANGED
|
@@ -9323,7 +9323,7 @@ var init_package = __esm(() => {
|
|
|
9323
9323
|
package_default = {
|
|
9324
9324
|
name: "oh-my-customcode",
|
|
9325
9325
|
workspaces: ["packages/*"],
|
|
9326
|
-
version: "0.48.
|
|
9326
|
+
version: "0.48.4",
|
|
9327
9327
|
description: "Batteries-included agent harness for Claude Code",
|
|
9328
9328
|
type: "module",
|
|
9329
9329
|
bin: {
|
package/dist/index.js
CHANGED
|
@@ -1642,7 +1642,7 @@ import { join as join6 } from "node:path";
|
|
|
1642
1642
|
var package_default = {
|
|
1643
1643
|
name: "oh-my-customcode",
|
|
1644
1644
|
workspaces: ["packages/*"],
|
|
1645
|
-
version: "0.48.
|
|
1645
|
+
version: "0.48.4",
|
|
1646
1646
|
description: "Batteries-included agent harness for Claude Code",
|
|
1647
1647
|
type: "module",
|
|
1648
1648
|
bin: {
|
package/package.json
CHANGED
|
@@ -115,6 +115,16 @@
|
|
|
115
115
|
}
|
|
116
116
|
],
|
|
117
117
|
"description": "Check codex CLI and Agent Teams availability at session start"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"matcher": "*",
|
|
121
|
+
"hooks": [
|
|
122
|
+
{
|
|
123
|
+
"type": "command",
|
|
124
|
+
"command": "bash .claude/hooks/scripts/stale-todo-scanner.sh"
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"description": "Scan TODO.md files for stale items at session start"
|
|
118
128
|
}
|
|
119
129
|
],
|
|
120
130
|
"SubagentStart": [
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Stale TODO Scanner Hook
|
|
5
|
+
# Trigger: SessionStart
|
|
6
|
+
# Purpose: Scan TODO.md files for staleness and pending items, report via stderr
|
|
7
|
+
# Protocol: stdin JSON -> stdout pass-through, exit 0 always
|
|
8
|
+
# Note: Zero network calls — local file scanning only
|
|
9
|
+
|
|
10
|
+
input=$(cat)
|
|
11
|
+
|
|
12
|
+
TODO_FILES=("TODO.md" ".claude/TODO.md")
|
|
13
|
+
NOW=$(date +%s)
|
|
14
|
+
FOUND_ANY=false
|
|
15
|
+
FOUND_STALE=false
|
|
16
|
+
|
|
17
|
+
echo "" >&2
|
|
18
|
+
echo "--- [TODO Health Check] ---" >&2
|
|
19
|
+
|
|
20
|
+
for TODO_FILE in "${TODO_FILES[@]}"; do
|
|
21
|
+
if [ ! -f "$TODO_FILE" ]; then
|
|
22
|
+
continue
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
FOUND_ANY=true
|
|
26
|
+
|
|
27
|
+
# Parse "Last updated: YYYY-MM-DD" header
|
|
28
|
+
LAST_UPDATED_LINE=$(grep -m1 "> Last updated:" "$TODO_FILE" 2>/dev/null || echo "")
|
|
29
|
+
DATE_STR=$(echo "$LAST_UPDATED_LINE" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}' | head -1 || echo "")
|
|
30
|
+
|
|
31
|
+
# Count pending items (grep -c exits 1 when no matches on some systems — normalize to 0)
|
|
32
|
+
PENDING_COUNT=$(grep -c "^- \[ \]" "$TODO_FILE" 2>/dev/null) || PENDING_COUNT=0
|
|
33
|
+
|
|
34
|
+
if [ -z "$DATE_STR" ]; then
|
|
35
|
+
echo " ${TODO_FILE}: no 'Last updated' header found" >&2
|
|
36
|
+
echo " Pending items: ${PENDING_COUNT}" >&2
|
|
37
|
+
continue
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# Cross-platform date parsing: try GNU date first, fallback to BSD date
|
|
41
|
+
FILE_EPOCH=""
|
|
42
|
+
if date -d "$DATE_STR" +%s >/dev/null 2>&1; then
|
|
43
|
+
# GNU date (Linux)
|
|
44
|
+
FILE_EPOCH=$(date -d "$DATE_STR" +%s)
|
|
45
|
+
elif date -j -f "%Y-%m-%d" "$DATE_STR" +%s >/dev/null 2>&1; then
|
|
46
|
+
# BSD date (macOS)
|
|
47
|
+
FILE_EPOCH=$(date -j -f "%Y-%m-%d" "$DATE_STR" +%s)
|
|
48
|
+
else
|
|
49
|
+
echo " ${TODO_FILE}: could not parse date '${DATE_STR}'" >&2
|
|
50
|
+
echo " Pending items: ${PENDING_COUNT}" >&2
|
|
51
|
+
continue
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
DAYS_OLD=$(( (NOW - FILE_EPOCH) / 86400 ))
|
|
55
|
+
|
|
56
|
+
if [ "$DAYS_OLD" -gt 30 ]; then
|
|
57
|
+
STATUS="⚠⚠ critical — stale >30d"
|
|
58
|
+
FOUND_STALE=true
|
|
59
|
+
elif [ "$DAYS_OLD" -gt 7 ]; then
|
|
60
|
+
STATUS="⚠ stale >7d"
|
|
61
|
+
FOUND_STALE=true
|
|
62
|
+
else
|
|
63
|
+
STATUS="up to date"
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
echo " ${TODO_FILE}: last updated ${DAYS_OLD} days ago (${STATUS})" >&2
|
|
67
|
+
echo " Pending items: ${PENDING_COUNT}" >&2
|
|
68
|
+
done
|
|
69
|
+
|
|
70
|
+
if [ "$FOUND_ANY" = false ] || [ "$FOUND_STALE" = false ]; then
|
|
71
|
+
if [ "$FOUND_ANY" = false ]; then
|
|
72
|
+
: # No TODO files found — skip silently
|
|
73
|
+
else
|
|
74
|
+
echo " ✓ All TODO files are up to date" >&2
|
|
75
|
+
fi
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
echo "------------------------------------" >&2
|
|
79
|
+
|
|
80
|
+
# Pass through
|
|
81
|
+
echo "$input"
|
|
82
|
+
exit 0
|
package/templates/manifest.json
CHANGED