cleargate 0.8.1 → 0.10.0

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 (98) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/README.md +11 -0
  3. package/dist/MANIFEST.json +259 -28
  4. package/dist/{chunk-OM4FAEA7.js → chunk-Q3BTSXCK.js} +69 -3
  5. package/dist/chunk-Q3BTSXCK.js.map +1 -0
  6. package/dist/cli.cjs +2621 -548
  7. package/dist/cli.cjs.map +1 -1
  8. package/dist/cli.js +2548 -560
  9. package/dist/cli.js.map +1 -1
  10. package/dist/lib/ledger.cjs +120 -0
  11. package/dist/lib/ledger.cjs.map +1 -0
  12. package/dist/lib/ledger.d.cts +64 -0
  13. package/dist/lib/ledger.d.ts +64 -0
  14. package/dist/lib/ledger.js +96 -0
  15. package/dist/lib/ledger.js.map +1 -0
  16. package/dist/templates/cleargate-planning/.claude/agents/architect.md +10 -8
  17. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-contradict.md +108 -0
  18. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-ingest.md +49 -3
  19. package/dist/templates/cleargate-planning/.claude/agents/cleargate-wiki-lint.md +6 -1
  20. package/dist/templates/cleargate-planning/.claude/agents/developer.md +29 -2
  21. package/dist/templates/cleargate-planning/.claude/agents/qa.md +50 -1
  22. package/dist/templates/cleargate-planning/.claude/agents/reporter.md +31 -9
  23. package/dist/templates/cleargate-planning/.claude/hooks/pre-tool-use-task.sh +148 -0
  24. package/dist/templates/cleargate-planning/.claude/hooks/session-start.sh +6 -0
  25. package/dist/templates/cleargate-planning/.claude/hooks/token-ledger.sh +314 -96
  26. package/dist/templates/cleargate-planning/.claude/settings.json +4 -0
  27. package/dist/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +473 -0
  28. package/dist/templates/cleargate-planning/.cleargate/config.example.yml +19 -0
  29. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-enforcement.md +542 -0
  30. package/dist/templates/cleargate-planning/.cleargate/knowledge/cleargate-protocol.md +102 -428
  31. package/dist/templates/cleargate-planning/.cleargate/knowledge/readiness-gates.md +31 -0
  32. package/dist/templates/cleargate-planning/.cleargate/knowledge/sprint-closeout-checklist.md +71 -0
  33. package/dist/templates/cleargate-planning/.cleargate/scripts/assert_story_files.mjs +24 -2
  34. package/dist/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +387 -27
  35. package/dist/templates/cleargate-planning/.cleargate/scripts/dedupe_frontmatter.mjs +219 -0
  36. package/dist/templates/cleargate-planning/.cleargate/scripts/lib/report-filename.mjs +54 -0
  37. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_doc_refresh.mjs +378 -0
  38. package/dist/templates/cleargate-planning/.cleargate/scripts/prep_qa_context.mjs +888 -0
  39. package/dist/templates/cleargate-planning/.cleargate/scripts/sprint_trends.mjs +71 -0
  40. package/dist/templates/cleargate-planning/.cleargate/scripts/suggest_improvements.mjs +355 -13
  41. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_flashcard_gate.sh +20 -20
  42. package/dist/templates/cleargate-planning/.cleargate/scripts/test/test_prep_qa_context.sh +482 -0
  43. package/dist/templates/cleargate-planning/.cleargate/scripts/write_dispatch.sh +125 -0
  44. package/dist/templates/cleargate-planning/.cleargate/templates/Bug.md +33 -10
  45. package/dist/templates/cleargate-planning/.cleargate/templates/CR.md +41 -10
  46. package/dist/templates/cleargate-planning/.cleargate/templates/Sprint Plan Template.md +48 -14
  47. package/dist/templates/cleargate-planning/.cleargate/templates/epic.md +46 -12
  48. package/dist/templates/cleargate-planning/.cleargate/templates/hotfix.md +51 -1
  49. package/dist/templates/cleargate-planning/.cleargate/templates/initiative.md +98 -29
  50. package/dist/templates/cleargate-planning/.cleargate/templates/proposal.md +26 -13
  51. package/dist/templates/cleargate-planning/.cleargate/templates/sprint_report.md +23 -4
  52. package/dist/templates/cleargate-planning/.cleargate/templates/story.md +64 -12
  53. package/dist/templates/cleargate-planning/CLAUDE.md +28 -10
  54. package/dist/templates/cleargate-planning/MANIFEST.json +259 -28
  55. package/dist/{whoami-CX7CXJD5.js → whoami-W4U6DPVG.js} +17 -17
  56. package/dist/whoami-W4U6DPVG.js.map +1 -0
  57. package/package.json +13 -2
  58. package/templates/cleargate-planning/.claude/agents/architect.md +10 -8
  59. package/templates/cleargate-planning/.claude/agents/cleargate-wiki-contradict.md +108 -0
  60. package/templates/cleargate-planning/.claude/agents/cleargate-wiki-ingest.md +49 -3
  61. package/templates/cleargate-planning/.claude/agents/cleargate-wiki-lint.md +6 -1
  62. package/templates/cleargate-planning/.claude/agents/developer.md +29 -2
  63. package/templates/cleargate-planning/.claude/agents/qa.md +50 -1
  64. package/templates/cleargate-planning/.claude/agents/reporter.md +31 -9
  65. package/templates/cleargate-planning/.claude/hooks/pre-tool-use-task.sh +148 -0
  66. package/templates/cleargate-planning/.claude/hooks/session-start.sh +6 -0
  67. package/templates/cleargate-planning/.claude/hooks/token-ledger.sh +314 -96
  68. package/templates/cleargate-planning/.claude/settings.json +4 -0
  69. package/templates/cleargate-planning/.claude/skills/sprint-execution/SKILL.md +473 -0
  70. package/templates/cleargate-planning/.cleargate/config.example.yml +19 -0
  71. package/templates/cleargate-planning/.cleargate/knowledge/cleargate-enforcement.md +542 -0
  72. package/templates/cleargate-planning/.cleargate/knowledge/cleargate-protocol.md +102 -428
  73. package/templates/cleargate-planning/.cleargate/knowledge/readiness-gates.md +31 -0
  74. package/templates/cleargate-planning/.cleargate/knowledge/sprint-closeout-checklist.md +71 -0
  75. package/templates/cleargate-planning/.cleargate/scripts/assert_story_files.mjs +24 -2
  76. package/templates/cleargate-planning/.cleargate/scripts/close_sprint.mjs +387 -27
  77. package/templates/cleargate-planning/.cleargate/scripts/dedupe_frontmatter.mjs +219 -0
  78. package/templates/cleargate-planning/.cleargate/scripts/lib/report-filename.mjs +54 -0
  79. package/templates/cleargate-planning/.cleargate/scripts/prep_doc_refresh.mjs +378 -0
  80. package/templates/cleargate-planning/.cleargate/scripts/prep_qa_context.mjs +888 -0
  81. package/templates/cleargate-planning/.cleargate/scripts/sprint_trends.mjs +71 -0
  82. package/templates/cleargate-planning/.cleargate/scripts/suggest_improvements.mjs +355 -13
  83. package/templates/cleargate-planning/.cleargate/scripts/test/test_flashcard_gate.sh +20 -20
  84. package/templates/cleargate-planning/.cleargate/scripts/test/test_prep_qa_context.sh +482 -0
  85. package/templates/cleargate-planning/.cleargate/scripts/write_dispatch.sh +125 -0
  86. package/templates/cleargate-planning/.cleargate/templates/Bug.md +33 -10
  87. package/templates/cleargate-planning/.cleargate/templates/CR.md +41 -10
  88. package/templates/cleargate-planning/.cleargate/templates/Sprint Plan Template.md +48 -14
  89. package/templates/cleargate-planning/.cleargate/templates/epic.md +46 -12
  90. package/templates/cleargate-planning/.cleargate/templates/hotfix.md +51 -1
  91. package/templates/cleargate-planning/.cleargate/templates/initiative.md +98 -29
  92. package/templates/cleargate-planning/.cleargate/templates/sprint_report.md +23 -4
  93. package/templates/cleargate-planning/.cleargate/templates/story.md +64 -12
  94. package/templates/cleargate-planning/CLAUDE.md +28 -10
  95. package/templates/cleargate-planning/MANIFEST.json +259 -28
  96. package/dist/chunk-OM4FAEA7.js.map +0 -1
  97. package/dist/whoami-CX7CXJD5.js.map +0 -1
  98. package/templates/cleargate-planning/.cleargate/templates/proposal.md +0 -61
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env bash
2
+ # pre-tool-use-task.sh — PreToolUse:Task hook.
3
+ #
4
+ # CR-026: Auto-write a dispatch marker on every Task() spawn so the
5
+ # SubagentStop hook (token-ledger.sh) can attribute tokens to the correct
6
+ # work item and agent without relying on transcript-grep heuristics.
7
+ #
8
+ # This hook addresses BUG-024 §3.1 Defect 3: manual write_dispatch.sh calls
9
+ # were unreliable (~5 calls vs ~19 spawns in SPRINT-18). The hook fires
10
+ # automatically on every Task() spawn inside the orchestrator session.
11
+ #
12
+ # Input: JSON on stdin from Claude Code with fields:
13
+ # session_id, transcript_path, cwd, hook_event_name, tool_name, tool_input
14
+ # For tool_name == "Task", tool_input has: subagent_type, description, prompt.
15
+ #
16
+ # Output: writes .cleargate/sprint-runs/<sprint>/.dispatch-<ts>-<pid>-<rand>.json
17
+ # with { work_item_id, agent_type, spawned_at, session_id, writer }
18
+ # Uniquified filename prevents collision under parallel Task() spawns.
19
+ # SubagentStop hook uses newest-file lookup (ls -t) to consume it.
20
+ #
21
+ # Log: .cleargate/hook-log/pre-tool-use-task.log
22
+ #
23
+ # Exit code: 0 always. Never blocks a Task spawn.
24
+ #
25
+ # Banner-immunity: reads tool_input.prompt directly from the JSON payload —
26
+ # no transcript involvement, so the SessionStart blocked-items banner cannot
27
+ # poison this path (contrast with token-ledger.sh's transcript-grep fallback).
28
+
29
+ set -u
30
+
31
+ # ─── Resolve repo root (matches token-ledger.sh:59 + write_dispatch.sh:30) ───
32
+ REPO_ROOT="${ORCHESTRATOR_PROJECT_DIR:-${CLAUDE_PROJECT_DIR}}"
33
+ LOG_DIR="${REPO_ROOT}/.cleargate/hook-log"
34
+ mkdir -p "${LOG_DIR}"
35
+ HOOK_LOG="${LOG_DIR}/pre-tool-use-task.log"
36
+ ACTIVE_SENTINEL="${REPO_ROOT}/.cleargate/sprint-runs/.active"
37
+
38
+ TS="$(date -u +%FT%TZ)"
39
+
40
+ # Read stdin once
41
+ INPUT="$(cat)"
42
+
43
+ # ─── Extract tool_name to confirm this is a Task spawn ────────────────────────
44
+ TOOL_NAME="$(printf '%s' "${INPUT}" | jq -r '.tool_name // empty' 2>/dev/null)"
45
+ if [[ "${TOOL_NAME}" != "Task" ]]; then
46
+ # Not a Task spawn — nothing to do; exit silently.
47
+ exit 0
48
+ fi
49
+
50
+ # ─── Resolve active sprint via sentinel ───────────────────────────────────────
51
+ if [[ ! -f "${ACTIVE_SENTINEL}" ]]; then
52
+ printf '[%s] no .active sentinel — dispatch marker skipped (off-sprint)\n' "${TS}" >> "${HOOK_LOG}"
53
+ exit 0
54
+ fi
55
+
56
+ SPRINT_ID="$(tr -d '[:space:]' < "${ACTIVE_SENTINEL}")"
57
+ if [[ -z "${SPRINT_ID}" ]]; then
58
+ printf '[%s] .active sentinel is empty — dispatch marker skipped\n' "${TS}" >> "${HOOK_LOG}"
59
+ exit 0
60
+ fi
61
+
62
+ SPRINT_DIR="${REPO_ROOT}/.cleargate/sprint-runs/${SPRINT_ID}"
63
+ mkdir -p "${SPRINT_DIR}"
64
+
65
+ # ─── Extract subagent_type ────────────────────────────────────────────────────
66
+ AGENT_TYPE="$(printf '%s' "${INPUT}" | jq -r '.tool_input.subagent_type // empty' 2>/dev/null)"
67
+ ALLOW_LIST="architect developer qa reporter cleargate-wiki-contradict"
68
+ if [[ -z "${AGENT_TYPE}" ]] || ! printf '%s\n' ${ALLOW_LIST} | grep -qxF "${AGENT_TYPE}"; then
69
+ printf '[%s] no marker: agent_type absent or not in allow-list (%s)\n' "${TS}" "${AGENT_TYPE:-<empty>}" >> "${HOOK_LOG}"
70
+ exit 0
71
+ fi
72
+
73
+ # ─── Extract work_item_id from first 5 lines of tool_input.prompt ─────────────
74
+ # Regex: (STORY=?NNN-NN | BUG-NNN | EPIC-NNN | CR-NNN | PROPOSAL-NNN | HOTFIX-NNN)
75
+ PROMPT_HEAD="$(printf '%s' "${INPUT}" | jq -r '.tool_input.prompt // ""' 2>/dev/null | head -5)"
76
+ if [[ -z "${PROMPT_HEAD}" ]]; then
77
+ printf '[%s] no marker: prompt empty or unreadable\n' "${TS}" >> "${HOOK_LOG}"
78
+ exit 0
79
+ fi
80
+
81
+ WORK_ITEM_RAW="$(printf '%s' "${PROMPT_HEAD}" \
82
+ | grep -oE '(STORY=?[0-9]{3}-[0-9]{2}|BUG-[0-9]+|EPIC-[0-9]+|CR-[0-9]+|PROPOSAL-[0-9]+|HOTFIX-[0-9]+)' \
83
+ | head -1)"
84
+
85
+ if [[ -z "${WORK_ITEM_RAW}" ]]; then
86
+ printf '[%s] no marker: regex miss (agent=%s prompt_head=%s)\n' \
87
+ "${TS}" "${AGENT_TYPE}" "$(printf '%s' "${PROMPT_HEAD}" | head -1 | cut -c1-60)" >> "${HOOK_LOG}"
88
+ exit 0
89
+ fi
90
+
91
+ # Normalize STORY=NNN-NN → STORY-NNN-NN
92
+ WORK_ITEM_ID="$(printf '%s' "${WORK_ITEM_RAW}" | sed 's/=/\-/')"
93
+
94
+ # ─── Resolve orchestrator session ID ─────────────────────────────────────────
95
+ # Path-B: uniquified filename makes session ID irrelevant for lookup.
96
+ # We embed it in the JSON body for forensic value only.
97
+ # GOTCHA-5: CLAUDE_SESSION_ID may be unset on nested spawns; fall back to stdin payload.
98
+ SESSION_ID="${CLAUDE_SESSION_ID:-}"
99
+ if [[ -z "${SESSION_ID}" ]]; then
100
+ SESSION_ID="$(printf '%s' "${INPUT}" | jq -r '.session_id // empty' 2>/dev/null)"
101
+ fi
102
+ [[ -z "${SESSION_ID}" ]] && SESSION_ID="unknown"
103
+
104
+ # ─── Resolve cleargate version ────────────────────────────────────────────────
105
+ PKG_JSON="${REPO_ROOT}/cleargate-cli/package.json"
106
+ CG_VERSION="unknown"
107
+ if [[ -f "${PKG_JSON}" ]]; then
108
+ CG_VERSION="$(jq -r '.version // "unknown"' "${PKG_JSON}" 2>/dev/null || echo "unknown")"
109
+ fi
110
+
111
+ # ─── Write dispatch file atomically (mktemp + mv, matches write_dispatch.sh:110-112) ──
112
+ # Uniquified filename: .dispatch-<ts-epoch>-<pid>-<random>.json
113
+ # Prevents collision under parallel Task() spawns; newest-file lookup at SubagentStop.
114
+ SPAWNED_AT="${TS}"
115
+ DISPATCH_FILENAME=".dispatch-$(date -u +%s)-$$-${RANDOM}.json"
116
+ DISPATCH_TARGET="${SPRINT_DIR}/${DISPATCH_FILENAME}"
117
+
118
+ DISPATCH_JSON="$(jq -cn \
119
+ --arg work_item_id "${WORK_ITEM_ID}" \
120
+ --arg agent_type "${AGENT_TYPE}" \
121
+ --arg spawned_at "${SPAWNED_AT}" \
122
+ --arg session_id "${SESSION_ID}" \
123
+ --arg writer "pre-tool-use-task.sh@cleargate-${CG_VERSION}" \
124
+ '{
125
+ work_item_id: $work_item_id,
126
+ agent_type: $agent_type,
127
+ spawned_at: $spawned_at,
128
+ session_id: $session_id,
129
+ writer: $writer
130
+ }' 2>/dev/null)"
131
+
132
+ if [[ -z "${DISPATCH_JSON}" ]]; then
133
+ printf '[%s] error: jq failed to build dispatch JSON\n' "${TS}" >> "${HOOK_LOG}"
134
+ exit 0
135
+ fi
136
+
137
+ TMP="$(mktemp "${SPRINT_DIR}/.dispatch-tmp-XXXXXX" 2>/dev/null)"
138
+ if [[ -z "${TMP}" ]]; then
139
+ printf '[%s] error: mktemp failed for dispatch file\n' "${TS}" >> "${HOOK_LOG}"
140
+ exit 0
141
+ fi
142
+ printf '%s\n' "${DISPATCH_JSON}" > "${TMP}"
143
+ mv "${TMP}" "${DISPATCH_TARGET}"
144
+
145
+ printf '[%s] wrote dispatch: sprint=%s work_item=%s agent=%s file=%s\n' \
146
+ "${TS}" "${SPRINT_ID}" "${WORK_ITEM_ID}" "${AGENT_TYPE}" "${DISPATCH_FILENAME}" >> "${HOOK_LOG}"
147
+
148
+ exit 0
@@ -17,6 +17,12 @@ fi
17
17
 
18
18
  "${CG[@]}" doctor --session-start || true
19
19
 
20
+ # --- Sprint-active skill auto-load directive (STORY-026-01) ---
21
+ ACTIVE_FILE="${REPO_ROOT}/.cleargate/sprint-runs/.active"
22
+ if [ -s "${ACTIVE_FILE}" ] && [ -n "$(tr -d '[:space:]' < "${ACTIVE_FILE}")" ]; then
23
+ printf '→ Active sprint detected. Load skill: sprint-execution\n'
24
+ fi
25
+
20
26
  # ── §14.9 SessionStart sync nudge (STORY-010-08) ─────────────────────────────
21
27
  # Daily-throttled: probe remote for updates at most once per 24h.
22
28
  # Never auto-pulls or auto-pushes. Exits 0 regardless of outcome.