opengstack 0.13.4
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/AGENTS.md +47 -0
- package/CLAUDE.md +370 -0
- package/LICENSE +21 -0
- package/README.md +80 -0
- package/SKILL.md +226 -0
- package/autoplan/SKILL.md +96 -0
- package/autoplan/SKILL.md.tmpl +694 -0
- package/benchmark/SKILL.md +358 -0
- package/benchmark/SKILL.md.tmpl +222 -0
- package/browse/SKILL.md +396 -0
- package/browse/SKILL.md.tmpl +131 -0
- package/canary/SKILL.md +89 -0
- package/canary/SKILL.md.tmpl +212 -0
- package/careful/SKILL.md +58 -0
- package/careful/SKILL.md.tmpl +56 -0
- package/codex/SKILL.md +90 -0
- package/codex/SKILL.md.tmpl +417 -0
- package/connect-chrome/SKILL.md +87 -0
- package/connect-chrome/SKILL.md.tmpl +195 -0
- package/cso/SKILL.md +93 -0
- package/cso/SKILL.md.tmpl +606 -0
- package/design-consultation/SKILL.md +94 -0
- package/design-consultation/SKILL.md.tmpl +415 -0
- package/design-review/SKILL.md +94 -0
- package/design-review/SKILL.md.tmpl +290 -0
- package/design-shotgun/SKILL.md +91 -0
- package/design-shotgun/SKILL.md.tmpl +285 -0
- package/docs/designs/CHROME_VS_CHROMIUM_EXPLORATION.md +84 -0
- package/docs/designs/CONDUCTOR_CHROME_SIDEBAR_INTEGRATION.md +57 -0
- package/docs/designs/CONDUCTOR_SESSION_API.md +108 -0
- package/docs/designs/DESIGN_SHOTGUN.md +451 -0
- package/docs/designs/DESIGN_TOOLS_V1.md +622 -0
- package/docs/skills.md +880 -0
- package/document-release/SKILL.md +91 -0
- package/document-release/SKILL.md.tmpl +359 -0
- package/freeze/SKILL.md +78 -0
- package/freeze/SKILL.md.tmpl +77 -0
- package/gstack-upgrade/SKILL.md +224 -0
- package/gstack-upgrade/SKILL.md.tmpl +222 -0
- package/guard/SKILL.md +78 -0
- package/guard/SKILL.md.tmpl +77 -0
- package/investigate/SKILL.md +105 -0
- package/investigate/SKILL.md.tmpl +194 -0
- package/land-and-deploy/SKILL.md +88 -0
- package/land-and-deploy/SKILL.md.tmpl +881 -0
- package/office-hours/SKILL.md +96 -0
- package/office-hours/SKILL.md.tmpl +645 -0
- package/package.json +43 -0
- package/plan-ceo-review/SKILL.md +94 -0
- package/plan-ceo-review/SKILL.md.tmpl +811 -0
- package/plan-design-review/SKILL.md +92 -0
- package/plan-design-review/SKILL.md.tmpl +446 -0
- package/plan-eng-review/SKILL.md +93 -0
- package/plan-eng-review/SKILL.md.tmpl +303 -0
- package/qa/SKILL.md +95 -0
- package/qa/SKILL.md.tmpl +316 -0
- package/qa-only/SKILL.md +89 -0
- package/qa-only/SKILL.md.tmpl +101 -0
- package/retro/SKILL.md +89 -0
- package/retro/SKILL.md.tmpl +820 -0
- package/review/SKILL.md +92 -0
- package/review/SKILL.md.tmpl +281 -0
- package/scripts/cleanup.py +100 -0
- package/scripts/filter-skills.sh +114 -0
- package/scripts/filter_skills.py +140 -0
- package/setup-browser-cookies/SKILL.md +216 -0
- package/setup-browser-cookies/SKILL.md.tmpl +81 -0
- package/setup-deploy/SKILL.md +92 -0
- package/setup-deploy/SKILL.md.tmpl +215 -0
- package/ship/SKILL.md +90 -0
- package/ship/SKILL.md.tmpl +636 -0
- package/unfreeze/SKILL.md +37 -0
- package/unfreeze/SKILL.md.tmpl +36 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# OpenGStack — AI Engineering Workflow
|
|
2
|
+
|
|
3
|
+
OpenGStack is a collection of SKILL.md files that give AI agents structured roles for
|
|
4
|
+
software development. Each skill is a specialist: CEO reviewer, eng manager,
|
|
5
|
+
designer, QA lead, release engineer, debugger, and more.
|
|
6
|
+
|
|
7
|
+
Forked from garrytan/gstack with telemetry removed.
|
|
8
|
+
|
|
9
|
+
## Available skills
|
|
10
|
+
|
|
11
|
+
Skills live in skill directories. Invoke them by name (e.g., `/office-hours`).
|
|
12
|
+
|
|
13
|
+
| Skill | What it does |
|
|
14
|
+
|-------|-------------|
|
|
15
|
+
| `/office-hours` | Start here. Reframes your product idea before you write code. |
|
|
16
|
+
| `/plan-ceo-review` | CEO-level review: find the 10-star product in the request. |
|
|
17
|
+
| `/plan-eng-review` | Lock architecture, data flow, edge cases, and tests. |
|
|
18
|
+
| `/plan-design-review` | Rate each design dimension 0-10, explain what a 10 looks like. |
|
|
19
|
+
| `/design-consultation` | Build a complete design system from scratch. |
|
|
20
|
+
| `/review` | Pre-landing PR review. Finds bugs that pass CI but break in prod. |
|
|
21
|
+
| `/investigate` | Systematic root-cause debugging. No fixes without investigation. |
|
|
22
|
+
| `/design-review` | Design audit + fix loop with atomic commits. |
|
|
23
|
+
| `/qa` | Open a real browser, find bugs, fix them, re-verify. |
|
|
24
|
+
| `/qa-only` | Same as /qa but report only — no code changes. |
|
|
25
|
+
| `/ship` | Run tests, review, push, open PR. One command. |
|
|
26
|
+
| `/land-and-deploy` | Merge PR, deploy, verify health. |
|
|
27
|
+
| `/document-release` | Update all docs to match what you just shipped. |
|
|
28
|
+
| `/retro` | Weekly retro with per-person breakdowns and shipping streaks. |
|
|
29
|
+
| `/browse` | Headless browser — real Chromium, real clicks, ~100ms/command. |
|
|
30
|
+
| `/setup-browser-cookies` | Import cookies from your real browser for authenticated testing. |
|
|
31
|
+
| `/careful` | Warn before destructive commands (rm -rf, DROP TABLE, force-push). |
|
|
32
|
+
| `/freeze` | Lock edits to one directory. Hard block, not just a warning. |
|
|
33
|
+
| `/guard` | Activate both careful + freeze at once. |
|
|
34
|
+
| `/unfreeze` | Remove directory edit restrictions. |
|
|
35
|
+
| `/autoplan` | Run all reviews sequentially with auto-decisions. |
|
|
36
|
+
| `/codex` | OpenAI Codex CLI wrapper for code review. |
|
|
37
|
+
| `/canary` | Post-deploy monitoring. |
|
|
38
|
+
| `/benchmark` | Performance regression detection. |
|
|
39
|
+
| `/cso` | Security audit. |
|
|
40
|
+
|
|
41
|
+
## No Telemetry
|
|
42
|
+
|
|
43
|
+
This fork has all telemetry, analytics, and tracking removed. Your usage stays local.
|
|
44
|
+
|
|
45
|
+
## Sync from Upstream
|
|
46
|
+
|
|
47
|
+
This repo syncs daily from garrytan/gstack via GitHub Actions.
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# gstack development
|
|
2
|
+
|
|
3
|
+
## Commands
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
bun install # install dependencies
|
|
7
|
+
bun test # run free tests (browse + snapshot + skill validation)
|
|
8
|
+
bun run test:evals # run paid evals: LLM judge + E2E (diff-based, ~$4/run max)
|
|
9
|
+
bun run test:evals:all # run ALL paid evals regardless of diff
|
|
10
|
+
bun run test:gate # run gate-tier tests only (CI default, blocks merge)
|
|
11
|
+
bun run test:periodic # run periodic-tier tests only (weekly cron / manual)
|
|
12
|
+
bun run test:e2e # run E2E tests only (diff-based, ~$3.85/run max)
|
|
13
|
+
bun run test:e2e:all # run ALL E2E tests regardless of diff
|
|
14
|
+
bun run eval:select # show which tests would run based on current diff
|
|
15
|
+
bun run dev <cmd> # run CLI in dev mode, e.g. bun run dev goto https://example.com
|
|
16
|
+
bun run build # gen docs + compile binaries
|
|
17
|
+
bun run gen:skill-docs # regenerate SKILL.md files from templates
|
|
18
|
+
bun run skill:check # health dashboard for all skills
|
|
19
|
+
bun run dev:skill # watch mode: auto-regen + validate on change
|
|
20
|
+
bun run eval:list # list all eval runs from ~/.gstack-dev/evals/
|
|
21
|
+
bun run eval:compare # compare two eval runs (auto-picks most recent)
|
|
22
|
+
bun run eval:summary # aggregate stats across all eval runs
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`test:evals` requires `ANTHROPIC_API_KEY`. Codex E2E tests (`test/codex-e2e.test.ts`)
|
|
26
|
+
use Codex's own auth from `~/.codex/` config — no `OPENAI_API_KEY` env var needed.
|
|
27
|
+
E2E tests stream progress in real-time (tool-by-tool via `--output-format stream-json
|
|
28
|
+
--verbose`). Results are persisted to `~/.gstack-dev/evals/` with auto-comparison
|
|
29
|
+
against the previous run.
|
|
30
|
+
|
|
31
|
+
**Diff-based test selection:** `test:evals` and `test:e2e` auto-select tests based
|
|
32
|
+
on `git diff` against the base branch. Each test declares its file dependencies in
|
|
33
|
+
`test/helpers/touchfiles.ts`. Changes to global touchfiles (session-runner, eval-store,
|
|
34
|
+
touchfiles.ts itself) trigger all tests. Use `EVALS_ALL=1` or the `:all` script
|
|
35
|
+
variants to force all tests. Run `eval:select` to preview which tests would run.
|
|
36
|
+
|
|
37
|
+
**Two-tier system:** Tests are classified as `gate` or `periodic` in `E2E_TIERS`
|
|
38
|
+
(in `test/helpers/touchfiles.ts`). CI runs only gate tests (`EVALS_TIER=gate`);
|
|
39
|
+
periodic tests run weekly via cron or manually. Use `EVALS_TIER=gate` or
|
|
40
|
+
`EVALS_TIER=periodic` to filter. When adding new E2E tests, classify them:
|
|
41
|
+
1. Safety guardrail or deterministic functional test? -> `gate`
|
|
42
|
+
2. Quality benchmark, Opus model test, or non-deterministic? -> `periodic`
|
|
43
|
+
3. Requires external service (Codex, Gemini)? -> `periodic`
|
|
44
|
+
|
|
45
|
+
## Testing
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bun test # run before every commit — free, <2s
|
|
49
|
+
bun run test:evals # run before shipping — paid, diff-based (~$4/run max)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`bun test` runs skill validation, gen-skill-docs quality checks, and browse
|
|
53
|
+
integration tests. `bun run test:evals` runs LLM-judge quality evals and E2E
|
|
54
|
+
tests via `claude -p`. Both must pass before creating a PR.
|
|
55
|
+
|
|
56
|
+
## Project structure
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
gstack/
|
|
60
|
+
├── browse/ # Headless browser CLI (Playwright)
|
|
61
|
+
│ ├── src/ # CLI + server + commands
|
|
62
|
+
│ │ ├── commands.ts # Command registry (single source of truth)
|
|
63
|
+
│ │ └── snapshot.ts # SNAPSHOT_FLAGS metadata array
|
|
64
|
+
│ ├── test/ # Integration tests + fixtures
|
|
65
|
+
│ └── dist/ # Compiled binary
|
|
66
|
+
├── scripts/ # Build + DX tooling
|
|
67
|
+
│ ├── gen-skill-docs.ts # Template → SKILL.md generator
|
|
68
|
+
│ ├── resolvers/ # Template resolver modules (preamble, design, review, etc.)
|
|
69
|
+
│ ├── skill-check.ts # Health dashboard
|
|
70
|
+
│ └── dev-skill.ts # Watch mode
|
|
71
|
+
├── test/ # Skill validation + eval tests
|
|
72
|
+
│ ├── helpers/ # skill-parser.ts, session-runner.ts, llm-judge.ts, eval-store.ts
|
|
73
|
+
│ ├── fixtures/ # Ground truth JSON, planted-bug fixtures, eval baselines
|
|
74
|
+
│ ├── skill-validation.test.ts # Tier 1: static validation (free, <1s)
|
|
75
|
+
│ ├── gen-skill-docs.test.ts # Tier 1: generator quality (free, <1s)
|
|
76
|
+
│ ├── skill-llm-eval.test.ts # Tier 3: LLM-as-judge (~$0.15/run)
|
|
77
|
+
│ └── skill-e2e-*.test.ts # Tier 2: E2E via claude -p (~$3.85/run, split by category)
|
|
78
|
+
├── qa-only/ # /qa-only skill (report-only QA, no fixes)
|
|
79
|
+
├── plan-design-review/ # /plan-design-review skill (report-only design audit)
|
|
80
|
+
├── design-review/ # /design-review skill (design audit + fix loop)
|
|
81
|
+
├── ship/ # Ship workflow skill
|
|
82
|
+
├── review/ # PR review skill
|
|
83
|
+
├── plan-ceo-review/ # /plan-ceo-review skill
|
|
84
|
+
├── plan-eng-review/ # /plan-eng-review skill
|
|
85
|
+
├── autoplan/ # /autoplan skill (auto-review pipeline: CEO → design → eng)
|
|
86
|
+
├── benchmark/ # /benchmark skill (performance regression detection)
|
|
87
|
+
├── canary/ # /canary skill (post-deploy monitoring loop)
|
|
88
|
+
├── codex/ # /codex skill (multi-AI second opinion via OpenAI Codex CLI)
|
|
89
|
+
├── land-and-deploy/ # /land-and-deploy skill (merge → deploy → canary verify)
|
|
90
|
+
├── office-hours/ # /office-hours skill (YC Office Hours — startup diagnostic + builder brainstorm)
|
|
91
|
+
├── investigate/ # /investigate skill (systematic root-cause debugging)
|
|
92
|
+
├── retro/ # Retrospective skill (includes /retro global cross-project mode)
|
|
93
|
+
├── bin/ # CLI utilities (gstack-repo-mode, gstack-slug, gstack-config, etc.)
|
|
94
|
+
├── document-release/ # /document-release skill (post-ship doc updates)
|
|
95
|
+
├── cso/ # /cso skill (OWASP Top 10 + STRIDE security audit)
|
|
96
|
+
├── design-consultation/ # /design-consultation skill (design system from scratch)
|
|
97
|
+
├── design-shotgun/ # /design-shotgun skill (visual design exploration)
|
|
98
|
+
├── connect-chrome/ # /connect-chrome skill (headed Chrome with side panel)
|
|
99
|
+
├── design/ # Design binary CLI (GPT Image API)
|
|
100
|
+
│ ├── src/ # CLI + commands (generate, variants, compare, serve, etc.)
|
|
101
|
+
│ ├── test/ # Integration tests
|
|
102
|
+
│ └── dist/ # Compiled binary
|
|
103
|
+
├── extension/ # Chrome extension (side panel + activity feed)
|
|
104
|
+
├── lib/ # Shared libraries (worktree.ts)
|
|
105
|
+
├── docs/designs/ # Design documents
|
|
106
|
+
├── setup-deploy/ # /setup-deploy skill (one-time deploy config)
|
|
107
|
+
├── .github/ # CI workflows + Docker image
|
|
108
|
+
│ ├── workflows/ # evals.yml (E2E on Ubicloud), skill-docs.yml, actionlint.yml
|
|
109
|
+
│ └── docker/ # Dockerfile.ci (pre-baked toolchain + Playwright/Chromium)
|
|
110
|
+
├── setup # One-time setup: build binary + symlink skills
|
|
111
|
+
├── SKILL.md # Generated from SKILL.md.tmpl (don't edit directly)
|
|
112
|
+
├── SKILL.md.tmpl # Template: edit this, run gen:skill-docs
|
|
113
|
+
├── ETHOS.md # Builder philosophy (Boil the Lake, Search Before Building)
|
|
114
|
+
└── package.json # Build scripts for browse
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## SKILL.md workflow
|
|
118
|
+
|
|
119
|
+
SKILL.md files are **generated** from `.tmpl` templates. To update docs:
|
|
120
|
+
|
|
121
|
+
1. Edit the `.tmpl` file (e.g. `SKILL.md.tmpl` or `browse/SKILL.md.tmpl`)
|
|
122
|
+
2. Run `bun run gen:skill-docs` (or `bun run build` which does it automatically)
|
|
123
|
+
3. Commit both the `.tmpl` and generated `.md` files
|
|
124
|
+
|
|
125
|
+
To add a new browse command: add it to `browse/src/commands.ts` and rebuild.
|
|
126
|
+
To add a snapshot flag: add it to `SNAPSHOT_FLAGS` in `browse/src/snapshot.ts` and rebuild.
|
|
127
|
+
|
|
128
|
+
**Merge conflicts on SKILL.md files:** NEVER resolve conflicts on generated SKILL.md
|
|
129
|
+
files by accepting either side. Instead: (1) resolve conflicts on the `.tmpl` templates
|
|
130
|
+
and `scripts/gen-skill-docs.ts` (the sources of truth), (2) run `bun run gen:skill-docs`
|
|
131
|
+
to regenerate all SKILL.md files, (3) stage the regenerated files. Accepting one side's
|
|
132
|
+
generated output silently drops the other side's template changes.
|
|
133
|
+
|
|
134
|
+
## Platform-agnostic design
|
|
135
|
+
|
|
136
|
+
Skills must NEVER hardcode framework-specific commands, file patterns, or directory
|
|
137
|
+
structures. Instead:
|
|
138
|
+
|
|
139
|
+
1. **Read CLAUDE.md** for project-specific config (test commands, eval commands, etc.)
|
|
140
|
+
2. **If missing, AskUserQuestion** — let the user tell you or let gstack search the repo
|
|
141
|
+
3. **Persist the answer to CLAUDE.md** so we never have to ask again
|
|
142
|
+
|
|
143
|
+
This applies to test commands, eval commands, deploy commands, and any other
|
|
144
|
+
project-specific behavior. The project owns its config; gstack reads it.
|
|
145
|
+
|
|
146
|
+
## Writing SKILL templates
|
|
147
|
+
|
|
148
|
+
SKILL.md.tmpl files are **prompt templates read by Claude**, not bash scripts.
|
|
149
|
+
Each bash code block runs in a separate shell — variables do not persist between blocks.
|
|
150
|
+
|
|
151
|
+
Rules:
|
|
152
|
+
- **Use natural language for logic and state.** Don't use shell variables to pass
|
|
153
|
+
state between code blocks. Instead, tell Claude what to remember and reference
|
|
154
|
+
it in prose (e.g., "the base branch detected in Step 0").
|
|
155
|
+
- **Don't hardcode branch names.** Detect `main`/`master`/etc dynamically via
|
|
156
|
+
`gh pr view` or `gh repo view`. Use `{{BASE_BRANCH_DETECT}}` for PR-targeting
|
|
157
|
+
skills. Use "the base branch" in prose, `<base>` in code block placeholders.
|
|
158
|
+
- **Keep bash blocks self-contained.** Each code block should work independently.
|
|
159
|
+
If a block needs context from a previous step, restate it in the prose above.
|
|
160
|
+
- **Express conditionals as English.** Instead of nested `if/elif/else` in bash,
|
|
161
|
+
write numbered decision steps: "1. If X, do Y. 2. Otherwise, do Z."
|
|
162
|
+
|
|
163
|
+
## Browser interaction
|
|
164
|
+
|
|
165
|
+
When you need to interact with a browser (QA, dogfooding, cookie setup), use the
|
|
166
|
+
`/browse` skill or run the browse binary directly via `$B <command>`. NEVER use
|
|
167
|
+
`mcp__claude-in-chrome__*` tools — they are slow, unreliable, and not what this
|
|
168
|
+
project uses.
|
|
169
|
+
|
|
170
|
+
## Vendored symlink awareness
|
|
171
|
+
|
|
172
|
+
When developing gstack, `.claude/skills/gstack` may be a symlink back to this
|
|
173
|
+
working directory (gitignored). This means skill changes are **live immediately** —
|
|
174
|
+
great for rapid iteration, risky during big refactors where half-written skills
|
|
175
|
+
could break other Claude Code sessions using gstack concurrently.
|
|
176
|
+
|
|
177
|
+
**Check once per session:** Run `ls -la .claude/skills/gstack` to see if it's a
|
|
178
|
+
symlink or a real copy. If it's a symlink to your working directory, be aware that:
|
|
179
|
+
- Template changes + `bun run gen:skill-docs` immediately affect all gstack invocations
|
|
180
|
+
- Breaking changes to SKILL.md.tmpl files can break concurrent gstack sessions
|
|
181
|
+
- During large refactors, remove the symlink (`rm .claude/skills/gstack`) so the
|
|
182
|
+
global install at `~/.claude/skills/gstack/` is used instead
|
|
183
|
+
|
|
184
|
+
**Prefix setting:** Skill symlinks use either short names (`qa -> gstack/qa`) or
|
|
185
|
+
namespaced (`gstack-qa -> gstack/qa`), controlled by `skill_prefix` in
|
|
186
|
+
`~/.gstack/config.yaml`. When vendoring into a project, run `./setup` after
|
|
187
|
+
symlinking to create the per-skill symlinks with your preferred naming. Pass
|
|
188
|
+
`--no-prefix` or `--prefix` to skip the interactive prompt.
|
|
189
|
+
|
|
190
|
+
**For plan reviews:** When reviewing plans that modify skill templates or the
|
|
191
|
+
gen-skill-docs pipeline, consider whether the changes should be tested in isolation
|
|
192
|
+
before going live (especially if the user is actively using gstack in other windows).
|
|
193
|
+
|
|
194
|
+
## Compiled binaries — NEVER commit browse/dist/ or design/dist/
|
|
195
|
+
|
|
196
|
+
The `browse/dist/` and `design/dist/` directories contain compiled Bun binaries
|
|
197
|
+
(`browse`, `find-browse`, `design`, ~58MB each). These are Mach-O arm64 only — they
|
|
198
|
+
do NOT work on Linux, Windows, or Intel Macs. The `./setup` script already builds
|
|
199
|
+
from source for every platform, so the checked-in binaries are redundant. They are
|
|
200
|
+
tracked by git due to a historical mistake and should eventually be removed with
|
|
201
|
+
`git rm --cached`.
|
|
202
|
+
|
|
203
|
+
**NEVER stage or commit these files.** They show up as modified in `git status`
|
|
204
|
+
because they're tracked despite `.gitignore` — ignore them. When staging files,
|
|
205
|
+
always use specific filenames (`git add file1 file2`) — never `git add .` or
|
|
206
|
+
`git add -A`, which will accidentally include the binaries.
|
|
207
|
+
|
|
208
|
+
## Commit style
|
|
209
|
+
|
|
210
|
+
**Always bisect commits.** Every commit should be a single logical change. When
|
|
211
|
+
you've made multiple changes (e.g., a rename + a rewrite + new tests), split them
|
|
212
|
+
into separate commits before pushing. Each commit should be independently
|
|
213
|
+
understandable and revertable.
|
|
214
|
+
|
|
215
|
+
Examples of good bisection:
|
|
216
|
+
- Rename/move separate from behavior changes
|
|
217
|
+
- Test infrastructure (touchfiles, helpers) separate from test implementations
|
|
218
|
+
- Template changes separate from generated file regeneration
|
|
219
|
+
- Mechanical refactors separate from new features
|
|
220
|
+
|
|
221
|
+
When the user says "bisect commit" or "bisect and push," split staged/unstaged
|
|
222
|
+
changes into logical commits and push.
|
|
223
|
+
|
|
224
|
+
## Community PR guardrails
|
|
225
|
+
|
|
226
|
+
When reviewing or merging community PRs, **always AskUserQuestion** before accepting
|
|
227
|
+
any commit that:
|
|
228
|
+
|
|
229
|
+
1. **Touches ETHOS.md** — this file is Garry's personal builder philosophy. No edits
|
|
230
|
+
from external contributors or AI agents, period.
|
|
231
|
+
2. **Removes or softens promotional material** — YC references, founder perspective,
|
|
232
|
+
and product voice are intentional. PRs that frame these as "unnecessary" or
|
|
233
|
+
"too promotional" must be rejected.
|
|
234
|
+
3. **Changes Garry's voice** — the tone, humor, directness, and perspective in skill
|
|
235
|
+
templates, CHANGELOG, and docs are not generic. PRs that rewrite voice to be
|
|
236
|
+
more "neutral" or "professional" must be rejected.
|
|
237
|
+
|
|
238
|
+
Even if the agent strongly believes a change improves the project, these three
|
|
239
|
+
categories require explicit user approval via AskUserQuestion. No exceptions.
|
|
240
|
+
No auto-merging. No "I'll just clean this up."
|
|
241
|
+
|
|
242
|
+
## CHANGELOG + VERSION style
|
|
243
|
+
|
|
244
|
+
**VERSION and CHANGELOG are branch-scoped.** Every feature branch that ships gets its
|
|
245
|
+
own version bump and CHANGELOG entry. The entry describes what THIS branch adds —
|
|
246
|
+
not what was already on main.
|
|
247
|
+
|
|
248
|
+
**When to write the CHANGELOG entry:**
|
|
249
|
+
- At `/ship` time (Step 5), not during development or mid-branch.
|
|
250
|
+
- The entry covers ALL commits on this branch vs the base branch.
|
|
251
|
+
- Never fold new work into an existing CHANGELOG entry from a prior version that
|
|
252
|
+
already landed on main. If main has v0.10.0.0 and your branch adds features,
|
|
253
|
+
bump to v0.10.1.0 with a new entry — don't edit the v0.10.0.0 entry.
|
|
254
|
+
|
|
255
|
+
**Key questions before writing:**
|
|
256
|
+
1. What branch am I on? What did THIS branch change?
|
|
257
|
+
2. Is the base branch version already released? (If yes, bump and create new entry.)
|
|
258
|
+
3. Does an existing entry on this branch already cover earlier work? (If yes, replace
|
|
259
|
+
it with one unified entry for the final version.)
|
|
260
|
+
|
|
261
|
+
CHANGELOG.md is **for users**, not contributors. Write it like product release notes:
|
|
262
|
+
|
|
263
|
+
- Lead with what the user can now **do** that they couldn't before. Sell the feature.
|
|
264
|
+
- Use plain language, not implementation details. "You can now..." not "Refactored the..."
|
|
265
|
+
- **Never mention TODOS.md, internal tracking, eval infrastructure, or contributor-facing
|
|
266
|
+
details.** These are invisible to users and meaningless to them.
|
|
267
|
+
- Put contributor/internal changes in a separate "For contributors" section at the bottom.
|
|
268
|
+
- Every entry should make someone think "oh nice, I want to try that."
|
|
269
|
+
- No jargon: say "every question now tells you which project and branch you're in" not
|
|
270
|
+
"AskUserQuestion format standardized across skill templates via preamble resolver."
|
|
271
|
+
|
|
272
|
+
## AI effort compression
|
|
273
|
+
|
|
274
|
+
When estimating or discussing effort, always show both human-team and CC+gstack time:
|
|
275
|
+
|
|
276
|
+
| Task type | Human team | CC+gstack | Compression |
|
|
277
|
+
|-----------|-----------|-----------|-------------|
|
|
278
|
+
| Boilerplate / scaffolding | 2 days | 15 min | ~100x |
|
|
279
|
+
| Test writing | 1 day | 15 min | ~50x |
|
|
280
|
+
| Feature implementation | 1 week | 30 min | ~30x |
|
|
281
|
+
| Bug fix + regression test | 4 hours | 15 min | ~20x |
|
|
282
|
+
| Architecture / design | 2 days | 4 hours | ~5x |
|
|
283
|
+
| Research / exploration | 1 day | 3 hours | ~3x |
|
|
284
|
+
|
|
285
|
+
Completeness is cheap. Don't recommend shortcuts when the complete implementation
|
|
286
|
+
is a "lake" (achievable) not an "ocean" (multi-quarter migration). See the
|
|
287
|
+
Completeness Principle in the skill preamble for the full philosophy.
|
|
288
|
+
|
|
289
|
+
## Search before building
|
|
290
|
+
|
|
291
|
+
Before designing any solution that involves concurrency, unfamiliar patterns,
|
|
292
|
+
infrastructure, or anything where the runtime/framework might have a built-in:
|
|
293
|
+
|
|
294
|
+
1. Search for "{runtime} {thing} built-in"
|
|
295
|
+
2. Search for "{thing} best practice {current year}"
|
|
296
|
+
3. Check official runtime/framework docs
|
|
297
|
+
|
|
298
|
+
Three layers of knowledge: tried-and-true (Layer 1), new-and-popular (Layer 2),
|
|
299
|
+
first-principles (Layer 3). Prize Layer 3 above all. See ETHOS.md for the full
|
|
300
|
+
builder philosophy.
|
|
301
|
+
|
|
302
|
+
## Local plans
|
|
303
|
+
|
|
304
|
+
Contributors can store long-range vision docs and design documents in `~/.gstack-dev/plans/`.
|
|
305
|
+
These are local-only (not checked in). When reviewing TODOS.md, check `plans/` for candidates
|
|
306
|
+
that may be ready to promote to TODOs or implement.
|
|
307
|
+
|
|
308
|
+
## E2E eval failure blame protocol
|
|
309
|
+
|
|
310
|
+
When an E2E eval fails during `/ship` or any other workflow, **never claim "not
|
|
311
|
+
related to our changes" without proving it.** These systems have invisible couplings —
|
|
312
|
+
a preamble text change affects agent behavior, a new helper changes timing, a
|
|
313
|
+
regenerated SKILL.md shifts prompt context.
|
|
314
|
+
|
|
315
|
+
**Required before attributing a failure to "pre-existing":**
|
|
316
|
+
1. Run the same eval on main (or base branch) and show it fails there too
|
|
317
|
+
2. If it passes on main but fails on the branch — it IS your change. Trace the blame.
|
|
318
|
+
3. If you can't run on main, say "unverified — may or may not be related" and flag it
|
|
319
|
+
as a risk in the PR body
|
|
320
|
+
|
|
321
|
+
"Pre-existing" without receipts is a lazy claim. Prove it or don't say it.
|
|
322
|
+
|
|
323
|
+
## Long-running tasks: don't give up
|
|
324
|
+
|
|
325
|
+
When running evals, E2E tests, or any long-running background task, **poll until
|
|
326
|
+
completion**. Use `sleep 180 && echo "ready"` + `TaskOutput` in a loop every 3
|
|
327
|
+
minutes. Never switch to blocking mode and give up when the poll times out. Never
|
|
328
|
+
say "I'll be notified when it completes" and stop checking — keep the loop going
|
|
329
|
+
until the task finishes or the user tells you to stop.
|
|
330
|
+
|
|
331
|
+
The full E2E suite can take 30-45 minutes. That's 10-15 polling cycles. Do all of
|
|
332
|
+
them. Report progress at each check (which tests passed, which are running, any
|
|
333
|
+
failures so far). The user wants to see the run complete, not a promise that
|
|
334
|
+
you'll check later.
|
|
335
|
+
|
|
336
|
+
## E2E test fixtures: extract, don't copy
|
|
337
|
+
|
|
338
|
+
**NEVER copy a full SKILL.md file into an E2E test fixture.** SKILL.md files are
|
|
339
|
+
1500-2000 lines. When `claude -p` reads a file that large, context bloat causes
|
|
340
|
+
timeouts, flaky turn limits, and tests that take 5-10x longer than necessary.
|
|
341
|
+
|
|
342
|
+
Instead, extract only the section the test actually needs:
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// BAD — agent reads 1900 lines, burns tokens on irrelevant sections
|
|
346
|
+
fs.copyFileSync(path.join(ROOT, 'ship', 'SKILL.md'), path.join(dir, 'ship-SKILL.md'));
|
|
347
|
+
|
|
348
|
+
// GOOD — agent reads ~60 lines, finishes in 38s instead of timing out
|
|
349
|
+
const full = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8');
|
|
350
|
+
const start = full.indexOf('## Review Readiness Dashboard');
|
|
351
|
+
const end = full.indexOf('\n---\n', start);
|
|
352
|
+
fs.writeFileSync(path.join(dir, 'ship-SKILL.md'), full.slice(start, end > start ? end : undefined));
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Also when running targeted E2E tests to debug failures:
|
|
356
|
+
- Run in **foreground** (`bun test ...`), not background with `&` and `tee`
|
|
357
|
+
- Never `pkill` running eval processes and restart — you lose results and waste money
|
|
358
|
+
- One clean run beats three killed-and-restarted runs
|
|
359
|
+
|
|
360
|
+
## Deploying to the active skill
|
|
361
|
+
|
|
362
|
+
The active skill lives at `~/.claude/skills/gstack/`. After making changes:
|
|
363
|
+
|
|
364
|
+
1. Push your branch
|
|
365
|
+
2. Fetch and reset in the skill directory: `cd ~/.claude/skills/gstack && git fetch origin && git reset --hard origin/main`
|
|
366
|
+
3. Rebuild: `cd ~/.claude/skills/gstack && bun run build`
|
|
367
|
+
|
|
368
|
+
Or copy the binaries directly:
|
|
369
|
+
- `cp browse/dist/browse ~/.claude/skills/gstack/browse/dist/browse`
|
|
370
|
+
- `cp design/dist/design ~/.claude/skills/gstack/design/dist/design`
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Garry Tan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# OpenGStack
|
|
2
|
+
|
|
3
|
+
Open source engineering workflow skills for AI coding assistants.
|
|
4
|
+
|
|
5
|
+
Forked from [garrytan/gstack](https://github.com/garrytan/gstack) with telemetry and YC references removed.
|
|
6
|
+
|
|
7
|
+
## What is this?
|
|
8
|
+
|
|
9
|
+
Skills that give AI agents structured roles for software development. Each skill is a specialist: CEO reviewer, eng manager, designer, QA lead, release engineer, debugger, and more.
|
|
10
|
+
|
|
11
|
+
## Available Skills
|
|
12
|
+
|
|
13
|
+
| Skill | What it does |
|
|
14
|
+
|-------|--------------|
|
|
15
|
+
| `/office-hours` | Brainstorm your product idea before you write code. |
|
|
16
|
+
| `/plan-ceo-review` | CEO-level review: find the 10-star product in the request. |
|
|
17
|
+
| `/plan-eng-review` | Lock architecture, data flow, edge cases, and tests. |
|
|
18
|
+
| `/plan-design-review` | Rate each design dimension 0-10, explain what a 10 looks like. |
|
|
19
|
+
| `/design-consultation` | Build a complete design system from scratch. |
|
|
20
|
+
| `/design-review` | Design audit + fix loop with atomic commits. |
|
|
21
|
+
| `/review` | Pre-landing PR review. Finds bugs that pass CI but break in prod. |
|
|
22
|
+
| `/investigate` | Systematic root-cause debugging. |
|
|
23
|
+
| `/qa` | Open a real browser, find bugs, fix them, re-verify. |
|
|
24
|
+
| `/qa-only` | Same as /qa but report only — no code changes. |
|
|
25
|
+
| `/ship` | Run tests, review, push, open PR. One command. |
|
|
26
|
+
| `/land-and-deploy` | Merge PR, deploy, verify health. |
|
|
27
|
+
| `/document-release` | Update all docs to match what you just shipped. |
|
|
28
|
+
| `/retro` | Weekly retro with per-person breakdowns and shipping streaks. |
|
|
29
|
+
| `/browse` | Headless browser — real Chromium, real clicks, ~100ms/command. |
|
|
30
|
+
| `/setup-browser-cookies` | Import cookies from your real browser for authenticated testing. |
|
|
31
|
+
| `/careful` | Warn before destructive commands (rm -rf, DROP TABLE, force-push). |
|
|
32
|
+
| `/freeze` | Lock edits to one directory. Hard block, not just a warning. |
|
|
33
|
+
| `/guard` | Activate both careful + freeze at once. |
|
|
34
|
+
| `/unfreeze` | Remove directory edit restrictions. |
|
|
35
|
+
| `/autoplan` | Run all reviews sequentially with auto-decisions. |
|
|
36
|
+
| `/codex` | OpenAI Codex CLI wrapper for code review. |
|
|
37
|
+
| `/canary` | Post-deploy monitoring. |
|
|
38
|
+
| `/benchmark` | Performance regression detection. |
|
|
39
|
+
| `/cso` | Security audit. |
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
### For Claude Code / OpenCode
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Clone to your skills directory
|
|
47
|
+
git clone https://github.com/Ambisphaeric/opengstack.git ~/.claude/skills/opengstack
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Browse Setup (optional but recommended)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cd ~/.claude/skills/opengstack/browse
|
|
54
|
+
./setup
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Requires `bun`: `curl -fsSL https://bun.sh/install | bash`
|
|
58
|
+
|
|
59
|
+
## No Telemetry
|
|
60
|
+
|
|
61
|
+
This fork removes all telemetry, analytics, and tracking from the original gstack. Your usage data stays on your machine.
|
|
62
|
+
|
|
63
|
+
## Syncing from Upstream
|
|
64
|
+
|
|
65
|
+
This repo auto-syncs daily from `garrytan/gstack` via GitHub Actions. Filters are applied to remove telemetry and YC references.
|
|
66
|
+
|
|
67
|
+
To sync manually:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
git remote add upstream https://github.com/garrytan/gstack.git
|
|
71
|
+
git fetch upstream main
|
|
72
|
+
git merge upstream/main
|
|
73
|
+
./scripts/filter_skills.py .
|
|
74
|
+
./scripts/cleanup.py .
|
|
75
|
+
git commit -m "chore: sync from upstream"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## License
|
|
79
|
+
|
|
80
|
+
MIT
|