@haus-tech/haus-workflow 5.11.0 → 5.12.1

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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.12.1](https://github.com/WeAreHausTech/haus-workflow/compare/v5.12.0...v5.12.1) (2026-10-08)
4
+
5
+ ### Bug Fixes
6
+
7
+ - **security:** allow the desktop app's auto-merge tool ([#646](https://github.com/WeAreHausTech/haus-workflow/issues/646)) ([cc29b3e](https://github.com/WeAreHausTech/haus-workflow/commit/cc29b3e18f63e72766839c06d398007a199b22c0))
8
+
9
+ ## [5.12.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.11.0...v5.12.0) (2026-10-08)
10
+
11
+ ### Bug Fixes
12
+
13
+ - **doctor:** AGENT REFS skips bold terms and agent words outside the sentence (ADR-0149) ([#633](https://github.com/WeAreHausTech/haus-workflow/issues/633)) ([c67b09c](https://github.com/WeAreHausTech/haus-workflow/commit/c67b09c40341f17ccafa89ecb2515129de407827)), closes [#307](https://github.com/WeAreHausTech/haus-workflow/issues/307) [#328](https://github.com/WeAreHausTech/haus-workflow/issues/328) [#329](https://github.com/WeAreHausTech/haus-workflow/issues/329) [WeAreHausTech/haus-workflow-catalog#307](https://github.com/WeAreHausTech/haus-workflow-catalog/issues/307)
14
+
3
15
  ## [5.11.0](https://github.com/WeAreHausTech/haus-workflow/compare/v5.10.1...v5.11.0) (2026-10-07)
4
16
 
5
17
  ### Features
package/dist/cli.js CHANGED
@@ -4669,11 +4669,20 @@ var ALLOWED_COMMANDS = [
4669
4669
  "gh search prs",
4670
4670
  "gh search issues"
4671
4671
  ];
4672
+ var ALLOWED_TOOLS = [
4673
+ // The Claude desktop Code tab's auto-merge switch. The auto mode classifier blocked it
4674
+ // after `gh pr merge` itself was allowed. It reaches the same outcome as
4675
+ // `gh pr merge --auto`, which `Bash(gh pr merge:*)` already carries, and GitHub only
4676
+ // enables auto-merge where required checks exist, so branch protection stays the gate.
4677
+ // Outside the desktop app no such tool exists and the rule matches nothing.
4678
+ "mcp__ccd_pr__set_auto_merge"
4679
+ ];
4672
4680
  function buildAllowRules() {
4673
4681
  return [
4674
4682
  .../* @__PURE__ */ new Set([
4675
4683
  ...ALLOWED_SUBCOMMANDS.map((sub) => `Bash(haus ${sub}:*)`),
4676
- ...ALLOWED_COMMANDS.map((command) => `Bash(${command}:*)`)
4684
+ ...ALLOWED_COMMANDS.map((command) => `Bash(${command}:*)`),
4685
+ ...ALLOWED_TOOLS
4677
4686
  ])
4678
4687
  ];
4679
4688
  }
@@ -8910,11 +8919,13 @@ var BOLD_SPAN = /\*\*([^*\n]+)\*\*/g;
8910
8919
  var BARE_NAME = /^[a-z0-9][a-z0-9-]{2,}$/;
8911
8920
  var KEBAB_NAME = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/;
8912
8921
  var AGENT_WORD = /\bagents?\b/i;
8922
+ var SENTENCE_END = /[.!?](?=\s|$)/g;
8913
8923
  var ITEMS_HEADING = /\b(?:skills?|agents?)\b/i;
8914
8924
  var LIST_ITEM = /^(\s*(?:[-*+]|\d+[.)])\s+)(.*)$/;
8915
8925
  var LIST_LABEL = /^[A-Za-z][A-Za-z /]{0,24}:\s*/;
8916
8926
  var KEYWORD_BEFORE = /(?:sub)?(?:skills?|agents?)\s*[:=-]*\s*$/i;
8917
8927
  var KEYWORD_AFTER = /^\s+(?:[A-Za-z]+\s+)?(?:sub)?(?:skills?|agents?)\b/i;
8928
+ var ARTICLE_BEFORE = /\b(?:a|an)\s+$/i;
8918
8929
  var ROUTER_BEFORE = /\b(?:routes?|routing|delegates?|dispatch(?:es)?|hands? off)\s*(?:to|→|->|:)?\s*$/i;
8919
8930
  var RUN_SEPARATOR = /^\s*(?:\([^)\n]*\))?\s*(?:,|;|\/|\band\b|\bor\b|\bplus\b)\s*(?:the\s+)?$/i;
8920
8931
  var INLINE_KEYWORD_NAME = /^(?:sub)?(?:skills?|agents?)\s*[:=]\s*(\S+)$/i;
@@ -8948,7 +8959,15 @@ function groupRuns(line2, spans) {
8948
8959
  }
8949
8960
  return runs;
8950
8961
  }
