@haus-tech/haus-workflow 5.9.0 → 5.10.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 +17 -0
- package/dist/cli.js +31 -21
- package/library/catalog/manifest.json +4 -4
- package/library/global/agents/request-assessor.md +5 -1
- package/library/global/agents/request-specifier.md +3 -1
- package/library/global/skills/request/SKILL.md +394 -59
- package/library/global/skills/request/scripts/archive.mjs +546 -49
- package/library/global/skills/request/scripts/korning.mjs +41 -4
- package/library/global/skills/request/scripts/lib.mjs +189 -0
- package/library/global/skills/request/scripts/precheck.mjs +105 -130
- package/library/global/skills/request-assess-impact/SKILL.md +12 -0
- package/library/global/skills/request-sync/SKILL.md +61 -100
- package/library/global/skills/request-write-spec/SKILL.md +15 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [5.10.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.9.1...v5.10.0) (2026-09-25)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- **request:** Asana carries the customer-facing outcome only (ADR-0144) ([#603](https://github.com/WeAreHausTech/haus-workflow/issues/603)) ([ea858ab](https://github.com/WeAreHausTech/haus-workflow/commit/ea858ab54237c3eb5e1f6c542c87b6cfbc45f997))
|
|
8
|
+
- **request:** the design doc joins the flow, designa between spec approval and pricing ([#597](https://github.com/WeAreHausTech/haus-workflow/issues/597)) ([27081ce](https://github.com/WeAreHausTech/haus-workflow/commit/27081ce934a9b14a2c3163ca36947b3e9534d940))
|
|
9
|
+
|
|
10
|
+
### Bug Fixes
|
|
11
|
+
|
|
12
|
+
- **plugins:** remove a stale marketplace before re-pinning it ([#608](https://github.com/WeAreHausTech/haus-workflow/issues/608)) ([2dc3a0f](https://github.com/WeAreHausTech/haus-workflow/commit/2dc3a0f8fd003bb9e29c49634039818d064da131))
|
|
13
|
+
|
|
14
|
+
## [5.9.1](https://github.com/WeAreHausTech/haus-workflow/compare/v5.9.0...v5.9.1) (2026-09-24)
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
- **plugins:** read user-scope enabled state from settings.json, not the merged plugin list ([#594](https://github.com/WeAreHausTech/haus-workflow/issues/594)) ([7f93cb9](https://github.com/WeAreHausTech/haus-workflow/commit/7f93cb9c7d3bd01868f8fec4c73582b00e361561)), closes [#593](https://github.com/WeAreHausTech/haus-workflow/issues/593)
|
|
19
|
+
|
|
3
20
|
## [5.9.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.8.0...v5.9.0) (2026-09-24)
|
|
4
21
|
|
|
5
22
|
### Features
|
package/dist/cli.js
CHANGED
|
@@ -2624,7 +2624,7 @@ var DEFAULT_GLOBAL_PLUGINS = [
|
|
|
2624
2624
|
plugin: "superpowers",
|
|
2625
2625
|
marketplace: "superpowers-dev",
|
|
2626
2626
|
url: "https://github.com/obra/superpowers.git",
|
|
2627
|
-
ref: "v6.
|
|
2627
|
+
ref: "v6.4.1",
|
|
2628
2628
|
activation: "always"
|
|
2629
2629
|
},
|
|
2630
2630
|
{
|
|
@@ -2754,6 +2754,9 @@ function findManagedInstall(state, pin) {
|
|
|
2754
2754
|
const id = pluginId(pin);
|
|
2755
2755
|
return state.installed.find((p) => p.id === id && (p.scope ?? MANAGED_SCOPE) === MANAGED_SCOPE);
|
|
2756
2756
|
}
|
|
2757
|
+
function isEnabledAtUserScope(state, pin) {
|
|
2758
|
+
return (state.userEnabledPlugins ?? {})[pluginId(pin)] !== false;
|
|
2759
|
+
}
|
|
2757
2760
|
function isPluginActive(state, pin) {
|
|
2758
2761
|
if (!state.available) return false;
|
|
2759
2762
|
const id = pluginId(pin);
|
|
@@ -2795,7 +2798,7 @@ function planBuiltin(pin, state) {
|
|
|
2795
2798
|
reason: `plugin ${id} is not installed at ${MANAGED_SCOPE} scope`
|
|
2796
2799
|
};
|
|
2797
2800
|
}
|
|
2798
|
-
const enabled =
|
|
2801
|
+
const enabled = isEnabledAtUserScope(state, pin);
|
|
2799
2802
|
if (wantEnabled && !enabled) {
|
|
2800
2803
|
return {
|
|
2801
2804
|
pin,
|
|
@@ -2828,8 +2831,9 @@ function planPinned(pin, state) {
|
|
|
2828
2831
|
const installed = findManagedInstall(state, pin);
|
|
2829
2832
|
const disabled = installed?.enabled === false;
|
|
2830
2833
|
const enableStep = disabled ? ["plugin-enable"] : [];
|
|
2834
|
+
const readd = marketplace ? ["marketplace-remove", "marketplace-add"] : ["marketplace-add"];
|
|
2831
2835
|
if (!installed) {
|
|
2832
|
-
const steps = marketplaceMatches ? ["plugin-install"] : [
|
|
2836
|
+
const steps = marketplaceMatches ? ["plugin-install"] : [...readd, "plugin-install"];
|
|
2833
2837
|
return {
|
|
2834
2838
|
pin,
|
|
2835
2839
|
kind: "install",
|
|
@@ -2841,13 +2845,7 @@ function planPinned(pin, state) {
|
|
|
2841
2845
|
return {
|
|
2842
2846
|
pin,
|
|
2843
2847
|
kind: "repin",
|
|
2844
|
-
steps: [
|
|
2845
|
-
"marketplace-add",
|
|
2846
|
-
"marketplace-update",
|
|
2847
|
-
"plugin-uninstall",
|
|
2848
|
-
"plugin-install",
|
|
2849
|
-
...enableStep
|
|
2850
|
-
],
|
|
2848
|
+
steps: ["plugin-uninstall", ...readd, "plugin-install", ...enableStep],
|
|
2851
2849
|
reason: `marketplace ${pin.marketplace} does not track the pinned ref ${ref}`,
|
|
2852
2850
|
...normalized?.ref !== void 0 ? { overriddenRef: normalized.ref } : {}
|
|
2853
2851
|
};
|
|
@@ -6359,20 +6357,17 @@ async function writeClaudeFiles(root, dryRun, selectedIds, opts = {}) {
|
|
|
6359
6357
|
root,
|
|
6360
6358
|
claudePath(root, "rules", "haus.md"),
|
|
6361
6359
|
[
|
|
6362
|
-
"- Keep context minimal.",
|
|
6363
|
-
"- Follow project conventions.",
|
|
6364
|
-
"- Never read secrets.",
|
|
6365
|
-
"- Block dangerous shell commands.",
|
|
6366
6360
|
"- NEVER hand-edit haus-managed blocks (`<!-- HAUS:BEGIN \u2026 -->` \u2026 `<!-- HAUS:END \u2026 -->`)",
|
|
6367
|
-
" or haus-owned files under `.claude/`
|
|
6361
|
+
" or haus-owned files under `.claude/` and `.haus-workflow/` (lock-tracked catalog items,",
|
|
6362
|
+
" `rules/haus.md`, `settings.json`, `WORKFLOW.md`). Regenerate via `haus apply`.",
|
|
6368
6363
|
" Hand-edits are silently overwritten or flagged as drift.",
|
|
6369
6364
|
"",
|
|
6370
6365
|
"## Driving haus",
|
|
6371
|
-
"
|
|
6372
|
-
"
|
|
6373
|
-
"
|
|
6374
|
-
"- Set up / configure / fix / check
|
|
6375
|
-
"- Update package + catalog
|
|
6366
|
+
"When the user asks to set up, configure, check, fix, refresh, or update the project, run",
|
|
6367
|
+
"the matching `haus` command and narrate results in plain language. Never make them use a",
|
|
6368
|
+
"terminal or read JSON.",
|
|
6369
|
+
"- Set up / configure / fix / check: `haus init`, `haus apply --write`, `haus doctor`",
|
|
6370
|
+
"- Update package + catalog: `haus update`",
|
|
6376
6371
|
"- `/haus-workflow <task>` does the same conversationally (e.g. `init`, `fix`, `doctor`, `reinit`).",
|
|
6377
6372
|
""
|
|
6378
6373
|
].join("\n"),
|
|
@@ -7276,6 +7271,18 @@ async function readMarketplaceRefs(configDir) {
|
|
|
7276
7271
|
}
|
|
7277
7272
|
return out;
|
|
7278
7273
|
}
|
|
7274
|
+
async function readUserEnabledPlugins(configDir) {
|
|
7275
|
+
const settings = await readJson(
|
|
7276
|
+
path37.join(configDir, "settings.json")
|
|
7277
|
+
);
|
|
7278
|
+
const raw = settings?.enabledPlugins;
|
|
7279
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return {};
|
|
7280
|
+
const out = {};
|
|
7281
|
+
for (const [id, value] of Object.entries(raw)) {
|
|
7282
|
+
if (typeof value === "boolean") out[id] = value;
|
|
7283
|
+
}
|
|
7284
|
+
return out;
|
|
7285
|
+
}
|
|
7279
7286
|
async function readClonedPluginVersion(installLocation) {
|
|
7280
7287
|
const manifest = await readJson(
|
|
7281
7288
|
path37.join(installLocation, ".claude-plugin", "plugin.json")
|
|
@@ -7351,7 +7358,8 @@ async function probePluginEnv(deps = {}) {
|
|
|
7351
7358
|
warn2("Claude Code returned unreadable plugin state \u2014 leaving global plugins untouched.");
|
|
7352
7359
|
return { available: false, installed: [], marketplaces: [] };
|
|
7353
7360
|
}
|
|
7354
|
-
|
|
7361
|
+
const userEnabledPlugins = await readUserEnabledPlugins(configDir);
|
|
7362
|
+
return { available: true, installed, marketplaces, userEnabledPlugins };
|
|
7355
7363
|
}
|
|
7356
7364
|
function stepArgs(step, pin) {
|
|
7357
7365
|
const id = pluginId(pin);
|
|
@@ -7367,6 +7375,8 @@ function stepArgs(step, pin) {
|
|
|
7367
7375
|
];
|
|
7368
7376
|
case "marketplace-update":
|
|
7369
7377
|
return ["plugin", "marketplace", "update", pin.marketplace];
|
|
7378
|
+
case "marketplace-remove":
|
|
7379
|
+
return ["plugin", "marketplace", "remove", pin.marketplace];
|
|
7370
7380
|
case "plugin-uninstall":
|
|
7371
7381
|
return ["plugin", "uninstall", id, "--scope", "user"];
|
|
7372
7382
|
case "plugin-install":
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "6.
|
|
2
|
+
"version": "6.7.0",
|
|
3
3
|
"manifestFormat": 2,
|
|
4
4
|
"globalPlugins": [
|
|
5
5
|
{
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"plugin": "superpowers",
|
|
8
8
|
"marketplace": "superpowers-dev",
|
|
9
9
|
"url": "https://github.com/obra/superpowers.git",
|
|
10
|
-
"ref": "v6.
|
|
10
|
+
"ref": "v6.4.1"
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
"id": "vercel",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"items": [
|
|
45
45
|
{
|
|
46
46
|
"id": "haus.agentic-workflow-standard",
|
|
47
|
-
"version": "
|
|
47
|
+
"version": "2.0.0",
|
|
48
48
|
"source": "haus",
|
|
49
49
|
"type": "template",
|
|
50
50
|
"path": "templates/agentic-workflow-standard.md",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"tags": ["workflow", "baseline", "project-instructions"],
|
|
56
56
|
"repoRoles": [],
|
|
57
57
|
"installMode": "copy-selected",
|
|
58
|
-
"tokenEstimate":
|
|
58
|
+
"tokenEstimate": 2743,
|
|
59
59
|
"tokenBudget": 5131,
|
|
60
60
|
"default": true,
|
|
61
61
|
"reviewStatus": "approved",
|
|
@@ -27,7 +27,11 @@ the repo: you actually read the code. You never ask anything and write no files.
|
|
|
27
27
|
parts follow per the skill), `KÄLLOR:` (the source manifest the specifier
|
|
28
28
|
got: grep hits and paths from the start, a source to verify,
|
|
29
29
|
never an answer key; read further yourself where it points and ground every
|
|
30
|
-
claim in the code as before)
|
|
30
|
+
claim in the code as before), `DESIGN:` (a design decided with a human in
|
|
31
|
+
brainstorming against this spec, or the line `DESIGN: ingen`: every decision
|
|
32
|
+
in it is taken, verify it against the code and never reopen it; where the
|
|
33
|
+
code says it cannot be built as written, that is a `contradiction` whose text
|
|
34
|
+
starts with `design conflict:`).
|
|
31
35
|
3. Trace the impact in the code with Read/Grep/Glob: shared code, data storage,
|
|
32
36
|
integration points, flows, interfaces, test coverage. What you cannot
|
|
33
37
|
verify is written verbatim as unverified, per the skill.
|
|
@@ -21,7 +21,9 @@ nothing, never ask anything, and write no files: your answer is the deliverable.
|
|
|
21
21
|
verify exports against, so state it as an assumption instead of guessing),
|
|
22
22
|
`SPRÅK:` and `RUBRIKER:` (the spec's language and the heading skeleton in
|
|
23
23
|
that language; use the literals verbatim, never mix languages in the spec),
|
|
24
|
-
possibly `ESKALERAD: ja
|
|
24
|
+
possibly `ESKALERAD: ja`, and in umbrella mode `PARAPLY:` (the parent's approved
|
|
25
|
+
spec plus one `DELAR:` line per part: write ONE umbrella spec per the skill's
|
|
26
|
+
_The umbrella spec (PARAPLY)_).
|
|
25
27
|
3. **Ground before you assume.** Verify the source manifest's claims with
|
|
26
28
|
Read/Grep/Glob before you build on them, and keep searching yourself under
|
|
27
29
|
`REPO-ROT` where the manifest points. If `REPO-ROT: saknas` or `KÄLLOR: inga`:
|