@howlil/ez-agents 3.4.2 → 3.5.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.
- package/README.md +77 -2
- package/agents/ez-observer-agent.md +260 -0
- package/agents/ez-release-agent.md +333 -0
- package/agents/ez-requirements-agent.md +377 -0
- package/agents/ez-scrum-master-agent.md +242 -0
- package/agents/ez-tech-lead-agent.md +267 -0
- package/bin/install.js +3221 -3272
- package/commands/ez/arch-review.md +102 -0
- package/commands/ez/execute-phase.md +11 -0
- package/commands/ez/export-session.md +79 -0
- package/commands/ez/gather-requirements.md +117 -0
- package/commands/ez/git-workflow.md +72 -0
- package/commands/ez/hotfix.md +120 -0
- package/commands/ez/import-session.md +82 -0
- package/commands/ez/list-sessions.md +96 -0
- package/commands/ez/package-manager.md +316 -0
- package/commands/ez/plan-phase.md +9 -1
- package/commands/ez/preflight.md +79 -0
- package/commands/ez/progress.md +13 -1
- package/commands/ez/release.md +153 -0
- package/commands/ez/resume.md +107 -0
- package/commands/ez/standup.md +85 -0
- package/ez-agents/bin/ez-tools.cjs +1095 -716
- package/ez-agents/bin/lib/bdd-validator.cjs +622 -0
- package/ez-agents/bin/lib/content-scanner.cjs +238 -0
- package/ez-agents/bin/lib/context-cache.cjs +154 -0
- package/ez-agents/bin/lib/context-errors.cjs +71 -0
- package/ez-agents/bin/lib/context-manager.cjs +220 -0
- package/ez-agents/bin/lib/discussion-synthesizer.cjs +458 -0
- package/ez-agents/bin/lib/file-access.cjs +207 -0
- package/ez-agents/bin/lib/git-errors.cjs +83 -0
- package/ez-agents/bin/lib/git-utils.cjs +321 -203
- package/ez-agents/bin/lib/git-workflow-engine.cjs +1157 -0
- package/ez-agents/bin/lib/index.cjs +46 -2
- package/ez-agents/bin/lib/lockfile-validator.cjs +227 -0
- package/ez-agents/bin/lib/logger.cjs +124 -154
- package/ez-agents/bin/lib/memory-compression.cjs +256 -0
- package/ez-agents/bin/lib/metrics-tracker.cjs +406 -0
- package/ez-agents/bin/lib/package-manager-detector.cjs +203 -0
- package/ez-agents/bin/lib/package-manager-executor.cjs +385 -0
- package/ez-agents/bin/lib/package-manager-service.cjs +216 -0
- package/ez-agents/bin/lib/release-validator.cjs +614 -0
- package/ez-agents/bin/lib/safe-exec.cjs +128 -214
- package/ez-agents/bin/lib/session-chain.cjs +304 -0
- package/ez-agents/bin/lib/session-errors.cjs +81 -0
- package/ez-agents/bin/lib/session-export.cjs +251 -0
- package/ez-agents/bin/lib/session-import.cjs +262 -0
- package/ez-agents/bin/lib/session-manager.cjs +280 -0
- package/ez-agents/bin/lib/tier-manager.cjs +428 -0
- package/ez-agents/bin/lib/url-fetch.cjs +170 -0
- package/ez-agents/references/metrics-schema.md +118 -0
- package/ez-agents/references/planning-config.md +140 -0
- package/ez-agents/references/tier-strategy.md +103 -0
- package/ez-agents/templates/bdd-feature.md +173 -0
- package/ez-agents/templates/discussion.md +68 -0
- package/ez-agents/templates/incident-runbook.md +205 -0
- package/ez-agents/templates/release-checklist.md +133 -0
- package/ez-agents/templates/rollback-plan.md +201 -0
- package/ez-agents/workflows/arch-review.md +54 -0
- package/ez-agents/workflows/autonomous.md +844 -743
- package/ez-agents/workflows/execute-phase.md +45 -0
- package/ez-agents/workflows/export-session.md +255 -0
- package/ez-agents/workflows/gather-requirements.md +206 -0
- package/ez-agents/workflows/help.md +92 -0
- package/ez-agents/workflows/hotfix.md +291 -0
- package/ez-agents/workflows/import-session.md +303 -0
- package/ez-agents/workflows/new-milestone.md +713 -384
- package/ez-agents/workflows/new-project.md +1107 -1113
- package/ez-agents/workflows/plan-phase.md +22 -0
- package/ez-agents/workflows/progress.md +15 -25
- package/ez-agents/workflows/release.md +253 -0
- package/ez-agents/workflows/resume-session.md +215 -0
- package/ez-agents/workflows/standup.md +64 -0
- package/package.json +9 -2
|
@@ -40,6 +40,28 @@ mkdir -p ".planning/phases/${padded_phase}-${phase_slug}"
|
|
|
40
40
|
|
|
41
41
|
**Existing artifacts from init:** `has_research`, `has_plans`, `plan_count`.
|
|
42
42
|
|
|
43
|
+
<auto_invoke>
|
|
44
|
+
Check for --no-auto in ARGUMENTS. If not present:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
SMART_ORCH=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" config-get smart_orchestration.enabled 2>/dev/null || echo "true")
|
|
48
|
+
```
|
|
49
|
+
If `SMART_ORCH` is `"false"` or `--no-auto` is in ARGUMENTS: skip, proceed to step 3.
|
|
50
|
+
|
|
51
|
+
**Conditional discuss-phase for sensitive areas:**
|
|
52
|
+
Read phase name and objective from the phase arguments and roadmap. Check if they contain any of these sensitive keywords (case-insensitive):
|
|
53
|
+
`auth`, `login`, `jwt`, `oauth`, `database`, `migration`, `schema`, `payment`, `billing`, `security`
|
|
54
|
+
|
|
55
|
+
If YES and no CONTEXT.md exists in the phase directory and `--skip-discussion` is NOT in ARGUMENTS:
|
|
56
|
+
→ Display: `[auto] Sensitive area detected — running pre-flight discussion...`
|
|
57
|
+
→ Invoke: Skill(ez:discuss-phase, args: phase_number + " --auto")
|
|
58
|
+
→ Continue to step 3.
|
|
59
|
+
|
|
60
|
+
If NO match OR CONTEXT.md already exists OR `--skip-discussion` present: skip silently, proceed to step 3.
|
|
61
|
+
|
|
62
|
+
**Detection rule:** Only trigger if phase name or goal in ROADMAP.md contains one of the explicit keywords above. False-negative is safer than false-positive — when uncertain, skip.
|
|
63
|
+
</auto_invoke>
|
|
64
|
+
|
|
43
65
|
## 3. Validate Phase
|
|
44
66
|
|
|
45
67
|
```bash
|
|
@@ -8,6 +8,19 @@ Read all files referenced by the invoking prompt's execution_context before star
|
|
|
8
8
|
|
|
9
9
|
<process>
|
|
10
10
|
|
|
11
|
+
<auto_invoke>
|
|
12
|
+
Check for --no-auto in ARGUMENTS. If not present, also check:
|
|
13
|
+
```bash
|
|
14
|
+
SMART_ORCH=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" config-get smart_orchestration.enabled 2>/dev/null || echo "true")
|
|
15
|
+
```
|
|
16
|
+
If `SMART_ORCH` is not `"false"` and `--no-auto` is not in ARGUMENTS:
|
|
17
|
+
```bash
|
|
18
|
+
HEALTH=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" health --json 2>/dev/null)
|
|
19
|
+
```
|
|
20
|
+
- If FAIL: display a warning in the output report but do NOT stop (progress continues)
|
|
21
|
+
- If PASS: silent (do not show to user)
|
|
22
|
+
</auto_invoke>
|
|
23
|
+
|
|
11
24
|
<step name="init_context">
|
|
12
25
|
**Load progress context (paths only):**
|
|
13
26
|
|
|
@@ -219,16 +232,10 @@ Check if `{phase_num}-CONTEXT.md` exists in phase directory.
|
|
|
219
232
|
|
|
220
233
|
**Phase {N}: {Name}** — {Goal from ROADMAP.md}
|
|
221
234
|
|
|
222
|
-
`/ez:discuss-phase {phase}`
|
|
235
|
+
`/ez:discuss-phase {phase}`
|
|
223
236
|
|
|
224
237
|
<sub>`/clear` first → fresh context window</sub>
|
|
225
238
|
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
**Also available:**
|
|
229
|
-
- `/ez:plan-phase {phase}` — skip discussion, plan directly
|
|
230
|
-
- `/ez:list-phase-assumptions {phase}` — see Claude's assumptions
|
|
231
|
-
|
|
232
239
|
---
|
|
233
240
|
```
|
|
234
241
|
|
|
@@ -249,12 +256,6 @@ UAT.md exists with gaps (diagnosed issues). User needs to plan fixes.
|
|
|
249
256
|
|
|
250
257
|
<sub>`/clear` first → fresh context window</sub>
|
|
251
258
|
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
**Also available:**
|
|
255
|
-
- `/ez:execute-phase {phase}` — execute phase plans
|
|
256
|
-
- `/ez:verify-work {phase}` — run more UAT testing
|
|
257
|
-
|
|
258
259
|
---
|
|
259
260
|
```
|
|
260
261
|
|
|
@@ -292,16 +293,10 @@ Read ROADMAP.md to get the next phase's name and goal.
|
|
|
292
293
|
|
|
293
294
|
**Phase {Z+1}: {Name}** — {Goal from ROADMAP.md}
|
|
294
295
|
|
|
295
|
-
`/ez:discuss-phase {Z+1}`
|
|
296
|
+
`/ez:discuss-phase {Z+1}`
|
|
296
297
|
|
|
297
298
|
<sub>`/clear` first → fresh context window</sub>
|
|
298
299
|
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
**Also available:**
|
|
302
|
-
- `/ez:plan-phase {Z+1}` — skip discussion, plan directly
|
|
303
|
-
- `/ez:verify-work {Z}` — user acceptance test before continuing
|
|
304
|
-
|
|
305
300
|
---
|
|
306
301
|
```
|
|
307
302
|
|
|
@@ -324,11 +319,6 @@ All {N} phases finished!
|
|
|
324
319
|
|
|
325
320
|
<sub>`/clear` first → fresh context window</sub>
|
|
326
321
|
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
**Also available:**
|
|
330
|
-
- `/ez:verify-work` — user acceptance test before completing milestone
|
|
331
|
-
|
|
332
322
|
---
|
|
333
323
|
```
|
|
334
324
|
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Orchestrate tier-aware production releases. Validates state, runs security gates, evaluates tier checklist, creates release branch, generates changelog, bumps version, writes rollback plan, and tags the release.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<process>
|
|
6
|
+
|
|
7
|
+
<auto_invoke>
|
|
8
|
+
Check for --no-auto in ARGUMENTS. If present, skip this section and proceed to step 1.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
SMART_ORCH=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" config-get smart_orchestration.enabled 2>/dev/null || echo "true")
|
|
12
|
+
```
|
|
13
|
+
If `SMART_ORCH` is `"false"`: skip, proceed to step 1.
|
|
14
|
+
|
|
15
|
+
**Tier-based pre-flight:**
|
|
16
|
+
Parse the tier argument from ARGUMENTS (mvp / medium / enterprise).
|
|
17
|
+
|
|
18
|
+
- **mvp**: No pre-flight auto-invocations. Proceed directly to step 1.
|
|
19
|
+
- **medium**: Check if a VERIFICATION.md from verify-work already exists for the current phase. If not:
|
|
20
|
+
→ Display: `[auto] Running verify-work before medium release...`
|
|
21
|
+
→ Invoke: Skill(ez:verify-work)
|
|
22
|
+
→ Continue to step 1.
|
|
23
|
+
- **enterprise**: Run in sequence:
|
|
24
|
+
→ Display: `[auto] Running verify-work...`
|
|
25
|
+
→ Invoke: Skill(ez:verify-work)
|
|
26
|
+
→ Display: `[auto] Running audit-milestone...`
|
|
27
|
+
→ Invoke: Skill(ez:audit-milestone)
|
|
28
|
+
→ Display: `[auto] Running arch-review...`
|
|
29
|
+
→ Invoke: Skill(ez:arch-review)
|
|
30
|
+
→ Continue to step 1.
|
|
31
|
+
|
|
32
|
+
All auto-invocations are prefixed with `[auto]` in output. Override with `--no-auto` to skip all pre-invocations.
|
|
33
|
+
</auto_invoke>
|
|
34
|
+
|
|
35
|
+
## 1. Initialize
|
|
36
|
+
|
|
37
|
+
Parse $ARGUMENTS:
|
|
38
|
+
- Command: `release` or `preflight`
|
|
39
|
+
- Tier: `mvp`, `medium`, or `enterprise`
|
|
40
|
+
- Version: semver string (e.g., `1.0.0`)
|
|
41
|
+
|
|
42
|
+
**If missing tier or version (for release command):**
|
|
43
|
+
```
|
|
44
|
+
Usage: /ez:release <tier> <version>
|
|
45
|
+
/ez:release preflight <tier>
|
|
46
|
+
|
|
47
|
+
Examples:
|
|
48
|
+
/ez:release mvp v1.0.0
|
|
49
|
+
/ez:release medium v1.5.0
|
|
50
|
+
/ez:release enterprise v2.0.0
|
|
51
|
+
/ez:release preflight medium
|
|
52
|
+
```
|
|
53
|
+
Exit.
|
|
54
|
+
|
|
55
|
+
**Normalize version:** Strip leading `v` if present (e.g., `v1.0.0` → `1.0.0`).
|
|
56
|
+
|
|
57
|
+
**Load tier config:**
|
|
58
|
+
```bash
|
|
59
|
+
TIER_CONFIG=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" tier-config "${TARGET_TIER}" 2>/dev/null)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Display banner:
|
|
63
|
+
```
|
|
64
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
65
|
+
EZ ► RELEASE v{version} — {TIER} TIER
|
|
66
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 2. Validate Semver
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
echo "${VERSION}" | grep -E "^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**If invalid:** Error — "Version must be semver (X.Y.Z). Got: {version}"
|
|
76
|
+
|
|
77
|
+
## 3. Check Current State
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Uncommitted changes
|
|
81
|
+
git status --short
|
|
82
|
+
|
|
83
|
+
# Current branch
|
|
84
|
+
git branch --show-current
|
|
85
|
+
|
|
86
|
+
# Current version
|
|
87
|
+
CURRENT=$(node -e "console.log(require('./package.json').version)" 2>/dev/null || echo "0.0.0")
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**If uncommitted changes:** Error — "Commit or stash all changes before releasing"
|
|
91
|
+
|
|
92
|
+
## 4. Run Security Gates
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
echo "Running security gates..."
|
|
96
|
+
|
|
97
|
+
# Gate 1: No secrets in tracked files
|
|
98
|
+
SECRET_HITS=$(git grep -i -E "(api[_-]?key|password|secret)['\"]?\s*[=:]\s*['\"]?[a-zA-Z0-9+/]{20,}" HEAD 2>/dev/null | \
|
|
99
|
+
grep -v "example\|placeholder\|your-key\|process\.env\|env\.\|config\.\|getenv" | wc -l)
|
|
100
|
+
|
|
101
|
+
# Gate 2: npm audit
|
|
102
|
+
npm audit --audit-level=critical 2>/dev/null
|
|
103
|
+
AUDIT_EXIT=$?
|
|
104
|
+
|
|
105
|
+
# Gate 3: Production TODOs
|
|
106
|
+
PROD_TODOS=$(grep -rn "TODO\|FIXME\|HACK" src/ --include="*.ts" --include="*.js" --include="*.py" 2>/dev/null | \
|
|
107
|
+
grep -v "test\|spec\|__test__\|\.test\." | wc -l)
|
|
108
|
+
|
|
109
|
+
# Gate 4: .env in .gitignore
|
|
110
|
+
grep -q "^\.env" .gitignore 2>/dev/null && ENV_SAFE=true || ENV_SAFE=false
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Security gate results:
|
|
114
|
+
```
|
|
115
|
+
Security Gates:
|
|
116
|
+
✓/✗ No secrets in committed files ({SECRET_HITS} found)
|
|
117
|
+
✓/✗ npm audit clean (exit {AUDIT_EXIT})
|
|
118
|
+
✓/✗ No production TODOs ({PROD_TODOS} found)
|
|
119
|
+
✓/✗ .env in .gitignore
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Hard stop:** If SECRET_HITS > 0 → "BLOCKED: Secrets found in committed files. Remove before releasing."
|
|
123
|
+
**Hard stop:** If AUDIT_EXIT is non-zero → "BLOCKED: Critical vulnerabilities found. Run npm audit fix."
|
|
124
|
+
|
|
125
|
+
## 5. Run Tier Checklist
|
|
126
|
+
|
|
127
|
+
Load checklist template from `~/.claude/ez-agents/templates/release-checklist.md`.
|
|
128
|
+
|
|
129
|
+
Run automated checks for the target tier:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" release check-tier "${TARGET_TIER}"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Display checklist results with pass/fail/skip for each item.
|
|
136
|
+
|
|
137
|
+
**If `preflight` command:** Display checklist results and exit here.
|
|
138
|
+
|
|
139
|
+
## 6. Check Coverage (if test coverage available)
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Try to find coverage report
|
|
143
|
+
COVERAGE=$(cat coverage/coverage-summary.json 2>/dev/null | jq '.total.lines.pct // 0')
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Coverage thresholds by tier:
|
|
147
|
+
- mvp: 60%
|
|
148
|
+
- medium: 80%
|
|
149
|
+
- enterprise: 95%
|
|
150
|
+
|
|
151
|
+
**If below threshold:** Warning (not hard blocker — tests may not be configured).
|
|
152
|
+
|
|
153
|
+
## 7. Spawn Release Agent
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
157
|
+
◆ Spawning release agent...
|
|
158
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Release agent prompt:
|
|
162
|
+
|
|
163
|
+
```markdown
|
|
164
|
+
<objective>
|
|
165
|
+
Create a {TARGET_TIER} tier release v{VERSION}.
|
|
166
|
+
</objective>
|
|
167
|
+
|
|
168
|
+
<release_config>
|
|
169
|
+
Tier: {TARGET_TIER}
|
|
170
|
+
Version: {VERSION}
|
|
171
|
+
Current version: {CURRENT_VERSION}
|
|
172
|
+
</release_config>
|
|
173
|
+
|
|
174
|
+
<files_to_read>
|
|
175
|
+
- package.json (current version and scripts)
|
|
176
|
+
- CHANGELOG.md (if exists — append new entry)
|
|
177
|
+
- .planning/config.json (release tier config)
|
|
178
|
+
- ~/.claude/ez-agents/templates/release-checklist.md (checklist template)
|
|
179
|
+
- ~/.claude/ez-agents/templates/rollback-plan.md (rollback template)
|
|
180
|
+
</files_to_read>
|
|
181
|
+
|
|
182
|
+
<security_gate_results>
|
|
183
|
+
{security gate results from step 4}
|
|
184
|
+
</security_gate_results>
|
|
185
|
+
|
|
186
|
+
<checklist_results>
|
|
187
|
+
{checklist results from step 5}
|
|
188
|
+
</checklist_results>
|
|
189
|
+
|
|
190
|
+
<tasks>
|
|
191
|
+
1. Create release branch (per tier: trunk | github-flow | gitflow)
|
|
192
|
+
2. Generate changelog from git log since last tag
|
|
193
|
+
3. Bump version in package.json to {VERSION}
|
|
194
|
+
4. Create rollback plan in .planning/releases/v{VERSION}-ROLLBACK-PLAN.md
|
|
195
|
+
5. Commit release artifacts
|
|
196
|
+
6. Tag v{VERSION}
|
|
197
|
+
7. Report production readiness score
|
|
198
|
+
</tasks>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
Task(
|
|
203
|
+
prompt=release_prompt,
|
|
204
|
+
subagent_type="ez-release-agent",
|
|
205
|
+
model="{planner_model from init}"
|
|
206
|
+
)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## 8. Handle Agent Return
|
|
210
|
+
|
|
211
|
+
**`## RELEASE COMPLETE`:**
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
215
|
+
EZ ► RELEASE v{version} READY ✓
|
|
216
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
217
|
+
|
|
218
|
+
{agent summary}
|
|
219
|
+
|
|
220
|
+
### To Ship
|
|
221
|
+
git push origin {branch} && git push origin v{version}
|
|
222
|
+
|
|
223
|
+
### Rollback Plan
|
|
224
|
+
.planning/releases/v{version}-ROLLBACK-PLAN.md
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**If blocked:**
|
|
228
|
+
```
|
|
229
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
230
|
+
EZ ► RELEASE BLOCKED
|
|
231
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
232
|
+
|
|
233
|
+
{blocker details}
|
|
234
|
+
|
|
235
|
+
Fix the above issues then re-run: /ez:release {tier} v{version}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
</process>
|
|
239
|
+
|
|
240
|
+
<success_criteria>
|
|
241
|
+
- [ ] Tier and version validated
|
|
242
|
+
- [ ] Uncommitted changes check passed
|
|
243
|
+
- [ ] All security gates run (fail on hard blockers)
|
|
244
|
+
- [ ] Tier checklist evaluated
|
|
245
|
+
- [ ] Coverage checked against tier threshold
|
|
246
|
+
- [ ] ez-release-agent spawned with full context
|
|
247
|
+
- [ ] Release branch created per tier strategy
|
|
248
|
+
- [ ] Changelog updated
|
|
249
|
+
- [ ] Version bumped in package.json
|
|
250
|
+
- [ ] Rollback plan written
|
|
251
|
+
- [ ] Tag created
|
|
252
|
+
- [ ] User sees push instructions and production readiness score
|
|
253
|
+
</success_criteria>
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Workflow: resume-session
|
|
2
|
+
|
|
3
|
+
**Purpose:** Resume work from a previous session with full context restoration
|
|
4
|
+
|
|
5
|
+
**Related Commands:** `/ez:resume`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Workflow Steps
|
|
10
|
+
|
|
11
|
+
### 1. Load and Validate Session
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
SessionManager mgr = new SessionManager();
|
|
15
|
+
Session session = sessionId ? mgr.loadSession(sessionId) : mgr.getLastSession();
|
|
16
|
+
|
|
17
|
+
if (!session) {
|
|
18
|
+
output("No previous sessions found. Start a new session with your work.");
|
|
19
|
+
exit;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
logger.info('Resuming session', { sessionId: session.metadata.session_id });
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. Compare with Current State
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Load current STATE.md
|
|
29
|
+
Extract current phase, plan, incomplete tasks from STATE.md
|
|
30
|
+
|
|
31
|
+
sessionPhase = session.state.current_phase
|
|
32
|
+
sessionPlan = session.state.current_plan
|
|
33
|
+
statePhase = STATE.md.current_phase
|
|
34
|
+
statePlan = STATE.md.current_plan
|
|
35
|
+
|
|
36
|
+
needsReconciliation = (sessionPhase !== statePhase) || (sessionPlan !== statePlan)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 3. If Reconciliation Needed
|
|
40
|
+
|
|
41
|
+
**Display Warning:**
|
|
42
|
+
```
|
|
43
|
+
⚠️ Session state differs from current project state
|
|
44
|
+
|
|
45
|
+
Session shows:
|
|
46
|
+
- Phase: {session.state.current_phase}
|
|
47
|
+
- Plan: {session.state.current_plan}
|
|
48
|
+
|
|
49
|
+
Current STATE.md shows:
|
|
50
|
+
- Phase: {state.current_phase}
|
|
51
|
+
- Plan: {state.current_plan}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Offer Options:**
|
|
55
|
+
```
|
|
56
|
+
How would you like to reconcile?
|
|
57
|
+
|
|
58
|
+
1. Use session state (overwrite STATE.md)
|
|
59
|
+
2. Use current state (ignore session state)
|
|
60
|
+
3. Manual review (show both, let user decide)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Handle Choice:**
|
|
64
|
+
- "1": Update STATE.md with session.state values
|
|
65
|
+
- "2": Keep STATE.md unchanged, use session context only
|
|
66
|
+
- "3": Show side-by-side comparison, let user edit
|
|
67
|
+
|
|
68
|
+
### 4. Load Context
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
// Load recent transcript for context
|
|
72
|
+
transcript = session.context.transcript
|
|
73
|
+
if (Array.isArray(transcript)) {
|
|
74
|
+
recentMessages = transcript.slice(-20) // Last 20 messages
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Load tasks
|
|
78
|
+
completedTasks = session.context.tasks.filter(t => t.status === 'completed')
|
|
79
|
+
incompleteTasks = session.state.incomplete_tasks
|
|
80
|
+
|
|
81
|
+
// Load decisions
|
|
82
|
+
decisions = session.context.decisions
|
|
83
|
+
|
|
84
|
+
// Load file changes
|
|
85
|
+
fileChanges = session.context.file_changes
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 5. Update STATE.md
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
ez-tools state record-session \
|
|
92
|
+
--stopped-at "{session.state.last_action}" \
|
|
93
|
+
--resume-file "{session.metadata.session_id}"
|
|
94
|
+
|
|
95
|
+
// Update phase/plan if using session state
|
|
96
|
+
if (useSessionState) {
|
|
97
|
+
ez-tools state update "Current Phase" "{session.metadata.phase}"
|
|
98
|
+
ez-tools state update "Current Plan" "{session.metadata.plan}"
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 6. Prepare for Continuation
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
// Identify incomplete work
|
|
106
|
+
incompleteTasks = session.state.incomplete_tasks || []
|
|
107
|
+
|
|
108
|
+
// Identify next action
|
|
109
|
+
nextAction = session.state.next_recommended_action
|
|
110
|
+
|
|
111
|
+
// Load relevant files
|
|
112
|
+
if (session.metadata.phase && session.metadata.plan) {
|
|
113
|
+
planFile = `.planning/phases/${session.metadata.phase}/.../${session.metadata.plan}-PLAN.md`
|
|
114
|
+
summaryFile = `.planning/phases/${session.metadata.phase}/.../${session.metadata.plan}-PLAN-SUMMARY.md`
|
|
115
|
+
|
|
116
|
+
if (fileExists(planFile)) {
|
|
117
|
+
loadFile(planFile)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Load incomplete task files
|
|
122
|
+
for (task of incompleteTasks) {
|
|
123
|
+
if (task.file) {
|
|
124
|
+
loadFile(task.file)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 7. Output Resumption Confirmation
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
╔══════════════════════════════════════════════════════════════╗
|
|
133
|
+
║ SESSION RESUMED ║
|
|
134
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
135
|
+
║ Session: {session.metadata.session_id} ║
|
|
136
|
+
║ Phase: {session.metadata.phase} ║
|
|
137
|
+
║ Plan: {session.metadata.plan} ║
|
|
138
|
+
║ Next action: {session.state.next_recommended_action} ║
|
|
139
|
+
╚══════════════════════════════════════════════════════════════╝
|
|
140
|
+
|
|
141
|
+
Context loaded:
|
|
142
|
+
- {incompleteTasks.length} incomplete tasks
|
|
143
|
+
- {decisions.length} decisions recorded
|
|
144
|
+
- {fileChanges.length} file changes
|
|
145
|
+
|
|
146
|
+
Ready to continue. What would you like to do?
|
|
147
|
+
|
|
148
|
+
1. Continue with recommended action
|
|
149
|
+
2. Review incomplete tasks
|
|
150
|
+
3. View session transcript
|
|
151
|
+
4. Something else
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Error Handling
|
|
157
|
+
|
|
158
|
+
### Session Not Found
|
|
159
|
+
```
|
|
160
|
+
if (!session) {
|
|
161
|
+
output(`Session not found: ${sessionId}`);
|
|
162
|
+
output("Use /ez:list-sessions to see available sessions.");
|
|
163
|
+
exit;
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Corrupted Session File
|
|
168
|
+
```
|
|
169
|
+
try {
|
|
170
|
+
session = JSON.parse(content);
|
|
171
|
+
} catch (err) {
|
|
172
|
+
logger.error('Corrupted session file', { sessionId, error: err.message });
|
|
173
|
+
output(`Error: Session file is corrupted: ${sessionId}`);
|
|
174
|
+
output("Consider deleting the file or contacting support.");
|
|
175
|
+
exit;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Broken Chain Links
|
|
180
|
+
```
|
|
181
|
+
if (session.metadata.session_chain) {
|
|
182
|
+
for (chainId of session.metadata.session_chain) {
|
|
183
|
+
if (!mgr.loadSession(chainId)) {
|
|
184
|
+
warnings.push(`Missing linked session: ${chainId}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (warnings.length > 0) {
|
|
189
|
+
output("⚠️ Session chain has broken links:");
|
|
190
|
+
for (warning of warnings) {
|
|
191
|
+
output(` - ${warning}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## State Transitions
|
|
200
|
+
|
|
201
|
+
**Before:** Session ended, STATE.md shows stopped state
|
|
202
|
+
|
|
203
|
+
**After:** Session resumed, STATE.md updated with:
|
|
204
|
+
- `Last session`: Current timestamp
|
|
205
|
+
- `Resume file`: Session ID
|
|
206
|
+
- `Stopped at`: Last action from session
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Related Files
|
|
211
|
+
|
|
212
|
+
- `ez-agents/bin/lib/session-manager.cjs` - Session loading
|
|
213
|
+
- `ez-agents/bin/lib/session-chain.cjs` - Chain navigation
|
|
214
|
+
- `ez-agents/bin/lib/state.cjs` - STATE.md updates
|
|
215
|
+
- `.planning/sessions/` - Session storage directory
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Generate a sprint standup report. Analyzes recent SUMMARY.md files, STATE.md decisions/blockers, and phase progress to produce yesterday/today/blockers/velocity/health score.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<process>
|
|
6
|
+
|
|
7
|
+
## 1. Initialize
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
INIT=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" init progress)
|
|
11
|
+
if [[ "$INIT" == @file:* ]]; then INIT=$(cat "${INIT#@file:}"); fi
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Parse optional phase from $ARGUMENTS.
|
|
15
|
+
|
|
16
|
+
## 2. Gather Data
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
STATE=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" state-snapshot)
|
|
20
|
+
ROADMAP=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" roadmap analyze)
|
|
21
|
+
PROGRESS_BAR=$(node "$HOME/.claude/ez-agents/bin/ez-tools.cjs" progress bar --raw)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Find 3-5 most recent SUMMARY.md files (last 2 sessions worth of work).
|
|
25
|
+
|
|
26
|
+
## 3. Calculate Sprint Health
|
|
27
|
+
|
|
28
|
+
Score 0-100 based on:
|
|
29
|
+
- Plans completed vs planned (velocity): 30pts
|
|
30
|
+
- Active blockers (0=30pts, 1=15pts, 2+=0pts): 30pts
|
|
31
|
+
- Requirements coverage from ROADMAP: 20pts
|
|
32
|
+
- Deviation rate from STATE.md: 20pts
|
|
33
|
+
|
|
34
|
+
## 4. Generate Standup Report
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
## Daily Standup — {date}
|
|
38
|
+
|
|
39
|
+
### Yesterday
|
|
40
|
+
{recent SUMMARY.md one-liners}
|
|
41
|
+
|
|
42
|
+
### Today (Planned)
|
|
43
|
+
{next phase/plans from ROADMAP}
|
|
44
|
+
|
|
45
|
+
### Blockers
|
|
46
|
+
{from STATE.md blockers[] or "None"}
|
|
47
|
+
|
|
48
|
+
### Velocity Trend
|
|
49
|
+
{calculated from plan completion rate}
|
|
50
|
+
|
|
51
|
+
Sprint Health: {score}/100 — {status}
|
|
52
|
+
{one-line recommendation}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Status thresholds: 80-100=HEALTHY, 60-79=SOME FRICTION, 40-59=STRUGGLING, <40=AT RISK.
|
|
56
|
+
|
|
57
|
+
</process>
|
|
58
|
+
|
|
59
|
+
<success_criteria>
|
|
60
|
+
- [ ] Recent work summarized
|
|
61
|
+
- [ ] Next steps identified
|
|
62
|
+
- [ ] Blockers surfaced
|
|
63
|
+
- [ ] Sprint health score calculated
|
|
64
|
+
</success_criteria>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@howlil/ez-agents",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "EZ Agents — Meta-prompting with multi-model support (Qwen, Kimi, OpenAI)",
|
|
5
5
|
"bin": {
|
|
6
6
|
"ez-agents": "bin/install.js"
|
|
@@ -41,11 +41,15 @@
|
|
|
41
41
|
"node": ">=16.7.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
+
"@octokit/rest": "^20.0.0",
|
|
44
45
|
"c8": "^11.0.0",
|
|
46
|
+
"conventional-changelog": "^5.0.0",
|
|
47
|
+
"conventional-commits-parser": "^5.0.0",
|
|
45
48
|
"esbuild": "^0.24.2",
|
|
46
49
|
"husky": "^9.1.7",
|
|
47
50
|
"lint-staged": "^15.5.2",
|
|
48
|
-
"proper-lockfile": "^4.1.2"
|
|
51
|
+
"proper-lockfile": "^4.1.2",
|
|
52
|
+
"semver": "^7.6.0"
|
|
49
53
|
},
|
|
50
54
|
"scripts": {
|
|
51
55
|
"build:hooks": "node scripts/build-hooks.js",
|
|
@@ -60,5 +64,8 @@
|
|
|
60
64
|
"*.md": [
|
|
61
65
|
"node scripts/run-tests.cjs"
|
|
62
66
|
]
|
|
67
|
+
},
|
|
68
|
+
"dependencies": {
|
|
69
|
+
"micromatch": "^4.0.5"
|
|
63
70
|
}
|
|
64
71
|
}
|