create-issflow 1.0.0 → 1.0.2
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 +56 -41
- package/bin/cli.js +259 -96
- package/package.json +28 -23
- package/template/.claude/agents/debugger.md +47 -47
- package/template/.claude/agents/e2e-runner.md +66 -56
- package/template/.claude/agents/implementer.md +75 -75
- package/template/.claude/agents/planner.md +71 -65
- package/template/.claude/agents/researcher.md +103 -103
- package/template/.claude/agents/synthesizer.md +72 -72
- package/template/.claude/agents/test-author.md +70 -70
- package/template/.claude/commands/log-decision.md +33 -33
- package/template/.claude/commands/log-issue.md +28 -28
- package/template/.claude/commands/overview.md +99 -98
- package/template/.claude/commands/phase.md +202 -191
- package/template/.claude/commands/quick.md +30 -30
- package/template/.claude/commands/replan.md +63 -63
- package/template/.claude/commands/store-wisdom.md +195 -194
- package/template/.claude/commands/synthesize.md +26 -26
- package/template/.claude/commands/unstuck.md +40 -40
- package/template/.claude/hooks/pre-compact.sh +25 -25
- package/template/.claude/hooks/session-start.sh +120 -120
- package/template/.claude/hooks/subagent-stop.sh +11 -11
- package/template/.claude/istartsoft-flow/METHODOLOGY.md +229 -214
- package/template/.claude/skills/caveman/SKILL.md +39 -39
- package/template/.claude/skills/grill-me/SKILL.md +10 -10
- package/template/.claude/skills/karpathy-guidelines/SKILL.md +34 -34
- package/template/.claude/skills/ux-design/SKILL.md +99 -0
- package/template/.claude/skills/ux-design/wireframe-template.md +95 -0
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SessionStart hook. stdout is injected into Claude's context every session.
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
cd "${CLAUDE_PROJECT_DIR:-.}"
|
|
5
|
-
|
|
6
|
-
emit () { printf '%s\n' "$1"; }
|
|
7
|
-
|
|
8
|
-
emit "=== iStartSoftFlow AUTO-CONTEXT (injected by hook, NOT optional) ==="
|
|
9
|
-
emit ""
|
|
10
|
-
|
|
11
|
-
# 1. git state
|
|
12
|
-
emit "## Git"
|
|
13
|
-
emit "branch: $(git branch --show-current 2>/dev/null || echo n/a)"
|
|
14
|
-
emit "uncommitted: $(git status --short 2>/dev/null | wc -l | tr -d ' ') file(s)"
|
|
15
|
-
git log --oneline -3 2>/dev/null | sed 's/^/ /' || true
|
|
16
|
-
emit ""
|
|
17
|
-
|
|
18
|
-
# 2. active state
|
|
19
|
-
if [ -f docs/STATE.md ]; then
|
|
20
|
-
emit "## STATE.md (current position - READ THIS FIRST)"
|
|
21
|
-
cat docs/STATE.md
|
|
22
|
-
emit ""
|
|
23
|
-
else
|
|
24
|
-
emit "## STATE.md missing -> run /overview to bootstrap the project."
|
|
25
|
-
emit ""
|
|
26
|
-
fi
|
|
27
|
-
|
|
28
|
-
# 3. issue log
|
|
29
|
-
if [ -f docs/ISSUES.md ]; then
|
|
30
|
-
OPEN=$(grep -c '^- \[ \]' docs/ISSUES.md 2>/dev/null || true)
|
|
31
|
-
OPEN=${OPEN:-0}
|
|
32
|
-
emit "## ISSUES.md (${OPEN} open) - check this before debugging anything"
|
|
33
|
-
awk '/^### / {p=1} p' docs/ISSUES.md 2>/dev/null | head -100
|
|
34
|
-
emit ""
|
|
35
|
-
fi
|
|
36
|
-
|
|
37
|
-
# 3b. research index
|
|
38
|
-
if [ -f docs/research/INDEX.md ]; then
|
|
39
|
-
RCOUNT=$(grep -c '^[0-9]' docs/research/INDEX.md 2>/dev/null || true)
|
|
40
|
-
RCOUNT=${RCOUNT:-0}
|
|
41
|
-
emit "## research/INDEX.md (${RCOUNT} prior investigations)"
|
|
42
|
-
emit "grep this before any new research or debugging."
|
|
43
|
-
grep '^[0-9]' docs/research/INDEX.md 2>/dev/null | tail -15 | sed 's/^/ /' || true
|
|
44
|
-
emit ""
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# 3d. shared KB — pull latest + load snapshot
|
|
49
|
-
KB_CONFIG=".claude/kb-config.json"
|
|
50
|
-
if [ -f "$KB_CONFIG" ]; then
|
|
51
|
-
KB_PATH=$(python3 -c "import json; print(json.load(open('$KB_CONFIG')).get('kb_path',''))" 2>/dev/null || echo "")
|
|
52
|
-
KB_PATH_EXPANDED="${KB_PATH/#\~/$HOME}"
|
|
53
|
-
|
|
54
|
-
if [ -n "$KB_PATH_EXPANDED" ] && [ -d "$KB_PATH_EXPANDED" ]; then
|
|
55
|
-
emit "## Shared KB"
|
|
56
|
-
|
|
57
|
-
# Pull latest (fail silently — offline or no remote shouldn't break session start)
|
|
58
|
-
if git -C "$KB_PATH_EXPANDED" pull --ff-only --quiet 2>/dev/null; then
|
|
59
|
-
emit "KB pulled: OK"
|
|
60
|
-
else
|
|
61
|
-
emit "KB pull skipped (offline or conflict — using local copy)"
|
|
62
|
-
fi
|
|
63
|
-
|
|
64
|
-
# Load INDEX.md into session snapshot
|
|
65
|
-
KB_INDEX="${KB_PATH_EXPANDED}/INDEX.md"
|
|
66
|
-
SNAPSHOT="docs/.kb-snapshot.md"
|
|
67
|
-
|
|
68
|
-
if [ -f "$KB_INDEX" ]; then
|
|
69
|
-
TODAY=$(date +%Y-%m-%d)
|
|
70
|
-
CUTOFF=$(date -d "6 months ago" +%Y-%m-%d 2>/dev/null \
|
|
71
|
-
|| python3 -c "from datetime import date, timedelta; print((date.today() - timedelta(days=180)).isoformat())" 2>/dev/null \
|
|
72
|
-
|| echo "2000-01-01")
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
echo "# KB snapshot — loaded $(date +%Y-%m-%d)"
|
|
76
|
-
echo "# Stale = created date older than ${CUTOFF}"
|
|
77
|
-
echo ""
|
|
78
|
-
while IFS='|' read -r entry_date domain slug summary rest; do
|
|
79
|
-
entry_date=$(echo "$entry_date" | tr -d ' ')
|
|
80
|
-
# Mark stale if date field present and older than cutoff
|
|
81
|
-
if [ -n "$entry_date" ] && [[ "$entry_date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
|
|
82
|
-
if [[ "$entry_date" < "$CUTOFF" ]]; then
|
|
83
|
-
echo "[STALE] ${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
84
|
-
else
|
|
85
|
-
echo "${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
86
|
-
fi
|
|
87
|
-
else
|
|
88
|
-
echo "${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
89
|
-
fi
|
|
90
|
-
done < <(grep -v '^#' "$KB_INDEX" | grep -v '^$')
|
|
91
|
-
} > "$SNAPSHOT"
|
|
92
|
-
|
|
93
|
-
TOTAL=$(grep -c '|' "$SNAPSHOT" 2>/dev/null || echo 0)
|
|
94
|
-
STALE=$(grep -c '^\[STALE\]' "$SNAPSHOT" 2>/dev/null || echo 0)
|
|
95
|
-
emit "KB snapshot loaded: ${TOTAL} entries (${STALE} stale — researcher will re-research these)"
|
|
96
|
-
emit "Snapshot at docs/.kb-snapshot.md — researcher reads this before web search."
|
|
97
|
-
else
|
|
98
|
-
emit "KB INDEX.md not found at ${KB_PATH_EXPANDED} — run /store-wisdom to populate it."
|
|
99
|
-
fi
|
|
100
|
-
emit ""
|
|
101
|
-
else
|
|
102
|
-
emit "## Shared KB: configured but path not found (${KB_PATH})"
|
|
103
|
-
emit "
|
|
104
|
-
emit ""
|
|
105
|
-
fi
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
# 4. hard rule reminder
|
|
109
|
-
emit "## RULES (enforced this session)"
|
|
110
|
-
emit "- caveman ULTRA mode is active."
|
|
111
|
-
emit "- before debugging ANY error: grep ISSUES.md AND research/INDEX.md first."
|
|
112
|
-
emit "- debug attempts: WARN at 2; first hard-stop at 3 STOPS and asks you."
|
|
113
|
-
emit "- end of every phase: run /synthesize, then /clear."
|
|
114
|
-
emit "- small obvious change? use /quick, not /phase."
|
|
115
|
-
if [ -f "$KB_CONFIG" ]; then
|
|
116
|
-
emit "- KB active: researcher checks docs/.kb-snapshot.md before web search."
|
|
117
|
-
emit "- learned something worth keeping? run /store-wisdom."
|
|
118
|
-
fi
|
|
119
|
-
emit "=== END AUTO-CONTEXT ==="
|
|
120
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SessionStart hook. stdout is injected into Claude's context every session.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
cd "${CLAUDE_PROJECT_DIR:-.}"
|
|
5
|
+
|
|
6
|
+
emit () { printf '%s\n' "$1"; }
|
|
7
|
+
|
|
8
|
+
emit "=== iStartSoftFlow AUTO-CONTEXT (injected by hook, NOT optional) ==="
|
|
9
|
+
emit ""
|
|
10
|
+
|
|
11
|
+
# 1. git state
|
|
12
|
+
emit "## Git"
|
|
13
|
+
emit "branch: $(git branch --show-current 2>/dev/null || echo n/a)"
|
|
14
|
+
emit "uncommitted: $(git status --short 2>/dev/null | wc -l | tr -d ' ') file(s)"
|
|
15
|
+
git log --oneline -3 2>/dev/null | sed 's/^/ /' || true
|
|
16
|
+
emit ""
|
|
17
|
+
|
|
18
|
+
# 2. active state
|
|
19
|
+
if [ -f docs/STATE.md ]; then
|
|
20
|
+
emit "## STATE.md (current position - READ THIS FIRST)"
|
|
21
|
+
cat docs/STATE.md
|
|
22
|
+
emit ""
|
|
23
|
+
else
|
|
24
|
+
emit "## STATE.md missing -> run /overview to bootstrap the project."
|
|
25
|
+
emit ""
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# 3. issue log
|
|
29
|
+
if [ -f docs/ISSUES.md ]; then
|
|
30
|
+
OPEN=$(grep -c '^- \[ \]' docs/ISSUES.md 2>/dev/null || true)
|
|
31
|
+
OPEN=${OPEN:-0}
|
|
32
|
+
emit "## ISSUES.md (${OPEN} open) - check this before debugging anything"
|
|
33
|
+
awk '/^### / {p=1} p' docs/ISSUES.md 2>/dev/null | head -100
|
|
34
|
+
emit ""
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# 3b. research index
|
|
38
|
+
if [ -f docs/research/INDEX.md ]; then
|
|
39
|
+
RCOUNT=$(grep -c '^[0-9]' docs/research/INDEX.md 2>/dev/null || true)
|
|
40
|
+
RCOUNT=${RCOUNT:-0}
|
|
41
|
+
emit "## research/INDEX.md (${RCOUNT} prior investigations)"
|
|
42
|
+
emit "grep this before any new research or debugging."
|
|
43
|
+
grep '^[0-9]' docs/research/INDEX.md 2>/dev/null | tail -15 | sed 's/^/ /' || true
|
|
44
|
+
emit ""
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# 3d. shared KB — pull latest + load snapshot
|
|
49
|
+
KB_CONFIG=".claude/kb-config.json"
|
|
50
|
+
if [ -f "$KB_CONFIG" ]; then
|
|
51
|
+
KB_PATH=$(python3 -c "import json; print(json.load(open('$KB_CONFIG')).get('kb_path',''))" 2>/dev/null || echo "")
|
|
52
|
+
KB_PATH_EXPANDED="${KB_PATH/#\~/$HOME}"
|
|
53
|
+
|
|
54
|
+
if [ -n "$KB_PATH_EXPANDED" ] && [ -d "$KB_PATH_EXPANDED" ]; then
|
|
55
|
+
emit "## Shared KB"
|
|
56
|
+
|
|
57
|
+
# Pull latest (fail silently — offline or no remote shouldn't break session start)
|
|
58
|
+
if git -C "$KB_PATH_EXPANDED" pull --ff-only --quiet 2>/dev/null; then
|
|
59
|
+
emit "KB pulled: OK"
|
|
60
|
+
else
|
|
61
|
+
emit "KB pull skipped (offline or conflict — using local copy)"
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# Load INDEX.md into session snapshot
|
|
65
|
+
KB_INDEX="${KB_PATH_EXPANDED}/INDEX.md"
|
|
66
|
+
SNAPSHOT="docs/.kb-snapshot.md"
|
|
67
|
+
|
|
68
|
+
if [ -f "$KB_INDEX" ]; then
|
|
69
|
+
TODAY=$(date +%Y-%m-%d)
|
|
70
|
+
CUTOFF=$(date -d "6 months ago" +%Y-%m-%d 2>/dev/null \
|
|
71
|
+
|| python3 -c "from datetime import date, timedelta; print((date.today() - timedelta(days=180)).isoformat())" 2>/dev/null \
|
|
72
|
+
|| echo "2000-01-01")
|
|
73
|
+
|
|
74
|
+
{
|
|
75
|
+
echo "# KB snapshot — loaded $(date +%Y-%m-%d)"
|
|
76
|
+
echo "# Stale = created date older than ${CUTOFF}"
|
|
77
|
+
echo ""
|
|
78
|
+
while IFS='|' read -r entry_date domain slug summary rest; do
|
|
79
|
+
entry_date=$(echo "$entry_date" | tr -d ' ')
|
|
80
|
+
# Mark stale if date field present and older than cutoff
|
|
81
|
+
if [ -n "$entry_date" ] && [[ "$entry_date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
|
|
82
|
+
if [[ "$entry_date" < "$CUTOFF" ]]; then
|
|
83
|
+
echo "[STALE] ${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
84
|
+
else
|
|
85
|
+
echo "${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
86
|
+
fi
|
|
87
|
+
else
|
|
88
|
+
echo "${entry_date} |${domain} |${slug} |${summary} |${rest}"
|
|
89
|
+
fi
|
|
90
|
+
done < <(grep -v '^#' "$KB_INDEX" | grep -v '^$')
|
|
91
|
+
} > "$SNAPSHOT"
|
|
92
|
+
|
|
93
|
+
TOTAL=$(grep -c '|' "$SNAPSHOT" 2>/dev/null || echo 0)
|
|
94
|
+
STALE=$(grep -c '^\[STALE\]' "$SNAPSHOT" 2>/dev/null || echo 0)
|
|
95
|
+
emit "KB snapshot loaded: ${TOTAL} entries (${STALE} stale — researcher will re-research these)"
|
|
96
|
+
emit "Snapshot at docs/.kb-snapshot.md — researcher reads this before web search."
|
|
97
|
+
else
|
|
98
|
+
emit "KB INDEX.md not found at ${KB_PATH_EXPANDED} — run /store-wisdom to populate it."
|
|
99
|
+
fi
|
|
100
|
+
emit ""
|
|
101
|
+
else
|
|
102
|
+
emit "## Shared KB: configured but path not found (${KB_PATH})"
|
|
103
|
+
emit "Fix kb_path in .claude/kb-config.json (or re-run: npx create-issflow)."
|
|
104
|
+
emit ""
|
|
105
|
+
fi
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# 4. hard rule reminder
|
|
109
|
+
emit "## RULES (enforced this session)"
|
|
110
|
+
emit "- caveman ULTRA mode is active."
|
|
111
|
+
emit "- before debugging ANY error: grep ISSUES.md AND research/INDEX.md first."
|
|
112
|
+
emit "- debug attempts: WARN at 2; first hard-stop at 3 STOPS and asks you."
|
|
113
|
+
emit "- end of every phase: run /synthesize, then /clear."
|
|
114
|
+
emit "- small obvious change? use /quick, not /phase."
|
|
115
|
+
if [ -f "$KB_CONFIG" ]; then
|
|
116
|
+
emit "- KB active: researcher checks docs/.kb-snapshot.md before web search."
|
|
117
|
+
emit "- learned something worth keeping? run /store-wisdom."
|
|
118
|
+
fi
|
|
119
|
+
emit "=== END AUTO-CONTEXT ==="
|
|
120
|
+
exit 0
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# SubagentStop hook.
|
|
3
|
-
set -euo pipefail
|
|
4
|
-
cd "${CLAUDE_PROJECT_DIR:-.}"
|
|
5
|
-
|
|
6
|
-
mkdir -p docs/.snapshots
|
|
7
|
-
LOG="docs/.snapshots/agent-trace.log"
|
|
8
|
-
echo "$(date +%H:%M:%S) subagent finished" >> "$LOG"
|
|
9
|
-
|
|
10
|
-
tail -n 50 "$LOG" > "$LOG.tmp" 2>/dev/null && mv "$LOG.tmp" "$LOG" || true
|
|
11
|
-
exit 0
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SubagentStop hook.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
cd "${CLAUDE_PROJECT_DIR:-.}"
|
|
5
|
+
|
|
6
|
+
mkdir -p docs/.snapshots
|
|
7
|
+
LOG="docs/.snapshots/agent-trace.log"
|
|
8
|
+
echo "$(date +%H:%M:%S) subagent finished" >> "$LOG"
|
|
9
|
+
|
|
10
|
+
tail -n 50 "$LOG" > "$LOG.tmp" 2>/dev/null && mv "$LOG.tmp" "$LOG" || true
|
|
11
|
+
exit 0
|