8951
- function isAgentContext(line2, nearestHeading) {
8962
+ function sentenceAround(line2, token) {
8963
+ let start = 0;
8964
+ for (const end of line2.matchAll(SENTENCE_END)) {
8965
+ if (end.index >= token.end) return [start, end.index + 1];
8966
+ start = end.index + 1;
8967
+ }
8968
+ return [start, line2.length];
8969
+ }
8970
+ function isAgentContext(line2, token, nearestHeading) {
8952
8971
  let blanked = "";
8953
8972
  let cursor = 0;
8954
8973
  for (const span of boldNameSpans(line2)) {
@@ -8956,7 +8975,8 @@ function isAgentContext(line2, nearestHeading) {
8956
8975
  cursor = span.end;
8957
8976
  }
8958
8977
  blanked += line2.slice(cursor);
8959
- return AGENT_WORD.test(blanked) || AGENT_WORD.test(nearestHeading);
8978
+ const [start, end] = sentenceAround(line2, token);
8979
+ return AGENT_WORD.test(blanked.slice(start, end)) || AGENT_WORD.test(nearestHeading);
8960
8980
  }
8961
8981
  function extractNameReferences(lines, { knownNames = /* @__PURE__ */ new Set() } = {}) {
8962
8982
  const out = [];
@@ -8970,16 +8990,17 @@ function extractNameReferences(lines, { knownNames = /* @__PURE__ */ new Set() }
8970
8990
  const itemBody = listMatch?.[2]?.replace(LIST_LABEL, "");
8971
8991
  const itemBodyStart = itemBody === void 0 ? -1 : line2.length - itemBody.length;
8972
8992
  const underItemsHeading = ITEMS_HEADING.test(nearestHeading);
8973
- const looseContext = isAgentContext(line2, nearestHeading);
8993
+ const looseContext = (span) => KEBAB_NAME.test(span.text) && isAgentContext(line2, span, nearestHeading);
8974
8994
  for (const run of groupRuns(line2, boldNameSpans(line2))) {
8975
8995
  const before = line2.slice(0, run[0].start);
8976
8996
  const after = line2.slice(run.at(-1).end);
8977
- const positional = KEYWORD_BEFORE.test(before) || ROUTER_BEFORE.test(before) || KEYWORD_AFTER.test(after) || // Two co-listed installed items make the run an item list. One is not enough:
8997
+ const classifier = ARTICLE_BEFORE.test(before);
8998
+ const positional = KEYWORD_BEFORE.test(before) || ROUTER_BEFORE.test(before) || !classifier && KEYWORD_AFTER.test(after) || // Two co-listed installed items make the run an item list. One is not enough:
8978
8999
  // package names share basenames with skills.
8979
9000
  run.filter((span) => knownNames.has(span.text)).length >= 2 || underItemsHeading && run[0].start === itemBodyStart;
8980
9001
  for (const span of run) {
8981
9002
  if (inCodeSpan(span.start)) continue;
8982
- if (!positional && !(KEBAB_NAME.test(span.text) && looseContext)) continue;
9003
+ if (!positional && (classifier || !looseContext(span))) continue;
8983
9004
  out.push({ line: lineNumber, name: span.text, kind: "bold" });
8984
9005
  }
8985
9006
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "6.9.0",
2
+ "version": "6.10.0",
3
3
  "manifestFormat": 2,
4
4
  "globalPlugins": [
5
5
  {
@@ -40,7 +40,9 @@
40
40
  "haus.mattpocock-domain-modeling",
41
41
  "haus.mattpocock-grill-with-docs",
42
42
  "haus.mattpocock-research",
43
- "haus.mattpocock-handoff"
43
+ "haus.mattpocock-handoff",
44
+ "haus.mattpocock-retro",
45
+ "haus.mattpocock-writing-for-agents"
44
46
  ]
45
47
  },
46
48
  "keepIds": ["haus.currents-dev-playwright-best-practices"]
@@ -49,7 +51,7 @@
49
51
  "items": [
50
52
  {
51
53
  "id": "haus.agentic-workflow-standard",
52
- "version": "2.1.0",
54
+ "version": "2.2.1",
53
55
  "source": "haus",
54
56
  "type": "template",
55
57
  "path": "templates/agentic-workflow-standard.md",
@@ -60,7 +62,7 @@
60
62
  "tags": ["workflow", "baseline", "project-instructions"],
61
63
  "repoRoles": [],
62
64
  "installMode": "copy-selected",
63
- "tokenEstimate": 3189,
65
+ "tokenEstimate": 3434,
64
66
  "tokenBudget": 5131,
65
67
  "default": true,
66
68
  "reviewStatus": "approved",
@@ -1656,7 +1658,7 @@
1656
1658
  },
1657
1659
  {
1658
1660
  "id": "haus.adr-decisions",
1659
- "version": "1.1.0",
1661
+ "version": "1.2.0",
1660
1662
  "source": "haus",
1661
1663
  "type": "skill",
1662
1664
  "path": "skills/haus-owned/general/adr-decisions",
@@ -1668,7 +1670,7 @@
1668
1670
  "repoRoles": [],
1669
1671
  "ecosystem": "general",
1670
1672
  "installMode": "copy-selected",
1671
- "tokenEstimate": 863,
1673
+ "tokenEstimate": 924,
1672
1674
  "tokenBudget": 1122,
1673
1675
  "default": true,
1674
1676
  "reviewStatus": "approved",
@@ -1676,7 +1678,7 @@
1676
1678
  },
1677
1679
  {
1678
1680
  "id": "haus.issue-authoring",
1679
- "version": "1.3.0",
1681
+ "version": "1.4.1",
1680
1682
  "source": "haus",
1681
1683
  "type": "skill",
1682
1684
  "path": "skills/haus-owned/general/issue-authoring",
@@ -1688,7 +1690,7 @@
1688
1690
  "repoRoles": [],
1689
1691
  "ecosystem": "general",
1690
1692
  "installMode": "copy-selected",
1691
- "tokenEstimate": 2284,
1693
+ "tokenEstimate": 2590,
1692
1694
  "tokenBudget": 2970,
1693
1695
  "default": true,
1694
1696
  "reviewStatus": "approved",
@@ -1725,7 +1727,7 @@
1725
1727
  },
1726
1728
  {
1727
1729
  "id": "haus.issue-creator",
1728
- "version": "1.2.0",
1730
+ "version": "1.3.0",
1729
1731
  "source": "haus",
1730
1732
  "type": "agent",
1731
1733
  "path": "agents/haus-owned/issue-creator.md",
@@ -1737,7 +1739,7 @@
1737
1739
  "repoRoles": [],
1738
1740
  "ecosystem": "general",
1739
1741
  "installMode": "copy-selected",
1740
- "tokenEstimate": 749,
1742
+ "tokenEstimate": 797,
1741
1743
  "tokenBudget": 974,
1742
1744
  "default": true,
1743
1745
  "reviewStatus": "approved",
@@ -5564,14 +5566,14 @@
5564
5566
  },
5565
5567
  {
5566
5568
  "id": "haus.mattpocock-grill-with-docs",
5567
- "version": "1.0.0",
5569
+ "version": "1.0.1",
5568
5570
  "source": "curated",
5569
5571
  "type": "skill",
5570
5572
  "path": "sources/mattpocock/skills/engineering/grill-with-docs",
5571
5573
  "title": "Mattpocock Grill With Docs",
5572
5574
  "purpose": "A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.",
5573
5575
  "whenToUse": "A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.",
5574
- "whenNotToUse": "Not for a customer request that is to be specced: the request flow never asks questions back. Run it on a branch or worktree, because it writes files. One session: split larger work first.",
5576
+ "whenNotToUse": "Not for a customer request that is to be specced: the request flow never asks questions back. Run it on a branch (a worktree only from a clean, committed state), because it writes files. One session: split larger work first.",
5575
5577
  "tags": ["workflow"],
5576
5578
  "repoRoles": [],
5577
5579
  "tokenEstimate": 62,
@@ -5660,6 +5662,72 @@
5660
5662
  "role": "handoff-workflow"
5661
5663
  }
5662
5664
  ]
5665
+ },
5666
+ {
5667
+ "id": "haus.mattpocock-retro",
5668
+ "version": "1.0.0",
5669
+ "source": "curated",
5670
+ "type": "skill",
5671
+ "path": "sources/mattpocock/skills/engineering/retro",
5672
+ "title": "Mattpocock Retro",
5673
+ "purpose": "Conduct a retrospective on a coding session.",
5674
+ "whenToUse": "Conduct a retrospective on a coding session.",
5675
+ "whenNotToUse": "Not for a verdict on the code a session produced. A candidate about haus-shipped content is filed upstream, never hand-edited. Only the candidates you pick are filed.",
5676
+ "tags": ["workflow"],
5677
+ "repoRoles": [],
5678
+ "tokenEstimate": 1093,
5679
+ "tokenBudget": 1421,
5680
+ "installMode": "copy-selected",
5681
+ "default": false,
5682
+ "reviewStatus": "approved",
5683
+ "riskLevel": "low",
5684
+ "useMode": "copy",
5685
+ "license": "MIT",
5686
+ "licenseConfidence": "high",
5687
+ "originSourceId": "mattpocock-skills",
5688
+ "originUrl": "https://github.com/mattpocock/skills/blob/4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d/skills/engineering/retro/SKILL.md",
5689
+ "pinnedRef": "4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d",
5690
+ "ecosystem": "general",
5691
+ "optInTier": "workflow",
5692
+ "optInGroup": "Session retrospective",
5693
+ "requiresAny": [
5694
+ {
5695
+ "role": "retro-workflow"
5696
+ }
5697
+ ]
5698
+ },
5699
+ {
5700
+ "id": "haus.mattpocock-writing-for-agents",
5701
+ "version": "1.0.0",
5702
+ "source": "curated",
5703
+ "type": "skill",
5704
+ "path": "sources/mattpocock/skills/productivity/writing-for-agents",
5705
+ "title": "Mattpocock Writing For Agents",
5706
+ "purpose": "Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.",
5707
+ "whenToUse": "Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.",
5708
+ "whenNotToUse": "Not for generating or refreshing project docs or the CLAUDE.md body: the writing-documentation skill owns that. Not for testing a skill before shipping: the superpowers writing-skills skill does that. Never on haus-managed files and blocks, which change only through the catalog and haus apply.",
5709
+ "tags": ["workflow"],
5710
+ "repoRoles": [],
5711
+ "tokenEstimate": 2722,
5712
+ "tokenBudget": 3539,
5713
+ "installMode": "copy-selected",
5714
+ "default": false,
5715
+ "reviewStatus": "approved",
5716
+ "riskLevel": "low",
5717
+ "useMode": "copy",
5718
+ "license": "MIT",
5719
+ "licenseConfidence": "high",
5720
+ "originSourceId": "mattpocock-skills",
5721
+ "originUrl": "https://github.com/mattpocock/skills/blob/4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d/skills/productivity/writing-for-agents/SKILL.md",
5722
+ "pinnedRef": "4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d",
5723
+ "ecosystem": "general",
5724
+ "optInTier": "workflow",
5725
+ "optInGroup": "Session retrospective",
5726
+ "requiresAny": [
5727
+ {
5728
+ "role": "retro-workflow"
5729
+ }
5730
+ ]
5663
5731
  }
5664
5732
  ]
5665
5733
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haus-tech/haus-workflow",
3
- "version": "5.11.0",
3
+ "version": "5.12.1",
4
4
  "description": "Haus AI workflow CLI for Claude Code.",
5
5
  "type": "module",
6
6
  "bin": {