cc-discipline 2.10.1 → 2.10.3

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.
Files changed (43) hide show
  1. package/README.md +236 -153
  2. package/README.zh-CN.md +299 -207
  3. package/bin/cli.sh +96 -96
  4. package/global/CLAUDE.md +45 -45
  5. package/init.sh +594 -594
  6. package/lib/doctor.sh +145 -145
  7. package/lib/stack-remove.sh +68 -68
  8. package/lib/status.sh +100 -100
  9. package/package.json +34 -34
  10. package/templates/.claude/agents/investigator.md +44 -44
  11. package/templates/.claude/agents/reviewer.md +46 -46
  12. package/templates/.claude/hooks/action-counter.sh +58 -58
  13. package/templates/.claude/hooks/git-guard.sh +62 -62
  14. package/templates/.claude/hooks/phase-gate.sh +10 -10
  15. package/templates/.claude/hooks/post-error-remind.sh +114 -114
  16. package/templates/.claude/hooks/pre-edit-guard.sh +100 -100
  17. package/templates/.claude/hooks/session-start.sh +44 -44
  18. package/templates/.claude/hooks/streak-breaker.sh +111 -111
  19. package/templates/.claude/rules/00-core-principles.md +16 -16
  20. package/templates/.claude/rules/01-debugging.md +32 -32
  21. package/templates/.claude/rules/02-before-edit.md +22 -22
  22. package/templates/.claude/rules/03-context-mgmt.md +44 -44
  23. package/templates/.claude/rules/04-no-mole-whacking.md +26 -26
  24. package/templates/.claude/rules/05-phase-discipline.md +15 -15
  25. package/templates/.claude/rules/06-multi-task.md +12 -12
  26. package/templates/.claude/rules/07-integrity.md +92 -92
  27. package/templates/.claude/rules/stacks/embedded.md +24 -24
  28. package/templates/.claude/rules/stacks/js-ts.md +21 -21
  29. package/templates/.claude/rules/stacks/mobile.md +16 -16
  30. package/templates/.claude/rules/stacks/python.md +20 -20
  31. package/templates/.claude/rules/stacks/rtl.md +24 -24
  32. package/templates/.claude/settings.json +84 -84
  33. package/templates/.claude/skills/commit/SKILL.md +40 -40
  34. package/templates/.claude/skills/evaluate/SKILL.md +57 -57
  35. package/templates/.claude/skills/investigate/SKILL.md +192 -192
  36. package/templates/.claude/skills/retro/SKILL.md +40 -40
  37. package/templates/.claude/skills/self-check/SKILL.md +112 -87
  38. package/templates/.claude/skills/summary/SKILL.md +48 -48
  39. package/templates/.claude/skills/think/SKILL.md +108 -108
  40. package/templates/CLAUDE.md +96 -96
  41. package/templates/docs/debug-log.md +48 -48
  42. package/templates/docs/progress.md +72 -72
  43. package/templates/memory/MEMORY.md +23 -23
