@shendu-sdt/sdt-dev-agent 0.1.1

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.
Files changed (66) hide show
  1. package/README.md +108 -0
  2. package/bin/sdt-dev-agent.js +3 -0
  3. package/dist/cli/index.d.ts +2 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +26 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/commands/init.d.ts +3 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +34 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/core/init-options.d.ts +9 -0
  12. package/dist/core/init-options.d.ts.map +1 -0
  13. package/dist/core/init-options.js +151 -0
  14. package/dist/core/init-options.js.map +1 -0
  15. package/dist/core/init-plan.d.ts +3 -0
  16. package/dist/core/init-plan.d.ts.map +1 -0
  17. package/dist/core/init-plan.js +108 -0
  18. package/dist/core/init-plan.js.map +1 -0
  19. package/dist/core/init-writer.d.ts +6 -0
  20. package/dist/core/init-writer.d.ts.map +1 -0
  21. package/dist/core/init-writer.js +28 -0
  22. package/dist/core/init-writer.js.map +1 -0
  23. package/dist/core/project-inspector.d.ts +3 -0
  24. package/dist/core/project-inspector.d.ts.map +1 -0
  25. package/dist/core/project-inspector.js +53 -0
  26. package/dist/core/project-inspector.js.map +1 -0
  27. package/dist/types.d.ts +49 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +4 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/utils/fs.d.ts +6 -0
  32. package/dist/utils/fs.d.ts.map +1 -0
  33. package/dist/utils/fs.js +25 -0
  34. package/dist/utils/fs.js.map +1 -0
  35. package/dist/utils/init-welcome.d.ts +5 -0
  36. package/dist/utils/init-welcome.d.ts.map +1 -0
  37. package/dist/utils/init-welcome.js +285 -0
  38. package/dist/utils/init-welcome.js.map +1 -0
  39. package/dist/utils/interactive.d.ts +2 -0
  40. package/dist/utils/interactive.d.ts.map +1 -0
  41. package/dist/utils/interactive.js +4 -0
  42. package/dist/utils/interactive.js.map +1 -0
  43. package/dist/utils/prompt-flow.d.ts +3 -0
  44. package/dist/utils/prompt-flow.d.ts.map +1 -0
  45. package/dist/utils/prompt-flow.js +2 -0
  46. package/dist/utils/prompt-flow.js.map +1 -0
  47. package/dist/utils/render-template.d.ts +2 -0
  48. package/dist/utils/render-template.d.ts.map +1 -0
  49. package/dist/utils/render-template.js +4 -0
  50. package/dist/utils/render-template.js.map +1 -0
  51. package/dist/utils/searchable-multi-select.d.ts +15 -0
  52. package/dist/utils/searchable-multi-select.d.ts.map +1 -0
  53. package/dist/utils/searchable-multi-select.js +144 -0
  54. package/dist/utils/searchable-multi-select.js.map +1 -0
  55. package/dist/utils/styled-select.d.ts +13 -0
  56. package/dist/utils/styled-select.d.ts.map +1 -0
  57. package/dist/utils/styled-select.js +74 -0
  58. package/dist/utils/styled-select.js.map +1 -0
  59. package/package.json +63 -0
  60. package/templates/AGENTS.md +24 -0
  61. package/templates/ARCHITECTURE.md +26 -0
  62. package/templates/capabilities/mcp/README.md +8 -0
  63. package/templates/capabilities/skills/README.md +8 -0
  64. package/templates/docs/ai-collaboration/README.md +16 -0
  65. package/templates/tools/claude-code/README.md +8 -0
  66. package/templates/tools/codex/README.md +8 -0
