its-magic 0.1.2-9
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/.cursor/agents/curator.mdc +21 -0
- package/.cursor/agents/dev.mdc +20 -0
- package/.cursor/agents/po.mdc +19 -0
- package/.cursor/agents/qa.mdc +19 -0
- package/.cursor/agents/release.mdc +19 -0
- package/.cursor/agents/tech-lead.mdc +21 -0
- package/.cursor/commands/gsd-architecture.md +29 -0
- package/.cursor/commands/gsd-auto.md +27 -0
- package/.cursor/commands/gsd-discovery.md +27 -0
- package/.cursor/commands/gsd-execute.md +32 -0
- package/.cursor/commands/gsd-intake.md +28 -0
- package/.cursor/commands/gsd-map-codebase.md +25 -0
- package/.cursor/commands/gsd-milestone-complete.md +24 -0
- package/.cursor/commands/gsd-milestone-start.md +26 -0
- package/.cursor/commands/gsd-pause.md +25 -0
- package/.cursor/commands/gsd-phase-context.md +25 -0
- package/.cursor/commands/gsd-plan-verify.md +26 -0
- package/.cursor/commands/gsd-qa.md +28 -0
- package/.cursor/commands/gsd-quick.md +24 -0
- package/.cursor/commands/gsd-refresh-context.md +26 -0
- package/.cursor/commands/gsd-release.md +29 -0
- package/.cursor/commands/gsd-research.md +28 -0
- package/.cursor/commands/gsd-resume.md +26 -0
- package/.cursor/commands/gsd-sprint-plan.md +30 -0
- package/.cursor/commands/gsd-verify-work.md +25 -0
- package/.cursor/hooks/README.md +13 -0
- package/.cursor/hooks/gsd-hook.py +197 -0
- package/.cursor/hooks.json +26 -0
- package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +57 -0
- package/.cursor/remote.json +18 -0
- package/.cursor/rules/gsd-core.mdc +18 -0
- package/.cursor/rules/gsd-escalation.mdc +11 -0
- package/.cursor/rules/gsd-handoffs.mdc +10 -0
- package/.cursor/rules/gsd-quality.mdc +15 -0
- package/.cursor/scratchpad.md +34 -0
- package/.cursor/skills/gsd-team/SKILL.md +39 -0
- package/.cursor/skills/gsd-team/templates/acceptance.json +10 -0
- package/.cursor/skills/gsd-team/templates/acceptance.md +7 -0
- package/.cursor/skills/gsd-team/templates/architecture.json +11 -0
- package/.cursor/skills/gsd-team/templates/architecture.md +14 -0
- package/.cursor/skills/gsd-team/templates/decision.json +14 -0
- package/.cursor/skills/gsd-team/templates/decision.md +19 -0
- package/.cursor/skills/gsd-team/templates/handoff.json +6 -0
- package/.cursor/skills/gsd-team/templates/handoff.md +12 -0
- package/.cursor/skills/gsd-team/templates/milestone.json +7 -0
- package/.cursor/skills/gsd-team/templates/phase-context.json +6 -0
- package/.cursor/skills/gsd-team/templates/plan-verify.json +11 -0
- package/.cursor/skills/gsd-team/templates/sprint.json +6 -0
- package/.cursor/skills/gsd-team/templates/sprint.md +11 -0
- package/.cursor/skills/gsd-team/templates/story.json +9 -0
- package/.cursor/skills/gsd-team/templates/story.md +15 -0
- package/.cursor/skills/gsd-team/templates/uat.json +15 -0
- package/.github/workflows/ci.yml +47 -0
- package/.github/workflows/deploy.yml +56 -0
- package/README.md +755 -0
- package/bin/its-magic.js +86 -0
- package/decisions/DEC-0001.md +21 -0
- package/decisions/DEC-0002.md +21 -0
- package/docs/engineering/architecture.md +354 -0
- package/docs/engineering/codebase-map.md +14 -0
- package/docs/engineering/context/phase-template.json +6 -0
- package/docs/engineering/decisions.md +6 -0
- package/docs/engineering/dependencies.json +5 -0
- package/docs/engineering/research.md +11 -0
- package/docs/engineering/runbook.md +32 -0
- package/docs/engineering/state.md +33 -0
- package/docs/product/acceptance.md +6 -0
- package/docs/product/backlog.md +7 -0
- package/docs/product/vision.md +46 -0
- package/gsd-installer.ps1 +189 -0
- package/gsd-installer.py +195 -0
- package/gsd-installer.sh +201 -0
- package/handoffs/dev_to_qa.md +8 -0
- package/handoffs/po_to_tl.md +8 -0
- package/handoffs/qa_to_dev.md +6 -0
- package/handoffs/release_notes.md +14 -0
- package/handoffs/resume_brief.md +8 -0
- package/handoffs/tl_to_dev.md +7 -0
- package/milestones/M0001/milestone.json +7 -0
- package/milestones/M0001/phases.json +9 -0
- package/milestones/M0001/progress.md +3 -0
- package/milestones/M0001/summary.md +3 -0
- package/package.json +38 -0
- package/scripts/generate-release-notes.ps1 +74 -0
- package/scripts/generate-release-notes.sh +63 -0
- package/scripts/release-all.ps1 +423 -0
- package/scripts/release-all.sh +226 -0
- package/sprints/S0001/plan-verify.json +5 -0
- package/sprints/S0001/progress.md +4 -0
- package/sprints/S0001/qa-findings.md +113 -0
- package/sprints/S0001/sprint.md +70 -0
- package/sprints/S0001/summary.md +46 -0
- package/sprints/S0001/tasks.md +35 -0
- package/sprints/S0001/uat.json +8 -0
- package/sprints/S0001/uat.md +8 -0
- package/sprints/quick/Q0001/summary.md +3 -0
- package/sprints/quick/Q0001/task.json +6 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import re
|
|
4
|
+
import sys
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
|
|
7
|
+
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
|
|
8
|
+
SCRATCHPAD = os.path.join(ROOT, ".cursor", "scratchpad.md")
|
|
9
|
+
STATE_FILE = os.path.join(ROOT, ".cursor", "hooks", "gsd-hook-state.json")
|
|
10
|
+
BENCH_LOG = os.path.join(ROOT, ".cursor", "hooks", "gsd-bench-log.jsonl")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def read_scratchpad():
|
|
14
|
+
flags = {}
|
|
15
|
+
try:
|
|
16
|
+
with open(SCRATCHPAD, "r", encoding="utf-8") as f:
|
|
17
|
+
for line in f:
|
|
18
|
+
line = line.strip()
|
|
19
|
+
if not line or line.startswith("#"):
|
|
20
|
+
continue
|
|
21
|
+
if "=" in line:
|
|
22
|
+
key, val = line.split("=", 1)
|
|
23
|
+
flags[key.strip()] = val.strip()
|
|
24
|
+
except OSError:
|
|
25
|
+
pass
|
|
26
|
+
return flags
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def load_state():
|
|
30
|
+
try:
|
|
31
|
+
with open(STATE_FILE, "r", encoding="utf-8") as f:
|
|
32
|
+
return json.load(f)
|
|
33
|
+
except Exception:
|
|
34
|
+
return {
|
|
35
|
+
"code_changed": False,
|
|
36
|
+
"context_refreshed": False,
|
|
37
|
+
"last_edit": None,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def save_state(state):
|
|
42
|
+
try:
|
|
43
|
+
with open(STATE_FILE, "w", encoding="utf-8") as f:
|
|
44
|
+
json.dump(state, f, indent=2)
|
|
45
|
+
except OSError:
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def bench_session(flags):
|
|
50
|
+
session = flags.get("GSD_BENCH_SESSION", "").strip()
|
|
51
|
+
return session if session else None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def log_bench_event(session, event, payload):
|
|
55
|
+
if not session:
|
|
56
|
+
return
|
|
57
|
+
try:
|
|
58
|
+
entry = {
|
|
59
|
+
"ts": datetime.utcnow().isoformat() + "Z",
|
|
60
|
+
"session": session,
|
|
61
|
+
"event": event,
|
|
62
|
+
}
|
|
63
|
+
if event == "beforeShellExecution":
|
|
64
|
+
cmd = payload.get("command", "")
|
|
65
|
+
entry["command"] = cmd[:200]
|
|
66
|
+
elif event == "beforeReadFile":
|
|
67
|
+
entry["path"] = payload.get("path", "")
|
|
68
|
+
elif event == "afterFileEdit":
|
|
69
|
+
entry["path"] = payload.get("path", "")
|
|
70
|
+
elif event == "stop":
|
|
71
|
+
entry["state"] = payload.get("state", "")
|
|
72
|
+
with open(BENCH_LOG, "a", encoding="utf-8") as f:
|
|
73
|
+
f.write(json.dumps(entry) + "\n")
|
|
74
|
+
except OSError:
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def read_event_payload():
|
|
79
|
+
try:
|
|
80
|
+
data = sys.stdin.read()
|
|
81
|
+
if not data.strip():
|
|
82
|
+
return {}
|
|
83
|
+
return json.loads(data)
|
|
84
|
+
except Exception:
|
|
85
|
+
return {}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def is_dangerous_command(cmd):
|
|
89
|
+
patterns = [
|
|
90
|
+
r"\brm\s+-rf\s+/",
|
|
91
|
+
r"\bdel\s+/f\s+/s\b",
|
|
92
|
+
r"\bformat\b",
|
|
93
|
+
r"\bmkfs\b",
|
|
94
|
+
r"\bdiskpart\b",
|
|
95
|
+
r"\bshutdown\b",
|
|
96
|
+
r"\breboot\b",
|
|
97
|
+
r"\bcurl\b.+\|\s*(sh|bash|pwsh|powershell)",
|
|
98
|
+
]
|
|
99
|
+
return any(re.search(p, cmd, re.IGNORECASE) for p in patterns)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def is_secret_like(path):
|
|
103
|
+
secrets = [
|
|
104
|
+
".env",
|
|
105
|
+
"id_rsa",
|
|
106
|
+
"id_dsa",
|
|
107
|
+
".pem",
|
|
108
|
+
".key",
|
|
109
|
+
".p12",
|
|
110
|
+
"credentials.json",
|
|
111
|
+
]
|
|
112
|
+
lower = path.lower()
|
|
113
|
+
return any(s in lower for s in secrets)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def is_code_path(path):
|
|
117
|
+
normalized = path.replace("\\", "/").lower()
|
|
118
|
+
if "/docs/" in normalized:
|
|
119
|
+
return False
|
|
120
|
+
if "/handoffs/" in normalized:
|
|
121
|
+
return False
|
|
122
|
+
if "/decisions/" in normalized:
|
|
123
|
+
return False
|
|
124
|
+
if "/sprints/" in normalized:
|
|
125
|
+
return False
|
|
126
|
+
if "/.cursor/" in normalized:
|
|
127
|
+
return False
|
|
128
|
+
if "/.github/" in normalized:
|
|
129
|
+
return False
|
|
130
|
+
if normalized.endswith("readme.md"):
|
|
131
|
+
return False
|
|
132
|
+
return True
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def is_context_refresh(path):
|
|
136
|
+
normalized = path.replace("\\", "/").lower()
|
|
137
|
+
return normalized.endswith("/docs/engineering/state.md") or normalized.endswith(
|
|
138
|
+
"/sprints/s0001/summary.md"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def main():
|
|
143
|
+
if len(sys.argv) < 2:
|
|
144
|
+
sys.exit(0)
|
|
145
|
+
|
|
146
|
+
event = sys.argv[1]
|
|
147
|
+
flags = read_scratchpad()
|
|
148
|
+
payload = read_event_payload()
|
|
149
|
+
state = load_state()
|
|
150
|
+
session = bench_session(flags)
|
|
151
|
+
|
|
152
|
+
if event == "beforeShellExecution":
|
|
153
|
+
log_bench_event(session, event, payload)
|
|
154
|
+
cmd = payload.get("command", "")
|
|
155
|
+
if cmd and is_dangerous_command(cmd):
|
|
156
|
+
print("Blocked: dangerous command pattern detected.")
|
|
157
|
+
sys.exit(1)
|
|
158
|
+
sys.exit(0)
|
|
159
|
+
|
|
160
|
+
if event == "beforeReadFile":
|
|
161
|
+
log_bench_event(session, event, payload)
|
|
162
|
+
path = payload.get("path", "")
|
|
163
|
+
if path and is_secret_like(path):
|
|
164
|
+
print("Blocked: secret-like file detected. Confirm before reading.")
|
|
165
|
+
sys.exit(1)
|
|
166
|
+
sys.exit(0)
|
|
167
|
+
|
|
168
|
+
if event == "afterFileEdit":
|
|
169
|
+
log_bench_event(session, event, payload)
|
|
170
|
+
path = payload.get("path", "")
|
|
171
|
+
if path:
|
|
172
|
+
if is_code_path(path):
|
|
173
|
+
state["code_changed"] = True
|
|
174
|
+
if is_context_refresh(path):
|
|
175
|
+
state["context_refreshed"] = True
|
|
176
|
+
state["last_edit"] = datetime.utcnow().isoformat() + "Z"
|
|
177
|
+
save_state(state)
|
|
178
|
+
sys.exit(0)
|
|
179
|
+
|
|
180
|
+
if event == "stop":
|
|
181
|
+
log_bench_event(session, event, payload)
|
|
182
|
+
strict = flags.get("GSD_CONTEXT_STRICT", "0") == "1"
|
|
183
|
+
done = flags.get("DONE", "0") == "1"
|
|
184
|
+
if strict and state.get("code_changed") and not state.get("context_refreshed"):
|
|
185
|
+
if not done:
|
|
186
|
+
print(
|
|
187
|
+
"Context refresh recommended: update state or summary after code edits."
|
|
188
|
+
)
|
|
189
|
+
sys.exit(1)
|
|
190
|
+
sys.exit(0)
|
|
191
|
+
|
|
192
|
+
sys.exit(0)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
if __name__ == "__main__":
|
|
196
|
+
main()
|
|
197
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"hooks": {
|
|
4
|
+
"beforeShellExecution": [
|
|
5
|
+
{
|
|
6
|
+
"command": "python .cursor/hooks/gsd-hook.py beforeShellExecution"
|
|
7
|
+
}
|
|
8
|
+
],
|
|
9
|
+
"beforeReadFile": [
|
|
10
|
+
{
|
|
11
|
+
"command": "python .cursor/hooks/gsd-hook.py beforeReadFile"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"afterFileEdit": [
|
|
15
|
+
{
|
|
16
|
+
"command": "python .cursor/hooks/gsd-hook.py afterFileEdit"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"stop": [
|
|
20
|
+
{
|
|
21
|
+
"command": "python .cursor/hooks/gsd-hook.py stop"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cursor-gsd-team-kit
|
|
3
|
+
overview: Plan the build of the Cursor-native “GSD Team Kit” template repo described in `Plan.md`, covering commands, rules, skills, agents, hooks, docs, and CI/CD templates.
|
|
4
|
+
todos:
|
|
5
|
+
- id: scaffold-structure
|
|
6
|
+
content: Scaffold directory structure and starter artifacts
|
|
7
|
+
status: pending
|
|
8
|
+
- id: commands-rules
|
|
9
|
+
content: Add 10 commands and 4 rules with IO/stop gates
|
|
10
|
+
status: pending
|
|
11
|
+
- id: skills-agents
|
|
12
|
+
content: Create gsd-team skill, templates, and 6 agents
|
|
13
|
+
status: pending
|
|
14
|
+
- id: hooks-cicd-docs
|
|
15
|
+
content: Implement hooks, CI/CD workflows, and README updates
|
|
16
|
+
status: pending
|
|
17
|
+
isProject: false
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Cursor-GSD-Team Kit Plan
|
|
21
|
+
|
|
22
|
+
## Scope Summary
|
|
23
|
+
|
|
24
|
+
Build a drop-in template repo that implements the full GSD workflow (intake → discovery → architecture → sprint plan → execute → QA → release → pause/resume) using Cursor-native artifacts: commands, rules, skills, subagents, hooks, docs, and GitHub Actions. Voice input is documented as an input layer only. CI/CD is template-based and driven by runbook keys.
|
|
25
|
+
|
|
26
|
+
## Key Files and Structures
|
|
27
|
+
|
|
28
|
+
- Template structure per spec: [.cursor/](.cursor/), [docs/](docs/), [sprints/](sprints/), [handoffs/](handoffs/), [decisions/](decisions/), [.github/workflows/](.github/workflows/)
|
|
29
|
+
- Commands: `.cursor/commands/gsd-*.md` (10 commands)
|
|
30
|
+
- Rules: `.cursor/rules/gsd-*.mdc` (4 rules)
|
|
31
|
+
- Skills: `.cursor/skills/gsd-team/SKILL.md` + `templates/*.md`
|
|
32
|
+
- Agents: `.cursor/agents/*.mdc` (PO, tech-lead, dev, QA, release, curator)
|
|
33
|
+
- Hooks: `.cursor/hooks.json`, `.cursor/hooks/gsd-hook.py`, `.cursor/scratchpad.md`
|
|
34
|
+
- Docs templates: `docs/product/*.md`, `docs/engineering/*.md`, `sprints/S0001/*`, `handoffs/*.md`, `decisions/DEC-0001.md`
|
|
35
|
+
- CI/CD: `.github/workflows/ci.yml`, `.github/workflows/deploy.yml`
|
|
36
|
+
- README updates: voice options + runbook usage
|
|
37
|
+
|
|
38
|
+
## Implementation Outline
|
|
39
|
+
|
|
40
|
+
1. **Scaffold repo layout** per section 4 and add starter artifacts in `docs/`, `sprints/`, `handoffs/`, `decisions/`.
|
|
41
|
+
2. **Write 10 commands** in `.cursor/commands/` with explicit inputs/outputs, stop-conditions, and role usage.
|
|
42
|
+
3. **Define rules** in `.cursor/rules/` for phase flow, quality gates, handoffs/state persistence, and escalation.
|
|
43
|
+
4. **Create the skill** in `.cursor/skills/gsd-team/` and template files for story/acceptance/architecture/decision/sprint/handoff.
|
|
44
|
+
5. **Define 6 subagents** with required IO and artifact persistence requirements.
|
|
45
|
+
6. **Implement hooks** (`hooks.json` + dispatcher script) with fail-open logic, context-refresh checks, and safe-command blocking.
|
|
46
|
+
7. **Add CI/CD workflows** that read `docs/engineering/runbook.md` keys and conditionally execute commands.
|
|
47
|
+
8. **Update README** to document quick start, voice input strategies, and runbook-driven CI/CD.
|
|
48
|
+
|
|
49
|
+
## Notes / Constraints
|
|
50
|
+
|
|
51
|
+
- Voice input is documented only; no runtime integration beyond documentation.
|
|
52
|
+
- Hooks and CI/CD must be fail-open unless commands are explicitly set.
|
|
53
|
+
- Decision gate should create `decisions/DEC-xxxx.md` and stop until user decision.
|
|
54
|
+
|
|
55
|
+
## Reference (Plan Spec)
|
|
56
|
+
|
|
57
|
+
Primary source: [Plan.md](Plan.md)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"servers": [
|
|
3
|
+
{
|
|
4
|
+
"name": "local-docker",
|
|
5
|
+
"type": "docker",
|
|
6
|
+
"host": "unix:///var/run/docker.sock",
|
|
7
|
+
"notes": "Example Docker socket configuration"
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"name": "remote-ssh",
|
|
11
|
+
"type": "ssh",
|
|
12
|
+
"host": "example.com",
|
|
13
|
+
"port": 22,
|
|
14
|
+
"user": "ubuntu",
|
|
15
|
+
"notes": "Example SSH configuration"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "GSD core workflow and context pack rules"
|
|
3
|
+
globs: ["**/*"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
- Use the GSD phase flow: intake -> discovery -> research -> architecture ->
|
|
7
|
+
sprint plan -> plan verify -> execute -> QA -> verify work -> release ->
|
|
8
|
+
refresh context.
|
|
9
|
+
- `AUTO_FLOW_MODE` controls whether phases run automatically or stop at
|
|
10
|
+
decision gates (`auto_until_decision` recommended).
|
|
11
|
+
- `PHASE_MODE=interactive` means ask questions; `PHASE_MODE=auto` minimizes
|
|
12
|
+
prompts unless decisions are required.
|
|
13
|
+
- Persist decisions and state in files; do not keep critical info only in chat.
|
|
14
|
+
- Pause/resume is first-class. Update `handoffs/resume_brief.md` on pause.
|
|
15
|
+
- Context pack must stay compact: summarize, do not dump raw logs.
|
|
16
|
+
- If `REMOTE_EXECUTION=1` and `.cursor/remote.json` is configured, the agent
|
|
17
|
+
may use the configured remote/docker servers for builds/tests.
|
|
18
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Decision gate and escalation logic"
|
|
3
|
+
globs: ["**/*"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
- Trigger a decision when scope, security, data migration, or architecture
|
|
7
|
+
changes are high impact or unclear.
|
|
8
|
+
- Create `decisions/DEC-xxxx.md` with 2-3 options and a recommendation.
|
|
9
|
+
- Pause execution until a decision is made and recorded in
|
|
10
|
+
`docs/engineering/decisions.md`.
|
|
11
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Handoffs and artifact persistence"
|
|
3
|
+
globs: ["**/*"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
- Every role writes handoffs to files; nothing important stays in chat only.
|
|
7
|
+
- Update sprint `summary.md` and `progress.md` after task completion.
|
|
8
|
+
- Use `handoffs/*.md` for role-to-role transfers.
|
|
9
|
+
- Keep `docs/engineering/state.md` current and concise.
|
|
10
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Quality gates and small-step execution"
|
|
3
|
+
globs: ["**/*"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
- Prefer small, atomic changes tied to a single task.
|
|
7
|
+
- Run tests, lint, and typecheck when commands are configured.
|
|
8
|
+
- If `AUTO_INSTALL_DEPS=1` in `.cursor/scratchpad.md`, install required
|
|
9
|
+
runtimes/libs without asking (package manager only).
|
|
10
|
+
- If `AUTO_RELEASE_NOTES=1` in `.cursor/scratchpad.md`, generate release notes
|
|
11
|
+
automatically (scripted).
|
|
12
|
+
- If `PERMISSION_MODE=auto`, do not ask for routine permission prompts.
|
|
13
|
+
- Update `docs/engineering/state.md` after meaningful changes.
|
|
14
|
+
- If tests fail and commands are set, fix or document before proceeding.
|
|
15
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# GSD scratchpad
|
|
2
|
+
#
|
|
3
|
+
# Core behavior
|
|
4
|
+
# - GSD_CONTEXT_STRICT: 0|1 (require context refresh after code changes)
|
|
5
|
+
# - LOOP_UNTIL_GREEN: 0|1 (optional test loop)
|
|
6
|
+
# - RUN_TESTS_ON_EDIT: 0|1 (run tests after edits)
|
|
7
|
+
# - DONE: 0|1 (stop hook loops)
|
|
8
|
+
GSD_CONTEXT_STRICT=1
|
|
9
|
+
LOOP_UNTIL_GREEN=0
|
|
10
|
+
RUN_TESTS_ON_EDIT=0
|
|
11
|
+
DONE=0
|
|
12
|
+
#
|
|
13
|
+
# Benchmarking
|
|
14
|
+
# - GSD_BENCH_SESSION: free-form id for live benchmark logging
|
|
15
|
+
GSD_BENCH_SESSION=
|
|
16
|
+
#
|
|
17
|
+
# Automation
|
|
18
|
+
# - AUTO_FLOW_MODE: manual|auto_until_decision
|
|
19
|
+
# - PHASE_MODE: interactive|auto
|
|
20
|
+
# - PERMISSION_MODE: interactive|auto
|
|
21
|
+
# - AUTO_INSTALL_DEPS: 0|1
|
|
22
|
+
# - AUTO_RELEASE_NOTES: 0|1
|
|
23
|
+
AUTO_FLOW_MODE=manual
|
|
24
|
+
PHASE_MODE=interactive
|
|
25
|
+
PERMISSION_MODE=interactive
|
|
26
|
+
AUTO_INSTALL_DEPS=0
|
|
27
|
+
AUTO_RELEASE_NOTES=0
|
|
28
|
+
#
|
|
29
|
+
# Remote execution
|
|
30
|
+
# - REMOTE_EXECUTION: 0|1
|
|
31
|
+
# - REMOTE_CONFIG: path to remote config
|
|
32
|
+
REMOTE_EXECUTION=0
|
|
33
|
+
REMOTE_CONFIG=.cursor/remote.json
|
|
34
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# GSD Team Skill
|
|
2
|
+
|
|
3
|
+
This skill guides the AI dev team through the GSD workflow. It enforces
|
|
4
|
+
artifact persistence, clear handoffs, and compact context packs.
|
|
5
|
+
|
|
6
|
+
## Workflow
|
|
7
|
+
|
|
8
|
+
1. Intake: clarify idea, write story + acceptance.
|
|
9
|
+
2. Discovery: capture design/UX references.
|
|
10
|
+
3. Research: summarize patterns, risks, dependencies.
|
|
11
|
+
4. Architecture: define approach, risks, decisions.
|
|
12
|
+
5. Sprint plan: create sprint and tasks.
|
|
13
|
+
6. Plan verify: verify tasks cover acceptance.
|
|
14
|
+
7. Execute: implement task-by-task, update state.
|
|
15
|
+
8. QA: test plan, findings, verification.
|
|
16
|
+
9. Verify work: UAT and user-facing validation.
|
|
17
|
+
10. Release: notes, runbook, readiness.
|
|
18
|
+
11. Refresh context: compact state + decisions.
|
|
19
|
+
|
|
20
|
+
Optional modes:
|
|
21
|
+
- Quick: fast path for small tasks.
|
|
22
|
+
- Milestones: group phases into larger delivery cycles.
|
|
23
|
+
|
|
24
|
+
## Required artifacts
|
|
25
|
+
|
|
26
|
+
- `docs/product/*`
|
|
27
|
+
- `docs/engineering/*`
|
|
28
|
+
- `sprints/Sxxxx/*`
|
|
29
|
+
- `sprints/quick/*`
|
|
30
|
+
- `milestones/*`
|
|
31
|
+
- `handoffs/*`
|
|
32
|
+
- `decisions/*`
|
|
33
|
+
|
|
34
|
+
## Templates
|
|
35
|
+
|
|
36
|
+
Use templates in `templates/` for both markdown and JSON artifacts. JSON
|
|
37
|
+
templates are preferred for structured data (story, acceptance, architecture,
|
|
38
|
+
decision, sprint, handoff, plan-verify, UAT, milestone, phase context).
|
|
39
|
+
|