package/lib/doctor.sh CHANGED
@@ -1,145 +1,145 @@
1
- #!/bin/bash
2
- # cc-discipline doctor — diagnose installation issues
3
- set -e
4
-
5
- GREEN='\033[0;32m'
6
- YELLOW='\033[1;33m'
7
- RED='\033[0;31m'
8
- NC='\033[0m'
9
-
10
- ISSUES=0
11
- WARNINGS=0
12
-
13
- ok() { echo -e " ${GREEN}✓${NC} $1"; }
14
- warn() { echo -e " ${YELLOW}!${NC} $1"; WARNINGS=$((WARNINGS + 1)); }
15
- fail() { echo -e " ${RED}✗${NC} $1"; ISSUES=$((ISSUES + 1)); }
16
-
17
- echo "cc-discipline doctor"
18
- echo "──────────────────────"
19
- echo ""
20
-
21
- # 1. Version file
22
- echo "Installation:"
23
- if [ -f ".claude/.cc-discipline-version" ]; then
24
- ok "Version file: $(cat .claude/.cc-discipline-version)"
25
- else
26
- fail "Not installed (no .claude/.cc-discipline-version)"
27
- echo ""
28
- echo "Run 'npx cc-discipline init' to install."
29
- exit 1
30
- fi
31
-
32
- # 2. Core rules
33
- echo ""
34
- echo "Core rules:"
35
- for i in 00 01 02 03 04 05 06 07; do
36
- FILE=$(ls .claude/rules/${i}-*.md 2>/dev/null | head -1)
37
- if [ -n "$FILE" ]; then
38
- ok "$(basename "$FILE")"
39
- else
40
- fail "Missing rule ${i}-*.md"
41
- fi
42
- done
43
-
44
- # 3. Hooks
45
- echo ""
46
- echo "Hooks:"
47
- for hook in pre-edit-guard streak-breaker post-error-remind session-start phase-gate action-counter git-guard; do
48
- if [ -f ".claude/hooks/${hook}.sh" ]; then
49
- if [ -x ".claude/hooks/${hook}.sh" ]; then
50
- ok "${hook}.sh"
51
- else
52
- warn "${hook}.sh exists but not executable"
53
- fi
54
- else
55
- fail "Missing ${hook}.sh"
56
- fi
57
- done
58
-
59
- # 4. settings.json hook registration
60
- echo ""
61
- echo "Hook registration:"
62
- if [ -f ".claude/settings.json" ]; then
63
- if command -v jq &>/dev/null; then
64
- CONTENT=$(cat .claude/settings.json)
65
- for hook in pre-edit-guard streak-breaker post-error-remind session-start phase-gate action-counter git-guard; do
66
- if echo "$CONTENT" | grep -q "$hook"; then
67
- ok "${hook} registered"
68
- else
69
- fail "${hook} NOT registered in settings.json"
70
- fi
71
- done
72
- else
73
- warn "jq not installed — cannot verify hook registration details"
74
- if grep -q "pre-edit-guard" .claude/settings.json 2>/dev/null; then
75
- ok "settings.json contains hook references"
76
- else
77
- fail "settings.json doesn't reference any hooks"
78
- fi
79
- fi
80
- else
81
- fail "settings.json missing"
82
- fi
83
-
84
- # 5. Agents
85
- echo ""
86
- echo "Agents:"
87
- for agent in reviewer investigator; do
88
- if [ -f ".claude/agents/${agent}.md" ]; then
89
- ok "${agent}.md"
90
- else
91
- warn "Missing ${agent}.md (optional)"
92
- fi
93
- done
94
-
95
- # 6. Skills
96
- echo ""
97
- echo "Skills:"
98
- for skill in commit self-check evaluate think retro summary investigate; do
99
- if [ -d ".claude/skills/${skill}" ]; then
100
- ok "/${skill}"
101
- else
102
- warn "Missing /${skill} skill (optional)"
103
- fi
104
- done
105
-
106
- # 7. jq
107
- echo ""
108
- echo "Dependencies:"
109
- if command -v jq &>/dev/null; then
110
- ok "jq installed ($(jq --version 2>&1))"
111
- else
112
- warn "jq not installed — hooks use grep/sed fallback, recommend: brew install jq"
113
- fi
114
-
115
- # 8. CLAUDE.md
116
- echo ""
117
- echo "Project files:"
118
- if [ -f "CLAUDE.md" ]; then
119
- if grep -q "\[TODO\]" CLAUDE.md 2>/dev/null; then
120
- warn "CLAUDE.md has unfilled [TODO] sections"
121
- else
122
- ok "CLAUDE.md"
123
- fi
124
- else
125
- warn "No CLAUDE.md found"
126
- fi
127
-
128
- if [ -f "docs/progress.md" ]; then
129
- ok "docs/progress.md"
130
- else
131
- warn "No docs/progress.md"
132
- fi
133
-
134
- # Summary
135
- echo ""
136
- echo "──────────────────────"
137
- if [ "$ISSUES" -eq 0 ] && [ "$WARNINGS" -eq 0 ]; then
138
- echo -e "${GREEN}All checks passed!${NC}"
139
- elif [ "$ISSUES" -eq 0 ]; then
140
- echo -e "${YELLOW}${WARNINGS} warning(s), no critical issues${NC}"
141
- else
142
- echo -e "${RED}${ISSUES} issue(s), ${WARNINGS} warning(s)${NC}"
143
- echo "Run 'npx cc-discipline upgrade' to fix missing files."
144
- fi
145
- echo ""
1
+ #!/bin/bash
2
+ # cc-discipline doctor — diagnose installation issues
3
+ set -e
4
+
5
+ GREEN='\033[0;32m'
6
+ YELLOW='\033[1;33m'
7
+ RED='\033[0;31m'
8
+ NC='\033[0m'
9
+
10
+ ISSUES=0
11
+ WARNINGS=0
12
+
13
+ ok() { echo -e " ${GREEN}✓${NC} $1"; }
14
+ warn() { echo -e " ${YELLOW}!${NC} $1"; WARNINGS=$((WARNINGS + 1)); }
15
+ fail() { echo -e " ${RED}✗${NC} $1"; ISSUES=$((ISSUES + 1)); }
16
+
17
+ echo "cc-discipline doctor"
18
+ echo "──────────────────────"
19
+ echo ""
20
+
21
+ # 1. Version file
22
+ echo "Installation:"
23
+ if [ -f ".claude/.cc-discipline-version" ]; then
24
+ ok "Version file: $(cat .claude/.cc-discipline-version)"
25
+ else
26
+ fail "Not installed (no .claude/.cc-discipline-version)"
27
+ echo ""
28
+ echo "Run 'npx cc-discipline init' to install."
29
+ exit 1
30
+ fi
31
+
32
+ # 2. Core rules
33
+ echo ""
34
+ echo "Core rules:"
35
+ for i in 00 01 02 03 04 05 06 07; do
36
+ FILE=$(ls .claude/rules/${i}-*.md 2>/dev/null | head -1)
37
+ if [ -n "$FILE" ]; then
38
+ ok "$(basename "$FILE")"
39
+ else
40
+ fail "Missing rule ${i}-*.md"
41
+ fi
42
+ done
43
+
44
+ # 3. Hooks
45
+ echo ""
46
+ echo "Hooks:"
47
+ for hook in pre-edit-guard streak-breaker post-error-remind session-start phase-gate action-counter git-guard; do
48
+ if [ -f ".claude/hooks/${hook}.sh" ]; then
49
+ if [ -x ".claude/hooks/${hook}.sh" ]; then
50
+ ok "${hook}.sh"
51
+ else
52
+ warn "${hook}.sh exists but not executable"
53
+ fi
54
+ else
55
+ fail "Missing ${hook}.sh"
56
+ fi
57
+ done
58
+
59
+ # 4. settings.json hook registration
60
+ echo ""
61
+ echo "Hook registration:"
62
+ if [ -f ".claude/settings.json" ]; then
63
+ if command -v jq &>/dev/null; then
64
+ CONTENT=$(cat .claude/settings.json)
65
+ for hook in pre-edit-guard streak-breaker post-error-remind session-start phase-gate action-counter git-guard; do
66
+ if echo "$CONTENT" | grep -q "$hook"; then
67
+ ok "${hook} registered"
68
+ else
69
+ fail "${hook} NOT registered in settings.json"
70
+ fi
71
+ done
72
+ else
73
+ warn "jq not installed — cannot verify hook registration details"
74
+ if grep -q "pre-edit-guard" .claude/settings.json 2>/dev/null; then
75
+ ok "settings.json contains hook references"
76
+ else
77
+ fail "settings.json doesn't reference any hooks"
78
+ fi
79
+ fi
80
+ else
81
+ fail "settings.json missing"
82
+ fi
83
+
84
+ # 5. Agents
85
+ echo ""
86
+ echo "Agents:"
87
+ for agent in reviewer investigator; do
88
+ if [ -f ".claude/agents/${agent}.md" ]; then
89
+ ok "${agent}.md"
90
+ else
91
+ warn "Missing ${agent}.md (optional)"
92
+ fi
93
+ done
94
+
95
+ # 6. Skills
96
+ echo ""
97
+ echo "Skills:"
98
+ for skill in commit self-check evaluate think retro summary investigate; do
99
+ if [ -d ".claude/skills/${skill}" ]; then
100
+ ok "/${skill}"
101
+ else
102
+ warn "Missing /${skill} skill (optional)"
103
+ fi
104
+ done
105
+
106
+ # 7. jq
107
+ echo ""
108
+ echo "Dependencies:"
109
+ if command -v jq &>/dev/null; then
110
+ ok "jq installed ($(jq --version 2>&1))"
111
+ else
112
+ warn "jq not installed — hooks use grep/sed fallback, recommend: brew install jq"
113
+ fi
114
+
115
+ # 8. CLAUDE.md
116
+ echo ""
117
+ echo "Project files:"
118
+ if [ -f "CLAUDE.md" ]; then
119
+ if grep -q "\[TODO\]" CLAUDE.md 2>/dev/null; then
120
+ warn "CLAUDE.md has unfilled [TODO] sections"
121
+ else
122
+ ok "CLAUDE.md"
123
+ fi
124
+ else
125
+ warn "No CLAUDE.md found"
126
+ fi
127
+
128
+ if [ -f "docs/progress.md" ]; then
129
+ ok "docs/progress.md"
130
+ else
131
+ warn "No docs/progress.md"
132
+ fi
133
+
134
+ # Summary
135
+ echo ""
136
+ echo "──────────────────────"
137
+ if [ "$ISSUES" -eq 0 ] && [ "$WARNINGS" -eq 0 ]; then
138
+ echo -e "${GREEN}All checks passed!${NC}"
139
+ elif [ "$ISSUES" -eq 0 ]; then
140
+ echo -e "${YELLOW}${WARNINGS} warning(s), no critical issues${NC}"
141
+ else
142
+ echo -e "${RED}${ISSUES} issue(s), ${WARNINGS} warning(s)${NC}"
143
+ echo "Run 'npx cc-discipline upgrade' to fix missing files."
144
+ fi
145
+ echo ""
@@ -1,68 +1,68 @@
1
- #!/bin/bash
2
- # cc-discipline remove-stack — remove stack rules
3
- set -e
4
-
5
- GREEN='\033[0;32m'
6
- YELLOW='\033[1;33m'
7
- RED='\033[0;31m'
8
- NC='\033[0m'
9
-
10
- if [ -z "$1" ]; then
11
- echo "Usage: cc-discipline remove-stack <numbers>"
12
- echo " e.g.: cc-discipline remove-stack 1 2"
13
- echo ""
14
- echo "Stacks: 1=RTL 2=Embedded 3=Python 4=JS/TS 5=Mobile"
15
- exit 1
16
- fi
17
-
18
- if [ ! -f ".claude/.cc-discipline-version" ]; then
19
- echo -e "${RED}cc-discipline is not installed in this project.${NC}"
20
- exit 1
21
- fi
22
-
23
- for choice in "$@"; do
24
- case $choice in
25
- 1)
26
- FILE=".claude/rules/stacks/rtl.md"
27
- NAME="RTL"
28
- ;;
29
- 2)
30
- FILE=".claude/rules/stacks/embedded.md"
31
- NAME="Embedded"
32
- ;;
33
- 3)
34
- FILE=".claude/rules/stacks/python.md"
35
- NAME="Python"
36
- ;;
37
- 4)
38
- FILE=".claude/rules/stacks/js-ts.md"
39
- NAME="JS/TS"
40
- ;;
41
- 5)
42
- FILE=".claude/rules/stacks/mobile.md"
43
- NAME="Mobile"
44
- ;;
45
- *)
46
- echo -e "${YELLOW}Unknown stack: $choice (valid: 1-5)${NC}"
47
- continue
48
- ;;
49
- esac
50
-
51
- if [ -f "$FILE" ]; then
52
- rm "$FILE"
53
- echo -e "${GREEN}✓${NC} Removed $NAME stack ($FILE)"
54
- else
55
- echo -e "${YELLOW}!${NC} $NAME stack not installed, skipping"
56
- fi
57
- done
58
-
59
- echo ""
60
- echo "Done. Remaining stacks:"
61
- REMAINING=$(ls .claude/rules/stacks/*.md 2>/dev/null || true)
62
- if [ -n "$REMAINING" ]; then
63
- for f in $REMAINING; do
64
- echo " - $(basename "$f" .md)"
65
- done
66
- else
67
- echo " (none)"
68
- fi
1
+ #!/bin/bash
2
+ # cc-discipline remove-stack — remove stack rules
3
+ set -e
4
+
5
+ GREEN='\033[0;32m'
6
+ YELLOW='\033[1;33m'
7
+ RED='\033[0;31m'
8
+ NC='\033[0m'
9
+
10
+ if [ -z "$1" ]; then
11
+ echo "Usage: cc-discipline remove-stack <numbers>"
12
+ echo " e.g.: cc-discipline remove-stack 1 2"
13
+ echo ""
14
+ echo "Stacks: 1=RTL 2=Embedded 3=Python 4=JS/TS 5=Mobile"
15
+ exit 1
16
+ fi
17
+
18
+ if [ ! -f ".claude/.cc-discipline-version" ]; then
19
+ echo -e "${RED}cc-discipline is not installed in this project.${NC}"
20
+ exit 1
21
+ fi
22
+
23
+ for choice in "$@"; do
24
+ case $choice in
25
+ 1)
26
+ FILE=".claude/rules/stacks/rtl.md"
27
+ NAME="RTL"
28
+ ;;
29
+ 2)
30
+ FILE=".claude/rules/stacks/embedded.md"
31
+ NAME="Embedded"
32
+ ;;
33
+ 3)
34
+ FILE=".claude/rules/stacks/python.md"
35
+ NAME="Python"
36
+ ;;
37
+ 4)
38
+ FILE=".claude/rules/stacks/js-ts.md"
39
+ NAME="JS/TS"
40
+ ;;
41
+ 5)
42
+ FILE=".claude/rules/stacks/mobile.md"
43
+ NAME="Mobile"
44
+ ;;
45
+ *)
46
+ echo -e "${YELLOW}Unknown stack: $choice (valid: 1-5)${NC}"
47
+ continue
48
+ ;;
49
+ esac
50
+
51
+ if [ -f "$FILE" ]; then
52
+ rm "$FILE"
53
+ echo -e "${GREEN}✓${NC} Removed $NAME stack ($FILE)"
54
+ else
55
+ echo -e "${YELLOW}!${NC} $NAME stack not installed, skipping"
56
+ fi
57
+ done
58
+
59
+ echo ""
60
+ echo "Done. Remaining stacks:"
61
+ REMAINING=$(ls .claude/rules/stacks/*.md 2>/dev/null || true)
62
+ if [ -n "$REMAINING" ]; then
63
+ for f in $REMAINING; do
64
+ echo " - $(basename "$f" .md)"
65
+ done
66
+ else
67
+ echo " (none)"
68
+ fi
package/lib/status.sh CHANGED
@@ -1,100 +1,100 @@
1
- #!/bin/bash
2
- # cc-discipline status — show what's installed in the current project
3
- set -e
4
-
5
- GREEN='\033[0;32m'
6
- YELLOW='\033[1;33m'
7
- RED='\033[0;31m'
8
- NC='\033[0m'
9
-
10
- echo "cc-discipline status"
11
- echo "──────────────────────"
12
- echo ""
13
-
14
- # Version
15
- if [ -f ".claude/.cc-discipline-version" ]; then
16
- echo -e "Version: ${GREEN}$(cat .claude/.cc-discipline-version)${NC}"
17
- else
18
- echo -e "Version: ${RED}not installed${NC}"
19
- echo ""
20
- echo "Run 'npx cc-discipline init' to install."
21
- exit 0
22
- fi
23
-
24
- # Stacks
25
- echo -n "Stacks: "
26
- STACKS=""
27
- [ -f ".claude/rules/stacks/rtl.md" ] && STACKS="${STACKS}RTL "
28
- [ -f ".claude/rules/stacks/embedded.md" ] && STACKS="${STACKS}Embedded "
29
- [ -f ".claude/rules/stacks/python.md" ] && STACKS="${STACKS}Python "
30
- [ -f ".claude/rules/stacks/js-ts.md" ] && STACKS="${STACKS}JS/TS "
31
- [ -f ".claude/rules/stacks/mobile.md" ] && STACKS="${STACKS}Mobile "
32
- if [ -n "$STACKS" ]; then
33
- echo -e "${GREEN}${STACKS}${NC}"
34
- else
35
- echo -e "${YELLOW}General (no stack rules)${NC}"
36
- fi
37
-
38
- # Core rules
39
- CORE_COUNT=0
40
- for f in .claude/rules/0*.md; do
41
- [ -f "$f" ] && CORE_COUNT=$((CORE_COUNT + 1))
42
- done
43
- echo -e "Rules: ${GREEN}${CORE_COUNT} core rules${NC}"
44
-
45
- # Hooks
46
- echo -n "Hooks: "
47
- HOOKS=""
48
- [ -f ".claude/hooks/pre-edit-guard.sh" ] && HOOKS="${HOOKS}pre-edit-guard "
49
- [ -f ".claude/hooks/streak-breaker.sh" ] && HOOKS="${HOOKS}streak-breaker "
50
- [ -f ".claude/hooks/post-error-remind.sh" ] && HOOKS="${HOOKS}post-error-remind "
51
- [ -f ".claude/hooks/session-start.sh" ] && HOOKS="${HOOKS}session-start "
52
- [ -f ".claude/hooks/phase-gate.sh" ] && HOOKS="${HOOKS}phase-gate "
53
- [ -f ".claude/hooks/action-counter.sh" ] && HOOKS="${HOOKS}action-counter "
54
- [ -f ".claude/hooks/git-guard.sh" ] && HOOKS="${HOOKS}git-guard "
55
- HOOK_COUNT=$(echo "$HOOKS" | wc -w | tr -d ' ')
56
- echo -e "${GREEN}${HOOK_COUNT}/7${NC} (${HOOKS% })"
57
-
58
- # Agents
59
- echo -n "Agents: "
60
- AGENTS=""
61
- [ -f ".claude/agents/reviewer.md" ] && AGENTS="${AGENTS}reviewer "
62
- [ -f ".claude/agents/investigator.md" ] && AGENTS="${AGENTS}investigator "
63
- AGENT_COUNT=$(echo "$AGENTS" | wc -w | tr -d ' ')
64
- echo -e "${GREEN}${AGENT_COUNT}/2${NC} (${AGENTS% })"
65
-
66
- # Skills
67
- echo -n "Skills: "
68
- SKILLS=""
69
- [ -d ".claude/skills/commit" ] && SKILLS="${SKILLS}/commit "
70
- [ -d ".claude/skills/self-check" ] && SKILLS="${SKILLS}/self-check "
71
- [ -d ".claude/skills/evaluate" ] && SKILLS="${SKILLS}/evaluate "
72
- [ -d ".claude/skills/think" ] && SKILLS="${SKILLS}/think "
73
- [ -d ".claude/skills/retro" ] && SKILLS="${SKILLS}/retro "
74
- [ -d ".claude/skills/summary" ] && SKILLS="${SKILLS}/summary "
75
- [ -d ".claude/skills/investigate" ] && SKILLS="${SKILLS}/investigate "
76
- SKILL_COUNT=$(echo "$SKILLS" | wc -w | tr -d ' ')
77
- echo -e "${GREEN}${SKILL_COUNT}/7${NC} (${SKILLS% })"
78
-
79
- # Settings
80
- echo -n "Settings: "
81
- if [ -f ".claude/settings.json" ]; then
82
- if command -v jq &>/dev/null; then
83
- HOOK_EVENTS=$(jq -r '.hooks // {} | keys[]' .claude/settings.json 2>/dev/null | tr '\n' ' ')
84
- echo -e "${GREEN}registered${NC} (events: ${HOOK_EVENTS% })"
85
- else
86
- echo -e "${GREEN}exists${NC}"
87
- fi
88
- else
89
- echo -e "${RED}missing${NC}"
90
- fi
91
-
92
- # CLAUDE.md
93
- echo -n "CLAUDE.md: "
94
- if [ -f "CLAUDE.md" ]; then
95
- echo -e "${GREEN}exists${NC}"
96
- else
97
- echo -e "${YELLOW}missing${NC}"
98
- fi
99
-
100
- echo ""
1
+ #!/bin/bash
2
+ # cc-discipline status — show what's installed in the current project
3
+ set -e
4
+
5
+ GREEN='\033[0;32m'
6
+ YELLOW='\033[1;33m'
7
+ RED='\033[0;31m'
8
+ NC='\033[0m'
9
+
10
+ echo "cc-discipline status"
11
+ echo "──────────────────────"
12
+ echo ""
13
+
14
+ # Version
15
+ if [ -f ".claude/.cc-discipline-version" ]; then
16
+ echo -e "Version: ${GREEN}$(cat .claude/.cc-discipline-version)${NC}"
17
+ else
18
+ echo -e "Version: ${RED}not installed${NC}"
19
+ echo ""
20
+ echo "Run 'npx cc-discipline init' to install."
21
+ exit 0
22
+ fi
23
+
24
+ # Stacks
25
+ echo -n "Stacks: "
26
+ STACKS=""
27
+ [ -f ".claude/rules/stacks/rtl.md" ] && STACKS="${STACKS}RTL "
28
+ [ -f ".claude/rules/stacks/embedded.md" ] && STACKS="${STACKS}Embedded "
29
+ [ -f ".claude/rules/stacks/python.md" ] && STACKS="${STACKS}Python "
30
+ [ -f ".claude/rules/stacks/js-ts.md" ] && STACKS="${STACKS}JS/TS "
31
+ [ -f ".claude/rules/stacks/mobile.md" ] && STACKS="${STACKS}Mobile "
32
+ if [ -n "$STACKS" ]; then
33
+ echo -e "${GREEN}${STACKS}${NC}"
34
+ else
35
+ echo -e "${YELLOW}General (no stack rules)${NC}"
36
+ fi
37
+
38
+ # Core rules
39
+ CORE_COUNT=0
40
+ for f in .claude/rules/0*.md; do
41
+ [ -f "$f" ] && CORE_COUNT=$((CORE_COUNT + 1))
42
+ done
43
+ echo -e "Rules: ${GREEN}${CORE_COUNT} core rules${NC}"
44
+
45
+ # Hooks
46
+ echo -n "Hooks: "
47
+ HOOKS=""
48
+ [ -f ".claude/hooks/pre-edit-guard.sh" ] && HOOKS="${HOOKS}pre-edit-guard "
49
+ [ -f ".claude/hooks/streak-breaker.sh" ] && HOOKS="${HOOKS}streak-breaker "
50
+ [ -f ".claude/hooks/post-error-remind.sh" ] && HOOKS="${HOOKS}post-error-remind "
51
+ [ -f ".claude/hooks/session-start.sh" ] && HOOKS="${HOOKS}session-start "
52
+ [ -f ".claude/hooks/phase-gate.sh" ] && HOOKS="${HOOKS}phase-gate "
53
+ [ -f ".claude/hooks/action-counter.sh" ] && HOOKS="${HOOKS}action-counter "
54
+ [ -f ".claude/hooks/git-guard.sh" ] && HOOKS="${HOOKS}git-guard "
55
+ HOOK_COUNT=$(echo "$HOOKS" | wc -w | tr -d ' ')
56
+ echo -e "${GREEN}${HOOK_COUNT}/7${NC} (${HOOKS% })"
57
+
58
+ # Agents
59
+ echo -n "Agents: "
60
+ AGENTS=""
61
+ [ -f ".claude/agents/reviewer.md" ] && AGENTS="${AGENTS}reviewer "
62
+ [ -f ".claude/agents/investigator.md" ] && AGENTS="${AGENTS}investigator "
63
+ AGENT_COUNT=$(echo "$AGENTS" | wc -w | tr -d ' ')
64
+ echo -e "${GREEN}${AGENT_COUNT}/2${NC} (${AGENTS% })"
65
+
66
+ # Skills
67
+ echo -n "Skills: "
68
+ SKILLS=""
69
+ [ -d ".claude/skills/commit" ] && SKILLS="${SKILLS}/commit "
70
+ [ -d ".claude/skills/self-check" ] && SKILLS="${SKILLS}/self-check "
71
+ [ -d ".claude/skills/evaluate" ] && SKILLS="${SKILLS}/evaluate "
72
+ [ -d ".claude/skills/think" ] && SKILLS="${SKILLS}/think "
73
+ [ -d ".claude/skills/retro" ] && SKILLS="${SKILLS}/retro "
74
+ [ -d ".claude/skills/summary" ] && SKILLS="${SKILLS}/summary "
75
+ [ -d ".claude/skills/investigate" ] && SKILLS="${SKILLS}/investigate "
76
+ SKILL_COUNT=$(echo "$SKILLS" | wc -w | tr -d ' ')
77
+ echo -e "${GREEN}${SKILL_COUNT}/7${NC} (${SKILLS% })"
78
+
79
+ # Settings
80
+ echo -n "Settings: "
81
+ if [ -f ".claude/settings.json" ]; then
82
+ if command -v jq &>/dev/null; then
83
+ HOOK_EVENTS=$(jq -r '.hooks // {} | keys[]' .claude/settings.json 2>/dev/null | tr '\n' ' ')
84
+ echo -e "${GREEN}registered${NC} (events: ${HOOK_EVENTS% })"
85
+ else
86
+ echo -e "${GREEN}exists${NC}"
87
+ fi
88
+ else
89
+ echo -e "${RED}missing${NC}"
90
+ fi
91
+
92
+ # CLAUDE.md
93
+ echo -n "CLAUDE.md: "
94
+ if [ -f "CLAUDE.md" ]; then
95
+ echo -e "${GREEN}exists${NC}"
96
+ else
97
+ echo -e "${YELLOW}missing${NC}"
98
+ fi
99
+
100
+ echo ""