@@ -0,0 +1,49 @@
1
+ export declare const SUPPORTED_TOOLS: readonly ["codex", "claude-code"];
2
+ export declare const INSTALL_MODES: readonly ["recommended", "minimal", "custom"];
3
+ export declare const CAPABILITIES: readonly ["base-assets", "skills", "mcp"];
4
+ export type ToolId = (typeof SUPPORTED_TOOLS)[number];
5
+ export type InstallMode = (typeof INSTALL_MODES)[number];
6
+ export type CapabilityId = (typeof CAPABILITIES)[number];
7
+ export interface InitSelections {
8
+ tools: ToolId[];
9
+ installMode: InstallMode;
10
+ capabilities: CapabilityId[];
11
+ }
12
+ export interface ProjectFacts {
13
+ targetPath: string;
14
+ projectName: string;
15
+ packageManager: string;
16
+ sourceRoot: string;
17
+ testRoot: string;
18
+ hasPackageJson: boolean;
19
+ hasReadme: boolean;
20
+ hasDocsDir: boolean;
21
+ }
22
+ export interface PlannedFile {
23
+ path: string;
24
+ content: string;
25
+ kind: 'project-asset' | 'tool-integration' | 'manifest';
26
+ }
27
+ export interface InitPlan {
28
+ files: PlannedFile[];
29
+ manifest: InstallManifest;
30
+ }
31
+ export interface InstallManifest {
32
+ version: string;
33
+ generatedAt: string;
34
+ installMode: InstallMode;
35
+ tools: ToolId[];
36
+ capabilities: CapabilityId[];
37
+ project: {
38
+ path: string;
39
+ name: string;
40
+ packageManager: string;
41
+ sourceRoot: string;
42
+ testRoot: string;
43
+ };
44
+ generatedFiles: Array<{
45
+ path: string;
46
+ kind: PlannedFile['kind'];
47
+ }>;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,mCAAoC,CAAA;AAChE,eAAO,MAAM,aAAa,+CAAgD,CAAA;AAC1E,eAAO,MAAM,YAAY,2CAA4C,CAAA;AAErE,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,UAAU,CAAA;CACxD;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,YAAY,EAAE,YAAY,EAAE,CAAA;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,cAAc,EAAE,KAAK,CAAC;QACpB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAC1B,CAAC,CAAA;CACH"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ export const SUPPORTED_TOOLS = ['codex', 'claude-code'];
2
+ export const INSTALL_MODES = ['recommended', 'minimal', 'custom'];
3
+ export const CAPABILITIES = ['base-assets', 'skills', 'mcp'];
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,CAAU,CAAA;AAChE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare function exists(targetPath: string): Promise<boolean>;
2
+ export declare function ensureDir(targetPath: string): Promise<void>;
3
+ export declare function readText(targetPath: string): Promise<string>;
4
+ export declare function writeText(targetPath: string, content: string): Promise<void>;
5
+ export declare function toPosixPath(targetPath: string): string;
6
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjE;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAElE;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,25 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ export async function exists(targetPath) {
4
+ try {
5
+ await fs.access(targetPath);
6
+ return true;
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ }
12
+ export async function ensureDir(targetPath) {
13
+ await fs.mkdir(targetPath, { recursive: true });
14
+ }
15
+ export async function readText(targetPath) {
16
+ return fs.readFile(targetPath, 'utf8');
17
+ }
18
+ export async function writeText(targetPath, content) {
19
+ await ensureDir(path.dirname(targetPath));
20
+ await fs.writeFile(targetPath, content, 'utf8');
21
+ }
22
+ export function toPosixPath(targetPath) {
23
+ return targetPath.split(path.sep).join('/');
24
+ }
25
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAAkB;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB;IAChD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAAkB;IAC/C,OAAO,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,OAAe;IACjE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function buildInitWelcomeLines(): string[];
2
+ export declare function buildInitWelcomeLogoLines(): string[];
3
+ export declare function formatInitWelcome(): string;
4
+ export declare function showInitWelcome(): Promise<void>;
5
+ //# sourceMappingURL=init-welcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-welcome.d.ts","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAkJA,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAiBhD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAEpD;AAmDD,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAwDD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA0DrD"}
@@ -0,0 +1,285 @@
1
+ const MIN_WIDTH = 60;
2
+ const LOGO_COLUMN_WIDTH = 24;
3
+ const ANIMATION_INTERVAL_MS = 120;
4
+ const supportsUnicode = process.platform !== 'win32' ||
5
+ Boolean(process.env.WT_SESSION) ||
6
+ Boolean(process.env.TERM_PROGRAM);
7
+ const CHARS = supportsUnicode
8
+ ? { empty: ' ', full: '██', dim: '░░' }
9
+ : { empty: ' ', full: '##', dim: '++' };
10
+ const EMPTY = CHARS.empty;
11
+ const FULL = CHARS.full;
12
+ const DIM = CHARS.dim;
13
+ function pixelRow(pattern) {
14
+ return [...pattern]
15
+ .map((cell) => {
16
+ if (cell === '#') {
17
+ return FULL;
18
+ }
19
+ if (cell === '+') {
20
+ return DIM;
21
+ }
22
+ return EMPTY;
23
+ })
24
+ .join('');
25
+ }
26
+ const ANSI = {
27
+ reset: '\u001B[0m',
28
+ bold: '\u001B[1m',
29
+ dim: '\u001B[2m',
30
+ cyan: '\u001B[36m',
31
+ };
32
+ const INIT_WELCOME_ANIMATION = {
33
+ interval: ANIMATION_INTERVAL_MS,
34
+ frames: [
35
+ [
36
+ pixelRow('............'),
37
+ pixelRow('............'),
38
+ pixelRow('............'),
39
+ pixelRow('............'),
40
+ pixelRow('............'),
41
+ pixelRow('............'),
42
+ pixelRow('............'),
43
+ pixelRow('............'),
44
+ pixelRow('............'),
45
+ ],
46
+ [
47
+ pixelRow('............'),
48
+ pixelRow('............'),
49
+ pixelRow('.........+++'),
50
+ pixelRow('..........+.'),
51
+ pixelRow('..........+.'),
52
+ pixelRow('..........+.'),
53
+ pixelRow('..........+.'),
54
+ pixelRow('............'),
55
+ pixelRow('............'),
56
+ ],
57
+ [
58
+ pixelRow('............'),
59
+ pixelRow('............'),
60
+ pixelRow('.........###'),
61
+ pixelRow('..........#.'),
62
+ pixelRow('..........#.'),
63
+ pixelRow('..........#.'),
64
+ pixelRow('..........#.'),
65
+ pixelRow('............'),
66
+ pixelRow('............'),
67
+ ],
68
+ [
69
+ pixelRow('............'),
70
+ pixelRow('............'),
71
+ pixelRow('....+++.###'),
72
+ pixelRow('....+.....#.'),
73
+ pixelRow('....+.....#.'),
74
+ pixelRow('....+.....#.'),
75
+ pixelRow('....+++...#.'),
76
+ pixelRow('............'),
77
+ pixelRow('............'),
78
+ ],
79
+ [
80
+ pixelRow('............'),
81
+ pixelRow('............'),
82
+ pixelRow('+++.+##..###'),
83
+ pixelRow('+...+..#..#.'),
84
+ pixelRow('+++.+..#..#.'),
85
+ pixelRow('..+.+..#..#.'),
86
+ pixelRow('+++.+##...#.'),
87
+ pixelRow('............'),
88
+ pixelRow('............'),
89
+ ],
90
+ [
91
+ pixelRow('............'),
92
+ pixelRow('............'),
93
+ pixelRow('###.###..###'),
94
+ pixelRow('#...#..#..#.'),
95
+ pixelRow('###+#..#..#.'),
96
+ pixelRow('..#+#..#..#.'),
97
+ pixelRow('###.###...#.'),
98
+ pixelRow('............'),
99
+ pixelRow('............'),
100
+ ],
101
+ [
102
+ pixelRow('............'),
103
+ pixelRow('............'),
104
+ pixelRow('###.###..###'),
105
+ pixelRow('#...#..#..#.'),
106
+ pixelRow('###.#..#..#.'),
107
+ pixelRow('..#.#..#..#.'),
108
+ pixelRow('###.###...#.'),
109
+ pixelRow('............'),
110
+ pixelRow('............'),
111
+ ],
112
+ [
113
+ pixelRow('............'),
114
+ pixelRow('............'),
115
+ pixelRow('###.###..###'),
116
+ pixelRow('#...#..#..#.'),
117
+ pixelRow('###.#..#..#.'),
118
+ pixelRow('..#.#..#..#.'),
119
+ pixelRow('###.###...#.'),
120
+ pixelRow('............'),
121
+ pixelRow('............'),
122
+ ],
123
+ ],
124
+ };
125
+ function supportsColor() {
126
+ return Boolean(process.stdout.isTTY && !process.env.NO_COLOR);
127
+ }
128
+ function colorize(text, code, useColor) {
129
+ if (!useColor || text.length === 0) {
130
+ return text;
131
+ }
132
+ return `${code}${text}${ANSI.reset}`;
133
+ }
134
+ export function buildInitWelcomeLines() {
135
+ return [
136
+ 'Welcome to SDT DevAgent',
137
+ 'Bootstrap AI collaboration assets into an existing repo',
138
+ '',
139
+ 'This setup will configure:',
140
+ ' - AGENTS.md and ARCHITECTURE.md scaffolds',
141
+ ' - Codex / Claude Code integration folders',
142
+ ' - .sdt-devagent/manifest.json install record',
143
+ '',
144
+ 'Quick start after setup:',
145
+ ' - Review the generated AGENTS.md rules',
146
+ ' - Fill in ARCHITECTURE.md with repo facts',
147
+ ' - Re-run init with --tools or --install-mode if needed',
148
+ '',
149
+ 'Press Enter to configure this project...',
150
+ ];
151
+ }
152
+ export function buildInitWelcomeLogoLines() {
153
+ return [...INIT_WELCOME_ANIMATION.frames[INIT_WELCOME_ANIMATION.frames.length - 1]];
154
+ }
155
+ function formatTextLine(line, useColor) {
156
+ if (line === 'Welcome to SDT DevAgent') {
157
+ return colorize(line, ANSI.bold, useColor);
158
+ }
159
+ if (line === 'Bootstrap AI collaboration assets into an existing repo') {
160
+ return colorize(line, ANSI.dim, useColor);
161
+ }
162
+ if (line === 'This setup will configure:' || line === 'Quick start after setup:') {
163
+ return colorize(line, ANSI.bold, useColor);
164
+ }
165
+ if (line === 'Press Enter to configure this project...') {
166
+ return colorize(line, ANSI.cyan, useColor);
167
+ }
168
+ if (line.startsWith(' - ')) {
169
+ return colorize(line, ANSI.dim, useColor);
170
+ }
171
+ return line;
172
+ }
173
+ function padLogoLines(logoLines, textLineCount) {
174
+ const topPadding = Math.max(0, Math.floor((textLineCount - logoLines.length) / 2) - 1);
175
+ const bottomPadding = Math.max(0, textLineCount - logoLines.length - topPadding);
176
+ return [
177
+ ...Array.from({ length: topPadding }, () => ''),
178
+ ...logoLines,
179
+ ...Array.from({ length: bottomPadding }, () => ''),
180
+ ];
181
+ }
182
+ function renderFrame(logoLines, textLines, useColor) {
183
+ const maxLines = Math.max(logoLines.length, textLines.length);
184
+ const lines = [];
185
+ for (let index = 0; index < maxLines; index += 1) {
186
+ const logoLine = (logoLines[index] ?? '').padEnd(LOGO_COLUMN_WIDTH);
187
+ const textLine = textLines[index] ?? '';
188
+ const coloredLogo = colorize(logoLine, ANSI.cyan, useColor);
189
+ lines.push(`\u001B[2K${coloredLogo}${formatTextLine(textLine, useColor)}`);
190
+ }
191
+ return lines.join('\n');
192
+ }
193
+ export function formatInitWelcome() {
194
+ const useColor = supportsColor();
195
+ const textLines = buildInitWelcomeLines();
196
+ const logoLines = padLogoLines(buildInitWelcomeLogoLines(), textLines.length);
197
+ return `\n${renderFrame(logoLines, textLines, useColor)}\n\n`;
198
+ }
199
+ function canAnimate() {
200
+ if (!process.stdout.isTTY || !process.stdin.isTTY) {
201
+ return false;
202
+ }
203
+ if (process.env.NO_COLOR) {
204
+ return false;
205
+ }
206
+ return (process.stdout.columns ?? 80) >= MIN_WIDTH;
207
+ }
208
+ function waitForEnter() {
209
+ return new Promise((resolve) => {
210
+ const { stdin } = process;
211
+ if (!stdin.isTTY) {
212
+ resolve();
213
+ return;
214
+ }
215
+ const wasRaw = stdin.isRaw;
216
+ const startedAt = Date.now();
217
+ stdin.setRawMode(true);
218
+ stdin.resume();
219
+ const onData = (data) => {
220
+ const char = data.toString();
221
+ if (char === '\u0003') {
222
+ stdin.removeListener('data', onData);
223
+ stdin.setRawMode(wasRaw);
224
+ stdin.pause();
225
+ process.stdout.write('\n');
226
+ process.exit(0);
227
+ }
228
+ if (char === '\r' || char === '\n') {
229
+ if (Date.now() - startedAt < 150) {
230
+ return;
231
+ }
232
+ stdin.removeListener('data', onData);
233
+ stdin.setRawMode(wasRaw);
234
+ stdin.pause();
235
+ resolve();
236
+ }
237
+ };
238
+ stdin.on('data', onData);
239
+ });
240
+ }
241
+ export async function showInitWelcome() {
242
+ const useColor = supportsColor();
243
+ const textLines = buildInitWelcomeLines();
244
+ if (!process.stdout.isTTY || !process.stdin.isTTY) {
245
+ process.stdout.write(`\n${renderFrame(padLogoLines(buildInitWelcomeLogoLines(), textLines.length), textLines, useColor)}\n\n`);
246
+ return;
247
+ }
248
+ if (!canAnimate()) {
249
+ process.stdout.write(`\n${renderFrame(padLogoLines(buildInitWelcomeLogoLines(), textLines.length), textLines, useColor)}\n\n`);
250
+ await waitForEnter();
251
+ return;
252
+ }
253
+ const paddedFrames = INIT_WELCOME_ANIMATION.frames.map((frame) => padLogoLines([...frame], textLines.length));
254
+ const frameHeight = Math.max(paddedFrames[0]?.length ?? 0, textLines.length) + 1;
255
+ const totalHeight = frameHeight + 1;
256
+ let frameIndex = 0;
257
+ let running = true;
258
+ let isFirstRender = true;
259
+ process.stdout.write('\n');
260
+ const renderCurrentFrame = () => {
261
+ const frame = paddedFrames[frameIndex] ?? paddedFrames[paddedFrames.length - 1] ?? [];
262
+ if (!isFirstRender) {
263
+ process.stdout.write(`\u001B[${frameHeight}A`);
264
+ }
265
+ isFirstRender = false;
266
+ process.stdout.write(`${renderFrame(frame, textLines, useColor)}\n\n`);
267
+ frameIndex = (frameIndex + 1) % paddedFrames.length;
268
+ };
269
+ renderCurrentFrame();
270
+ const interval = setInterval(() => {
271
+ if (!running) {
272
+ return;
273
+ }
274
+ renderCurrentFrame();
275
+ }, INIT_WELCOME_ANIMATION.interval);
276
+ await waitForEnter();
277
+ running = false;
278
+ clearInterval(interval);
279
+ process.stdout.write(`\u001B[${totalHeight}A`);
280
+ for (let index = 0; index < totalHeight; index += 1) {
281
+ process.stdout.write('\u001B[2K\n');
282
+ }
283
+ process.stdout.write(`\u001B[${totalHeight}A`);
284
+ }
285
+ //# sourceMappingURL=init-welcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-welcome.js","sourceRoot":"","sources":["../../src/utils/init-welcome.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAC5B,MAAM,qBAAqB,GAAG,GAAG,CAAA;AAEjC,MAAM,eAAe,GACnB,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC5B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;AAEnC,MAAM,KAAK,GAAG,eAAe;IAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACxC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;AACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;AACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;AAErB,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,GAAG,CAAA;QACZ,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;CACV,CAAA;AAEV,MAAM,sBAAsB,GAAG;IAC7B,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE;QACN;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,aAAa,CAAC;YACvB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;SACzB;QACD;YACE,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,cAAc,CAAC;YACxB,QAAQ,CAAC,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"}
@@ -0,0 +1,2 @@
1
+ export declare function canPrompt(): boolean;
2
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,OAAO,CAEnC"}
@@ -0,0 +1,4 @@
1
+ export function canPrompt() {
2
+ return Boolean(process.stdin.isTTY && process.stdout.isTTY);
3
+ }
4
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/utils/interactive.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const GO_BACK: unique symbol;
2
+ export type PromptBack = typeof GO_BACK;
3
+ //# sourceMappingURL=prompt-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-flow.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-flow.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,eAAsC,CAAA;AAE1D,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAA"}
@@ -0,0 +1,2 @@
1
+ export const GO_BACK = Symbol.for('sdt-dev-agent.go-back');
2
+ //# sourceMappingURL=prompt-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-flow.js","sourceRoot":"","sources":["../../src/utils/prompt-flow.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function renderTemplate(template: string, values: Record<string, string>): string;
2
+ //# sourceMappingURL=render-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-template.d.ts","sourceRoot":"","sources":["../../src/utils/render-template.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEvF"}
@@ -0,0 +1,4 @@
1
+ export function renderTemplate(template, values) {
2
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => values[key] ?? '');
3
+ }
4
+ //# sourceMappingURL=render-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-template.js","sourceRoot":"","sources":["../../src/utils/render-template.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,MAA8B;IAC7E,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAClF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PromptBack } from './prompt-flow.js';
2
+ export interface SearchableChoice {
3
+ name: string;
4
+ value: string;
5
+ preSelected?: boolean;
6
+ }
7
+ export interface SearchableMultiSelectConfig {
8
+ message: string;
9
+ choices: SearchableChoice[];
10
+ pageSize?: number;
11
+ validate?: (selected: string[]) => boolean | string;
12
+ allowBack?: boolean;
13
+ }
14
+ export declare function searchableMultiSelect(config: SearchableMultiSelectConfig): Promise<string[] | PromptBack>;
15
+ //# sourceMappingURL=searchable-multi-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-multi-select.d.ts","sourceRoot":"","sources":["../../src/utils/searchable-multi-select.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,GAAG,MAAM,CAAA;IACnD,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AA8LD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAGhC"}
@@ -0,0 +1,144 @@
1
+ const ANSI = {
2
+ reset: '\u001B[0m',
3
+ bold: '\u001B[1m',
4
+ dim: '\u001B[2m',
5
+ cyan: '\u001B[36m',
6
+ green: '\u001B[32m',
7
+ yellow: '\u001B[33m',
8
+ bgCyan: '\u001B[46m',
9
+ black: '\u001B[30m',
10
+ red: '\u001B[31m',
11
+ };
12
+ import { GO_BACK } from './prompt-flow.js';
13
+ function supportsColor() {
14
+ return Boolean(process.stdout.isTTY && !process.env.NO_COLOR);
15
+ }
16
+ function colorize(text, code, enabled) {
17
+ if (!enabled || text.length === 0) {
18
+ return text;
19
+ }
20
+ return `${code}${text}${ANSI.reset}`;
21
+ }
22
+ async function createSearchableMultiSelect() {
23
+ const { createPrompt, useState, useKeypress, useMemo, usePrefix, isEnterKey, isBackspaceKey, isUpKey, isDownKey, } = await import('@inquirer/core');
24
+ return createPrompt((config, done) => {
25
+ const { message, choices, pageSize = 15, validate, allowBack = false } = config;
26
+ const useColor = supportsColor();
27
+ const [searchText, setSearchText] = useState('');
28
+ const [selectedValues, setSelectedValues] = useState(() => choices.filter((choice) => choice.preSelected).map((choice) => choice.value));
29
+ const [cursor, setCursor] = useState(0);
30
+ const [status, setStatus] = useState('idle');
31
+ const [error, setError] = useState(null);
32
+ const prefix = usePrefix({ status });
33
+ const filteredChoices = useMemo(() => {
34
+ if (!searchText.trim()) {
35
+ return choices;
36
+ }
37
+ const term = searchText.toLowerCase();
38
+ return choices.filter((choice) => choice.name.toLowerCase().includes(term) ||
39
+ choice.value.toLowerCase().includes(term));
40
+ }, [searchText, choices]);
41
+ const selectedSet = useMemo(() => new Set(selectedValues), [selectedValues]);
42
+ const choiceMap = useMemo(() => new Map(choices.map((choice) => [choice.value, choice])), [choices]);
43
+ useKeypress((key) => {
44
+ if (status === 'done') {
45
+ return;
46
+ }
47
+ if (isEnterKey(key)) {
48
+ if (validate) {
49
+ const result = validate(selectedValues);
50
+ if (result !== true) {
51
+ setError(typeof result === 'string' ? result : 'Invalid selection');
52
+ return;
53
+ }
54
+ }
55
+ setStatus('done');
56
+ done(selectedValues);
57
+ return;
58
+ }
59
+ if (key.name === 'escape' && allowBack) {
60
+ setStatus('done');
61
+ done(GO_BACK);
62
+ return;
63
+ }
64
+ if (key.name === 'space') {
65
+ const choice = filteredChoices[cursor];
66
+ if (!choice) {
67
+ return;
68
+ }
69
+ if (selectedSet.has(choice.value)) {
70
+ setSelectedValues(selectedValues.filter((value) => value !== choice.value));
71
+ }
72
+ else {
73
+ setSelectedValues([...selectedValues, choice.value]);
74
+ }
75
+ return;
76
+ }
77
+ if (isBackspaceKey(key)) {
78
+ if (searchText === '' && selectedValues.length > 0) {
79
+ setSelectedValues(selectedValues.slice(0, -1));
80
+ }
81
+ else {
82
+ setSearchText(searchText.slice(0, -1));
83
+ setCursor(0);
84
+ }
85
+ return;
86
+ }
87
+ if (isUpKey(key)) {
88
+ setCursor(Math.max(0, cursor - 1));
89
+ return;
90
+ }
91
+ if (isDownKey(key)) {
92
+ setCursor(Math.min(filteredChoices.length - 1, cursor + 1));
93
+ return;
94
+ }
95
+ if (key.name && key.name.length === 1 && !key.ctrl) {
96
+ setSearchText(searchText + key.name);
97
+ setCursor(0);
98
+ }
99
+ });
100
+ if (status === 'done') {
101
+ const names = selectedValues
102
+ .map((value) => choiceMap.get(value)?.name ?? value)
103
+ .join(', ');
104
+ return `${prefix} ${colorize(message, ANSI.bold, useColor)} ${colorize(names || '(none)', ANSI.cyan, useColor)}`;
105
+ }
106
+ const lines = [];
107
+ lines.push(`${prefix} ${colorize(message, ANSI.bold, useColor)}`);
108
+ const chips = selectedValues.length > 0
109
+ ? selectedValues
110
+ .map((value) => colorize(` ${choiceMap.get(value)?.name ?? value} `, `${ANSI.bgCyan}${ANSI.black}`, useColor))
111
+ .join(' ')
112
+ : colorize('(none selected)', ANSI.dim, useColor);
113
+ lines.push(` Selected: ${chips}`);
114
+ lines.push(` Search: ${colorize('[', ANSI.yellow, useColor)}${searchText || colorize('type to filter', ANSI.dim, useColor)}${colorize(']', ANSI.yellow, useColor)}`);
115
+ lines.push(` ${colorize('↑↓', ANSI.cyan, useColor)} navigate • ${colorize('Space', ANSI.cyan, useColor)} toggle • ${colorize('Backspace', ANSI.cyan, useColor)} remove • ${colorize('Enter', ANSI.cyan, useColor)} confirm${allowBack ? ` • ${colorize('Esc', ANSI.cyan, useColor)} back` : ''}`);
116
+ if (filteredChoices.length === 0) {
117
+ lines.push(colorize(' No matches', ANSI.yellow, useColor));
118
+ }
119
+ else {
120
+ const startIndex = Math.max(0, Math.min(cursor - Math.floor(pageSize / 2), filteredChoices.length - pageSize));
121
+ const endIndex = Math.min(startIndex + pageSize, filteredChoices.length);
122
+ const visibleChoices = filteredChoices.slice(startIndex, endIndex);
123
+ for (let index = 0; index < visibleChoices.length; index += 1) {
124
+ const item = visibleChoices[index];
125
+ const actualIndex = startIndex + index;
126
+ const isActive = actualIndex === cursor;
127
+ const selected = selectedSet.has(item.value);
128
+ const arrow = isActive ? colorize('›', ANSI.cyan, useColor) : ' ';
129
+ const icon = selected ? colorize('◉', ANSI.green, useColor) : colorize('○', ANSI.dim, useColor);
130
+ const name = isActive ? colorize(item.name, ANSI.cyan, useColor) : item.name;
131
+ lines.push(` ${arrow} ${icon} ${name}`);
132
+ }
133
+ }
134
+ if (error) {
135
+ lines.push(` ${colorize(error, ANSI.red, useColor)}`);
136
+ }
137
+ return lines.join('\n');
138
+ });
139
+ }
140
+ export async function searchableMultiSelect(config) {
141
+ const prompt = await createSearchableMultiSelect();
142
+ return prompt(config);
143
+ }
144
+ //# sourceMappingURL=searchable-multi-select.js.map