@react-spa-scaffold/mcp 1.2.0 → 2.0.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/README.md +36 -123
- package/dist/constants.d.ts +35 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +35 -0
- package/dist/constants.js.map +1 -0
- package/dist/features/definitions/api.d.ts.map +1 -1
- package/dist/features/definitions/api.js +0 -1
- package/dist/features/definitions/api.js.map +1 -1
- package/dist/features/definitions/ci.d.ts.map +1 -1
- package/dist/features/definitions/ci.js +0 -1
- package/dist/features/definitions/ci.js.map +1 -1
- package/dist/features/definitions/core.d.ts.map +1 -1
- package/dist/features/definitions/core.js +0 -1
- package/dist/features/definitions/core.js.map +1 -1
- package/dist/features/definitions/devtools.d.ts.map +1 -1
- package/dist/features/definitions/devtools.js +0 -1
- package/dist/features/definitions/devtools.js.map +1 -1
- package/dist/features/definitions/forms.d.ts.map +1 -1
- package/dist/features/definitions/forms.js +0 -1
- package/dist/features/definitions/forms.js.map +1 -1
- package/dist/features/definitions/i18n.d.ts.map +1 -1
- package/dist/features/definitions/i18n.js +0 -1
- package/dist/features/definitions/i18n.js.map +1 -1
- package/dist/features/definitions/mobile.d.ts.map +1 -1
- package/dist/features/definitions/mobile.js +0 -1
- package/dist/features/definitions/mobile.js.map +1 -1
- package/dist/features/definitions/observability.d.ts.map +1 -1
- package/dist/features/definitions/observability.js +0 -1
- package/dist/features/definitions/observability.js.map +1 -1
- package/dist/features/definitions/performance.d.ts.map +1 -1
- package/dist/features/definitions/performance.js +0 -1
- package/dist/features/definitions/performance.js.map +1 -1
- package/dist/features/definitions/routing.d.ts.map +1 -1
- package/dist/features/definitions/routing.js +0 -1
- package/dist/features/definitions/routing.js.map +1 -1
- package/dist/features/definitions/state.d.ts.map +1 -1
- package/dist/features/definitions/state.js +0 -1
- package/dist/features/definitions/state.js.map +1 -1
- package/dist/features/definitions/testing.d.ts.map +1 -1
- package/dist/features/definitions/testing.js +0 -3
- package/dist/features/definitions/testing.js.map +1 -1
- package/dist/features/definitions/theming.js +2 -2
- package/dist/features/definitions/theming.js.map +1 -1
- package/dist/features/definitions/ui.d.ts.map +1 -1
- package/dist/features/definitions/ui.js +0 -1
- package/dist/features/definitions/ui.js.map +1 -1
- package/dist/features/types.d.ts +14 -20
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/types.js +4 -21
- package/dist/features/types.js.map +1 -1
- package/dist/features/types.test.d.ts +5 -0
- package/dist/features/types.test.d.ts.map +1 -0
- package/dist/features/types.test.js +32 -0
- package/dist/features/types.test.js.map +1 -0
- package/dist/resources/docs.d.ts +2 -8
- package/dist/resources/docs.d.ts.map +1 -1
- package/dist/resources/docs.js +27 -49
- package/dist/resources/docs.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -8
- package/dist/server.js.map +1 -1
- package/dist/tools/get-features.d.ts +15 -9
- package/dist/tools/get-features.d.ts.map +1 -1
- package/dist/tools/get-features.js +12 -0
- package/dist/tools/get-features.js.map +1 -1
- package/dist/tools/get-file.d.ts +23 -0
- package/dist/tools/get-file.d.ts.map +1 -0
- package/dist/tools/get-file.js +57 -0
- package/dist/tools/get-file.js.map +1 -0
- package/dist/tools/get-file.test.d.ts +5 -0
- package/dist/tools/get-file.test.d.ts.map +1 -0
- package/dist/tools/get-file.test.js +63 -0
- package/dist/tools/get-file.test.js.map +1 -0
- package/dist/tools/get-scaffold.d.ts +11 -33
- package/dist/tools/get-scaffold.d.ts.map +1 -1
- package/dist/tools/get-scaffold.js +31 -44
- package/dist/tools/get-scaffold.js.map +1 -1
- package/dist/tools/get-scaffold.test.js +29 -22
- package/dist/tools/get-scaffold.test.js.map +1 -1
- package/dist/tools/index.d.ts +2 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/registry.d.ts +4 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +26 -16
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +24 -6
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -1
- package/dist/utils/cache.d.ts +9 -5
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +21 -5
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/docs.d.ts +1 -3
- package/dist/utils/docs.d.ts.map +1 -1
- package/dist/utils/docs.js +3 -8
- package/dist/utils/docs.js.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +0 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +19 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/paths.test.js +22 -1
- package/dist/utils/paths.test.js.map +1 -1
- package/dist/utils/scaffold/claude-md/index.d.ts +7 -0
- package/dist/utils/scaffold/claude-md/index.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/index.js +23 -0
- package/dist/utils/scaffold/claude-md/index.js.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts +16 -0
- package/dist/utils/scaffold/claude-md/sections.d.ts.map +1 -0
- package/dist/utils/scaffold/claude-md/sections.js +269 -0
- package/dist/utils/scaffold/claude-md/sections.js.map +1 -0
- package/dist/utils/scaffold/commands.d.ts +2 -6
- package/dist/utils/scaffold/commands.d.ts.map +1 -1
- package/dist/utils/scaffold/commands.js +9 -12
- package/dist/utils/scaffold/commands.js.map +1 -1
- package/dist/utils/scaffold/compute.d.ts +5 -8
- package/dist/utils/scaffold/compute.d.ts.map +1 -1
- package/dist/utils/scaffold/compute.js +26 -41
- package/dist/utils/scaffold/compute.js.map +1 -1
- package/dist/utils/scaffold/dependencies.d.ts +10 -17
- package/dist/utils/scaffold/dependencies.d.ts.map +1 -1
- package/dist/utils/scaffold/dependencies.js +28 -34
- package/dist/utils/scaffold/dependencies.js.map +1 -1
- package/dist/utils/scaffold/generators.d.ts +3 -11
- package/dist/utils/scaffold/generators.d.ts.map +1 -1
- package/dist/utils/scaffold/generators.js +20 -288
- package/dist/utils/scaffold/generators.js.map +1 -1
- package/dist/utils/scaffold/index.d.ts +2 -3
- package/dist/utils/scaffold/index.d.ts.map +1 -1
- package/dist/utils/scaffold/index.js +1 -3
- package/dist/utils/scaffold/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/tools/get-example.d.ts +0 -49
- package/dist/tools/get-example.d.ts.map +0 -1
- package/dist/tools/get-example.js +0 -91
- package/dist/tools/get-example.js.map +0 -1
- package/dist/tools/get-example.test.d.ts +0 -5
- package/dist/tools/get-example.test.d.ts.map +0 -1
- package/dist/tools/get-example.test.js +0 -63
- package/dist/tools/get-example.test.js.map +0 -1
- package/dist/utils/examples/api-patterns.d.ts +0 -3
- package/dist/utils/examples/api-patterns.d.ts.map +0 -1
- package/dist/utils/examples/api-patterns.js +0 -19
- package/dist/utils/examples/api-patterns.js.map +0 -1
- package/dist/utils/examples/component-patterns.d.ts +0 -3
- package/dist/utils/examples/component-patterns.d.ts.map +0 -1
- package/dist/utils/examples/component-patterns.js +0 -71
- package/dist/utils/examples/component-patterns.js.map +0 -1
- package/dist/utils/examples/context-patterns.d.ts +0 -3
- package/dist/utils/examples/context-patterns.d.ts.map +0 -1
- package/dist/utils/examples/context-patterns.js +0 -32
- package/dist/utils/examples/context-patterns.js.map +0 -1
- package/dist/utils/examples/hook-patterns.d.ts +0 -3
- package/dist/utils/examples/hook-patterns.d.ts.map +0 -1
- package/dist/utils/examples/hook-patterns.js +0 -55
- package/dist/utils/examples/hook-patterns.js.map +0 -1
- package/dist/utils/examples/i18n-patterns.d.ts +0 -3
- package/dist/utils/examples/i18n-patterns.d.ts.map +0 -1
- package/dist/utils/examples/i18n-patterns.js +0 -43
- package/dist/utils/examples/i18n-patterns.js.map +0 -1
- package/dist/utils/examples/index.d.ts +0 -12
- package/dist/utils/examples/index.d.ts.map +0 -1
- package/dist/utils/examples/index.js +0 -69
- package/dist/utils/examples/index.js.map +0 -1
- package/dist/utils/examples/mobile-patterns.d.ts +0 -3
- package/dist/utils/examples/mobile-patterns.d.ts.map +0 -1
- package/dist/utils/examples/mobile-patterns.js +0 -38
- package/dist/utils/examples/mobile-patterns.js.map +0 -1
- package/dist/utils/examples/page-patterns.d.ts +0 -3
- package/dist/utils/examples/page-patterns.d.ts.map +0 -1
- package/dist/utils/examples/page-patterns.js +0 -34
- package/dist/utils/examples/page-patterns.js.map +0 -1
- package/dist/utils/examples/store-patterns.d.ts +0 -3
- package/dist/utils/examples/store-patterns.d.ts.map +0 -1
- package/dist/utils/examples/store-patterns.js +0 -40
- package/dist/utils/examples/store-patterns.js.map +0 -1
- package/dist/utils/examples/test-patterns.d.ts +0 -3
- package/dist/utils/examples/test-patterns.d.ts.map +0 -1
- package/dist/utils/examples/test-patterns.js +0 -58
- package/dist/utils/examples/test-patterns.js.map +0 -1
- package/dist/utils/examples/types.d.ts +0 -17
- package/dist/utils/examples/types.d.ts.map +0 -1
- package/dist/utils/examples/types.js +0 -2
- package/dist/utils/examples/types.js.map +0 -1
- package/dist/utils/examples/utility-patterns.d.ts +0 -3
- package/dist/utils/examples/utility-patterns.d.ts.map +0 -1
- package/dist/utils/examples/utility-patterns.js +0 -77
- package/dist/utils/examples/utility-patterns.js.map +0 -1
package/dist/utils/cache.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* In-memory cache utilities for MCP server.
|
|
3
3
|
*/
|
|
4
|
-
/** Creates a typed cache with getOrSet
|
|
4
|
+
/** Creates a typed key-value cache with sync and async getOrSet patterns. */
|
|
5
5
|
export function createCache() {
|
|
6
6
|
const cache = new Map();
|
|
7
7
|
return {
|
|
@@ -11,7 +11,16 @@ export function createCache() {
|
|
|
11
11
|
},
|
|
12
12
|
has: (key) => cache.has(key),
|
|
13
13
|
clear: () => cache.clear(),
|
|
14
|
-
/** Gets cached value or computes and caches it. */
|
|
14
|
+
/** Gets cached value or computes and caches it (sync). */
|
|
15
|
+
getOrSetSync(key, factory) {
|
|
16
|
+
const existing = cache.get(key);
|
|
17
|
+
if (existing !== undefined)
|
|
18
|
+
return existing;
|
|
19
|
+
const value = factory();
|
|
20
|
+
cache.set(key, value);
|
|
21
|
+
return value;
|
|
22
|
+
},
|
|
23
|
+
/** Gets cached value or computes and caches it (async). */
|
|
15
24
|
async getOrSet(key, factory) {
|
|
16
25
|
const existing = cache.get(key);
|
|
17
26
|
if (existing !== undefined)
|
|
@@ -22,7 +31,7 @@ export function createCache() {
|
|
|
22
31
|
},
|
|
23
32
|
};
|
|
24
33
|
}
|
|
25
|
-
/** Creates a
|
|
34
|
+
/** Creates a singleton cache (single value, no key). */
|
|
26
35
|
export function createSingletonCache() {
|
|
27
36
|
let cached = null;
|
|
28
37
|
return {
|
|
@@ -33,7 +42,14 @@ export function createSingletonCache() {
|
|
|
33
42
|
clear: () => {
|
|
34
43
|
cached = null;
|
|
35
44
|
},
|
|
36
|
-
/** Gets cached value or computes
|
|
45
|
+
/** Gets cached value or computes (sync). */
|
|
46
|
+
getOrSetSync(factory) {
|
|
47
|
+
if (cached !== null)
|
|
48
|
+
return cached;
|
|
49
|
+
cached = factory();
|
|
50
|
+
return cached;
|
|
51
|
+
},
|
|
52
|
+
/** Gets cached value or computes (async). */
|
|
37
53
|
async getOrSet(factory) {
|
|
38
54
|
if (cached !== null)
|
|
39
55
|
return cached;
|
package/dist/utils/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,6EAA6E;AAC7E,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAa,CAAC;IAEnC,OAAO;QACL,GAAG,EAAE,CAAC,GAAW,EAAiB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QACnD,GAAG,EAAE,CAAC,GAAW,EAAE,KAAQ,EAAQ,EAAE;YACnC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,GAAG,EAAE,CAAC,GAAW,EAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7C,KAAK,EAAE,GAAS,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;QAEhC,0DAA0D;QAC1D,YAAY,CAAC,GAAW,EAAE,OAAgB;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAC5C,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2DAA2D;QAC3D,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,OAAyB;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,oBAAoB;IAClC,IAAI,MAAM,GAAa,IAAI,CAAC;IAE5B,OAAO;QACL,GAAG,EAAE,GAAa,EAAE,CAAC,MAAM;QAC3B,GAAG,EAAE,CAAC,KAAQ,EAAQ,EAAE;YACtB,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QACD,KAAK,EAAE,GAAS,EAAE;YAChB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,4CAA4C;QAC5C,YAAY,CAAC,OAAgB;YAC3B,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;YACnC,MAAM,GAAG,OAAO,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,6CAA6C;QAC7C,KAAK,CAAC,QAAQ,CAAC,OAAyB;YACtC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;YACnC,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/utils/docs.d.ts
CHANGED
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
* Determine which docs to include based on selected features
|
|
8
8
|
*/
|
|
9
9
|
export declare function computeDocsForFeatures(featureIds: readonly string[]): string[];
|
|
10
|
-
/**
|
|
11
|
-
* Read all docs for scaffolding based on selected features
|
|
12
|
-
*/
|
|
10
|
+
/** Read all docs for scaffolding based on selected features (parallel). */
|
|
13
11
|
export declare function computeDocsContent(featureIds: readonly string[]): Promise<Record<string, string>>;
|
|
14
12
|
//# sourceMappingURL=docs.d.ts.map
|
package/dist/utils/docs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAU9E;AAeD
|
|
1
|
+
{"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAU9E;AAeD,2EAA2E;AAC3E,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAIvG"}
|
package/dist/utils/docs.js
CHANGED
|
@@ -50,15 +50,10 @@ async function readDoc(docPath) {
|
|
|
50
50
|
return `<!-- File not found: ${docPath} -->\n<!-- Run MCP server from within react-spa-scaffold repository -->`;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Read all docs for scaffolding based on selected features
|
|
55
|
-
*/
|
|
53
|
+
/** Read all docs for scaffolding based on selected features (parallel). */
|
|
56
54
|
export async function computeDocsContent(featureIds) {
|
|
57
55
|
const docPaths = computeDocsForFeatures(featureIds);
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
docs[docPath] = await readDoc(docPath);
|
|
61
|
-
}
|
|
62
|
-
return docs;
|
|
56
|
+
const contents = await Promise.all(docPaths.map(readDoc));
|
|
57
|
+
return Object.fromEntries(docPaths.map((path, i) => [path, contents[i]]));
|
|
63
58
|
}
|
|
64
59
|
//# sourceMappingURL=docs.js.map
|
package/dist/utils/docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAoD;IACnE,8BAA8B;IAC9B,sBAAsB,EAAE,EAAE;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,8BAA8B,EAAE,EAAE;IAClC,uBAAuB,EAAE,EAAE;IAE3B,mBAAmB;IACnB,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACpD,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE;CAC/D,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEvC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;IAClH,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/utils/docs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAoD;IACnE,8BAA8B;IAC9B,sBAAsB,EAAE,EAAE;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,8BAA8B,EAAE,EAAE;IAClC,uBAAuB,EAAE,EAAE;IAE3B,mBAAmB;IACnB,iBAAiB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACpD,qBAAqB,EAAE,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IACxD,8BAA8B,EAAE,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE;CAC/D,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAA6B;IAClE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAEvC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;SACrB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,OAAO,yEAAyE,CAAC;IAClH,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA6B;IACpE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,6 +2,5 @@ export { isPublishedMode, CONTENT_ROOT, resolveTemplatePath } from './paths.js';
|
|
|
2
2
|
export { createCache, createSingletonCache } from './cache.js';
|
|
3
3
|
export { readWithFallback, getErrorMessage } from './errors.js';
|
|
4
4
|
export { resolveFeatureDependencies, mergeDependencies, mergeScripts, computeFileStructure, getConfigFiles, getSetupCommands, computeScaffold, } from './scaffold/index.js';
|
|
5
|
-
export { getAvailablePatterns, getCodeExample, getFeatureExamples, type CodeExample } from './examples/index.js';
|
|
6
5
|
export { computeDocsForFeatures, computeDocsContent } from './docs.js';
|
|
7
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -2,6 +2,5 @@ export { isPublishedMode, CONTENT_ROOT, resolveTemplatePath } from './paths.js';
|
|
|
2
2
|
export { createCache, createSingletonCache } from './cache.js';
|
|
3
3
|
export { readWithFallback, getErrorMessage } from './errors.js';
|
|
4
4
|
export { resolveFeatureDependencies, mergeDependencies, mergeScripts, computeFileStructure, getConfigFiles, getSetupCommands, computeScaffold, } from './scaffold/index.js';
|
|
5
|
-
export { getAvailablePatterns, getCodeExample, getFeatureExamples } from './examples/index.js';
|
|
6
5
|
export { computeDocsForFeatures, computeDocsContent } from './docs.js';
|
|
7
6
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/utils/paths.d.ts
CHANGED
|
@@ -7,4 +7,13 @@ export declare const isPublishedMode: boolean;
|
|
|
7
7
|
export declare const CONTENT_ROOT: string;
|
|
8
8
|
/** Resolves path relative to content root, handling dotfile renames in published mode. */
|
|
9
9
|
export declare function resolveTemplatePath(relativePath: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Check if resolved path is within CONTENT_ROOT (prevent path traversal).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* isPathWithinRoot('vite.config.ts') // true
|
|
15
|
+
* isPathWithinRoot('../../../etc/passwd') // false
|
|
16
|
+
* isPathWithinRoot('/etc/passwd') // false
|
|
17
|
+
*/
|
|
18
|
+
export declare function isPathWithinRoot(relativePath: string): boolean;
|
|
10
19
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,6DAA6D;AAC7D,eAAO,MAAM,eAAe,SAA4B,CAAC;AAEzD,gDAAgD;AAChD,eAAO,MAAM,YAAY,QAAiD,CAAC;AAO3E,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAKhE"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,6DAA6D;AAC7D,eAAO,MAAM,eAAe,SAA4B,CAAC;AAEzD,gDAAgD;AAChD,eAAO,MAAM,YAAY,QAAiD,CAAC;AAO3E,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAW9D"}
|
package/dist/utils/paths.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Path resolution for MCP server - handles dev vs published mode.
|
|
3
3
|
*/
|
|
4
4
|
import { existsSync } from 'fs';
|
|
5
|
-
import { dirname, join } from 'path';
|
|
5
|
+
import { dirname, isAbsolute, join, normalize } from 'path';
|
|
6
6
|
import { fileURLToPath } from 'url';
|
|
7
7
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
8
|
const BUNDLED_PATH = join(__dirname, '..', '..', 'templates');
|
|
@@ -21,4 +21,22 @@ export function resolveTemplatePath(relativePath) {
|
|
|
21
21
|
const resolvedPath = isPublishedMode && RENAMED_DOTFILES[relativePath] ? RENAMED_DOTFILES[relativePath] : relativePath;
|
|
22
22
|
return join(CONTENT_ROOT, resolvedPath);
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if resolved path is within CONTENT_ROOT (prevent path traversal).
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* isPathWithinRoot('vite.config.ts') // true
|
|
29
|
+
* isPathWithinRoot('../../../etc/passwd') // false
|
|
30
|
+
* isPathWithinRoot('/etc/passwd') // false
|
|
31
|
+
*/
|
|
32
|
+
export function isPathWithinRoot(relativePath) {
|
|
33
|
+
// Reject absolute paths - they bypass CONTENT_ROOT
|
|
34
|
+
if (isAbsolute(relativePath)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const fullPath = join(CONTENT_ROOT, relativePath);
|
|
38
|
+
const normalizedPath = normalize(fullPath);
|
|
39
|
+
const normalizedRoot = normalize(CONTENT_ROOT);
|
|
40
|
+
return normalizedPath.startsWith(normalizedRoot + '/') || normalizedPath === normalizedRoot;
|
|
41
|
+
}
|
|
24
42
|
//# sourceMappingURL=paths.js.map
|
package/dist/utils/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AACrD,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAEzD,gDAAgD;AAChD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;AAE3E,qEAAqE;AACrE,MAAM,gBAAgB,GAA2B;IAC/C,YAAY,EAAE,WAAW;CAC1B,CAAC;AAEF,0FAA0F;AAC1F,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,MAAM,YAAY,GAChB,eAAe,IAAI,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAEpG,OAAO,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,mDAAmD;IACnD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAE/C,OAAO,cAAc,CAAC,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,IAAI,cAAc,KAAK,cAAc,CAAC;AAC9F,CAAC"}
|
package/dist/utils/paths.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { isPublishedMode, CONTENT_ROOT, resolveTemplatePath } from './paths.js';
|
|
2
|
+
import { isPublishedMode, CONTENT_ROOT, resolveTemplatePath, isPathWithinRoot } from './paths.js';
|
|
3
3
|
describe('paths', () => {
|
|
4
4
|
it('isPublishedMode is boolean', () => {
|
|
5
5
|
expect(typeof isPublishedMode).toBe('boolean');
|
|
@@ -14,4 +14,25 @@ describe('paths', () => {
|
|
|
14
14
|
expect(result).toContain(CONTENT_ROOT);
|
|
15
15
|
});
|
|
16
16
|
});
|
|
17
|
+
describe('isPathWithinRoot', () => {
|
|
18
|
+
it('returns true for valid paths', () => {
|
|
19
|
+
expect(isPathWithinRoot('vite.config.ts')).toBe(true);
|
|
20
|
+
expect(isPathWithinRoot('docs/ARCHITECTURE.md')).toBe(true);
|
|
21
|
+
expect(isPathWithinRoot('src/main.tsx')).toBe(true);
|
|
22
|
+
expect(isPathWithinRoot('.gitignore')).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('returns false for path traversal attempts', () => {
|
|
25
|
+
expect(isPathWithinRoot('../../../etc/passwd')).toBe(false);
|
|
26
|
+
expect(isPathWithinRoot('../../secret')).toBe(false);
|
|
27
|
+
expect(isPathWithinRoot('/etc/passwd')).toBe(false);
|
|
28
|
+
});
|
|
29
|
+
it('returns false for paths with embedded traversal', () => {
|
|
30
|
+
expect(isPathWithinRoot('docs/../../../etc/passwd')).toBe(false);
|
|
31
|
+
expect(isPathWithinRoot('src/../../outside')).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('returns true for paths with internal traversal that stay within root', () => {
|
|
34
|
+
expect(isPathWithinRoot('src/../package.json')).toBe(true);
|
|
35
|
+
expect(isPathWithinRoot('docs/../vite.config.ts')).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
17
38
|
//# sourceMappingURL=paths.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../src/utils/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../src/utils/paths.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElG,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md generator - composes sections based on selected features.
|
|
3
|
+
*/
|
|
4
|
+
import type { FeatureId } from '../../../features/types.js';
|
|
5
|
+
/** Generates CLAUDE.md content based on selected features. */
|
|
6
|
+
export declare function generateClaudeMd(featureIds: FeatureId[], projectName: string, scripts: Record<string, string>): string;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAe5D,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,SAAS,EAAE,EACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,MAAM,CAgBR"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md generator - composes sections based on selected features.
|
|
3
|
+
*/
|
|
4
|
+
import { FEATURE } from '../../../constants.js';
|
|
5
|
+
import { generateHeader, generateCommandsSection, generateStructureSection, generateCodePatternsSection, generateUiSection, generateMobileSection, generateThemingSection, generateMcpSection, generateI18nSection, generateTestingSection, generateGotchasSection, } from './sections.js';
|
|
6
|
+
/** Generates CLAUDE.md content based on selected features. */
|
|
7
|
+
export function generateClaudeMd(featureIds, projectName, scripts) {
|
|
8
|
+
const sections = [
|
|
9
|
+
generateHeader(projectName),
|
|
10
|
+
generateCommandsSection(scripts),
|
|
11
|
+
generateStructureSection(featureIds),
|
|
12
|
+
generateCodePatternsSection(featureIds),
|
|
13
|
+
featureIds.includes(FEATURE.UI) && generateUiSection(),
|
|
14
|
+
featureIds.includes(FEATURE.MOBILE) && generateMobileSection(),
|
|
15
|
+
featureIds.includes(FEATURE.THEMING) && generateThemingSection(),
|
|
16
|
+
generateMcpSection(featureIds),
|
|
17
|
+
featureIds.includes(FEATURE.I18N) && generateI18nSection(),
|
|
18
|
+
featureIds.includes(FEATURE.TESTING) && generateTestingSection(),
|
|
19
|
+
generateGotchasSection(featureIds),
|
|
20
|
+
];
|
|
21
|
+
return sections.filter(Boolean).join('\n');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,UAAuB,EACvB,WAAmB,EACnB,OAA+B;IAE/B,MAAM,QAAQ,GAAG;QACf,cAAc,CAAC,WAAW,CAAC;QAC3B,uBAAuB,CAAC,OAAO,CAAC;QAChC,wBAAwB,CAAC,UAAU,CAAC;QACpC,2BAA2B,CAAC,UAAU,CAAC;QACvC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,iBAAiB,EAAE;QACtD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,EAAE;QAC9D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,kBAAkB,CAAC,UAAU,CAAC;QAC9B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE;QAC1D,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,sBAAsB,EAAE;QAChE,sBAAsB,CAAC,UAAU,CAAC;KACnC,CAAC;IAEF,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md section generators - each function generates one section.
|
|
3
|
+
*/
|
|
4
|
+
import type { FeatureId } from '../../../features/types.js';
|
|
5
|
+
export declare function generateHeader(projectName: string): string;
|
|
6
|
+
export declare function generateCommandsSection(scripts: Record<string, string>): string;
|
|
7
|
+
export declare function generateStructureSection(featureIds: FeatureId[]): string;
|
|
8
|
+
export declare function generateCodePatternsSection(featureIds: FeatureId[]): string;
|
|
9
|
+
export declare function generateUiSection(): string;
|
|
10
|
+
export declare function generateMobileSection(): string;
|
|
11
|
+
export declare function generateThemingSection(): string;
|
|
12
|
+
export declare function generateMcpSection(featureIds: FeatureId[]): string;
|
|
13
|
+
export declare function generateI18nSection(): string;
|
|
14
|
+
export declare function generateTestingSection(): string;
|
|
15
|
+
export declare function generateGotchasSection(featureIds: FeatureId[]): string;
|
|
16
|
+
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAqB5D,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAe/E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAuCxE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAkB3E;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAmB1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAoC9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAuB/C;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAwClE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAe/C;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAoBtE"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md section generators - each function generates one section.
|
|
3
|
+
*/
|
|
4
|
+
import { FEATURE } from '../../../constants.js';
|
|
5
|
+
/** Script descriptions for commands section. */
|
|
6
|
+
const SCRIPT_DESCRIPTIONS = {
|
|
7
|
+
dev: 'Dev server at localhost:5173',
|
|
8
|
+
build: 'Production build (typecheck + bundle)',
|
|
9
|
+
preview: 'Preview production build',
|
|
10
|
+
typecheck: 'TypeScript only',
|
|
11
|
+
lint: 'ESLint check',
|
|
12
|
+
'lint:fix': 'ESLint auto-fix',
|
|
13
|
+
format: 'Prettier format',
|
|
14
|
+
'format:check': 'Prettier check',
|
|
15
|
+
test: 'Vitest once',
|
|
16
|
+
'test:watch': 'Vitest watch mode',
|
|
17
|
+
'test:coverage': 'Coverage (80% threshold)',
|
|
18
|
+
e2e: 'Playwright E2E',
|
|
19
|
+
'e2e:ui': 'Playwright UI mode',
|
|
20
|
+
'i18n:extract': 'Extract translations to .po',
|
|
21
|
+
prepare: 'Initialize Husky hooks',
|
|
22
|
+
};
|
|
23
|
+
export function generateHeader(projectName) {
|
|
24
|
+
return `# CLAUDE.md
|
|
25
|
+
|
|
26
|
+
AI assistant guidance for **${projectName}** - a React 19 + TypeScript + Vite 7 codebase.`;
|
|
27
|
+
}
|
|
28
|
+
export function generateCommandsSection(scripts) {
|
|
29
|
+
const commandLines = Object.keys(scripts)
|
|
30
|
+
.sort()
|
|
31
|
+
.map((script) => {
|
|
32
|
+
const desc = SCRIPT_DESCRIPTIONS[script] || '';
|
|
33
|
+
const padding = ' '.repeat(Math.max(1, 20 - script.length));
|
|
34
|
+
return `npm run ${script}${padding}# ${desc}`;
|
|
35
|
+
});
|
|
36
|
+
return `
|
|
37
|
+
## Commands
|
|
38
|
+
|
|
39
|
+
\`\`\`bash
|
|
40
|
+
${commandLines.join('\n')}
|
|
41
|
+
\`\`\``;
|
|
42
|
+
}
|
|
43
|
+
export function generateStructureSection(featureIds) {
|
|
44
|
+
const parts = ['src/', '├── components/ # ui/ (primitives), layout/, shared/ (features)'];
|
|
45
|
+
if (featureIds.includes(FEATURE.API) || featureIds.includes(FEATURE.I18N) || featureIds.includes(FEATURE.MOBILE)) {
|
|
46
|
+
parts.push('├── contexts/ # React Context providers');
|
|
47
|
+
}
|
|
48
|
+
parts.push('├── hooks/ # Custom hooks');
|
|
49
|
+
const libParts = ['config', 'utils', 'format'];
|
|
50
|
+
if (featureIds.includes(FEATURE.API))
|
|
51
|
+
libParts.push('api');
|
|
52
|
+
if (featureIds.includes(FEATURE.ROUTING))
|
|
53
|
+
libParts.push('routes');
|
|
54
|
+
if (featureIds.includes(FEATURE.STATE))
|
|
55
|
+
libParts.push('storage');
|
|
56
|
+
parts.push(`├── lib/ # ${libParts.join(', ')}`);
|
|
57
|
+
if (featureIds.includes(FEATURE.ROUTING))
|
|
58
|
+
parts.push('├── pages/ # Lazy-loaded route components');
|
|
59
|
+
if (featureIds.includes(FEATURE.STATE))
|
|
60
|
+
parts.push('├── stores/ # Zustand stores');
|
|
61
|
+
if (featureIds.includes(FEATURE.I18N)) {
|
|
62
|
+
parts.push('├── i18n/ # LinguiJS config and catalogs');
|
|
63
|
+
parts.push('├── locales/ # Translation files (.po)');
|
|
64
|
+
}
|
|
65
|
+
parts.push('└── types/ # TypeScript definitions');
|
|
66
|
+
if (featureIds.includes(FEATURE.TESTING)) {
|
|
67
|
+
parts.push('', '# Unit tests co-located: *.test.ts/tsx next to source');
|
|
68
|
+
parts.push('e2e/tests/ # Playwright functional E2E tests');
|
|
69
|
+
if (featureIds.includes(FEATURE.PERFORMANCE)) {
|
|
70
|
+
parts.push('e2e/performance/ # Performance regression tests');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return `
|
|
74
|
+
## Project Structure
|
|
75
|
+
|
|
76
|
+
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for full structure and data flow.
|
|
77
|
+
|
|
78
|
+
\`\`\`
|
|
79
|
+
${parts.join('\n')}
|
|
80
|
+
\`\`\``;
|
|
81
|
+
}
|
|
82
|
+
export function generateCodePatternsSection(featureIds) {
|
|
83
|
+
const stateHierarchy = [];
|
|
84
|
+
if (featureIds.includes(FEATURE.STATE))
|
|
85
|
+
stateHierarchy.push('Zustand (persisted)');
|
|
86
|
+
if (featureIds.includes(FEATURE.API))
|
|
87
|
+
stateHierarchy.push('TanStack Query (server)');
|
|
88
|
+
stateHierarchy.push('Context (UI)', 'useState (local)');
|
|
89
|
+
return `
|
|
90
|
+
## Code Patterns
|
|
91
|
+
|
|
92
|
+
**Imports**: Always use \`@/\` path alias
|
|
93
|
+
|
|
94
|
+
**Components**: Named exports + \`Props\` interface. Pages use default exports for lazy loading.
|
|
95
|
+
|
|
96
|
+
**TypeScript**: \`type\` for unions, \`interface\` for objects
|
|
97
|
+
|
|
98
|
+
**State hierarchy**: ${stateHierarchy.join(' → ')}
|
|
99
|
+
|
|
100
|
+
See [docs/CODING_STANDARDS.md](docs/CODING_STANDARDS.md) and [docs/COMPONENT_GUIDELINES.md](docs/COMPONENT_GUIDELINES.md).`;
|
|
101
|
+
}
|
|
102
|
+
export function generateUiSection() {
|
|
103
|
+
return `
|
|
104
|
+
## UI Components (Shadcn/UI)
|
|
105
|
+
|
|
106
|
+
This project uses **Shadcn/UI** with radix-nova style. Components live in \`src/components/ui/\`.
|
|
107
|
+
|
|
108
|
+
### Adding New Components
|
|
109
|
+
|
|
110
|
+
\`\`\`bash
|
|
111
|
+
npx shadcn@latest add button # Single component
|
|
112
|
+
npx shadcn@latest add dialog card input # Multiple components
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
**Pattern**: Import directly (no barrel exports for UI):
|
|
116
|
+
|
|
117
|
+
\`\`\`tsx
|
|
118
|
+
import { Button } from '@/components/ui/button';
|
|
119
|
+
import { cn } from '@/lib/utils';
|
|
120
|
+
\`\`\``;
|
|
121
|
+
}
|
|
122
|
+
export function generateMobileSection() {
|
|
123
|
+
return `
|
|
124
|
+
## Mobile & Responsive Design
|
|
125
|
+
|
|
126
|
+
This project includes mobile-first responsive utilities.
|
|
127
|
+
|
|
128
|
+
### Viewport Detection
|
|
129
|
+
|
|
130
|
+
\`\`\`tsx
|
|
131
|
+
import { MobileProvider, useMobileContext } from '@/contexts/mobileContext';
|
|
132
|
+
|
|
133
|
+
// Wrap app with MobileProvider
|
|
134
|
+
<MobileProvider>{children}</MobileProvider>
|
|
135
|
+
|
|
136
|
+
// Use in components
|
|
137
|
+
const { isMobile, isTablet, isDesktop, width } = useMobileContext();
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
### Breakpoints
|
|
141
|
+
|
|
142
|
+
\`\`\`tsx
|
|
143
|
+
import { BREAKPOINTS, useIsMobile, useIsDesktop } from '@/hooks/useMediaQuery';
|
|
144
|
+
|
|
145
|
+
// BREAKPOINTS: sm (640), md (768), lg (1024), xl (1280)
|
|
146
|
+
const isMobile = useIsMobile(); // width < 768px
|
|
147
|
+
const isDesktop = useIsDesktop(); // width >= 1024px
|
|
148
|
+
\`\`\`
|
|
149
|
+
|
|
150
|
+
### Touch-Aware Sizing
|
|
151
|
+
|
|
152
|
+
\`\`\`tsx
|
|
153
|
+
import { useTouchSizes } from '@/hooks/useTouchSizes';
|
|
154
|
+
|
|
155
|
+
const sizes = useTouchSizes();
|
|
156
|
+
<Button size={sizes.button}>Click</Button> // 'touch' on mobile, 'default' on desktop
|
|
157
|
+
\`\`\``;
|
|
158
|
+
}
|
|
159
|
+
export function generateThemingSection() {
|
|
160
|
+
return `
|
|
161
|
+
## Theming
|
|
162
|
+
|
|
163
|
+
Light/dark/system theme support with Zustand persistence.
|
|
164
|
+
|
|
165
|
+
### Usage
|
|
166
|
+
|
|
167
|
+
\`\`\`tsx
|
|
168
|
+
import { usePreferencesStore } from '@/stores/preferencesStore';
|
|
169
|
+
|
|
170
|
+
// Get current theme
|
|
171
|
+
const theme = usePreferencesStore((s) => s.theme);
|
|
172
|
+
|
|
173
|
+
// Toggle theme
|
|
174
|
+
const toggleTheme = usePreferencesStore((s) => s.toggleTheme);
|
|
175
|
+
|
|
176
|
+
// Get resolved theme (actual light/dark value when 'system')
|
|
177
|
+
const getResolvedTheme = usePreferencesStore((s) => s.getResolvedTheme);
|
|
178
|
+
\`\`\`
|
|
179
|
+
|
|
180
|
+
The \`useThemeEffect\` hook automatically applies the \`.dark\` class to the document.
|
|
181
|
+
The ThemeToggle component provides a UI for switching between light, dark, and system themes.`;
|
|
182
|
+
}
|
|
183
|
+
export function generateMcpSection(featureIds) {
|
|
184
|
+
let section = `
|
|
185
|
+
## MCP Servers (PREFER OVER WebSearch)
|
|
186
|
+
|
|
187
|
+
Use MCP servers for documentation lookup. They provide **structured, version-accurate data** directly from source.`;
|
|
188
|
+
if (featureIds.includes(FEATURE.UI)) {
|
|
189
|
+
section += `
|
|
190
|
+
|
|
191
|
+
### Shadcn MCP (UI Components)
|
|
192
|
+
|
|
193
|
+
| Need | Tool |
|
|
194
|
+
| ------------------- | ------------------------------------------------ |
|
|
195
|
+
| Find component | \`mcp__shadcn__search_items_in_registries\` |
|
|
196
|
+
| View component code | \`mcp__shadcn__view_items_in_registries\` |
|
|
197
|
+
| Usage examples | \`mcp__shadcn__get_item_examples_from_registries\` |
|
|
198
|
+
| CLI add command | \`mcp__shadcn__get_add_command_for_items\` |`;
|
|
199
|
+
}
|
|
200
|
+
section += `
|
|
201
|
+
|
|
202
|
+
### Context7 MCP (All Libraries)
|
|
203
|
+
|
|
204
|
+
Use for **any npm package** documentation:
|
|
205
|
+
|
|
206
|
+
\`\`\`
|
|
207
|
+
resolve-library-id → get-library-docs
|
|
208
|
+
\`\`\`
|
|
209
|
+
|
|
210
|
+
**Examples**: react-hook-form, @tanstack/react-query, zustand, zod, date-fns
|
|
211
|
+
|
|
212
|
+
### Decision Flow
|
|
213
|
+
|
|
214
|
+
\`\`\`
|
|
215
|
+
Need UI component? → Shadcn MCP
|
|
216
|
+
Need library docs? → Context7 MCP (any npm package)
|
|
217
|
+
Need general info? → WebSearch (fallback only)
|
|
218
|
+
\`\`\``;
|
|
219
|
+
return section;
|
|
220
|
+
}
|
|
221
|
+
export function generateI18nSection() {
|
|
222
|
+
return `
|
|
223
|
+
## Translations (CRITICAL)
|
|
224
|
+
|
|
225
|
+
All user-facing text MUST have translator comments. ESLint enforces this.
|
|
226
|
+
|
|
227
|
+
\`\`\`tsx
|
|
228
|
+
<Trans comment="Dashboard heading">Welcome back</Trans>
|
|
229
|
+
t({ message: 'Close', comment: 'Close button' })
|
|
230
|
+
\`\`\`
|
|
231
|
+
|
|
232
|
+
See [docs/INTERNATIONALIZATION.md](docs/INTERNATIONALIZATION.md).`;
|
|
233
|
+
}
|
|
234
|
+
export function generateTestingSection() {
|
|
235
|
+
return `
|
|
236
|
+
## Testing
|
|
237
|
+
|
|
238
|
+
See [docs/TESTING.md](docs/TESTING.md) and [docs/E2E_TESTING.md](docs/E2E_TESTING.md).
|
|
239
|
+
|
|
240
|
+
Unit tests are **co-located** with source files (\`*.test.ts/tsx\`). 80% coverage required.
|
|
241
|
+
|
|
242
|
+
\`\`\`typescript
|
|
243
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
244
|
+
import { screen, renderHook } from '@testing-library/react';
|
|
245
|
+
import { render, mockMatchMedia, server } from '@/test';
|
|
246
|
+
\`\`\`
|
|
247
|
+
|
|
248
|
+
MSW handlers auto-reset after each test.`;
|
|
249
|
+
}
|
|
250
|
+
export function generateGotchasSection(featureIds) {
|
|
251
|
+
const gotchas = [];
|
|
252
|
+
if (featureIds.includes(FEATURE.DEVTOOLS)) {
|
|
253
|
+
gotchas.push('**Node.js >= 22.0.0** required (check `.nvmrc`)');
|
|
254
|
+
gotchas.push('**Conventional commits** enforced by commitlint');
|
|
255
|
+
}
|
|
256
|
+
if (featureIds.includes(FEATURE.MOBILE)) {
|
|
257
|
+
gotchas.push('**Context hooks throw** outside provider (e.g., `useMobileContext()`)');
|
|
258
|
+
}
|
|
259
|
+
gotchas.push('**Barrel exports** in each directory via `index.ts`');
|
|
260
|
+
if (featureIds.includes(FEATURE.UI)) {
|
|
261
|
+
gotchas.push('**UI components** import directly: `@/components/ui/button` (no barrel)');
|
|
262
|
+
}
|
|
263
|
+
return `
|
|
264
|
+
## Common Gotchas
|
|
265
|
+
|
|
266
|
+
${gotchas.map((g, i) => `${i + 1}. ${g}`).join('\n')}
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../../src/utils/scaffold/claude-md/sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Setup commands utility
|
|
3
|
-
*
|
|
4
|
-
* Generates the npm commands needed to set up a scaffolded project.
|
|
2
|
+
* Setup commands utility - generates npm commands for scaffolded projects.
|
|
5
3
|
*/
|
|
6
4
|
import type { FeatureId } from '../../features/types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Generate setup commands based on selected features
|
|
9
|
-
*/
|
|
5
|
+
/** Generate setup commands based on selected features. */
|
|
10
6
|
export declare function getSetupCommands(featureIds: FeatureId[]): string[];
|
|
11
7
|
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/commands.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/utils/scaffold/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAgBlE"}
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Setup commands utility
|
|
3
|
-
*
|
|
4
|
-
* Generates the npm commands needed to set up a scaffolded project.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Generate setup commands based on selected features
|
|
2
|
+
* Setup commands utility - generates npm commands for scaffolded projects.
|
|
8
3
|
*/
|
|
4
|
+
import { FEATURE, SCRIPT } from '../../constants.js';
|
|
5
|
+
/** Generate setup commands based on selected features. */
|
|
9
6
|
export function getSetupCommands(featureIds) {
|
|
10
7
|
const commands = ['npm install'];
|
|
11
|
-
if (featureIds.includes(
|
|
12
|
-
commands.push(
|
|
8
|
+
if (featureIds.includes(FEATURE.DEVTOOLS)) {
|
|
9
|
+
commands.push(`npm run ${SCRIPT.PREPARE}`);
|
|
13
10
|
}
|
|
14
|
-
if (featureIds.includes(
|
|
15
|
-
commands.push('npx playwright install chromium');
|
|
11
|
+
if (featureIds.includes(FEATURE.TESTING)) {
|
|
12
|
+
commands.push('npx playwright install chromium');
|
|
16
13
|
}
|
|
17
|
-
if (featureIds.includes(
|
|
18
|
-
commands.push(
|
|
14
|
+
if (featureIds.includes(FEATURE.I18N)) {
|
|
15
|
+
commands.push(`npm run ${SCRIPT.I18N_EXTRACT}`);
|
|
19
16
|
}
|
|
20
17
|
return commands;
|
|
21
18
|
}
|