@haus-tech/haus-workflow 4.2.0 → 4.4.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,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.4.0](https://github.com/WeAreHausTech/haus-workflow/compare/v4.3.0...v4.4.0) (2026-08-24)
4
+
5
+ ### Features
6
+
7
+ - **skills:** add request-score and let assess describe open outcome choices ([#347](https://github.com/WeAreHausTech/haus-workflow/issues/347)) ([09bd070](https://github.com/WeAreHausTech/haus-workflow/commit/09bd0709c5123fb9d82a0410fa995020beb384a6))
8
+
9
+ ## [4.3.0](https://github.com/WeAreHausTech/haus-workflow/compare/v4.2.0...v4.3.0) (2026-08-24)
10
+
11
+ ### Features
12
+
13
+ - **doctor:** advisory hint when project docs were never generated ([#341](https://github.com/WeAreHausTech/haus-workflow/issues/341)) ([711ca0f](https://github.com/WeAreHausTech/haus-workflow/commit/711ca0fa5d2ed27e0bf05601c2e7a556ce542733))
14
+ - **install:** allow all non-destructive subcommands ([#338](https://github.com/WeAreHausTech/haus-workflow/issues/338)) ([47d4636](https://github.com/WeAreHausTech/haus-workflow/commit/47d463689ca9e82faaf1f3eed74e1a308a47890f))
15
+ - **new:** add react-router stack; project:new writes docs, sets structure, stays private ([#345](https://github.com/WeAreHausTech/haus-workflow/issues/345)) ([2a45cd9](https://github.com/WeAreHausTech/haus-workflow/commit/2a45cd9b44aa35ecf38aaa623cd7ce02fdff62d8)), closes [#339](https://github.com/WeAreHausTech/haus-workflow/issues/339) [#340](https://github.com/WeAreHausTech/haus-workflow/issues/340) [#342](https://github.com/WeAreHausTech/haus-workflow/issues/342) [#343](https://github.com/WeAreHausTech/haus-workflow/issues/343) [#339](https://github.com/WeAreHausTech/haus-workflow/issues/339) [#340](https://github.com/WeAreHausTech/haus-workflow/issues/340) [#342](https://github.com/WeAreHausTech/haus-workflow/issues/342) [#343](https://github.com/WeAreHausTech/haus-workflow/issues/343)
16
+ - **scanner:** detect python and go repos as backend stack tokens ([#344](https://github.com/WeAreHausTech/haus-workflow/issues/344)) ([6a062d9](https://github.com/WeAreHausTech/haus-workflow/commit/6a062d989408634810a7a7007718c981960a2814))
17
+ - **skill:** update the request-pipeline skills to the current working versions ([#334](https://github.com/WeAreHausTech/haus-workflow/issues/334)) ([7e2c556](https://github.com/WeAreHausTech/haus-workflow/commit/7e2c556be36e333b4577814daf7f09ac63cc023f))
18
+
19
+ ### Bug Fixes
20
+
21
+ - **request-classify:** redefine B2 around what the change requires ([#335](https://github.com/WeAreHausTech/haus-workflow/issues/335)) ([5ef8418](https://github.com/WeAreHausTech/haus-workflow/commit/5ef84184273f151e93fb1daee7a60bd0f0a80b7c))
22
+
3
23
  ## [4.2.0](https://github.com/WeAreHausTech/haus-workflow/compare/v4.1.0...v4.2.0) (2026-08-21)
4
24
 
5
25
  ### Features
package/dist/cli.js CHANGED
@@ -1225,10 +1225,6 @@ var init_validation_rules = __esm({
1225
1225
  "library/catalog/validation-rules.json"() {
1226
1226
  validation_rules_default = {
1227
1227
  forbiddenTags: [
1228
- "python",
1229
- "django",
1230
- "go",
1231
- "golang",
1232
1228
  "rust",
1233
1229
  "rustlang",
1234
1230
  "java",
@@ -1278,6 +1274,8 @@ var init_validation_rules = __esm({
1278
1274
  "typescript",
1279
1275
  "php",
1280
1276
  "csharp",
1277
+ "python",
1278
+ "golang",
1281
1279
  "vendure",
1282
1280
  "vendure3",
1283
1281
  "nestjs",
@@ -2380,9 +2378,6 @@ function isRecord(v) {
2380
2378
 
2381
2379
  // src/scanner/detection.ts
2382
2380
  var UNSUPPORTED_MARKERS = {
2383
- "requirements.txt": "python",
2384
- "pyproject.toml": "python",
2385
- "go.mod": "go",
2386
2381
  "Cargo.toml": "rust",
2387
2382
  "pom.xml": "java",
2388
2383
  "build.gradle": "java",
@@ -2818,7 +2813,55 @@ async function writeManagedJson(root, filePath, value, dryRun, quiet = false) {
2818
2813
  }
2819
2814
 
2820
2815
  // src/install/allow-rules.ts
2821
- var ALLOWED_SUBCOMMANDS = ["init", "apply", "doctor", "scan", "recommend"];
2816
+ var ALLOWED_SUBCOMMANDS = [
2817
+ // Setup / health / recommendation flow
2818
+ "init",
2819
+ "apply",
2820
+ "doctor",
2821
+ "scan",
2822
+ "recommend",
2823
+ "explain-recommendation",
2824
+ "fetch-refs",
2825
+ "rescan",
2826
+ // Project creation (create-only; refuses existing targets)
2827
+ "clone",
2828
+ "new",
2829
+ // Global install / update (writes ~/.claude + plugin pins, never deletes user content)
2830
+ "update",
2831
+ "install",
2832
+ "configs",
2833
+ // Read-only reporting and validation
2834
+ "ci-gate",
2835
+ "catalog-audit",
2836
+ "validate-catalog",
2837
+ "backups list",
2838
+ "guard file-access",
2839
+ "guard bash",
2840
+ // Catalog cache maintenance (staged + validated, never deletes user content)
2841
+ "catalog bundle export",
2842
+ "catalog bundle import",
2843
+ // Decision gate (read-only; `suggest` prints a draft, it does not write one)
2844
+ "decisions check",
2845
+ "decisions suggest",
2846
+ "decisions next-number",
2847
+ "decisions guard",
2848
+ "decisions validate",
2849
+ "adr check",
2850
+ "adr suggest",
2851
+ "adr next-number",
2852
+ "adr guard",
2853
+ "adr validate",
2854
+ // Workspace (planning previews, scans, setup merge; no deleters)
2855
+ "workspace discover",
2856
+ "workspace scan",
2857
+ "workspace setup",
2858
+ "workspace doctor",
2859
+ "workspace link-context",
2860
+ "workspace worktree add",
2861
+ "workspace worktree hydrate",
2862
+ "workspace worktree list",
2863
+ "workspace worktree doctor"
2864
+ ];
2822
2865
  function buildAllowRules() {
2823
2866
  return [...new Set(ALLOWED_SUBCOMMANDS.map((sub) => `Bash(haus ${sub}:*)`))];
2824
2867
  }
@@ -7587,7 +7630,23 @@ var STACK_RULES = [
7587
7630
  stack: ["auth", "saml2"],
7588
7631
  any: [dep("24slides/laravel-saml2"), dep("aacotroneo/laravel-saml2")]
7589
7632
  },
7590
- { stack: ["auth", "next-auth"], any: [dep("next-auth"), dep("@auth/core")] }
7633
+ { stack: ["auth", "next-auth"], any: [dep("next-auth"), dep("@auth/core")] },
7634
+ // Python — broad language signal so python-tooling catalog items gated on
7635
+ // { stack: 'python' } are recommendable on any Python project (same rationale as
7636
+ // the 'php' rule above: composer.json presence). Appended at the end so existing
7637
+ // bucket insertion order is untouched.
7638
+ {
7639
+ stack: ["backend", "python"],
7640
+ any: [
7641
+ fileEndsWith("pyproject.toml"),
7642
+ fileEndsWith("requirements.txt"),
7643
+ fileEndsWith("setup.py"),
7644
+ fileEquals("Pipfile")
7645
+ ]
7646
+ },
7647
+ // Go — broad language signal, same rationale: catalog items gated on
7648
+ // { stack: 'go' } become recommendable on any Go module.
7649
+ { stack: ["backend", "go"], any: [fileEndsWith("go.mod")] }
7591
7650
  ];
7592
7651
  function runDetection(ctx, rules = STACK_RULES) {
7593
7652
  const roles = [];
@@ -7707,11 +7766,17 @@ var SAFE_FILES = [
7707
7766
  "**/*.sln",
7708
7767
  "docker-compose.*",
7709
7768
  "Dockerfile",
7710
- // Unsupported-ecosystem markers — matched by PRESENCE only (never content-read; none
7711
- // match the content-blob extensions). Drive detectionStatus / unsupportedSignals.
7769
+ // Python/Go detection signals — matched by PRESENCE only (never content-read; none
7770
+ // match the content-blob extensions). Drive the `python`/`go` stack rules in
7771
+ // detection-registry.ts; requirements.txt / pyproject.toml / go.mod also still feed
7772
+ // detectionStatus / unsupportedSignals (UNSUPPORTED_MARKERS in detection.ts).
7712
7773
  "requirements.txt",
7713
7774
  "pyproject.toml",
7775
+ "setup.py",
7776
+ "Pipfile",
7714
7777
  "go.mod",
7778
+ // Unsupported-ecosystem markers — matched by PRESENCE only (never content-read; none
7779
+ // match the content-blob extensions). Drive detectionStatus / unsupportedSignals.
7715
7780
  "Cargo.toml",
7716
7781
  "pom.xml",
7717
7782
  "build.gradle",
@@ -8032,6 +8097,20 @@ async function runDoctor(options) {
8032
8097
  ok("- .haus-workflow/workflow-config.md: OK (project-owned)");
8033
8098
  }
8034
8099
  }
8100
+ const docsSkillInstalled = await fs37.pathExists(
8101
+ path45.join(root, ".claude", "skills", "writing-documentation", "SKILL.md")
8102
+ );
8103
+ if (docsSkillInstalled) {
8104
+ if (await fs37.pathExists(path45.join(root, "docs", "SUMMARY.md"))) {
8105
+ ok("- PROJECT DOCS: OK (docs/SUMMARY.md present)");
8106
+ } else {
8107
+ suggest(
8108
+ "- PROJECT DOCS: docs/SUMMARY.md missing \u2014 run the writing-documentation skill (`/docs` in Claude Code) to generate the project docs",
8109
+ "The project docs index (docs/SUMMARY.md) has not been generated yet",
8110
+ "run `/docs` in Claude Code (the writing-documentation skill)"
8111
+ );
8112
+ }
8113
+ }
8035
8114
  if (workflowExists) {
8036
8115
  const prettierIgnore = await readText(path45.join(root, ".prettierignore")) ?? "";
8037
8116
  const lines = prettierIgnore.split("\n");
@@ -10972,6 +11051,29 @@ var STACKS = [
10972
11051
  overlayConfigIds: ["haus.eslint-config", "haus.prettier-config"],
10973
11052
  expectedRole: "react-app"
10974
11053
  },
11054
+ {
11055
+ id: "react-router",
11056
+ title: "React Router app (framework mode, TypeScript)",
11057
+ scaffold: {
11058
+ package: "create-react-router",
11059
+ majorPin: 8,
11060
+ // --yes skips all option prompts; --no-git-init because the git step here
11061
+ // owns init/branch/commit; --no-agent-skills because haus installs its own
11062
+ // context assets. Default template ships react-router + @react-router/node,
11063
+ // which is exactly the detection registry's react-router-app rule.
11064
+ args: [
11065
+ "{name}",
11066
+ "--no-install",
11067
+ "--no-git-init",
11068
+ "--no-agent-skills",
11069
+ "--package-manager",
11070
+ "{pm}",
11071
+ "--yes"
11072
+ ]
11073
+ },
11074
+ overlayConfigIds: ["haus.eslint-config", "haus.prettier-config"],
11075
+ expectedRole: "react-router-app"
11076
+ },
10975
11077
  {
10976
11078
  id: "nest",
10977
11079
  title: "NestJS API",