specweave 0.28.7 → 0.28.11
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/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +17 -1
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/init/index.d.ts +1 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +2 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/helpers/init/translation-config.d.ts +53 -0
- package/dist/src/cli/helpers/init/translation-config.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/translation-config.js +216 -0
- package/dist/src/cli/helpers/init/translation-config.js.map +1 -0
- package/dist/src/cli/helpers/init/types.d.ts +33 -0
- package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
- package/dist/src/core/config/types.d.ts +115 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.d.ts +24 -95
- package/dist/src/core/repo-structure/repo-id-generator.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-id-generator.js +31 -223
- package/dist/src/core/repo-structure/repo-id-generator.js.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
- package/dist/src/core/repo-structure/repo-structure-manager.js +12 -46
- package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
- package/dist/src/utils/multi-repo-detector.d.ts +85 -0
- package/dist/src/utils/multi-repo-detector.d.ts.map +1 -0
- package/dist/src/utils/multi-repo-detector.js +264 -0
- package/dist/src/utils/multi-repo-detector.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/agents/pm/AGENT.md +141 -0
- package/plugins/specweave/commands/specweave-done.md +28 -0
- package/plugins/specweave/hooks/hooks.json +12 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +59 -0
- package/plugins/specweave/hooks/post-increment-planning.sh +95 -51
- package/plugins/specweave/hooks/pre-task-completion-edit.sh +355 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +43 -0
- package/plugins/specweave/skills/umbrella-repo-detector/SKILL.md +219 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +18 -0
- package/plugins/specweave-infrastructure/skills/hetzner-provisioner/README.md +1 -1
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +27 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjG;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAErG;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,oBAAoB,CAAC;IAG/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAG3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAGjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,UAAU,CAAC,EAAE;QACX,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB,EAAE,OAAO,CAAC;IAChC,sBAAsB,EAAE,OAAO,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAGvC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,iBAAiB,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,CAAC,EAAE;QACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IACF,uBAAuB,CAAC,EAAE;QACxB,wBAAwB,CAAC,EAAE,OAAO,CAAC;KACpC,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,uBAAuB,CAAC;IAErC;;OAEG;IACH,YAAY,CAAC,EAAE,yBAAyB,CAAC;IAEzC;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2aH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,OAAO,EAAE,KAAK;IACd,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO;KAClB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM;KACjB;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,eAAe;QAC1B,QAAQ,EAAE,KAAK;QACf,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;KACtB;IACD,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,KAAK,EAAE,aAAa;QACjC,gBAAgB,EAAE,CAAC;QACnB,aAAa,EAAE,EAAE;KAClB;CACF,CAAC"}
|
|
@@ -1,120 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Repository ID Generator
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Strips common suffixes and takes last segment for readable IDs.
|
|
4
|
+
* Simple approach: Repository name IS the project ID (after normalization).
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* Why?
|
|
7
|
+
* - Repository names are already unique within an organization
|
|
8
|
+
* - No complex suffix-stripping = no collisions
|
|
9
|
+
* - Project folder matches repo name (predictable)
|
|
11
10
|
*
|
|
12
11
|
* @module repo-id-generator
|
|
13
12
|
*/
|
|
14
13
|
/**
|
|
15
|
-
*
|
|
16
|
-
*/
|
|
17
|
-
export interface ValidationResult {
|
|
18
|
-
valid: boolean;
|
|
19
|
-
error?: string;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Result of ensuring unique ID
|
|
23
|
-
*/
|
|
24
|
-
export interface UniqueIdResult {
|
|
25
|
-
id: string;
|
|
26
|
-
wasModified: boolean;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Generate a clean repository ID from a repository name.
|
|
14
|
+
* Normalize a repository name to a valid project ID.
|
|
30
15
|
*
|
|
31
|
-
*
|
|
16
|
+
* Rules:
|
|
32
17
|
* 1. Convert to lowercase
|
|
33
|
-
* 2.
|
|
34
|
-
* 3.
|
|
35
|
-
* 4.
|
|
36
|
-
* 5.
|
|
37
|
-
*
|
|
38
|
-
* This correctly identifies the service type regardless of suffixes.
|
|
39
|
-
*
|
|
40
|
-
* Examples:
|
|
41
|
-
* - "sw-web-calc-frontend" → remove "sw-" → "web-calc-frontend" → last segment "frontend" ✓
|
|
42
|
-
* - "sw-web-calc-frontend-app" → remove "sw-" → "web-calc-frontend-app" → last "app" (suffix) → take "frontend" ✓
|
|
43
|
-
* - "acme-api-gateway-service" → remove "api-" → "gateway-service" → last "service" (suffix) → take "gateway" ✓
|
|
44
|
-
* - "backend-service" → no prefix → "backend-service" → last "service" (suffix) → take "backend" ✓
|
|
45
|
-
*
|
|
46
|
-
* @param repoName - Full repository name
|
|
47
|
-
* @returns Clean repository ID
|
|
48
|
-
*/
|
|
49
|
-
export declare function generateRepoId(repoName: string): string;
|
|
50
|
-
/**
|
|
51
|
-
* Generate a context-aware repository ID with conflict detection.
|
|
52
|
-
*
|
|
53
|
-
* This is a smarter version that considers existing IDs and tries different strategies:
|
|
54
|
-
* 1. Try last segment (e.g., "calc-frontend" → "frontend")
|
|
55
|
-
* 2. If conflict, try abbreviated last segment (e.g., "frontend" → "fe")
|
|
56
|
-
* 3. If still conflict, try last two segments (e.g., "calc-fe")
|
|
57
|
-
* 4. If still conflict, use full cleaned name
|
|
58
|
-
*
|
|
59
|
-
* @param repoName - Full repository name
|
|
60
|
-
* @param existingNames - Array of existing repository names (for conflict detection)
|
|
61
|
-
* @returns Best available repository ID
|
|
18
|
+
* 2. Replace underscores and spaces with hyphens
|
|
19
|
+
* 3. Remove invalid characters (keep only a-z, 0-9, hyphens)
|
|
20
|
+
* 4. Collapse multiple hyphens
|
|
21
|
+
* 5. Trim leading/trailing hyphens
|
|
62
22
|
*
|
|
63
23
|
* @example
|
|
64
|
-
*
|
|
65
|
-
* //
|
|
24
|
+
* normalizeRepoName('My-SaaS-Frontend') // 'my-saas-frontend'
|
|
25
|
+
* normalizeRepoName('sw_qr_menu_be') // 'sw-qr-menu-be'
|
|
66
26
|
*/
|
|
67
|
-
export declare function
|
|
68
|
-
/**
|
|
69
|
-
* Ensure repository ID is unique by appending numeric suffix if needed.
|
|
70
|
-
*
|
|
71
|
-
* @param baseId - Base repository ID to make unique
|
|
72
|
-
* @param existingIds - Set of already-used IDs
|
|
73
|
-
* @returns Unique ID with modification flag
|
|
74
|
-
*
|
|
75
|
-
* @example
|
|
76
|
-
* ensureUniqueId("frontend", new Set()) // { id: "frontend", wasModified: false }
|
|
77
|
-
* ensureUniqueId("frontend", new Set(["frontend"])) // { id: "frontend-2", wasModified: true }
|
|
78
|
-
* ensureUniqueId("frontend", new Set(["frontend", "frontend-2"])) // { id: "frontend-3", wasModified: true }
|
|
79
|
-
*/
|
|
80
|
-
export declare function ensureUniqueId(baseId: string, existingIds: Set<string>): UniqueIdResult;
|
|
27
|
+
export declare function normalizeRepoName(repoName: string): string;
|
|
81
28
|
/**
|
|
82
29
|
* Validate a repository ID against naming rules.
|
|
83
30
|
*
|
|
84
31
|
* Rules:
|
|
85
|
-
* -
|
|
86
|
-
* - Lowercase letters, numbers, and hyphens only
|
|
32
|
+
* - Lowercase letters, numbers, hyphens only
|
|
87
33
|
* - Must start with a letter
|
|
88
34
|
* - Length 1-50 characters
|
|
89
|
-
* - No spaces or special characters
|
|
90
|
-
*
|
|
91
|
-
* @param id - Repository ID to validate
|
|
92
|
-
* @returns Validation result with error message if invalid
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* validateRepoId("frontend-app") // { valid: true }
|
|
96
|
-
* validateRepoId("parent,fe,be") // { valid: false, error: "..." }
|
|
97
|
-
* validateRepoId("MyRepo") // { valid: false, error: "..." }
|
|
35
|
+
* - No commas, spaces, or special characters
|
|
98
36
|
*/
|
|
99
|
-
export declare function validateRepoId(id: string):
|
|
37
|
+
export declare function validateRepoId(id: string): {
|
|
38
|
+
valid: boolean;
|
|
39
|
+
error?: string;
|
|
40
|
+
};
|
|
100
41
|
/**
|
|
101
|
-
* Suggest repository name for multi-repo setup
|
|
102
|
-
*
|
|
103
|
-
* Uses common patterns for different repository types:
|
|
104
|
-
* - Index 0: frontend
|
|
105
|
-
* - Index 1: backend
|
|
106
|
-
* - Index 2: mobile/api
|
|
107
|
-
* - Index 3+: infra, shared, worker, etc.
|
|
108
|
-
*
|
|
109
|
-
* @param projectName - Base project name (e.g., "my-saas" or "acme-platform")
|
|
110
|
-
* @param repoIndex - Zero-based repository index
|
|
111
|
-
* @param totalRepos - Total number of repositories (helps choose patterns)
|
|
112
|
-
* @returns Suggested repository name
|
|
42
|
+
* Suggest repository name for multi-repo setup.
|
|
113
43
|
*
|
|
114
44
|
* @example
|
|
115
|
-
* suggestRepoName(
|
|
116
|
-
* suggestRepoName(
|
|
117
|
-
* suggestRepoName("my-saas", 2, 3) // "my-saas-mobile"
|
|
45
|
+
* suggestRepoName('my-saas', 0, 3) // 'my-saas-frontend'
|
|
46
|
+
* suggestRepoName('my-saas', 1, 3) // 'my-saas-backend'
|
|
118
47
|
*/
|
|
119
|
-
export declare function suggestRepoName(projectName: string, repoIndex: number,
|
|
48
|
+
export declare function suggestRepoName(projectName: string, repoIndex: number, _totalRepos: number): string;
|
|
120
49
|
//# sourceMappingURL=repo-id-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-id-generator.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-id-generator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"repo-id-generator.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAuB7E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAInG"}
|
|
@@ -1,274 +1,82 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Repository ID Generator
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* Strips common suffixes and takes last segment for readable IDs.
|
|
4
|
+
* Simple approach: Repository name IS the project ID (after normalization).
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* Why?
|
|
7
|
+
* - Repository names are already unique within an organization
|
|
8
|
+
* - No complex suffix-stripping = no collisions
|
|
9
|
+
* - Project folder matches repo name (predictable)
|
|
11
10
|
*
|
|
12
11
|
* @module repo-id-generator
|
|
13
12
|
*/
|
|
14
13
|
/**
|
|
15
|
-
*
|
|
16
|
-
*/
|
|
17
|
-
const REPO_SUFFIXES = [
|
|
18
|
-
'-app',
|
|
19
|
-
'-service',
|
|
20
|
-
'-api',
|
|
21
|
-
'-frontend',
|
|
22
|
-
'-backend',
|
|
23
|
-
'-web',
|
|
24
|
-
'-mobile'
|
|
25
|
-
];
|
|
26
|
-
/**
|
|
27
|
-
* Common word abbreviations for cleaner IDs
|
|
28
|
-
*/
|
|
29
|
-
const WORD_ABBREVIATIONS = {
|
|
30
|
-
'frontend': 'fe',
|
|
31
|
-
'backend': 'be',
|
|
32
|
-
'service': 'svc',
|
|
33
|
-
'database': 'db',
|
|
34
|
-
'application': 'app',
|
|
35
|
-
'interface': 'ui',
|
|
36
|
-
'authentication': 'auth',
|
|
37
|
-
'authorization': 'authz',
|
|
38
|
-
'administration': 'admin',
|
|
39
|
-
'configuration': 'config',
|
|
40
|
-
'management': 'mgmt',
|
|
41
|
-
'repository': 'repo',
|
|
42
|
-
'documentation': 'docs'
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Generate a clean repository ID from a repository name.
|
|
14
|
+
* Normalize a repository name to a valid project ID.
|
|
46
15
|
*
|
|
47
|
-
*
|
|
16
|
+
* Rules:
|
|
48
17
|
* 1. Convert to lowercase
|
|
49
|
-
* 2.
|
|
50
|
-
* 3.
|
|
51
|
-
* 4.
|
|
52
|
-
* 5.
|
|
53
|
-
*
|
|
54
|
-
* This correctly identifies the service type regardless of suffixes.
|
|
55
|
-
*
|
|
56
|
-
* Examples:
|
|
57
|
-
* - "sw-web-calc-frontend" → remove "sw-" → "web-calc-frontend" → last segment "frontend" ✓
|
|
58
|
-
* - "sw-web-calc-frontend-app" → remove "sw-" → "web-calc-frontend-app" → last "app" (suffix) → take "frontend" ✓
|
|
59
|
-
* - "acme-api-gateway-service" → remove "api-" → "gateway-service" → last "service" (suffix) → take "gateway" ✓
|
|
60
|
-
* - "backend-service" → no prefix → "backend-service" → last "service" (suffix) → take "backend" ✓
|
|
61
|
-
*
|
|
62
|
-
* @param repoName - Full repository name
|
|
63
|
-
* @returns Clean repository ID
|
|
64
|
-
*/
|
|
65
|
-
export function generateRepoId(repoName) {
|
|
66
|
-
if (!repoName) {
|
|
67
|
-
return '';
|
|
68
|
-
}
|
|
69
|
-
let cleaned = repoName.toLowerCase();
|
|
70
|
-
// Step 1: Strip common prefixes
|
|
71
|
-
const prefixes = [/^sw-/, /^app-/, /^web-/, /^mobile-/, /^api-/];
|
|
72
|
-
for (const prefix of prefixes) {
|
|
73
|
-
cleaned = cleaned.replace(prefix, '');
|
|
74
|
-
}
|
|
75
|
-
// Step 2: Split by hyphen
|
|
76
|
-
const segments = cleaned.split('-').filter(seg => seg.length > 0);
|
|
77
|
-
if (segments.length === 0) {
|
|
78
|
-
return '';
|
|
79
|
-
}
|
|
80
|
-
// Step 3: Take last segment, but if it's a known suffix word, take second-to-last
|
|
81
|
-
const lastSegment = segments[segments.length - 1];
|
|
82
|
-
// Check if last segment is a suffix keyword (without the hyphen)
|
|
83
|
-
const suffixKeywords = ['app', 'service', 'api', 'web', 'mobile'];
|
|
84
|
-
if (suffixKeywords.includes(lastSegment) && segments.length >= 2) {
|
|
85
|
-
return segments[segments.length - 2];
|
|
86
|
-
}
|
|
87
|
-
return lastSegment;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Generate a context-aware repository ID with conflict detection.
|
|
91
|
-
*
|
|
92
|
-
* This is a smarter version that considers existing IDs and tries different strategies:
|
|
93
|
-
* 1. Try last segment (e.g., "calc-frontend" → "frontend")
|
|
94
|
-
* 2. If conflict, try abbreviated last segment (e.g., "frontend" → "fe")
|
|
95
|
-
* 3. If still conflict, try last two segments (e.g., "calc-fe")
|
|
96
|
-
* 4. If still conflict, use full cleaned name
|
|
97
|
-
*
|
|
98
|
-
* @param repoName - Full repository name
|
|
99
|
-
* @param existingNames - Array of existing repository names (for conflict detection)
|
|
100
|
-
* @returns Best available repository ID
|
|
18
|
+
* 2. Replace underscores and spaces with hyphens
|
|
19
|
+
* 3. Remove invalid characters (keep only a-z, 0-9, hyphens)
|
|
20
|
+
* 4. Collapse multiple hyphens
|
|
21
|
+
* 5. Trim leading/trailing hyphens
|
|
101
22
|
*
|
|
102
23
|
* @example
|
|
103
|
-
*
|
|
104
|
-
* //
|
|
24
|
+
* normalizeRepoName('My-SaaS-Frontend') // 'my-saas-frontend'
|
|
25
|
+
* normalizeRepoName('sw_qr_menu_be') // 'sw-qr-menu-be'
|
|
105
26
|
*/
|
|
106
|
-
export function
|
|
107
|
-
if (!repoName)
|
|
27
|
+
export function normalizeRepoName(repoName) {
|
|
28
|
+
if (!repoName)
|
|
108
29
|
return '';
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
// Generate IDs from existing names to check for conflicts
|
|
117
|
-
const existingIds = new Set(existingNames.map(name => generateRepoId(name)));
|
|
118
|
-
// Strategy 1: Try base ID
|
|
119
|
-
if (!existingIds.has(baseId)) {
|
|
120
|
-
return baseId;
|
|
121
|
-
}
|
|
122
|
-
// Strategy 2: Try abbreviated form (if available)
|
|
123
|
-
const abbreviated = WORD_ABBREVIATIONS[baseId];
|
|
124
|
-
if (abbreviated && !existingIds.has(abbreviated)) {
|
|
125
|
-
return abbreviated;
|
|
126
|
-
}
|
|
127
|
-
// Strategy 3: Try last two segments
|
|
128
|
-
let cleaned = repoName.toLowerCase();
|
|
129
|
-
// Strip prefixes
|
|
130
|
-
const prefixes = [/^sw-/, /^app-/, /^web-/, /^mobile-/, /^api-/];
|
|
131
|
-
for (const prefix of prefixes) {
|
|
132
|
-
cleaned = cleaned.replace(prefix, '');
|
|
133
|
-
}
|
|
134
|
-
const segments = cleaned.split('-').filter(seg => seg.length > 0);
|
|
135
|
-
if (segments.length >= 2) {
|
|
136
|
-
// Remove suffix keywords from end if present
|
|
137
|
-
const suffixKeywords = ['app', 'service', 'api', 'web', 'mobile'];
|
|
138
|
-
const cleanedSegments = suffixKeywords.includes(segments[segments.length - 1])
|
|
139
|
-
? segments.slice(0, -1)
|
|
140
|
-
: segments;
|
|
141
|
-
if (cleanedSegments.length >= 2) {
|
|
142
|
-
const lastTwo = cleanedSegments.slice(-2).join('-');
|
|
143
|
-
if (!existingIds.has(lastTwo)) {
|
|
144
|
-
return lastTwo;
|
|
145
|
-
}
|
|
146
|
-
// Try abbreviated last segment with penultimate
|
|
147
|
-
const abbrevLast = WORD_ABBREVIATIONS[cleanedSegments[cleanedSegments.length - 1]] || cleanedSegments[cleanedSegments.length - 1];
|
|
148
|
-
const lastTwoAbbrev = `${cleanedSegments[cleanedSegments.length - 2]}-${abbrevLast}`;
|
|
149
|
-
if (!existingIds.has(lastTwoAbbrev)) {
|
|
150
|
-
return lastTwoAbbrev;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Strategy 4: Fall back to full cleaned name
|
|
155
|
-
const finalSegments = segments.filter(seg => !['app', 'service', 'api'].includes(seg));
|
|
156
|
-
return finalSegments.join('-') || baseId;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Ensure repository ID is unique by appending numeric suffix if needed.
|
|
160
|
-
*
|
|
161
|
-
* @param baseId - Base repository ID to make unique
|
|
162
|
-
* @param existingIds - Set of already-used IDs
|
|
163
|
-
* @returns Unique ID with modification flag
|
|
164
|
-
*
|
|
165
|
-
* @example
|
|
166
|
-
* ensureUniqueId("frontend", new Set()) // { id: "frontend", wasModified: false }
|
|
167
|
-
* ensureUniqueId("frontend", new Set(["frontend"])) // { id: "frontend-2", wasModified: true }
|
|
168
|
-
* ensureUniqueId("frontend", new Set(["frontend", "frontend-2"])) // { id: "frontend-3", wasModified: true }
|
|
169
|
-
*/
|
|
170
|
-
export function ensureUniqueId(baseId, existingIds) {
|
|
171
|
-
if (!existingIds.has(baseId)) {
|
|
172
|
-
return { id: baseId, wasModified: false };
|
|
173
|
-
}
|
|
174
|
-
// Find first available suffix
|
|
175
|
-
let counter = 2;
|
|
176
|
-
while (existingIds.has(`${baseId}-${counter}`)) {
|
|
177
|
-
counter++;
|
|
178
|
-
}
|
|
179
|
-
return { id: `${baseId}-${counter}`, wasModified: true };
|
|
30
|
+
return repoName
|
|
31
|
+
.toLowerCase()
|
|
32
|
+
.replace(/[_\s]+/g, '-')
|
|
33
|
+
.replace(/[^a-z0-9-]/g, '')
|
|
34
|
+
.replace(/-+/g, '-')
|
|
35
|
+
.replace(/^-|-$/g, '');
|
|
180
36
|
}
|
|
181
37
|
/**
|
|
182
38
|
* Validate a repository ID against naming rules.
|
|
183
39
|
*
|
|
184
40
|
* Rules:
|
|
185
|
-
* -
|
|
186
|
-
* - Lowercase letters, numbers, and hyphens only
|
|
41
|
+
* - Lowercase letters, numbers, hyphens only
|
|
187
42
|
* - Must start with a letter
|
|
188
43
|
* - Length 1-50 characters
|
|
189
|
-
* - No spaces or special characters
|
|
190
|
-
*
|
|
191
|
-
* @param id - Repository ID to validate
|
|
192
|
-
* @returns Validation result with error message if invalid
|
|
193
|
-
*
|
|
194
|
-
* @example
|
|
195
|
-
* validateRepoId("frontend-app") // { valid: true }
|
|
196
|
-
* validateRepoId("parent,fe,be") // { valid: false, error: "..." }
|
|
197
|
-
* validateRepoId("MyRepo") // { valid: false, error: "..." }
|
|
44
|
+
* - No commas, spaces, or special characters
|
|
198
45
|
*/
|
|
199
46
|
export function validateRepoId(id) {
|
|
200
|
-
|
|
201
|
-
if (!id || id.trim().length === 0) {
|
|
47
|
+
if (!id?.trim()) {
|
|
202
48
|
return { valid: false, error: 'Repository ID cannot be empty' };
|
|
203
49
|
}
|
|
204
|
-
// Check length
|
|
205
50
|
if (id.length > 50) {
|
|
206
51
|
return { valid: false, error: 'Repository ID exceeds maximum length (50 characters)' };
|
|
207
52
|
}
|
|
208
|
-
// Check for commas (prevents "parent,fe,be" error)
|
|
209
53
|
if (id.includes(',')) {
|
|
210
54
|
return { valid: false, error: 'Repository ID cannot contain commas' };
|
|
211
55
|
}
|
|
212
|
-
// Check for spaces
|
|
213
56
|
if (id.includes(' ')) {
|
|
214
57
|
return { valid: false, error: 'Repository ID cannot contain spaces' };
|
|
215
58
|
}
|
|
216
|
-
// Check for uppercase letters
|
|
217
59
|
if (id !== id.toLowerCase()) {
|
|
218
60
|
return { valid: false, error: 'Repository ID must be lowercase' };
|
|
219
61
|
}
|
|
220
|
-
// Check starts with letter
|
|
221
62
|
if (!/^[a-z]/.test(id)) {
|
|
222
63
|
return { valid: false, error: 'Repository ID must start with a letter' };
|
|
223
64
|
}
|
|
224
|
-
// Check alphanumeric + hyphens only
|
|
225
65
|
if (!/^[a-z][a-z0-9-]*$/.test(id)) {
|
|
226
|
-
return { valid: false, error: 'Repository ID must contain only lowercase letters, numbers, and hyphens
|
|
66
|
+
return { valid: false, error: 'Repository ID must contain only lowercase letters, numbers, and hyphens' };
|
|
227
67
|
}
|
|
228
68
|
return { valid: true };
|
|
229
69
|
}
|
|
230
70
|
/**
|
|
231
|
-
* Suggest repository name for multi-repo setup
|
|
232
|
-
*
|
|
233
|
-
* Uses common patterns for different repository types:
|
|
234
|
-
* - Index 0: frontend
|
|
235
|
-
* - Index 1: backend
|
|
236
|
-
* - Index 2: mobile/api
|
|
237
|
-
* - Index 3+: infra, shared, worker, etc.
|
|
238
|
-
*
|
|
239
|
-
* @param projectName - Base project name (e.g., "my-saas" or "acme-platform")
|
|
240
|
-
* @param repoIndex - Zero-based repository index
|
|
241
|
-
* @param totalRepos - Total number of repositories (helps choose patterns)
|
|
242
|
-
* @returns Suggested repository name
|
|
71
|
+
* Suggest repository name for multi-repo setup.
|
|
243
72
|
*
|
|
244
73
|
* @example
|
|
245
|
-
* suggestRepoName(
|
|
246
|
-
* suggestRepoName(
|
|
247
|
-
* suggestRepoName("my-saas", 2, 3) // "my-saas-mobile"
|
|
74
|
+
* suggestRepoName('my-saas', 0, 3) // 'my-saas-frontend'
|
|
75
|
+
* suggestRepoName('my-saas', 1, 3) // 'my-saas-backend'
|
|
248
76
|
*/
|
|
249
|
-
export function suggestRepoName(projectName, repoIndex,
|
|
250
|
-
|
|
251
|
-
const
|
|
252
|
-
'frontend', // 0: Web/UI (most common first repo)
|
|
253
|
-
'backend', // 1: API/Server (most common second repo)
|
|
254
|
-
'mobile', // 2: Mobile app
|
|
255
|
-
'api', // 3: API gateway
|
|
256
|
-
'infra', // 4: Infrastructure/DevOps
|
|
257
|
-
'shared', // 5: Shared libraries
|
|
258
|
-
'worker', // 6: Background workers
|
|
259
|
-
'admin', // 7: Admin panel
|
|
260
|
-
'docs', // 8: Documentation site
|
|
261
|
-
'analytics' // 9: Analytics/reporting
|
|
262
|
-
];
|
|
263
|
-
// For repos beyond our predefined patterns, use generic "service-N" naming
|
|
264
|
-
let repoType;
|
|
265
|
-
if (repoIndex < repoTypePatterns.length) {
|
|
266
|
-
repoType = repoTypePatterns[repoIndex];
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
// Fallback for many repos: service-4, service-5, etc.
|
|
270
|
-
repoType = `service-${repoIndex + 1}`;
|
|
271
|
-
}
|
|
77
|
+
export function suggestRepoName(projectName, repoIndex, _totalRepos) {
|
|
78
|
+
const patterns = ['frontend', 'backend', 'mobile', 'api', 'infra', 'shared', 'worker', 'admin', 'docs', 'analytics'];
|
|
79
|
+
const repoType = repoIndex < patterns.length ? patterns[repoIndex] : `service-${repoIndex + 1}`;
|
|
272
80
|
return `${projectName}-${repoType}`;
|
|
273
81
|
}
|
|
274
82
|
//# sourceMappingURL=repo-id-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-id-generator.js","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-id-generator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"repo-id-generator.js","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,OAAO,QAAQ;SACZ,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sDAAsD,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yEAAyE,EAAE,CAAC;IAC5G,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,SAAiB,EAAE,WAAmB;IACzF,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACrH,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,SAAS,GAAG,CAAC,EAAE,CAAC;IAChG,OAAO,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAoB;gBAE5B,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IASrD;;;;OAIG;IACG,eAAe,CAAC,uBAAuB,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkGjG;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAWpC;;OAEG;YACW,WAAW;IAgCzB;;OAEG;YACW,mBAAmB;IAwIjC;;;;;;;;;;;OAWG;YACW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"repo-structure-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/repo-structure/repo-structure-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;QACjC,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAoB;gBAE5B,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IASrD;;;;OAIG;IACG,eAAe,CAAC,uBAAuB,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkGjG;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;;;;OAKG;IACH,OAAO,CAAC,4BAA4B;IAWpC;;OAEG;YACW,WAAW;IAgCzB;;OAEG;YACW,mBAAmB;IAwIjC;;;;;;;;;;;OAWG;YACW,kBAAkB;IA6oBhC;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,iBAAiB;IAmF/B;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiFpE;;OAEG;YACW,eAAe;IAwC7B;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,oBAAoB;IAmBlC;;OAEG;YACW,wBAAwB;IAmBtC;;;OAGG;YACW,qBAAqB;IAmEnC;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoEtE;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;;;;OAKG;IACG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAwC3E"}
|
|
@@ -21,7 +21,7 @@ import { select, input, confirm, number } from '@inquirer/prompts';
|
|
|
21
21
|
import ora from 'ora';
|
|
22
22
|
import { execSync } from 'child_process';
|
|
23
23
|
import { execFileNoThrowSync } from '../../utils/execFileNoThrow.js';
|
|
24
|
-
import {
|
|
24
|
+
import { normalizeRepoName, suggestRepoName } from './repo-id-generator.js';
|
|
25
25
|
import { SetupStateManager } from './setup-state-manager.js';
|
|
26
26
|
import { generateEnvFile } from '../../utils/env-file-generator.js';
|
|
27
27
|
import { generateSetupSummary } from './setup-summary.js';
|
|
@@ -808,22 +808,22 @@ export class RepoStructureManager {
|
|
|
808
808
|
const suggestedName = isDiscovered ? discoveredRepo.name : suggestRepoName(projectName, i, repoCount);
|
|
809
809
|
// If discovered, auto-use without confirmation (repos exist on GitHub)
|
|
810
810
|
if (isDiscovered) {
|
|
811
|
-
|
|
812
|
-
const
|
|
813
|
-
console.log(chalk.green(` ✓ Using: ${chalk.bold(discoveredRepo.name)} ${chalk.gray(`(id: ${
|
|
814
|
-
usedIds.add(
|
|
811
|
+
// Use normalized repo name as ID (repo names are unique in GitHub)
|
|
812
|
+
const repoId = normalizeRepoName(discoveredRepo.name);
|
|
813
|
+
console.log(chalk.green(` ✓ Using: ${chalk.bold(discoveredRepo.name)} ${chalk.gray(`(id: ${repoId})`)}`));
|
|
814
|
+
usedIds.add(repoId);
|
|
815
815
|
configuredRepoNames.push(discoveredRepo.name);
|
|
816
816
|
config.repositories.push({
|
|
817
|
-
id:
|
|
817
|
+
id: repoId,
|
|
818
818
|
name: discoveredRepo.name,
|
|
819
819
|
owner: discoveredRepo.owner,
|
|
820
820
|
description: discoveredRepo.description || `${discoveredRepo.name} service`,
|
|
821
|
-
path: discoveredRepo.name,
|
|
821
|
+
path: discoveredRepo.name,
|
|
822
822
|
visibility: discoveredRepo.private ? 'private' : 'public',
|
|
823
|
-
createOnGitHub: false,
|
|
823
|
+
createOnGitHub: false,
|
|
824
824
|
isNested: useParent
|
|
825
825
|
});
|
|
826
|
-
continue;
|
|
826
|
+
continue;
|
|
827
827
|
}
|
|
828
828
|
// Manual entry (original behavior)
|
|
829
829
|
const repoName = await input({
|
|
@@ -859,43 +859,9 @@ export class RepoStructureManager {
|
|
|
859
859
|
description: repoDescription,
|
|
860
860
|
createOnGitHub: repoCreateOnGitHub
|
|
861
861
|
};
|
|
862
|
-
//
|
|
863
|
-
const
|
|
864
|
-
|
|
865
|
-
// Auto-assign ID (no prompt unless conflict detected)
|
|
866
|
-
let id = suggestedId;
|
|
867
|
-
// Only prompt if ID was modified due to conflict
|
|
868
|
-
if (wasModified) {
|
|
869
|
-
console.log(chalk.yellow(` ⚠️ ID conflict detected: "${smartId}" already used`));
|
|
870
|
-
console.log(chalk.gray(` → Suggested unique ID: "${suggestedId}"`));
|
|
871
|
-
const confirmIdAnswer = await confirm({
|
|
872
|
-
message: `Use "${suggestedId}" as repository ID?`,
|
|
873
|
-
default: true
|
|
874
|
-
});
|
|
875
|
-
if (!confirmIdAnswer) {
|
|
876
|
-
const customId = await input({
|
|
877
|
-
message: 'Enter custom repository ID:',
|
|
878
|
-
default: suggestedId,
|
|
879
|
-
validate: (val) => {
|
|
880
|
-
// Validate format
|
|
881
|
-
const validation = validateRepoId(val);
|
|
882
|
-
if (!validation.valid) {
|
|
883
|
-
return validation.error || 'Invalid repository ID';
|
|
884
|
-
}
|
|
885
|
-
// Validate uniqueness
|
|
886
|
-
if (usedIds.has(val)) {
|
|
887
|
-
return 'Repository ID must be unique';
|
|
888
|
-
}
|
|
889
|
-
return true;
|
|
890
|
-
}
|
|
891
|
-
});
|
|
892
|
-
id = customId;
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
else {
|
|
896
|
-
// Show auto-generated ID (no prompt)
|
|
897
|
-
console.log(chalk.green(` ✓ Repository ID: ${chalk.bold(id)} ${chalk.gray('(auto-generated)')}`));
|
|
898
|
-
}
|
|
862
|
+
// Use normalized repo name as ID (repo names are unique)
|
|
863
|
+
const id = normalizeRepoName(repoAnswers.name);
|
|
864
|
+
console.log(chalk.green(` ✓ Repository ID: ${chalk.bold(id)}`));
|
|
899
865
|
usedIds.add(id);
|
|
900
866
|
configuredRepoNames.push(repoAnswers.name);
|
|
901
867
|
// Ask about visibility only if creating a new repository
|