@haus-tech/haus-workflow 5.4.0 → 5.6.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.6.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.5.0...v5.6.0) (2026-09-13)
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- **poc:** what the second PoC run rubbed against ([#557](https://github.com/WeAreHausTech/haus-workflow/issues/557)) ([8b37668](https://github.com/WeAreHausTech/haus-workflow/commit/8b37668bfd0a9a99f7be32cd4863ead8bcf96b27))
|
|
8
|
+
|
|
9
|
+
## [5.5.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.4.0...v5.5.0) (2026-09-12)
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
- **haus-workflow:** PoC mode in project:new ([#555](https://github.com/WeAreHausTech/haus-workflow/issues/555)) ([ffd2bfa](https://github.com/WeAreHausTech/haus-workflow/commit/ffd2bfa7e34bd66f679d23df3e54868b7536d291))
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- **poc:** two gaps the acceptance run found ([#556](https://github.com/WeAreHausTech/haus-workflow/issues/556)) ([728fe3b](https://github.com/WeAreHausTech/haus-workflow/commit/728fe3bc88fe31f1e6189c62108c89fbbe5d86d3))
|
|
18
|
+
|
|
3
19
|
## [5.4.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.3.0...v5.4.0) (2026-09-12)
|
|
4
20
|
|
|
5
21
|
### Features
|
package/dist/cli.js
CHANGED
|
@@ -2942,6 +2942,7 @@ var PROFILES = {
|
|
|
2942
2942
|
workflowTemplateRel: WORKFLOW_TEMPLATE_REL,
|
|
2943
2943
|
writesCiGate: true,
|
|
2944
2944
|
writesDecisionsSeed: true,
|
|
2945
|
+
runsDocsPass: true,
|
|
2945
2946
|
droppedHookCommands: [],
|
|
2946
2947
|
workflowConfig: "standard"
|
|
2947
2948
|
},
|
|
@@ -2950,6 +2951,7 @@ var PROFILES = {
|
|
|
2950
2951
|
workflowTemplateRel: "templates/agentic-workflow-poc.md",
|
|
2951
2952
|
writesCiGate: false,
|
|
2952
2953
|
writesDecisionsSeed: false,
|
|
2954
|
+
runsDocsPass: false,
|
|
2953
2955
|
droppedHookCommands: ["haus decisions guard --from-hook", "haus decisions suggest --from-hook"],
|
|
2954
2956
|
workflowConfig: "poc"
|
|
2955
2957
|
}
|
|
@@ -7695,9 +7697,9 @@ async function readScannedMarkdown(root) {
|
|
|
7695
7697
|
}
|
|
7696
7698
|
|
|
7697
7699
|
// src/decisions/doctor.ts
|
|
7698
|
-
init_fs();
|
|
7699
7700
|
import path40 from "node:path";
|
|
7700
7701
|
import fs38 from "fs-extra";
|
|
7702
|
+
init_fs();
|
|
7701
7703
|
|
|
7702
7704
|
// src/decisions/check.ts
|
|
7703
7705
|
init_fs();
|
|
@@ -8165,19 +8167,21 @@ async function listDecisionNumbers(decisionsDir) {
|
|
|
8165
8167
|
}
|
|
8166
8168
|
|
|
8167
8169
|
// src/decisions/doctor.ts
|
|
8168
|
-
async function auditDecisionsLayout(root) {
|
|
8170
|
+
async function auditDecisionsLayout(root, profile) {
|
|
8169
8171
|
const findings = [];
|
|
8170
8172
|
const primary = path40.join(root, DECISIONS_TRIGGERS.decisionsDir);
|
|
8171
8173
|
const legacy = path40.join(root, DECISIONS_TRIGGERS.legacyDecisionsDir ?? "docs/adr");
|
|
8172
8174
|
const hasPrimary = await fs38.pathExists(primary);
|
|
8173
8175
|
const hasLegacy = await fs38.pathExists(legacy);
|
|
8174
8176
|
if (!hasPrimary && hasLegacy) {
|
|
8175
|
-
|
|
8176
|
-
|
|
8177
|
-
|
|
8178
|
-
|
|
8179
|
-
|
|
8180
|
-
|
|
8177
|
+
if (PROFILES[profile].writesDecisionsSeed) {
|
|
8178
|
+
findings.push({
|
|
8179
|
+
level: "advisory",
|
|
8180
|
+
line: `- DECISIONS: legacy ${DECISIONS_TRIGGERS.legacyDecisionsDir}/ present \u2014 migrate to docs/decisions/`,
|
|
8181
|
+
sentence: "Decision records still live under the legacy docs/adr/ path",
|
|
8182
|
+
fix: `git mv ${DECISIONS_TRIGGERS.legacyDecisionsDir} ${DECISIONS_TRIGGERS.decisionsDir}`
|
|
8183
|
+
});
|
|
8184
|
+
}
|
|
8181
8185
|
return findings;
|
|
8182
8186
|
}
|
|
8183
8187
|
if (!hasPrimary) return findings;
|
|
@@ -9535,7 +9539,7 @@ async function runDoctor(options) {
|
|
|
9535
9539
|
if (docsSkillInstalled) {
|
|
9536
9540
|
if (await fs41.pathExists(path49.join(root, "docs", "SUMMARY.md"))) {
|
|
9537
9541
|
ok("- PROJECT DOCS: OK (docs/SUMMARY.md present)");
|
|
9538
|
-
} else {
|
|
9542
|
+
} else if (PROFILES[profile].runsDocsPass) {
|
|
9539
9543
|
suggest(
|
|
9540
9544
|
"- PROJECT DOCS: docs/SUMMARY.md missing \u2014 run the writing-documentation skill (`/docs` in Claude Code) to generate the project docs",
|
|
9541
9545
|
"The project docs index (docs/SUMMARY.md) has not been generated yet",
|
|
@@ -9557,14 +9561,14 @@ async function runDoctor(options) {
|
|
|
9557
9561
|
ok(`- .prettierignore: protects ${IGNORED_PATHS.join(" and ")}`);
|
|
9558
9562
|
}
|
|
9559
9563
|
}
|
|
9560
|
-
if (
|
|
9564
|
+
if (await projectRunsCiGate(root)) {
|
|
9565
|
+
ok("- CI GATE: OK (a workflow runs `haus ci-gate`)");
|
|
9566
|
+
} else if (PROFILES[profile].writesCiGate) {
|
|
9561
9567
|
suggest(
|
|
9562
9568
|
`- CI GATE: missing \u2014 no workflow runs \`haus ci-gate\` (${CI_GATE_WORKFLOW_REL})`,
|
|
9563
9569
|
"Nothing checks this project on a pull request: setup drift, a missing ADR, or a stale catalog would all land unnoticed",
|
|
9564
9570
|
"haus apply --write (writes .github/workflows/haus-gate.yml; never overwrites an existing one)"
|
|
9565
9571
|
);
|
|
9566
|
-
} else {
|
|
9567
|
-
ok("- CI GATE: OK (a workflow runs `haus ci-gate`)");
|
|
9568
9572
|
}
|
|
9569
9573
|
if (!PROFILES[profile].writesCiGate) {
|
|
9570
9574
|
const ciGateContent = await readText(path49.join(root, CI_GATE_WORKFLOW_REL));
|
|
@@ -9599,7 +9603,7 @@ async function runDoctor(options) {
|
|
|
9599
9603
|
} else {
|
|
9600
9604
|
ok("- GITIGNORE (haus content): OK (.claude/ and .haus-workflow/ are tracked)");
|
|
9601
9605
|
}
|
|
9602
|
-
for (const finding of await auditDecisionsLayout(root)) {
|
|
9606
|
+
for (const finding of await auditDecisionsLayout(root, profile)) {
|
|
9603
9607
|
if (finding.level === "ok") ok(finding.line);
|
|
9604
9608
|
else suggest(finding.line, finding.sentence, finding.fix);
|
|
9605
9609
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "6.5.
|
|
2
|
+
"version": "6.5.1",
|
|
3
3
|
"manifestFormat": 2,
|
|
4
4
|
"globalPlugins": [
|
|
5
5
|
{
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"id": "haus.agentic-workflow-poc",
|
|
59
|
-
"version": "1.0.
|
|
59
|
+
"version": "1.0.1",
|
|
60
60
|
"source": "haus",
|
|
61
61
|
"type": "template",
|
|
62
62
|
"path": "templates/agentic-workflow-poc.md",
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
"repoRoles": [],
|
|
69
69
|
"ecosystem": "general",
|
|
70
70
|
"installMode": "copy-selected",
|
|
71
|
-
"tokenEstimate":
|
|
72
|
-
"tokenBudget":
|
|
71
|
+
"tokenEstimate": 2187,
|
|
72
|
+
"tokenBudget": 2844,
|
|
73
73
|
"default": false,
|
|
74
74
|
"reviewStatus": "approved",
|
|
75
75
|
"riskLevel": "low"
|
|
@@ -29,7 +29,7 @@ that branch of the merged task.
|
|
|
29
29
|
| --------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
30
30
|
| `init` (`setup`, `project:init`, `reinit`, `re-init`, `project:reinit`) | _Init procedure below_ | State-aware setup. Not set up → first-time init (skills, commands, workflow + project docs). Already set up → asks: non-destructive refresh, or clean slate (confirmed wipe via `haus undo --yes` / `haus workspace undo`, then re-init). `reinit` aliases jump straight to the clean-slate branch (still confirmed). |
|
|
31
31
|
| `clone [name]` (`project:clone`, `cloneandsetup`, `project:cloneandsetup`) | _Clone procedure below_ | Clone one repo by name, or a whole workspace from `repos.manifest.json`. Afterwards asks "set up for local dev too?" (deps, databases, links, env via `localdev.yml`). `cloneandsetup` aliases pre-answer that question with yes. |
|
|
32
|
-
| `new [description]` (`create`, `project:new`)
|
|
32
|
+
| `new [description]` (`create`, `project:new`, `poc`, `kunddemo`) | _New-project procedure below_ | Create a brand-new project from a plain-language request, unchanged seven-phase flow. The `poc`/`kunddemo` aliases (and phrases like "ny poc", "customer demo") run the same flow in PoC mode: a throwaway demo repo under the `poc` profile (`--profile poc`), see `references/new.md` → PoC mode. |
|
|
33
33
|
| `doctor` (`check`, `fix`, `project:doctor`, `project:fix`) | _Doctor procedure below_ | Health check for the detected scope; relays the verdict, then offers to apply the doctor's own suggested fixes and re-checks until green. `fix` aliases pre-answer "fix now?" with yes. |
|
|
34
34
|
| `refresh` (`update`, `upgrade`, `apply`, `regenerate`, `claude-md`, `project:refresh`, `add-skills`, `opt-in`, `project:add-skills`, `install`, `global`) | _Refresh procedure below_ | Bring haus current. Always: update npm package + catalog + `~/.claude` (seeding it first if never installed). Inside a set-up project/workspace, asks: **Full sync** (re-run the whole setup pipeline in place) or **Just add helpers** (offer opt-in skills/agents + configs only). `add-skills`/`opt-in` aliases jump to the helpers branch; outside any project it stops after the global update. |
|
|
35
35
|
| `uninstall` | `haus uninstall` | Remove all haus global files from `~/.claude/`. Machine scope only — confirm gate states this does NOT touch the current project (that's `init` → clean slate). |
|
|
@@ -52,7 +52,7 @@ into a single `AskUserQuestion` call:
|
|
|
52
52
|
Question 1: "What would you like to do?"
|
|
53
53
|
Options:
|
|
54
54
|
1. init — set up this project (or workspace) with haus; offers refresh/clean-slate when already set up
|
|
55
|
-
2. new [description] — create a brand-new project from a plain-language request
|
|
55
|
+
2. new [description] — create a brand-new project, or a throwaway PoC, from a plain-language request
|
|
56
56
|
3. refresh — update haus itself, then fully sync this project (or just add optional helpers)
|
|
57
57
|
4. More options — see: clone, doctor, uninstall, help
|
|
58
58
|
|
|
@@ -211,7 +211,7 @@ Bring haus current. Global half always runs; the project half depends on scope.
|
|
|
211
211
|
it must ask the workspace-membership question there before eliciting anything
|
|
212
212
|
else. Otherwise (Project or Not-set-up scope) open it knowing that question is
|
|
213
213
|
skipped.
|
|
214
|
-
2. Open and follow `references/new.md` in this skill's directory. It is a seven-phase AI-driven flow: elicit the request and propose features, gate on user intent, scaffold (registry stacks via `haus new --json --yes` with a `--dry-run` preview; any other stack via a user-confirmed official scaffolder plus manual rails), install context via `haus init`, seed `docs/SPEC.md` + `docs/plans/walking-skeleton.md`, build the walking skeleton with one subagent per feature (against a structure recorded in `docs/DESIGN.md`), verify (build + lint + tests + smoke boot), then write the project docs by following `references/init.md` from step 3 (deep read, `CLAUDE.md` body + `docs/`, recommend re-check, opt-ins). Repos are only ever created private. Failure `detail` is relayed verbatim and nothing is ever auto-deleted. Never run bare interactive `haus new`.
|
|
214
|
+
2. Open and follow `references/new.md` in this skill's directory. It is a seven-phase AI-driven flow: elicit the request and propose features, gate on user intent, scaffold (registry stacks via `haus new --json --yes` with a `--dry-run` preview; any other stack via a user-confirmed official scaffolder plus manual rails), install context via `haus init`, seed `docs/SPEC.md` + `docs/plans/walking-skeleton.md`, build the walking skeleton with one subagent per feature (against a structure recorded in `docs/DESIGN.md`), verify (build + lint + tests + smoke boot), then write the project docs by following `references/init.md` from step 3 (deep read, `CLAUDE.md` body + `docs/`, recommend re-check, opt-ins). Repos are only ever created private. Failure `detail` is relayed verbatim and nothing is ever auto-deleted. Never run bare interactive `haus new`. The same reference carries a **PoC mode** (entered by the `poc`/`kunddemo` aliases, or by the "Production project or throwaway PoC?" question when no phrase was given): the repo gets the `poc` profile before the first design question (`haus new --profile poc` on the fast path; a hand-written `haus.config.json` plus `haus init --json --dry-run --profile poc` and `haus apply --write` on the manual path), the first brainstorm writes `docs/MANUS.md` instead of `docs/SPEC.md`, the only check is the Playwright manus, and Phase 6 skips the docs pass.
|
|
215
215
|
|
|
216
216
|
### After `haus uninstall`
|
|
217
217
|
|
|
@@ -8,6 +8,43 @@ session, from request to running app.
|
|
|
8
8
|
NEVER run bare `haus new` without flags — its interactive prompts don't work through
|
|
9
9
|
the agent; collect answers with AskUserQuestion and pass everything as flags.
|
|
10
10
|
|
|
11
|
+
## PoC mode
|
|
12
|
+
|
|
13
|
+
The same seven phases, for a throwaway proof of concept or customer demo (haus-workflow
|
|
14
|
+
ADR-0125, catalog ADR-0066). Enter it when the request says `new poc`, `poc`, `ny poc`,
|
|
15
|
+
`kunddemo`, `customer demo` or `throwaway demo`. With no such phrase, ask via
|
|
16
|
+
`AskUserQuestion` before Phase 0 runs its own checks: "Production project or throwaway PoC?"
|
|
17
|
+
The answer decides the mode for the rest of the flow, so by the time Phase 0 starts,
|
|
18
|
+
the mode is always known, either from the trigger phrase or from this question.
|
|
19
|
+
Production mode is everything below without the **PoC:** paragraphs.
|
|
20
|
+
|
|
21
|
+
What PoC mode changes, in one place:
|
|
22
|
+
|
|
23
|
+
- The project gets the `poc` profile (`--profile poc`) BEFORE the first design
|
|
24
|
+
question. The profile writes the PoC standard as `.haus-workflow/WORKFLOW.md`, keeps
|
|
25
|
+
testing/review/security content out, writes no CI gate. Once it is in place, every
|
|
26
|
+
rule the rest of this flow needs is already loaded.
|
|
27
|
+
- No feature elicitation. The first superpowers brainstorming round IS the design; its
|
|
28
|
+
output is `docs/MANUS.md` (the demo script), not `docs/SPEC.md`. No `docs/DESIGN.md`,
|
|
29
|
+
no walking-skeleton plan, no docs pass.
|
|
30
|
+
- The only executable check is `demo/manus.spec.ts`, one Playwright test per manus
|
|
31
|
+
point. No unit tests, no TDD, no code review. `.haus-workflow/WORKFLOW.md` in the new
|
|
32
|
+
repo says the same and is authoritative from Phase 5 on.
|
|
33
|
+
- The repo is always private and is archived after the demo. The demo date is written
|
|
34
|
+
into `docs/MANUS.md` (`Demo: YYYY-MM-DD`); "where are we" reports days left.
|
|
35
|
+
|
|
36
|
+
Two ways into the repo, decided in Phase 0 by what the cwd is:
|
|
37
|
+
|
|
38
|
+
- **The cwd is the project** (an empty directory, or a git repo): the manual rails
|
|
39
|
+
below scaffold into `.`; a repo with a remote is used as is, a repo without one is
|
|
40
|
+
pushed to a new private GitHub repo after asking where, or kept local only if that is
|
|
41
|
+
the answer.
|
|
42
|
+
- **The cwd is a parent folder** (anything else): the registry fast path
|
|
43
|
+
`haus new <stack> <name> --json --yes --profile poc [--dir <path>] [--org <org>]
|
|
44
|
+
[--no-github]` creates `<cwd>/<name>` (or `<path>/<name>` when `--dir` is given, e.g.
|
|
45
|
+
the workspace root from Phase 0), local only when that is the Phase 1 answer; the
|
|
46
|
+
handoff tells the user to open that directory as a new Claude Code project.
|
|
47
|
+
|
|
11
48
|
## Phase 0 — Entry
|
|
12
49
|
|
|
13
50
|
**Scope check first.** If `SKILL.md`'s Step 1.5 found the cwd is **Workspace** scope (or
|
|
@@ -30,6 +67,16 @@ A description argument ("a frontend app for shopping") goes straight to Phase 1.
|
|
|
30
67
|
No-argument invocation: ask "What do you want to build?" as free text. Do not present
|
|
31
68
|
a stack menu.
|
|
32
69
|
|
|
70
|
+
**PoC:** upgrading the haus package rewrites this very file, so if the CLI gets upgraded
|
|
71
|
+
mid-flow, re-read `references/new.md` from disk before continuing rather than carrying on
|
|
72
|
+
from what is already in context. The mode itself is already settled by now, either the
|
|
73
|
+
trigger phrase in the request or the question asked in `## PoC mode` above, so decide the
|
|
74
|
+
way in next: `git rev-parse --is-inside-work-tree` and `ls -A`: an empty directory or a
|
|
75
|
+
git repo means the cwd IS the project (manual rails in Phase 3); anything else means the
|
|
76
|
+
cwd is a parent folder (fast path). A git repo with a remote (`git remote -v`) keeps it;
|
|
77
|
+
one without gets a new private repo in Phase 3, unless local-only is chosen in Phase 1.
|
|
78
|
+
The workspace question above applies unchanged.
|
|
79
|
+
|
|
33
80
|
## Phase 1 — Elicit (at most 5 AskUserQuestion rounds)
|
|
34
81
|
|
|
35
82
|
Ask about dimensions, never from a domain template:
|
|
@@ -48,6 +95,19 @@ Ask about dimensions, never from a domain template:
|
|
|
48
95
|
mis-click in a menu. A public repo is a deliberate manual act outside this flow
|
|
49
96
|
(the CLI flag exists for that; this skill never uses it).
|
|
50
97
|
|
|
98
|
+
**PoC:** at most 3 rounds, and none of them about features (that is the brainstorm's job
|
|
99
|
+
in Phase 5):
|
|
100
|
+
|
|
101
|
+
1. What is shown, to whom, and when is the meeting. The date becomes `Demo: YYYY-MM-DD`
|
|
102
|
+
in `docs/MANUS.md`.
|
|
103
|
+
2. Where the code lives, plus the project name (lowercase letters, digits, `. _ -`),
|
|
104
|
+
only when a repo must be created: a private repo in the org (default: WeAreHausTech),
|
|
105
|
+
a private repo on personal GitHub (omit `--org`), or local only, no GitHub repo
|
|
106
|
+
(`--no-github`). NEVER offer or pass `--public`.
|
|
107
|
+
3. A stack hint, only if the user has one. Otherwise pick the stack yourself from the
|
|
108
|
+
one-line description (a Vendure storefront demo is `next` or `react-router`); a wrong
|
|
109
|
+
pick is cheap in a throwaway repo.
|
|
110
|
+
|
|
51
111
|
Pick the stack yourself from the answers. Confirm the stack with the user only on
|
|
52
112
|
genuine ambiguity (e.g. web vs native unclear).
|
|
53
113
|
|
|
@@ -59,6 +119,11 @@ committed to `main` in the new repo and pushed to the remote if one is created.
|
|
|
59
119
|
ONE explicit user OK before anything touches disk — this one approval covers those
|
|
60
120
|
actions.
|
|
61
121
|
|
|
122
|
+
**PoC:** one screen: project name, org, personal, or local only, stack and why, and the
|
|
123
|
+
sentence "PoC profile, private repo if one is created, thrown away after the demo on
|
|
124
|
+
<date>". Say that commits go to `main` until the first green manus exists. One OK covers
|
|
125
|
+
Phases 3 and 4.
|
|
126
|
+
|
|
62
127
|
## Phase 3 — Scaffold
|
|
63
128
|
|
|
64
129
|
Check the registry first: `haus new --list --json`.
|
|
@@ -86,6 +151,36 @@ Check the registry first: `haus new --list --json`.
|
|
|
86
151
|
3. Manual rails: `git init` (if the scaffolder didn't), `git branch -M main`, initial
|
|
87
152
|
commit; then `gh repo create` (confirm first) unless the user declined a repo.
|
|
88
153
|
|
|
154
|
+
**PoC:** two ways in, decided already in Phase 0 by what the cwd was. Before either
|
|
155
|
+
path's own first commit below, check whatever commit hook a scaffold's files already
|
|
156
|
+
ship (husky, commitlint, lefthook): reading its message-format rules now means finding
|
|
157
|
+
out what it wants before the first commit, not after it rejects one.
|
|
158
|
+
|
|
159
|
+
- **cwd is the project:** the registry is not used, because `haus new` creates
|
|
160
|
+
`<parent>/<name>` and refuses an existing directory. Run the official scaffolder into
|
|
161
|
+
`.` (show the exact command, the user confirms; e.g. `npx create-next-app@16 . --yes
|
|
162
|
+
--typescript --app`), then `git init` (if needed), `git branch -M main`, initial
|
|
163
|
+
commit. Then, unless a remote exists or local-only was chosen in Phase 1: `gh repo
|
|
164
|
+
create <org>/<name> --private --source . --push` (confirm first; omit `<org>/` for
|
|
165
|
+
personal GitHub). Local-only stops here: no `gh repo create`, no push, ever.
|
|
166
|
+
- **cwd is a parent folder:** the fast path with the profile: preview with
|
|
167
|
+
`haus new <stack> <name> --json --yes --dry-run --profile poc [--dir <path>] [--org
|
|
168
|
+
<org>] [--no-github]`, then run it without `--dry-run`, then `cd <name>`. Pass
|
|
169
|
+
`--no-github` when local-only was chosen in Phase 1; `haus new` then never runs `gh
|
|
170
|
+
repo create`. Carry `--dir` through from Phase 0 for a workspace member; without it a
|
|
171
|
+
PoC still lands in the cwd, exactly like production. The chained init records the
|
|
172
|
+
profile and writes the PoC standard; nothing more to do for the profile in Phase 4.
|
|
173
|
+
|
|
174
|
+
Whichever way in, the profile governs what haus installs and nothing else: a vendor
|
|
175
|
+
starter's own ceremony arrives untouched and no profile can subtract it. Right after the
|
|
176
|
+
first commit, list what came with the scaffold, naming at least its `test` script and
|
|
177
|
+
test directories, any `playwright.config.ts`, commit hooks (husky, commitlint, lefthook),
|
|
178
|
+
CI workflows, and a decisions or `docs/adr/` folder; tell the user in one line what
|
|
179
|
+
stays. Nothing gets deleted: removing files a vendor starter shipped is a surprise in
|
|
180
|
+
someone else's repo, not this flow's call to make. What stays is inert, not authority:
|
|
181
|
+
never run or extend a starter's test suite, and never read its presence as permission to
|
|
182
|
+
add tests.
|
|
183
|
+
|
|
89
184
|
## Phase 4 — Context install
|
|
90
185
|
|
|
91
186
|
Everything from here on runs inside the new project directory — `cd` into it first and
|
|
@@ -111,6 +206,71 @@ stay there.
|
|
|
111
206
|
`docs/plans/walking-skeleton.md` (one task per selected feature with acceptance
|
|
112
207
|
criteria and a verify command).
|
|
113
208
|
|
|
209
|
+
**PoC:** the profile must be on disk before the preview, because a PoC repo refuses
|
|
210
|
+
`haus init` without `--profile poc`, and a preview never persists the profile
|
|
211
|
+
(ADR-0125). Manual path, in this order:
|
|
212
|
+
|
|
213
|
+
1. Write `.haus-workflow/haus.config.json` with exactly `{ "profile": "poc" }` (create the
|
|
214
|
+
directory).
|
|
215
|
+
2. Read: `haus init --json --dry-run --profile poc`; on the zero-signal refusal, confirm
|
|
216
|
+
and re-run with `--force` as above.
|
|
217
|
+
3. Add a `"manus"` key to package.json scripts now, before the write step, even as a
|
|
218
|
+
placeholder (`"manus": "playwright test"`). `haus apply --write` derives the PoC's
|
|
219
|
+
only gate command in `.haus-workflow/workflow-config.md` from whether that key
|
|
220
|
+
exists, not from its final body, and with no key at all it falls back to a Playwright
|
|
221
|
+
invocation that resolves against whatever default config the scaffold shipped and
|
|
222
|
+
finds no tests at all. The skeleton below fills in the real body once the runner
|
|
223
|
+
config is decided; what matters here is that the key exists first.
|
|
224
|
+
4. Write: `haus apply --write`. It reads the profile: `.haus-workflow/WORKFLOW.md` now
|
|
225
|
+
starts with `# PoC Workflow Standard`, and there is no `.github/workflows/haus-gate.yml`.
|
|
226
|
+
|
|
227
|
+
Fast path: the chained init already ran `haus apply --write` inside Phase 3, before this
|
|
228
|
+
phase's `"manus"` script exists, so `.haus-workflow/workflow-config.md`'s "Run the manus"
|
|
229
|
+
line was derived from the fallback command. That file is project-owned and never
|
|
230
|
+
rewritten after its first write, exactly as its own header says, so adding the script
|
|
231
|
+
afterward will not fix it. Once the skeleton below has added the `manus` script and
|
|
232
|
+
decided the runner config, open `.haus-workflow/workflow-config.md` yourself and correct
|
|
233
|
+
that one line to `yarn run manus` / `npm run manus` / `pnpm run manus` (the project's
|
|
234
|
+
package manager) either way, whether the script ended up `"playwright test"` or
|
|
235
|
+
`"playwright test -c playwright.manus.config.ts"`: the line only needs to delegate to
|
|
236
|
+
the script, which already points at the right config. Also check that
|
|
237
|
+
`.haus-workflow/haus.config.json` says `"profile": "poc"`.
|
|
238
|
+
|
|
239
|
+
Then the demo skeleton, instead of SPEC.md and the walking-skeleton plan:
|
|
240
|
+
|
|
241
|
+
- `yarn add -D @playwright/test` (or the project's package manager), then
|
|
242
|
+
`npx playwright install chromium` (a download: ask first).
|
|
243
|
+
- The runner config. If the repo has no `playwright.config.ts`, write one with a
|
|
244
|
+
`webServer` that starts the dev server and takes its port from `PORT` (default 3000),
|
|
245
|
+
`testDir: 'demo'`, `reporter: 'line'`, `use.baseURL` from the same port. If the
|
|
246
|
+
scaffold already shipped a `playwright.config.ts`, which a vendor starter usually has
|
|
247
|
+
and points at its own e2e suite, leave that file alone and write
|
|
248
|
+
`playwright.manus.config.ts` beside it with the same contents instead: two configs is
|
|
249
|
+
the correct outcome, the starter's suite tests the starter and the manus tests the
|
|
250
|
+
demo. Either way, the config's own `webServer` owns the dev server: never start the
|
|
251
|
+
dev server yourself in the background and then run the manus against it, or every
|
|
252
|
+
round starts by hunting the process holding the port.
|
|
253
|
+
- `demo/manus.spec.ts` with the header comment `// The manus. One test per point in
|
|
254
|
+
docs/MANUS.md, same titles, same order. test.fixme() for points decided but not built.`
|
|
255
|
+
and no tests yet.
|
|
256
|
+
- The `"manus"` script: on the manual path fill in the key added in step 3, and on the fast
|
|
257
|
+
path add it here. Either way its body is `"playwright test"` when the repo had no
|
|
258
|
+
config of its own, or `"playwright test -c playwright.manus.config.ts"` when the
|
|
259
|
+
starter's config forced the second file.
|
|
260
|
+
- `docs/MANUS.md`:
|
|
261
|
+
|
|
262
|
+
```markdown
|
|
263
|
+
# Manus
|
|
264
|
+
|
|
265
|
+
Demo: <date from Phase 1>
|
|
266
|
+
|
|
267
|
+
## Parked
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
The numbered points are written by the brainstorm in Phase 5, never here.
|
|
271
|
+
|
|
272
|
+
Commit the skeleton on `main` (`chore(poc): demo skeleton`).
|
|
273
|
+
|
|
114
274
|
## Phase 5 — Build the walking skeleton
|
|
115
275
|
|
|
116
276
|
1. Install dependencies. On the fast path the JSON's `installHint` is written for the
|
|
@@ -140,6 +300,29 @@ stay there.
|
|
|
140
300
|
rule: it applies only to a freshly created single-author repo during this initial
|
|
141
301
|
walking-skeleton build; standard branch rules apply afterwards.
|
|
142
302
|
|
|
303
|
+
**PoC:** now, with the PoC standard loaded, invoke superpowers:brainstorming. A new
|
|
304
|
+
project is architectural, so it ends in a written design: tell the skill the spec
|
|
305
|
+
location is `docs/MANUS.md` (numbered points in show order, each with what the customer
|
|
306
|
+
sees and what proves it; keep the `Demo:` header).
|
|
307
|
+
|
|
308
|
+
Before the plan, probe. For every drafted point, run the smallest real query that
|
|
309
|
+
produces that point's proof against the system the demo will use: one GraphQL query, one
|
|
310
|
+
API call, one page load. Do it before any code is written, not when the feature is half
|
|
311
|
+
built. A point whose proof the system cannot produce today goes straight to Parked in
|
|
312
|
+
`docs/MANUS.md` with the one sentence that says what is missing, and the user hears it
|
|
313
|
+
before the plan exists. If the probe kills the system chosen in Phase 1, stop and ask:
|
|
314
|
+
the manus is the scope ceiling, and what it runs against is part of the manus. Do not
|
|
315
|
+
commit a backend URL or token until the probe has confirmed the system can produce the
|
|
316
|
+
points that depend on it.
|
|
317
|
+
|
|
318
|
+
Then superpowers:writing-plans into
|
|
319
|
+
`docs/plans/round-1.md`, one task per manus point with "the manus point is green" as its
|
|
320
|
+
verification. Build: `demo/manus.spec.ts` gets one `test()` per point as it is built and
|
|
321
|
+
`test.fixme()` for the rest; independent points may go to one subagent each in its own
|
|
322
|
+
worktree once a first green manus exists on `main`; before that, everything lands on
|
|
323
|
+
`main`. No `docs/DESIGN.md`, no TDD, no reviewer dispatch: the standard in the repo says
|
|
324
|
+
why.
|
|
325
|
+
|
|
143
326
|
## Phase 6 — Verify + hand off
|
|
144
327
|
|
|
145
328
|
1. Gate: build passes, lint passes, tests green, dev server boots (smoke check),
|
|
@@ -159,6 +342,30 @@ stay there.
|
|
|
159
342
|
the suggested next step — iterate per feature in fresh sessions inside the
|
|
160
343
|
project directory.
|
|
161
344
|
|
|
345
|
+
**PoC:** the gate is the manus: `yarn manus` (or the package manager's equivalent) with
|
|
346
|
+
every point green or `fixme`, nothing red, and the last run before you claim anything is
|
|
347
|
+
a cold `--headed` run with the dev server stopped first. Headless wins timing races that
|
|
348
|
+
a demo-day browser loses, so a point that is green headless and red headed is red, and
|
|
349
|
+
headed is the mode the demo is actually shown in. Never put a command in the handoff
|
|
350
|
+
that you have not run yourself in exactly that form. Then: README with the start
|
|
351
|
+
command, the port and the manus command; commit `docs/MANUS.md` and
|
|
352
|
+
`docs/plans/round-1.md`. `haus doctor` shows `Profile: poc`; the CI-gate suggestion, the
|
|
353
|
+
`docs/SUMMARY.md` suggestion and the legacy `docs/adr/` migration finding are all gated
|
|
354
|
+
on the profile now, so a healthy PoC repo will not see any of the three, and seeing one
|
|
355
|
+
means the installed CLI predates this gate, not something to argue past. Whatever doctor
|
|
356
|
+
still flags here is real: read it and act on it, or, for a machine-level finding such as
|
|
357
|
+
a disabled global plugin, check it with the tool that owns it (`claude plugin list`)
|
|
358
|
+
before telling the user doctor is wrong. Then push if a remote exists (never for
|
|
359
|
+
local-only). Then stop: do NOT follow `references/init.md`
|
|
360
|
+
from step 3, because a PoC has no docs pass, no deep read and no recommend re-check. Hand off in
|
|
361
|
+
the user's language, naming the demo date, the two re-entry phrases and the decision the
|
|
362
|
+
meeting ends with: next session, open this repo and say "where are we" / "var är vi",
|
|
363
|
+
or "extend the demo with ..."; after the demo, decide
|
|
364
|
+
actively per the standard's **After the demo** section: archive the repo, or build it for
|
|
365
|
+
real from zero with `docs/MANUS.md` and Parked as input, never from this code. If the
|
|
366
|
+
fast path created `<cwd>/<name>`, say that the user opens that directory as a new Claude
|
|
367
|
+
Code project.
|
|
368
|
+
|
|
162
369
|
## Failure rules
|
|
163
370
|
|
|
164
371
|
- Relay `haus` failure `detail` verbatim; never retry destructively; the project
|