@ui8kit/uxdx 0.1.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/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/uxdx.mjs +296 -0
- package/package.json +53 -0
- package/packages/sdlc/harness/README.md +58 -0
- package/packages/sdlc/harness/core/AGENTS.md +12 -0
- package/packages/sdlc/harness/core/README.md +15 -0
- package/packages/sdlc/harness/core/REVIEW.md +18 -0
- package/packages/sdlc/harness/core/changes/README.md +4 -0
- package/packages/sdlc/harness/core/cursor/rules/sdlc-core.mdc +15 -0
- package/packages/sdlc/harness/core/install.sh +3 -0
- package/packages/sdlc/harness/core/intent.md +25 -0
- package/packages/sdlc/harness/core/manifest.yaml +15 -0
- package/packages/sdlc/harness/core/plan.md +25 -0
- package/packages/sdlc/harness/core/sdlc.sh +230 -0
- package/packages/sdlc/harness/core/skills/sdlc-invariants/SKILL.md +20 -0
- package/packages/sdlc/harness/core/skills/sdlc-plan/SKILL.md +15 -0
- package/packages/sdlc/harness/core/spec.md +24 -0
- package/packages/sdlc/harness/core/start.sh +3 -0
- package/packages/sdlc/harness/full/AGENTS.md +15 -0
- package/packages/sdlc/harness/full/README.md +23 -0
- package/packages/sdlc/harness/full/REVIEW.md +19 -0
- package/packages/sdlc/harness/full/bands.yaml +13 -0
- package/packages/sdlc/harness/full/changes/README.md +4 -0
- package/packages/sdlc/harness/full/cursor/rules/sdlc-full.mdc +17 -0
- package/packages/sdlc/harness/full/evals/README.md +16 -0
- package/packages/sdlc/harness/full/hooks/README.md +17 -0
- package/packages/sdlc/harness/full/install.sh +3 -0
- package/packages/sdlc/harness/full/intent.md +26 -0
- package/packages/sdlc/harness/full/manifest.yaml +17 -0
- package/packages/sdlc/harness/full/plan.md +30 -0
- package/packages/sdlc/harness/full/sdlc.sh +230 -0
- package/packages/sdlc/harness/full/skills/sdlc-feedback/SKILL.md +18 -0
- package/packages/sdlc/harness/full/skills/sdlc-loop/SKILL.md +21 -0
- package/packages/sdlc/harness/full/skills/sdlc-review/SKILL.md +15 -0
- package/packages/sdlc/harness/full/spec.md +28 -0
- package/packages/sdlc/harness/full/start.sh +3 -0
- package/packages/sdlc/harness/light/AGENTS.md +13 -0
- package/packages/sdlc/harness/light/README.md +15 -0
- package/packages/sdlc/harness/light/changes/README.md +6 -0
- package/packages/sdlc/harness/light/cursor/rules/sdlc-light.mdc +16 -0
- package/packages/sdlc/harness/light/install.sh +3 -0
- package/packages/sdlc/harness/light/intent.md +24 -0
- package/packages/sdlc/harness/light/manifest.yaml +15 -0
- package/packages/sdlc/harness/light/plan.md +28 -0
- package/packages/sdlc/harness/light/sdlc.sh +230 -0
- package/packages/sdlc/harness/light/skills/sdlc-light/SKILL.md +30 -0
- package/packages/sdlc/harness/light/spec.md +23 -0
- package/packages/sdlc/harness/light/start.sh +3 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Run from a product repo after this pack is copied to .sdlc/
|
|
3
|
+
# .sdlc/sdlc.sh install
|
|
4
|
+
# .sdlc/sdlc.sh start <slug>
|
|
5
|
+
# .sdlc/sdlc.sh status
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
SDLC_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
|
|
9
|
+
REPO_ROOT="$(CDPATH= cd -- "$SDLC_DIR/.." && pwd)"
|
|
10
|
+
MANIFEST="$SDLC_DIR/manifest.yaml"
|
|
11
|
+
BEGIN='<!-- sdlc-harness:begin -->'
|
|
12
|
+
END='<!-- sdlc-harness:end -->'
|
|
13
|
+
|
|
14
|
+
die() { printf 'sdlc: %s\n' "$*" >&2; exit 1; }
|
|
15
|
+
|
|
16
|
+
need_manifest() {
|
|
17
|
+
[[ -f "$MANIFEST" ]] || die "missing $MANIFEST (copy a harness pack into .sdlc/)"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
level() {
|
|
21
|
+
awk '/^level:[[:space:]]/ { print $2; exit }' "$MANIFEST"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
warn_location() {
|
|
25
|
+
local base
|
|
26
|
+
base="$(basename -- "$SDLC_DIR")"
|
|
27
|
+
if [[ "$base" != ".sdlc" ]]; then
|
|
28
|
+
printf 'sdlc: warning: script dir is %s (expected .sdlc in a product repo)\n' "$SDLC_DIR" >&2
|
|
29
|
+
fi
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
usage() {
|
|
33
|
+
cat <<EOF
|
|
34
|
+
Usage: .sdlc/sdlc.sh <command>
|
|
35
|
+
|
|
36
|
+
install Overlay Cursor rules/skills; merge AGENTS.md at repo root
|
|
37
|
+
start <slug> [opts] Copy templates into .sdlc/changes/<slug>/
|
|
38
|
+
status Show level, overlay, and changes
|
|
39
|
+
|
|
40
|
+
start options:
|
|
41
|
+
--force Overwrite files that already exist in the change folder
|
|
42
|
+
--intent Also copy intent.md (light/core; full always copies it)
|
|
43
|
+
--spec Also copy spec.md (light; core/full as below)
|
|
44
|
+
--boundary core: copy intent.md + spec.md + plan.md
|
|
45
|
+
|
|
46
|
+
Repo root is the parent of this .sdlc directory:
|
|
47
|
+
$REPO_ROOT
|
|
48
|
+
EOF
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
copy_rules() {
|
|
52
|
+
local src="$SDLC_DIR/cursor/rules" dest="$REPO_ROOT/.cursor/rules" f
|
|
53
|
+
[[ -d "$src" ]] || die "missing $src"
|
|
54
|
+
mkdir -p "$dest"
|
|
55
|
+
shopt -s nullglob
|
|
56
|
+
for f in "$src"/*.mdc; do
|
|
57
|
+
cp -- "$f" "$dest/"
|
|
58
|
+
printf 'sdlc: rule %s\n' "$dest/$(basename -- "$f")"
|
|
59
|
+
done
|
|
60
|
+
shopt -u nullglob
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
copy_skills() {
|
|
64
|
+
local src="$SDLC_DIR/skills" dest="$REPO_ROOT/.cursor/skills" d name
|
|
65
|
+
[[ -d "$src" ]] || die "missing $src"
|
|
66
|
+
mkdir -p "$dest"
|
|
67
|
+
shopt -s nullglob
|
|
68
|
+
for d in "$src"/*/; do
|
|
69
|
+
name="$(basename -- "$d")"
|
|
70
|
+
rm -rf -- "$dest/$name"
|
|
71
|
+
cp -R -- "$d" "$dest/$name"
|
|
72
|
+
printf 'sdlc: skill %s\n' "$dest/$name"
|
|
73
|
+
done
|
|
74
|
+
shopt -u nullglob
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
merge_agents() {
|
|
78
|
+
local overlay="$SDLC_DIR/AGENTS.md" dest="$REPO_ROOT/AGENTS.md" tmp
|
|
79
|
+
[[ -f "$overlay" ]] || die "missing $overlay"
|
|
80
|
+
if [[ ! -f "$dest" ]]; then
|
|
81
|
+
cp -- "$overlay" "$dest"
|
|
82
|
+
printf 'sdlc: created %s\n' "$dest"
|
|
83
|
+
return
|
|
84
|
+
fi
|
|
85
|
+
tmp="$(mktemp)"
|
|
86
|
+
if grep -F -q -- "$BEGIN" "$dest"; then
|
|
87
|
+
awk -v begin="$BEGIN" -v end="$END" -v overlay="$overlay" '
|
|
88
|
+
BEGIN {
|
|
89
|
+
while ((getline line < overlay) > 0) { o = o line "\n" }
|
|
90
|
+
close(overlay)
|
|
91
|
+
}
|
|
92
|
+
index($0, begin) == 1 {
|
|
93
|
+
printf "%s", o
|
|
94
|
+
skip = 1
|
|
95
|
+
next
|
|
96
|
+
}
|
|
97
|
+
skip {
|
|
98
|
+
if (index($0, end) == 1) skip = 0
|
|
99
|
+
next
|
|
100
|
+
}
|
|
101
|
+
{ print }
|
|
102
|
+
' "$dest" >"$tmp"
|
|
103
|
+
else
|
|
104
|
+
cat -- "$dest" >"$tmp"
|
|
105
|
+
printf '\n' >>"$tmp"
|
|
106
|
+
cat -- "$overlay" >>"$tmp"
|
|
107
|
+
fi
|
|
108
|
+
mv -- "$tmp" "$dest"
|
|
109
|
+
printf 'sdlc: merged overlay into %s\n' "$dest"
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
cmd_install() {
|
|
113
|
+
need_manifest
|
|
114
|
+
warn_location
|
|
115
|
+
copy_rules
|
|
116
|
+
copy_skills
|
|
117
|
+
merge_agents
|
|
118
|
+
printf 'sdlc: install done (level %s) repo %s\n' "$(level)" "$REPO_ROOT"
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
valid_slug() {
|
|
122
|
+
[[ "$1" =~ ^[a-z0-9][a-z0-9-]*$ ]] || die "slug must be kebab-case: $1"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
copy_template() {
|
|
126
|
+
local src="$SDLC_DIR/$1" dest="$2/$1"
|
|
127
|
+
[[ -f "$src" ]] || die "missing template $src"
|
|
128
|
+
if [[ -e "$dest" && "$FORCE" -eq 0 ]]; then
|
|
129
|
+
printf 'sdlc: skip existing %s (use --force)\n' "$dest"
|
|
130
|
+
return
|
|
131
|
+
fi
|
|
132
|
+
cp -- "$src" "$dest"
|
|
133
|
+
printf 'sdlc: %s\n' "$dest"
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
cmd_start() {
|
|
137
|
+
need_manifest
|
|
138
|
+
warn_location
|
|
139
|
+
local slug="" with_intent=0 with_spec=0 boundary=0
|
|
140
|
+
FORCE=0
|
|
141
|
+
while [[ $# -gt 0 ]]; do
|
|
142
|
+
case "$1" in
|
|
143
|
+
--force) FORCE=1; shift ;;
|
|
144
|
+
--intent) with_intent=1; shift ;;
|
|
145
|
+
--spec) with_spec=1; shift ;;
|
|
146
|
+
--boundary) boundary=1; shift ;;
|
|
147
|
+
--help|-h) usage; exit 0 ;;
|
|
148
|
+
-*) die "unknown option $1" ;;
|
|
149
|
+
*)
|
|
150
|
+
[[ -z "$slug" ]] || die "unexpected argument $1"
|
|
151
|
+
slug="$1"
|
|
152
|
+
shift
|
|
153
|
+
;;
|
|
154
|
+
esac
|
|
155
|
+
done
|
|
156
|
+
[[ -n "$slug" ]] || die "start requires <slug>"
|
|
157
|
+
valid_slug "$slug"
|
|
158
|
+
|
|
159
|
+
local lvl dest
|
|
160
|
+
lvl="$(level)"
|
|
161
|
+
dest="$SDLC_DIR/changes/$slug"
|
|
162
|
+
mkdir -p "$dest"
|
|
163
|
+
|
|
164
|
+
case "$lvl" in
|
|
165
|
+
light)
|
|
166
|
+
copy_template plan.md "$dest"
|
|
167
|
+
[[ "$with_intent" -eq 1 ]] && copy_template intent.md "$dest"
|
|
168
|
+
[[ "$with_spec" -eq 1 ]] && copy_template spec.md "$dest"
|
|
169
|
+
;;
|
|
170
|
+
core)
|
|
171
|
+
copy_template plan.md "$dest"
|
|
172
|
+
if [[ "$boundary" -eq 1 || "$with_intent" -eq 1 || "$with_spec" -eq 1 ]]; then
|
|
173
|
+
copy_template intent.md "$dest"
|
|
174
|
+
copy_template spec.md "$dest"
|
|
175
|
+
fi
|
|
176
|
+
;;
|
|
177
|
+
full)
|
|
178
|
+
copy_template intent.md "$dest"
|
|
179
|
+
copy_template spec.md "$dest"
|
|
180
|
+
copy_template plan.md "$dest"
|
|
181
|
+
;;
|
|
182
|
+
*)
|
|
183
|
+
die "unknown level in manifest: $lvl"
|
|
184
|
+
;;
|
|
185
|
+
esac
|
|
186
|
+
printf 'sdlc: change %s ready under %s\n' "$slug" "$dest"
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
cmd_status() {
|
|
190
|
+
need_manifest
|
|
191
|
+
warn_location
|
|
192
|
+
local lvl
|
|
193
|
+
lvl="$(level)"
|
|
194
|
+
printf 'level: %s\n' "$lvl"
|
|
195
|
+
printf 'sdlc dir: %s\n' "$SDLC_DIR"
|
|
196
|
+
printf 'repo: %s\n' "$REPO_ROOT"
|
|
197
|
+
if [[ -f "$REPO_ROOT/AGENTS.md" ]] && grep -F -q -- "$BEGIN" "$REPO_ROOT/AGENTS.md"; then
|
|
198
|
+
printf 'AGENTS.md: overlay present\n'
|
|
199
|
+
else
|
|
200
|
+
printf 'AGENTS.md: overlay missing (run install)\n'
|
|
201
|
+
fi
|
|
202
|
+
if [[ -d "$REPO_ROOT/.cursor/rules" ]]; then
|
|
203
|
+
printf 'rules:\n'
|
|
204
|
+
ls -1 "$REPO_ROOT/.cursor/rules"/sdlc-*.mdc 2>/dev/null || printf ' (no sdlc-*.mdc)\n'
|
|
205
|
+
fi
|
|
206
|
+
printf 'changes:\n'
|
|
207
|
+
if [[ -d "$SDLC_DIR/changes" ]]; then
|
|
208
|
+
local d
|
|
209
|
+
shopt -s nullglob
|
|
210
|
+
for d in "$SDLC_DIR/changes"/*/; do
|
|
211
|
+
printf ' %s\n' "$(basename -- "$d")"
|
|
212
|
+
done
|
|
213
|
+
shopt -u nullglob
|
|
214
|
+
fi
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
main() {
|
|
218
|
+
local cmd="${1:-}"
|
|
219
|
+
[[ -n "$cmd" ]] || { usage; exit 1; }
|
|
220
|
+
shift || true
|
|
221
|
+
case "$cmd" in
|
|
222
|
+
install) cmd_install "$@" ;;
|
|
223
|
+
start) cmd_start "$@" ;;
|
|
224
|
+
status) cmd_status "$@" ;;
|
|
225
|
+
-h|--help|help) usage ;;
|
|
226
|
+
*) die "unknown command $cmd" ;;
|
|
227
|
+
esac
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
main "$@"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-invariants
|
|
3
|
+
description: >-
|
|
4
|
+
Enforce shared-module invariants for core SDLC harness. Use when editing a
|
|
5
|
+
kernel, form library, ARIA contract, or other pinned dependency. Block
|
|
6
|
+
product IA, second APIs, and hand-edits of generated code.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Core invariants
|
|
10
|
+
|
|
11
|
+
Apply whenever creating or changing a public surface in this repository.
|
|
12
|
+
|
|
13
|
+
1. Consumers pin this module. Do not add site-specific kinds, carts, or CMS
|
|
14
|
+
schemas so a product can ship a page.
|
|
15
|
+
2. Do not invent a parallel REST or GraphQL content contract.
|
|
16
|
+
3. Do not hand-edit generated sources if the repo marks them generated.
|
|
17
|
+
4. If a policy must always hold, prefer a test or hook over a comment in
|
|
18
|
+
`plan.md`.
|
|
19
|
+
5. Record the invariant in `.sdlc/changes/<slug>/spec.md` when the contract
|
|
20
|
+
itself changes.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sdlc-plan
|
|
3
|
+
description: >-
|
|
4
|
+
Write and follow plan.md for core SDLC. Use at the start of implementation
|
|
5
|
+
in a repo with .sdlc/manifest.yaml level core. Interview risks and callers
|
|
6
|
+
before editing.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Plan mode (core)
|
|
10
|
+
|
|
11
|
+
1. Read `intent.md` / `spec.md` in `.sdlc/changes/<slug>/` if they exist.
|
|
12
|
+
2. Produce `plan.md`: files, order, proof commands, blast radius, rollback.
|
|
13
|
+
3. Do not edit product files until a human accepts the plan (or the change is
|
|
14
|
+
a documented one-line fix).
|
|
15
|
+
4. If implementation diverges, update `plan.md` in the same commit.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Spec (core — compressed)
|
|
2
|
+
|
|
3
|
+
Intent: `.sdlc/changes/<slug>/intent.md`
|
|
4
|
+
|
|
5
|
+
This is not a product design session. Record the contract so a later `plan.md`
|
|
6
|
+
and PR review can check it.
|
|
7
|
+
|
|
8
|
+
## Requirements
|
|
9
|
+
|
|
10
|
+
-
|
|
11
|
+
|
|
12
|
+
## Non-requirements
|
|
13
|
+
|
|
14
|
+
What this library will not absorb from a consumer.
|
|
15
|
+
|
|
16
|
+
## Concerns
|
|
17
|
+
|
|
18
|
+
Flag contradictions with published API, ARIA, or kernel boundaries. A human
|
|
19
|
+
resolves each flag before implementation.
|
|
20
|
+
|
|
21
|
+
## Compatibility
|
|
22
|
+
|
|
23
|
+
Callers / pins that must not break:
|
|
24
|
+
-
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!-- sdlc-harness:begin -->
|
|
2
|
+
## SDLC harness (full)
|
|
3
|
+
|
|
4
|
+
This repo uses the **full** pack (`.harness-sdlc/full` → `.sdlc/`).
|
|
5
|
+
|
|
6
|
+
Loop: accepted `intent.md` → `spec.md` → `plan.md` → diff + existing verify
|
|
7
|
+
→ PR against `.sdlc/REVIEW.md` → you merge. Optional later: `evals/` on
|
|
8
|
+
harness-file changes, `bands.yaml` only if metrics already exist.
|
|
9
|
+
|
|
10
|
+
- Skills: `sdlc-loop`, `sdlc-feedback`, `sdlc-review`. Rule: `sdlc-full.mdc`.
|
|
11
|
+
- Start non-trivial sessions in plan mode. Auto-apply edits only after the
|
|
12
|
+
plan is accepted and tests exist for the blast radius.
|
|
13
|
+
- Do not replace this overlay with a second product contract. Stack rules win.
|
|
14
|
+
- Production deploy stays a human gate (release owner / existing runbooks).
|
|
15
|
+
<!-- sdlc-harness:end -->
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Full harness
|
|
2
|
+
|
|
3
|
+
For the portable Codex path and high-stakes operators.
|
|
4
|
+
Examples: SiteStarter, GoBackend, SvelteCMS, YPanel.
|
|
5
|
+
|
|
6
|
+
Copy this directory to `<repo>/.sdlc/`. Overlay Cursor files — `../README.md`.
|
|
7
|
+
|
|
8
|
+
Solo adaptation: no MDM, no weekly committee. You still accept `spec.md` and
|
|
9
|
+
`plan.md`, merge PRs, and authorize production.
|
|
10
|
+
|
|
11
|
+
## Loop
|
|
12
|
+
|
|
13
|
+
1. `intent.md` — originator + agent; you correct and commit.
|
|
14
|
+
2. `spec.md` — requirements and design in one pass; flagged concerns first.
|
|
15
|
+
3. `plan.md` — plan mode; implement only after you accept.
|
|
16
|
+
4. Feedback loop — repo verify commands before "done".
|
|
17
|
+
5. PR — `.sdlc/REVIEW.md`; you approve.
|
|
18
|
+
6. Maintain — `bands.yaml` is a stub. Fill it only if this repo already has
|
|
19
|
+
metrics; do not invent an on-call agent.
|
|
20
|
+
|
|
21
|
+
## Per change
|
|
22
|
+
|
|
23
|
+
`mkdir -p .sdlc/changes/<slug>` and copy `intent.md`, `spec.md`, `plan.md`.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Review instructions (full)
|
|
2
|
+
|
|
3
|
+
## Passes
|
|
4
|
+
|
|
5
|
+
Run three passes and tag each finding:
|
|
6
|
+
|
|
7
|
+
- Bugs: logic errors, broken edge cases, subtle regressions
|
|
8
|
+
- Security: injection, auth gaps, PII in logs, CSRF/session mistakes
|
|
9
|
+
- Compliance: the change matches `spec.md`, `plan.md`, and this repo's
|
|
10
|
+
`AGENTS.md` / `.project/` ADRs
|
|
11
|
+
|
|
12
|
+
## Important vs nit
|
|
13
|
+
|
|
14
|
+
Important: would break behaviour, leak data, or breach a documented policy.
|
|
15
|
+
Style and naming are nits. At most five nits; summarize the rest as a count.
|
|
16
|
+
|
|
17
|
+
## Do not report
|
|
18
|
+
|
|
19
|
+
Generated files the repo forbids editing, and anything CI already enforces.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Control bands stub. Fill only if this repo already has a queryable metric.
|
|
2
|
+
# Do not invent a headless on-call agent.
|
|
3
|
+
metric: ci_test_failure_rate
|
|
4
|
+
baseline: rolling_30d
|
|
5
|
+
rules: western_electric
|
|
6
|
+
tiers:
|
|
7
|
+
1sigma:
|
|
8
|
+
action: log
|
|
9
|
+
2sigma:
|
|
10
|
+
action: diagnose
|
|
11
|
+
3sigma:
|
|
12
|
+
action: propose
|
|
13
|
+
routes: [pull_request]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Full SDLC — intent, spec, plan, verify, human merge
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Full SDLC overlay
|
|
7
|
+
|
|
8
|
+
This repository opted into `.sdlc` harness **full**.
|
|
9
|
+
|
|
10
|
+
- One change = `.sdlc/changes/<slug>/{intent,spec,plan}.md`.
|
|
11
|
+
- Plan mode before large edits. Feedback loop = existing repo verify commands.
|
|
12
|
+
- Review policy: `.sdlc/REVIEW.md`. Production stays a human gate.
|
|
13
|
+
- `evals/` and `bands.yaml` are stubs until this repo already has CI/metrics.
|
|
14
|
+
- Skills: `sdlc-loop`, `sdlc-feedback`, `sdlc-review`.
|
|
15
|
+
- Product `AGENTS.md`, `.project/`, and stack-contract win on conflict.
|
|
16
|
+
- Do not invent a second content API, product CMS schema, or local module
|
|
17
|
+
replace to ship a site.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Agent evals (stub)
|
|
2
|
+
|
|
3
|
+
When this repo's agent config (`AGENTS.md`, `.sdlc`, `.cursor/rules`, skills)
|
|
4
|
+
changes, add 20–50 real tasks here later. Each eval is a prompt plus checks
|
|
5
|
+
(tests pass, lint clean, policy followed).
|
|
6
|
+
|
|
7
|
+
Do not add a second CI framework. Prefer the existing GitHub Actions /
|
|
8
|
+
`make verify` job, gated on paths:
|
|
9
|
+
|
|
10
|
+
- `AGENTS.md`
|
|
11
|
+
- `.sdlc/**`
|
|
12
|
+
- `.cursor/rules/**`
|
|
13
|
+
- `.cursor/skills/**`
|
|
14
|
+
|
|
15
|
+
A production incident becomes a permanent eval in this folder, owned by the
|
|
16
|
+
person who closed the incident.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Hooks (notes, not a runtime)
|
|
2
|
+
|
|
3
|
+
Solo default: rely on existing tests and PR review.
|
|
4
|
+
|
|
5
|
+
Add deterministic hooks later if you run Claude Code / Cursor hooks in this
|
|
6
|
+
repo, for example:
|
|
7
|
+
|
|
8
|
+
- Block edits to generated or frozen paths
|
|
9
|
+
- Block secret files (`.env`, `**/secrets/**`)
|
|
10
|
+
- Ask a human before production deploy commands
|
|
11
|
+
|
|
12
|
+
Keep approval prompts off the build hot path so parallel sessions are not
|
|
13
|
+
serialized. Production gates belong at deploy, not on every file save.
|
|
14
|
+
|
|
15
|
+
Example PreToolUse shape lives in the playbook
|
|
16
|
+
(`.manual/sdlc-en/10-hooks-as-approval-gates.md`). Do not enable managed-only
|
|
17
|
+
enterprise settings unless you actually operate MDM.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Intent: <!-- short title -->
|
|
2
|
+
|
|
3
|
+
Author: <!-- name / role -->
|
|
4
|
+
Status: draft
|
|
5
|
+
Slug: <!-- kebab-case, matches .sdlc/changes/<slug>/ -->
|
|
6
|
+
|
|
7
|
+
## Problem
|
|
8
|
+
|
|
9
|
+
What cannot be done today. Who is affected.
|
|
10
|
+
|
|
11
|
+
## Proposed outcome
|
|
12
|
+
|
|
13
|
+
What better looks like. Observable, not a slogan.
|
|
14
|
+
|
|
15
|
+
## Affected users and systems
|
|
16
|
+
|
|
17
|
+
People, processes, and repos that change or must stay pinned.
|
|
18
|
+
|
|
19
|
+
## Constraints
|
|
20
|
+
|
|
21
|
+
- Existing product `AGENTS.md` and `.project/` (if any) stay authoritative.
|
|
22
|
+
- No second content REST, no storefront-owned CMS SoT, no local `replace` of
|
|
23
|
+
portable modules to ship a site.
|
|
24
|
+
- Secrets stay out of `cms/` and `content/`.
|
|
25
|
+
|
|
26
|
+
## Open questions
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
level: full
|
|
2
|
+
version: 1
|
|
3
|
+
copy_to: .sdlc
|
|
4
|
+
cursor:
|
|
5
|
+
rules: cursor/rules
|
|
6
|
+
skills: skills
|
|
7
|
+
agents_md:
|
|
8
|
+
overlay: AGENTS.md
|
|
9
|
+
merge_markers:
|
|
10
|
+
begin: "<!-- sdlc-harness:begin -->"
|
|
11
|
+
end: "<!-- sdlc-harness:end -->"
|
|
12
|
+
artifacts:
|
|
13
|
+
required: [intent.md, spec.md, plan.md]
|
|
14
|
+
review: REVIEW.md
|
|
15
|
+
evals: evals/
|
|
16
|
+
hooks: hooks/
|
|
17
|
+
maintain: bands.yaml
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Plan: <!-- title -->
|
|
2
|
+
|
|
3
|
+
From: `.sdlc/changes/<slug>/spec.md` (intent <!-- date or slug -->)
|
|
4
|
+
Status: draft
|
|
5
|
+
|
|
6
|
+
## Files that change
|
|
7
|
+
|
|
8
|
+
-
|
|
9
|
+
|
|
10
|
+
## Order of work
|
|
11
|
+
|
|
12
|
+
1.
|
|
13
|
+
2.
|
|
14
|
+
3.
|
|
15
|
+
|
|
16
|
+
## Risks
|
|
17
|
+
|
|
18
|
+
What could break. Highest-risk step. Options considered and rejected.
|
|
19
|
+
|
|
20
|
+
## Proof
|
|
21
|
+
|
|
22
|
+
- Commands (from repo `AGENTS.md`):
|
|
23
|
+
- Tests or screenshots that match the spec:
|
|
24
|
+
|
|
25
|
+
An engineer who never saw the chat must be able to implement from this file
|
|
26
|
+
alone.
|
|
27
|
+
|
|
28
|
+
## Divergence
|
|
29
|
+
|
|
30
|
+
If implementation leaves this plan, update this file in the same commit.
|