@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 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.3.0",
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 = installed.enabled !== false;
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"] : ["marketplace-add", "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/` / `.haus-workflow/` \u2014 regenerate via `haus apply`.",
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
- "haus owns `.claude/` and `.haus-workflow/`. When the user asks to set up, configure,",
6372
- "check, fix, refresh, or update the project, run the matching `haus` command and narrate",
6373
- "results in plain language \u2014 never make them use a terminal or read JSON.",
6374
- "- Set up / configure / fix / check \u2192 `haus init`, `haus apply --write`, `haus doctor`",
6375
- "- Update package + catalog \u2192 `haus update`",
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
- return { available: true, installed, marketplaces };
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.6.0",
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.3.0"
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": "1.6.0",
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": 4080,
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`: