oh-my-customcode 0.48.2 → 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 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.80 Compatibility** | Rate limits statusline, skill effort frontmatter, settings-based plugin source |
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.2",
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.2",
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "oh-my-customcode",
3
3
  "workspaces": ["packages/*"],
4
- "version": "0.48.2",
4
+ "version": "0.48.4",
5
5
  "description": "Batteries-included agent harness for Claude Code",
6
6
  "type": "module",
7
7
  "bin": {
@@ -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": [
@@ -23,6 +23,7 @@ VIOLATION_FILE="/tmp/.claude-r010-violations-${PPID}"
23
23
  # Only warn when the delegated agent is NOT mgr-gitnerd
24
24
  if [ "$agent_type" != "mgr-gitnerd" ]; then
25
25
  git_keywords=(
26
+ "git add"
26
27
  "git commit"
27
28
  "git push"
28
29
  "git revert"
@@ -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
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.48.2",
2
+ "version": "0.48.4",
3
3
  "lastUpdated": "2026-03-16T00:00:00.000Z",
4
4
  "components": [
5
5
  {