@haus-tech/haus-workflow 1.5.5 → 1.5.6

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,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.5.6](https://github.com/WeAreHausTech/haus-workflow/compare/v1.5.5...v1.5.6) (2026-08-12)
4
+
5
+ ### Bug Fixes
6
+
7
+ - cross-repo manifest validator parity (--include vs catalog) ([#269](https://github.com/WeAreHausTech/haus-workflow/issues/269)) ([84269e6](https://github.com/WeAreHausTech/haus-workflow/commit/84269e67ab5e5cb28efdfaaea537c1d2d1459c08)), closes [haus-workflow-catalog#76](https://github.com/WeAreHausTech/haus-workflow-catalog/issues/76) [#227](https://github.com/WeAreHausTech/haus-workflow/issues/227) [#228](https://github.com/WeAreHausTech/haus-workflow/issues/228) [#227](https://github.com/WeAreHausTech/haus-workflow/issues/227) [#227](https://github.com/WeAreHausTech/haus-workflow/issues/227) [#228](https://github.com/WeAreHausTech/haus-workflow/issues/228)
8
+
3
9
  ## [1.5.5](https://github.com/WeAreHausTech/haus-workflow/compare/v1.5.4...v1.5.5) (2026-08-11)
4
10
 
5
11
  ### Bug Fixes
package/dist/cli.js CHANGED
@@ -693,10 +693,17 @@ function validateReferences(itemId, references) {
693
693
  if (references === void 0) return null;
694
694
  if (!isStringArray(references)) return `${itemId}: references must be a string array`;
695
695
  for (const ref of references) {
696
- if (/^https?:\/\//i.test(ref)) {
697
- if (!/^https:\/\//i.test(ref)) {
698
- return `${itemId}: reference must be https:// URL: ${ref}`;
699
- }
696
+ let parsed;
697
+ try {
698
+ parsed = new URL(ref);
699
+ } catch {
700
+ return `${itemId}: reference is not a valid URL: ${ref}`;
701
+ }
702
+ if (parsed.protocol === "http:") {
703
+ return `${itemId}: reference uses insecure http:// URL: ${ref}`;
704
+ }
705
+ if (parsed.protocol !== "https:") {
706
+ return `${itemId}: reference must be https:// URL: ${ref}`;
700
707
  }
701
708
  }
702
709
  return null;
@@ -751,16 +758,29 @@ function validateCuratedProvenance(item) {
751
758
  if (!RISK_LEVELS.has(item.riskLevel)) {
752
759
  return `${item.id}: invalid riskLevel "${item.riskLevel}"`;
753
760
  }
754
- if (item.useMode !== void 0 && !USE_MODES.has(String(item.useMode))) {
761
+ if (!isNonEmptyString(item.originSourceId)) {
762
+ return `${item.id}: curated item missing originSourceId`;
763
+ }
764
+ if (!isNonEmptyString(item.originUrl)) {
765
+ return `${item.id}: curated item missing originUrl`;
766
+ }
767
+ if (!isNonEmptyString(item.useMode)) {
768
+ return `${item.id}: curated item missing useMode`;
769
+ }
770
+ if (!USE_MODES.has(item.useMode)) {
755
771
  return `${item.id}: invalid useMode "${item.useMode}"`;
756
772
  }
757
- if (item.licenseConfidence !== void 0 && !LICENSE_CONFIDENCES.has(String(item.licenseConfidence))) {
773
+ if (!isNonEmptyString(item.license)) {
774
+ return `${item.id}: curated item missing license`;
775
+ }
776
+ if (!isNonEmptyString(item.licenseConfidence)) {
777
+ return `${item.id}: curated item missing licenseConfidence`;
778
+ }
779
+ if (!LICENSE_CONFIDENCES.has(item.licenseConfidence)) {
758
780
  return `${item.id}: invalid licenseConfidence "${item.licenseConfidence}"`;
759
781
  }
760
- if (item.originUrl !== void 0) {
761
- if (typeof item.originUrl !== "string" || !item.originUrl.startsWith("https://")) {
762
- return `${item.id}: originUrl must be an https:// URL`;
763
- }
782
+ if (typeof item.originUrl !== "string" || !item.originUrl.startsWith("https://")) {
783
+ return `${item.id}: originUrl must be an https:// URL`;
764
784
  }
765
785
  return null;
766
786
  }
@@ -782,9 +802,6 @@ function isRequiresAnyClause(value) {
782
802
  if (!REQUIRES_ANY_KEYS.includes(key)) return false;
783
803
  return typeof value[key] === "string";
784
804
  }
785
- function isRequiresAnyArray(value) {
786
- return Array.isArray(value) && value.every(isRequiresAnyClause);
787
- }
788
805
  function safeParse(json) {
789
806
  return JSON.parse(json, (key, value) => {
790
807
  if (POLLUTION_KEYS.has(key)) return void 0;
@@ -811,6 +828,7 @@ function parseManifest(json) {
811
828
  const items = [];
812
829
  const seenIds = /* @__PURE__ */ new Set();
813
830
  const seenPaths = /* @__PURE__ */ new Set();
831
+ const warnings = [];
814
832
  for (let i = 0; i < root.items.length; i++) {
815
833
  const raw = root.items[i];
816
834
  if (!raw || typeof raw !== "object") {
@@ -845,8 +863,21 @@ function parseManifest(json) {
845
863
  if (!isStringArray2(item.repoRoles)) {
846
864
  return { ok: false, error: `${item.id}: repoRoles must be a string array` };
847
865
  }
848
- if (item.requiresAny !== void 0 && !isRequiresAnyArray(item.requiresAny)) {
849
- return { ok: false, error: `${item.id}: requiresAny must be an array of clause objects` };
866
+ if (item.requiresAny !== void 0) {
867
+ if (!Array.isArray(item.requiresAny)) {
868
+ return { ok: false, error: `${item.id}: requiresAny must be an array of clause objects` };
869
+ }
870
+ const kept = [];
871
+ for (const clause of item.requiresAny) {
872
+ if (isRequiresAnyClause(clause)) {
873
+ kept.push(clause);
874
+ } else {
875
+ warnings.push(
876
+ `${item.id}: dropping unrecognized requiresAny clause (catalog schema evolved ahead of this CLI version) \u2014 ${JSON.stringify(clause)}`
877
+ );
878
+ }
879
+ }
880
+ item.requiresAny = kept;
850
881
  }
851
882
  if (typeof item.tokenEstimate !== "number" || !Number.isFinite(item.tokenEstimate)) {
852
883
  return { ok: false, error: `${item.id}: tokenEstimate must be a finite number` };
@@ -863,7 +894,7 @@ function parseManifest(json) {
863
894
  if (formerIdFailures.length > 0) {
864
895
  return { ok: false, error: formerIdFailures[0] };
865
896
  }
866
- return { ok: true, manifest: { version: root.version, items } };
897
+ return { ok: true, manifest: { version: root.version, items }, warnings };
867
898
  }
868
899
 
869
900
  // src/catalog/remote-catalog/manifest.ts
@@ -876,6 +907,7 @@ async function fetchRemoteManifest() {
876
907
  warn(`Remote manifest failed schema validation: ${parsed.error}`);
877
908
  return null;
878
909
  }
910
+ for (const warning of parsed.warnings) warn(warning);
879
911
  if (!parsed.manifest.items.length) return null;
880
912
  return parsed.manifest;
881
913
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.3.2",
2
+ "version": "4.3.3",
3
3
  "items": [
4
4
  {
5
5
  "id": "haus.agentic-workflow-standard",
@@ -365,7 +365,7 @@
365
365
  "useMode": "copy",
366
366
  "license": "MIT",
367
367
  "licenseConfidence": "high",
368
- "originSourceId": "ecc",
368
+ "originSourceId": "ecc-affaanm",
369
369
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/csharp-testing/SKILL.md",
370
370
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
371
371
  "ecosystem": "dotnet",
@@ -466,7 +466,7 @@
466
466
  "useMode": "copy",
467
467
  "license": "MIT",
468
468
  "licenseConfidence": "high",
469
- "originSourceId": "ecc",
469
+ "originSourceId": "ecc-affaanm",
470
470
  "originUrl": "https://github.com/affaan-m/ECC/blob/71d22d0a77b7e0684f4e51cba03749b788993cdb/skills/dotnet-patterns/SKILL.md",
471
471
  "pinnedRef": "71d22d0a77b7e0684f4e51cba03749b788993cdb",
472
472
  "ecosystem": "dotnet",
@@ -531,7 +531,7 @@
531
531
  "useMode": "copy",
532
532
  "license": "MIT",
533
533
  "licenseConfidence": "high",
534
- "originSourceId": "ecc",
534
+ "originSourceId": "ecc-affaanm",
535
535
  "originUrl": "https://github.com/affaan-m/ECC/blob/71d22d0a77b7e0684f4e51cba03749b788993cdb/skills/e2e-testing/SKILL.md",
536
536
  "pinnedRef": "71d22d0a77b7e0684f4e51cba03749b788993cdb",
537
537
  "ecosystem": "playwright",
@@ -565,7 +565,7 @@
565
565
  "useMode": "copy",
566
566
  "license": "MIT",
567
567
  "licenseConfidence": "high",
568
- "originSourceId": "ecc",
568
+ "originSourceId": "ecc-affaanm",
569
569
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/frontend-patterns/SKILL.md",
570
570
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
571
571
  "ecosystem": "react",
@@ -601,7 +601,7 @@
601
601
  "useMode": "copy",
602
602
  "license": "MIT",
603
603
  "licenseConfidence": "high",
604
- "originSourceId": "ecc",
604
+ "originSourceId": "ecc-affaanm",
605
605
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/laravel-patterns/SKILL.md",
606
606
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
607
607
  "ecosystem": "laravel",
@@ -703,7 +703,7 @@
703
703
  "useMode": "copy",
704
704
  "license": "MIT",
705
705
  "licenseConfidence": "high",
706
- "originSourceId": "ecc",
706
+ "originSourceId": "ecc-affaanm",
707
707
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/laravel-plugin-discovery/SKILL.md",
708
708
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
709
709
  "ecosystem": "laravel",
@@ -774,7 +774,7 @@
774
774
  "useMode": "copy",
775
775
  "license": "MIT",
776
776
  "licenseConfidence": "high",
777
- "originSourceId": "ecc",
777
+ "originSourceId": "ecc-affaanm",
778
778
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/laravel-verification/SKILL.md",
779
779
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
780
780
  "ecosystem": "laravel",
@@ -807,7 +807,7 @@
807
807
  "useMode": "copy",
808
808
  "license": "MIT",
809
809
  "licenseConfidence": "high",
810
- "originSourceId": "ecc",
810
+ "originSourceId": "ecc-affaanm",
811
811
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/nestjs-patterns/SKILL.md",
812
812
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
813
813
  "ecosystem": "nestjs",
@@ -901,7 +901,7 @@
901
901
  "useMode": "copy",
902
902
  "license": "MIT",
903
903
  "licenseConfidence": "high",
904
- "originSourceId": "ecc",
904
+ "originSourceId": "ecc-affaanm",
905
905
  "originUrl": "https://github.com/affaan-m/ECC/blob/81af40761939056ab3dc54732fd4f562a27309d0/skills/prisma-patterns/SKILL.md",
906
906
  "pinnedRef": "81af40761939056ab3dc54732fd4f562a27309d0",
907
907
  "ecosystem": "database",
@@ -1002,7 +1002,7 @@
1002
1002
  "useMode": "copy",
1003
1003
  "license": "MIT",
1004
1004
  "licenseConfidence": "high",
1005
- "originSourceId": "ecc",
1005
+ "originSourceId": "ecc-affaanm",
1006
1006
  "originUrl": "https://github.com/affaan-m/ECC/blob/71d22d0a77b7e0684f4e51cba03749b788993cdb/skills/react-testing/SKILL.md",
1007
1007
  "pinnedRef": "71d22d0a77b7e0684f4e51cba03749b788993cdb",
1008
1008
  "ecosystem": "testing",
@@ -1172,7 +1172,7 @@
1172
1172
  "useMode": "copy",
1173
1173
  "license": "MIT",
1174
1174
  "licenseConfidence": "high",
1175
- "originSourceId": "ecc",
1175
+ "originSourceId": "ecc-affaanm",
1176
1176
  "originUrl": "https://github.com/affaan-m/ECC/blob/ec92b528471df708c2384ebbcc82b390b60f535a/skills/vite-patterns/SKILL.md",
1177
1177
  "pinnedRef": "ec92b528471df708c2384ebbcc82b390b60f535a",
1178
1178
  "ecosystem": "vite",
@@ -1205,7 +1205,7 @@
1205
1205
  "useMode": "copy",
1206
1206
  "license": "MIT",
1207
1207
  "licenseConfidence": "high",
1208
- "originSourceId": "ecc",
1208
+ "originSourceId": "ecc-affaanm",
1209
1209
  "originUrl": "https://github.com/affaan-m/ECC/blob/71d22d0a77b7e0684f4e51cba03749b788993cdb/skills/vue-patterns/SKILL.md",
1210
1210
  "pinnedRef": "71d22d0a77b7e0684f4e51cba03749b788993cdb",
1211
1211
  "ecosystem": "vue",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haus-tech/haus-workflow",
3
- "version": "1.5.5",
3
+ "version": "1.5.6",
4
4
  "description": "Haus AI workflow CLI for Claude Code.",
5
5
  "type": "module",
6
6
  "bin": {