create-hq 10.12.1 → 10.12.2
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/dist/__tests__/recommended-packages.test.d.ts +19 -0
- package/dist/__tests__/recommended-packages.test.d.ts.map +1 -0
- package/dist/__tests__/recommended-packages.test.js +110 -0
- package/dist/__tests__/recommended-packages.test.js.map +1 -0
- package/dist/recommended-packages.d.ts +24 -4
- package/dist/recommended-packages.d.ts.map +1 -1
- package/dist/recommended-packages.js +53 -16
- package/dist/recommended-packages.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recommended-packages tests — specifically `readInstalledPackSources`.
|
|
3
|
+
*
|
|
4
|
+
* Under the v12 HQ layout, packs live at `core/packages/<name>/` and are
|
|
5
|
+
* tracked by filesystem presence rather than a manifest file. The dedupe
|
|
6
|
+
* set returned here gates `scaffold.installRecommendedPacksPhase` from
|
|
7
|
+
* re-offering / re-clobbering already-installed packs on `/setup --resume`.
|
|
8
|
+
*
|
|
9
|
+
* Source reconstruction: an installed pack's `package.yaml` carries
|
|
10
|
+
* `name` + `publisher` but NOT the install-time source string. We
|
|
11
|
+
* reconstruct `${publisher}/${name}` (e.g. `@indigoai-us/hq-pack-design-quality`),
|
|
12
|
+
* which matches the npm-style sources in `recommended_packages:` config.
|
|
13
|
+
* For packs whose source was a git ref / local path / git URL we still
|
|
14
|
+
* include the `${publisher}/${name}` reconstruction (and the bare name as
|
|
15
|
+
* a fallback) so the common npm case is deduped while other sources
|
|
16
|
+
* gracefully re-prompt rather than silently clobber.
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=recommended-packages.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommended-packages.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/recommended-packages.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recommended-packages tests — specifically `readInstalledPackSources`.
|
|
3
|
+
*
|
|
4
|
+
* Under the v12 HQ layout, packs live at `core/packages/<name>/` and are
|
|
5
|
+
* tracked by filesystem presence rather than a manifest file. The dedupe
|
|
6
|
+
* set returned here gates `scaffold.installRecommendedPacksPhase` from
|
|
7
|
+
* re-offering / re-clobbering already-installed packs on `/setup --resume`.
|
|
8
|
+
*
|
|
9
|
+
* Source reconstruction: an installed pack's `package.yaml` carries
|
|
10
|
+
* `name` + `publisher` but NOT the install-time source string. We
|
|
11
|
+
* reconstruct `${publisher}/${name}` (e.g. `@indigoai-us/hq-pack-design-quality`),
|
|
12
|
+
* which matches the npm-style sources in `recommended_packages:` config.
|
|
13
|
+
* For packs whose source was a git ref / local path / git URL we still
|
|
14
|
+
* include the `${publisher}/${name}` reconstruction (and the bare name as
|
|
15
|
+
* a fallback) so the common npm case is deduped while other sources
|
|
16
|
+
* gracefully re-prompt rather than silently clobber.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
19
|
+
import * as fs from "fs";
|
|
20
|
+
import * as os from "os";
|
|
21
|
+
import * as path from "path";
|
|
22
|
+
import { readInstalledPackSources } from "../recommended-packages.js";
|
|
23
|
+
function mkTmpHq() {
|
|
24
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), "create-hq-pkg-discovery-"));
|
|
25
|
+
}
|
|
26
|
+
function seedPack(hqRoot, name, fields) {
|
|
27
|
+
const dir = path.join(hqRoot, "core", "packages", name);
|
|
28
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
29
|
+
const body = Object.entries(fields)
|
|
30
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
31
|
+
.join("\n");
|
|
32
|
+
fs.writeFileSync(path.join(dir, "package.yaml"), body + "\n");
|
|
33
|
+
}
|
|
34
|
+
describe("readInstalledPackSources (v12 filesystem layout)", () => {
|
|
35
|
+
let hqRoot;
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
hqRoot = mkTmpHq();
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
fs.rmSync(hqRoot, { recursive: true, force: true });
|
|
41
|
+
});
|
|
42
|
+
// -------------------------------------------------------------------------
|
|
43
|
+
it("scans core/packages/<name>/package.yaml and returns reconstructed publisher/name sources", () => {
|
|
44
|
+
seedPack(hqRoot, "hq-pack-design-quality", {
|
|
45
|
+
name: "hq-pack-design-quality",
|
|
46
|
+
version: "1.0.0",
|
|
47
|
+
publisher: "'@indigoai-us'",
|
|
48
|
+
});
|
|
49
|
+
seedPack(hqRoot, "hq-pack-gstack", {
|
|
50
|
+
name: "hq-pack-gstack",
|
|
51
|
+
version: "0.2.0",
|
|
52
|
+
publisher: "'@indigoai-us'",
|
|
53
|
+
});
|
|
54
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
55
|
+
expect(sources.has("@indigoai-us/hq-pack-design-quality")).toBe(true);
|
|
56
|
+
expect(sources.has("@indigoai-us/hq-pack-gstack")).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
// -------------------------------------------------------------------------
|
|
59
|
+
it("falls back to bare name when publisher is missing (legacy local-path packs)", () => {
|
|
60
|
+
seedPack(hqRoot, "my-local-pack", {
|
|
61
|
+
name: "my-local-pack",
|
|
62
|
+
version: "0.0.1",
|
|
63
|
+
// no publisher
|
|
64
|
+
});
|
|
65
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
66
|
+
expect(sources.has("my-local-pack")).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
// -------------------------------------------------------------------------
|
|
69
|
+
it("returns empty set when core/packages/ does not exist", () => {
|
|
70
|
+
// Fresh HQ with no packs ever installed — must not throw.
|
|
71
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
72
|
+
expect(sources.size).toBe(0);
|
|
73
|
+
});
|
|
74
|
+
// -------------------------------------------------------------------------
|
|
75
|
+
it("ignores directories that lack a package.yaml file", () => {
|
|
76
|
+
// Half-installed or aborted install leaves a dir without metadata; skip.
|
|
77
|
+
const orphan = path.join(hqRoot, "core", "packages", "broken-pack");
|
|
78
|
+
fs.mkdirSync(orphan, { recursive: true });
|
|
79
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
80
|
+
expect(sources.size).toBe(0);
|
|
81
|
+
});
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
it("ignores non-directory entries inside core/packages/", () => {
|
|
84
|
+
// The template ships `core/packages/README.md`. That file must not crash
|
|
85
|
+
// the scanner or get treated as a pack.
|
|
86
|
+
fs.mkdirSync(path.join(hqRoot, "core", "packages"), { recursive: true });
|
|
87
|
+
fs.writeFileSync(path.join(hqRoot, "core", "packages", "README.md"), "# packs go here");
|
|
88
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
89
|
+
expect(sources.size).toBe(0);
|
|
90
|
+
});
|
|
91
|
+
// -------------------------------------------------------------------------
|
|
92
|
+
it("regression: does NOT read from top-level modules/modules.yaml or modules.yaml", () => {
|
|
93
|
+
// Pre-v12 manifest left behind by an older install. The new scanner
|
|
94
|
+
// must ignore it — otherwise stale entries leak into the dedupe set
|
|
95
|
+
// and recommended packs that should be re-offered get filtered out.
|
|
96
|
+
fs.mkdirSync(path.join(hqRoot, "modules"), { recursive: true });
|
|
97
|
+
fs.writeFileSync(path.join(hqRoot, "modules", "modules.yaml"), [
|
|
98
|
+
"version: '1'",
|
|
99
|
+
"modules:",
|
|
100
|
+
" - name: hq-pack-stale",
|
|
101
|
+
" strategy: package",
|
|
102
|
+
" source: '@indigoai-us/hq-pack-stale'",
|
|
103
|
+
"",
|
|
104
|
+
].join("\n"));
|
|
105
|
+
const sources = readInstalledPackSources(hqRoot);
|
|
106
|
+
expect(sources.has("@indigoai-us/hq-pack-stale")).toBe(false);
|
|
107
|
+
expect(sources.size).toBe(0);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=recommended-packages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommended-packages.test.js","sourceRoot":"","sources":["../../src/__tests__/recommended-packages.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,10 +59,30 @@ export declare function readRecommendedPackages(hqRoot: string): RecommendedPack
|
|
|
59
59
|
*/
|
|
60
60
|
export declare function evaluateConditional(expr: string): boolean;
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
63
|
-
* `
|
|
64
|
-
*
|
|
65
|
-
*
|
|
62
|
+
* Discover which content packs are already installed under the v12 HQ
|
|
63
|
+
* layout. Walks `core/packages/<name>/package.yaml` and reconstructs the
|
|
64
|
+
* npm-style source string `${publisher}/${name}` (e.g.
|
|
65
|
+
* `@indigoai-us/hq-pack-design-quality`) so it can be matched against
|
|
66
|
+
* the `source:` entries in `recommended_packages:` config.
|
|
67
|
+
*
|
|
68
|
+
* Why filesystem-based: hq-cli stopped writing `modules/modules.yaml`
|
|
69
|
+
* for pack installs under v12 (filesystem is the source of truth — see
|
|
70
|
+
* the layout-fix PR). The pack's on-disk `package.yaml` carries the
|
|
71
|
+
* canonical `name` + `publisher` we need to recover the source string.
|
|
72
|
+
*
|
|
73
|
+
* Edge cases:
|
|
74
|
+
* - Missing publisher → adds bare `name` (legacy local-path packs).
|
|
75
|
+
* - Missing package.yaml → directory skipped (half-installed / aborted).
|
|
76
|
+
* - Non-directory entries (e.g. the template's `core/packages/README.md`)
|
|
77
|
+
* are skipped.
|
|
78
|
+
* - Non-npm sources (git ref, git URL, local path) won't match exactly,
|
|
79
|
+
* so those packs gracefully re-prompt rather than silently clobber.
|
|
80
|
+
* The common npm case (the 4 indigoai-us recommended packs) is fully
|
|
81
|
+
* covered.
|
|
82
|
+
*
|
|
83
|
+
* Legacy `modules/modules.yaml` is intentionally NOT consulted — stale
|
|
84
|
+
* entries from pre-v12 installs would leak into the dedupe set and
|
|
85
|
+
* filter out packs that should be re-offered.
|
|
66
86
|
*/
|
|
67
87
|
export declare function readInstalledPackSources(hqRoot: string): Set<string>;
|
|
68
88
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended-packages.d.ts","sourceRoot":"","sources":["../src/recommended-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,EAAE,OAAO,CAAC;IACd,kEAAkE;IAClE,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkD5E;AAaD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED
|
|
1
|
+
{"version":3,"file":"recommended-packages.d.ts","sourceRoot":"","sources":["../src/recommended-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,EAAE,OAAO,CAAC;IACd,kEAAkE;IAClE,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkD5E;AAaD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAkCpE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,GAC5B,cAAc,CAkChB;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,EAAE,EAC7B,IAAI,EAAE;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,GAC5B,cAAc,EAAE,CAQlB;AAkBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAQA"}
|
|
@@ -111,25 +111,62 @@ export function evaluateConditional(expr) {
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
/**
|
|
114
|
-
*
|
|
115
|
-
* `
|
|
116
|
-
*
|
|
117
|
-
*
|
|
114
|
+
* Discover which content packs are already installed under the v12 HQ
|
|
115
|
+
* layout. Walks `core/packages/<name>/package.yaml` and reconstructs the
|
|
116
|
+
* npm-style source string `${publisher}/${name}` (e.g.
|
|
117
|
+
* `@indigoai-us/hq-pack-design-quality`) so it can be matched against
|
|
118
|
+
* the `source:` entries in `recommended_packages:` config.
|
|
119
|
+
*
|
|
120
|
+
* Why filesystem-based: hq-cli stopped writing `modules/modules.yaml`
|
|
121
|
+
* for pack installs under v12 (filesystem is the source of truth — see
|
|
122
|
+
* the layout-fix PR). The pack's on-disk `package.yaml` carries the
|
|
123
|
+
* canonical `name` + `publisher` we need to recover the source string.
|
|
124
|
+
*
|
|
125
|
+
* Edge cases:
|
|
126
|
+
* - Missing publisher → adds bare `name` (legacy local-path packs).
|
|
127
|
+
* - Missing package.yaml → directory skipped (half-installed / aborted).
|
|
128
|
+
* - Non-directory entries (e.g. the template's `core/packages/README.md`)
|
|
129
|
+
* are skipped.
|
|
130
|
+
* - Non-npm sources (git ref, git URL, local path) won't match exactly,
|
|
131
|
+
* so those packs gracefully re-prompt rather than silently clobber.
|
|
132
|
+
* The common npm case (the 4 indigoai-us recommended packs) is fully
|
|
133
|
+
* covered.
|
|
134
|
+
*
|
|
135
|
+
* Legacy `modules/modules.yaml` is intentionally NOT consulted — stale
|
|
136
|
+
* entries from pre-v12 installs would leak into the dedupe set and
|
|
137
|
+
* filter out packs that should be re-offered.
|
|
118
138
|
*/
|
|
119
139
|
export function readInstalledPackSources(hqRoot) {
|
|
120
|
-
const
|
|
121
|
-
path.join(hqRoot, "modules", "modules.yaml"),
|
|
122
|
-
path.join(hqRoot, "modules.yaml"),
|
|
123
|
-
];
|
|
124
|
-
const modulesPath = candidates.find((p) => fs.existsSync(p));
|
|
125
|
-
if (!modulesPath)
|
|
126
|
-
return new Set();
|
|
127
|
-
const content = fs.readFileSync(modulesPath, "utf-8");
|
|
128
|
-
const sourceRe = /^\s+source\s*:\s*["']?([^"'\r\n]+)["']?\s*$/gm;
|
|
140
|
+
const packsDir = path.join(hqRoot, "core", "packages");
|
|
129
141
|
const sources = new Set();
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
142
|
+
if (!fs.existsSync(packsDir))
|
|
143
|
+
return sources;
|
|
144
|
+
let entries;
|
|
145
|
+
try {
|
|
146
|
+
entries = fs.readdirSync(packsDir, { withFileTypes: true });
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return sources;
|
|
150
|
+
}
|
|
151
|
+
const fieldRe = (key) => new RegExp(`^${key}\\s*:\\s*["']?([^"'\\r\\n]+?)["']?\\s*$`, "m");
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
if (!entry.isDirectory())
|
|
154
|
+
continue;
|
|
155
|
+
const yamlPath = path.join(packsDir, entry.name, "package.yaml");
|
|
156
|
+
if (!fs.existsSync(yamlPath))
|
|
157
|
+
continue;
|
|
158
|
+
let content;
|
|
159
|
+
try {
|
|
160
|
+
content = fs.readFileSync(yamlPath, "utf-8");
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const name = content.match(fieldRe("name"))?.[1];
|
|
166
|
+
if (!name)
|
|
167
|
+
continue;
|
|
168
|
+
const publisher = content.match(fieldRe("publisher"))?.[1];
|
|
169
|
+
sources.add(publisher ? `${publisher}/${name}` : name);
|
|
133
170
|
}
|
|
134
171
|
return sources;
|
|
135
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended-packages.js","sourceRoot":"","sources":["../src/recommended-packages.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"recommended-packages.js","sourceRoot":"","sources":["../src/recommended-packages.ts"],"names":[],"mappings":"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"}
|