@haus-tech/haus-workflow 4.2.0 → 4.3.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 +14 -0
- package/dist/cli.js +113 -11
- package/library/catalog/manifest.json +558 -7
- package/library/catalog/validation-rules.json +2 -4
- package/library/global/skills/haus-workflow/SKILL.md +6 -1
- package/library/global/skills/haus-workflow/references/new.md +38 -11
- package/library/global/skills/request-assess-impact/SKILL.md +11 -8
- package/library/global/skills/request-classify/SKILL.md +0 -7
- package/library/global/skills/request-classify/references/klassningsinstruktion.md +9 -3
- package/library/global/skills/request-sync/SKILL.md +163 -39
- package/library/global/skills/request-write-spec/SKILL.md +10 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.3.0](https://github.com/WeAreHausTech/haus-workflow/compare/v4.2.0...v4.3.0) (2026-08-24)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- **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))
|
|
8
|
+
- **install:** allow all non-destructive subcommands ([#338](https://github.com/WeAreHausTech/haus-workflow/issues/338)) ([47d4636](https://github.com/WeAreHausTech/haus-workflow/commit/47d463689ca9e82faaf1f3eed74e1a308a47890f))
|
|
9
|
+
- **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)
|
|
10
|
+
- **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))
|
|
11
|
+
- **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))
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
- **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))
|
|
16
|
+
|
|
3
17
|
## [4.2.0](https://github.com/WeAreHausTech/haus-workflow/compare/v4.1.0...v4.2.0) (2026-08-21)
|
|
4
18
|
|
|
5
19
|
### 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 = [
|
|
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
|
-
//
|
|
7711
|
-
// match the content-blob extensions). Drive
|
|
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",
|