@slope-dev/slope 1.13.2 → 1.16.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.
Files changed (212) hide show
  1. package/dist/cli/commands/context.d.ts +2 -0
  2. package/dist/cli/commands/context.d.ts.map +1 -0
  3. package/dist/cli/commands/context.js +190 -0
  4. package/dist/cli/commands/context.js.map +1 -0
  5. package/dist/cli/commands/distill.d.ts.map +1 -1
  6. package/dist/cli/commands/distill.js +13 -4
  7. package/dist/cli/commands/distill.js.map +1 -1
  8. package/dist/cli/commands/docs.d.ts +5 -0
  9. package/dist/cli/commands/docs.d.ts.map +1 -0
  10. package/dist/cli/commands/docs.js +303 -0
  11. package/dist/cli/commands/docs.js.map +1 -0
  12. package/dist/cli/commands/enrich.d.ts +2 -0
  13. package/dist/cli/commands/enrich.d.ts.map +1 -0
  14. package/dist/cli/commands/enrich.js +140 -0
  15. package/dist/cli/commands/enrich.js.map +1 -0
  16. package/dist/cli/commands/guard.d.ts.map +1 -1
  17. package/dist/cli/commands/guard.js +2 -0
  18. package/dist/cli/commands/guard.js.map +1 -1
  19. package/dist/cli/commands/index-cmd.d.ts +2 -0
  20. package/dist/cli/commands/index-cmd.d.ts.map +1 -0
  21. package/dist/cli/commands/index-cmd.js +296 -0
  22. package/dist/cli/commands/index-cmd.js.map +1 -0
  23. package/dist/cli/commands/init.d.ts.map +1 -1
  24. package/dist/cli/commands/init.js +73 -182
  25. package/dist/cli/commands/init.js.map +1 -1
  26. package/dist/cli/commands/initiative.d.ts +2 -0
  27. package/dist/cli/commands/initiative.d.ts.map +1 -0
  28. package/dist/cli/commands/initiative.js +207 -0
  29. package/dist/cli/commands/initiative.js.map +1 -0
  30. package/dist/cli/commands/loop.d.ts +2 -0
  31. package/dist/cli/commands/loop.d.ts.map +1 -0
  32. package/dist/cli/commands/loop.js +388 -0
  33. package/dist/cli/commands/loop.js.map +1 -0
  34. package/dist/cli/commands/prep.d.ts +2 -0
  35. package/dist/cli/commands/prep.d.ts.map +1 -0
  36. package/dist/cli/commands/prep.js +94 -0
  37. package/dist/cli/commands/prep.js.map +1 -0
  38. package/dist/cli/commands/roadmap.d.ts.map +1 -1
  39. package/dist/cli/commands/roadmap.js +134 -46
  40. package/dist/cli/commands/roadmap.js.map +1 -1
  41. package/dist/cli/commands/session.d.ts.map +1 -1
  42. package/dist/cli/commands/session.js +2 -0
  43. package/dist/cli/commands/session.js.map +1 -1
  44. package/dist/cli/commands/store.js +76 -10
  45. package/dist/cli/commands/store.js.map +1 -1
  46. package/dist/cli/commands/vision.d.ts.map +1 -1
  47. package/dist/cli/commands/vision.js +104 -7
  48. package/dist/cli/commands/vision.js.map +1 -1
  49. package/dist/cli/guards/stop-check.d.ts +6 -1
  50. package/dist/cli/guards/stop-check.d.ts.map +1 -1
  51. package/dist/cli/guards/stop-check.js +84 -5
  52. package/dist/cli/guards/stop-check.js.map +1 -1
  53. package/dist/cli/guards/worktree-check.d.ts +14 -0
  54. package/dist/cli/guards/worktree-check.d.ts.map +1 -0
  55. package/dist/cli/guards/worktree-check.js +137 -0
  56. package/dist/cli/guards/worktree-check.js.map +1 -0
  57. package/dist/cli/index.js +56 -0
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/interactive-init.d.ts +19 -0
  60. package/dist/cli/interactive-init.d.ts.map +1 -0
  61. package/dist/cli/interactive-init.js +132 -0
  62. package/dist/cli/interactive-init.js.map +1 -0
  63. package/dist/cli/loop/analyze.d.ts +8 -0
  64. package/dist/cli/loop/analyze.d.ts.map +1 -0
  65. package/dist/cli/loop/analyze.js +62 -0
  66. package/dist/cli/loop/analyze.js.map +1 -0
  67. package/dist/cli/loop/backlog.d.ts +26 -0
  68. package/dist/cli/loop/backlog.d.ts.map +1 -0
  69. package/dist/cli/loop/backlog.js +95 -0
  70. package/dist/cli/loop/backlog.js.map +1 -0
  71. package/dist/cli/loop/config.d.ts +10 -0
  72. package/dist/cli/loop/config.d.ts.map +1 -0
  73. package/dist/cli/loop/config.js +75 -0
  74. package/dist/cli/loop/config.js.map +1 -0
  75. package/dist/cli/loop/continuous.d.ts +6 -0
  76. package/dist/cli/loop/continuous.d.ts.map +1 -0
  77. package/dist/cli/loop/continuous.js +108 -0
  78. package/dist/cli/loop/continuous.js.map +1 -0
  79. package/dist/cli/loop/executor.d.ts +8 -0
  80. package/dist/cli/loop/executor.d.ts.map +1 -0
  81. package/dist/cli/loop/executor.js +600 -0
  82. package/dist/cli/loop/executor.js.map +1 -0
  83. package/dist/cli/loop/guard-runner.d.ts +14 -0
  84. package/dist/cli/loop/guard-runner.d.ts.map +1 -0
  85. package/dist/cli/loop/guard-runner.js +53 -0
  86. package/dist/cli/loop/guard-runner.js.map +1 -0
  87. package/dist/cli/loop/logger.d.ts +9 -0
  88. package/dist/cli/loop/logger.d.ts.map +1 -0
  89. package/dist/cli/loop/logger.js +37 -0
  90. package/dist/cli/loop/logger.js.map +1 -0
  91. package/dist/cli/loop/model-selector.d.ts +14 -0
  92. package/dist/cli/loop/model-selector.d.ts.map +1 -0
  93. package/dist/cli/loop/model-selector.js +59 -0
  94. package/dist/cli/loop/model-selector.js.map +1 -0
  95. package/dist/cli/loop/parallel.d.ts +6 -0
  96. package/dist/cli/loop/parallel.d.ts.map +1 -0
  97. package/dist/cli/loop/parallel.js +109 -0
  98. package/dist/cli/loop/parallel.js.map +1 -0
  99. package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
  100. package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
  101. package/dist/cli/loop/pr-lifecycle.js +244 -0
  102. package/dist/cli/loop/pr-lifecycle.js.map +1 -0
  103. package/dist/cli/loop/types.d.ts +98 -0
  104. package/dist/cli/loop/types.d.ts.map +1 -0
  105. package/dist/cli/loop/types.js +37 -0
  106. package/dist/cli/loop/types.js.map +1 -0
  107. package/dist/cli/loop/worktree.d.ts +30 -0
  108. package/dist/cli/loop/worktree.d.ts.map +1 -0
  109. package/dist/cli/loop/worktree.js +134 -0
  110. package/dist/cli/loop/worktree.js.map +1 -0
  111. package/dist/cli/registry.d.ts.map +1 -1
  112. package/dist/cli/registry.js +9 -0
  113. package/dist/cli/registry.js.map +1 -1
  114. package/dist/core/analyzers/stack.d.ts +2 -0
  115. package/dist/core/analyzers/stack.d.ts.map +1 -1
  116. package/dist/core/analyzers/stack.js +9 -6
  117. package/dist/core/analyzers/stack.js.map +1 -1
  118. package/dist/core/config.d.ts +6 -0
  119. package/dist/core/config.d.ts.map +1 -1
  120. package/dist/core/config.js.map +1 -1
  121. package/dist/core/constants.d.ts +2 -0
  122. package/dist/core/constants.d.ts.map +1 -1
  123. package/dist/core/constants.js +2 -0
  124. package/dist/core/constants.js.map +1 -1
  125. package/dist/core/context.d.ts +20 -0
  126. package/dist/core/context.d.ts.map +1 -0
  127. package/dist/core/context.js +59 -0
  128. package/dist/core/context.js.map +1 -0
  129. package/dist/core/docs.d.ts +50 -0
  130. package/dist/core/docs.d.ts.map +1 -0
  131. package/dist/core/docs.js +67 -0
  132. package/dist/core/docs.js.map +1 -0
  133. package/dist/core/embedding-client.d.ts +11 -0
  134. package/dist/core/embedding-client.d.ts.map +1 -0
  135. package/dist/core/embedding-client.js +92 -0
  136. package/dist/core/embedding-client.js.map +1 -0
  137. package/dist/core/embedding-store.d.ts +44 -0
  138. package/dist/core/embedding-store.d.ts.map +1 -0
  139. package/dist/core/embedding-store.js +7 -0
  140. package/dist/core/embedding-store.js.map +1 -0
  141. package/dist/core/embedding.d.ts +32 -0
  142. package/dist/core/embedding.d.ts.map +1 -0
  143. package/dist/core/embedding.js +114 -0
  144. package/dist/core/embedding.js.map +1 -0
  145. package/dist/core/enrich.d.ts +76 -0
  146. package/dist/core/enrich.d.ts.map +1 -0
  147. package/dist/core/enrich.js +115 -0
  148. package/dist/core/enrich.js.map +1 -0
  149. package/dist/core/generators/roadmap.d.ts +6 -1
  150. package/dist/core/generators/roadmap.d.ts.map +1 -1
  151. package/dist/core/generators/roadmap.js +150 -0
  152. package/dist/core/generators/roadmap.js.map +1 -1
  153. package/dist/core/guard.d.ts +1 -1
  154. package/dist/core/guard.d.ts.map +1 -1
  155. package/dist/core/guard.js +8 -0
  156. package/dist/core/guard.js.map +1 -1
  157. package/dist/core/index.d.ts +27 -5
  158. package/dist/core/index.d.ts.map +1 -1
  159. package/dist/core/index.js +25 -4
  160. package/dist/core/index.js.map +1 -1
  161. package/dist/core/initiative.d.ts +72 -0
  162. package/dist/core/initiative.d.ts.map +1 -0
  163. package/dist/core/initiative.js +421 -0
  164. package/dist/core/initiative.js.map +1 -0
  165. package/dist/core/interview-engine.d.ts +34 -0
  166. package/dist/core/interview-engine.d.ts.map +1 -0
  167. package/dist/core/interview-engine.js +195 -0
  168. package/dist/core/interview-engine.js.map +1 -0
  169. package/dist/core/interview-steps.d.ts +27 -0
  170. package/dist/core/interview-steps.d.ts.map +1 -0
  171. package/dist/core/interview-steps.js +157 -0
  172. package/dist/core/interview-steps.js.map +1 -0
  173. package/dist/core/interview.d.ts +20 -0
  174. package/dist/core/interview.d.ts.map +1 -1
  175. package/dist/core/interview.js +61 -34
  176. package/dist/core/interview.js.map +1 -1
  177. package/dist/core/metaphor-preview.d.ts +34 -0
  178. package/dist/core/metaphor-preview.d.ts.map +1 -0
  179. package/dist/core/metaphor-preview.js +94 -0
  180. package/dist/core/metaphor-preview.js.map +1 -0
  181. package/dist/core/prep.d.ts +88 -0
  182. package/dist/core/prep.d.ts.map +1 -0
  183. package/dist/core/prep.js +302 -0
  184. package/dist/core/prep.js.map +1 -0
  185. package/dist/core/roles.d.ts +3 -0
  186. package/dist/core/roles.d.ts.map +1 -1
  187. package/dist/core/roles.js +36 -0
  188. package/dist/core/roles.js.map +1 -1
  189. package/dist/core/store.d.ts +1 -1
  190. package/dist/core/store.d.ts.map +1 -1
  191. package/dist/core/vision.d.ts +10 -0
  192. package/dist/core/vision.d.ts.map +1 -1
  193. package/dist/core/vision.js +37 -0
  194. package/dist/core/vision.js.map +1 -1
  195. package/dist/mcp/index.d.ts.map +1 -1
  196. package/dist/mcp/index.js +55 -7
  197. package/dist/mcp/index.js.map +1 -1
  198. package/dist/mcp/registry.d.ts +1 -1
  199. package/dist/mcp/registry.d.ts.map +1 -1
  200. package/dist/mcp/registry.js +44 -0
  201. package/dist/mcp/registry.js.map +1 -1
  202. package/dist/mcp/sandbox.d.ts.map +1 -1
  203. package/dist/mcp/sandbox.js +12 -1
  204. package/dist/mcp/sandbox.js.map +1 -1
  205. package/dist/store/index.d.ts +26 -1
  206. package/dist/store/index.d.ts.map +1 -1
  207. package/dist/store/index.js +193 -1
  208. package/dist/store/index.js.map +1 -1
  209. package/dist/store-pg/index.d.ts.map +1 -1
  210. package/dist/store-pg/index.js +25 -0
  211. package/dist/store-pg/index.js.map +1 -1
  212. package/package.json +3 -1
@@ -0,0 +1,195 @@
1
+ // SLOPE — Interview Engine
2
+ // Lightweight project detection, context building, and answer transformation.
3
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
4
+ import { join, basename } from 'node:path';
5
+ import { execSync } from 'node:child_process';
6
+ import { hasMetaphor } from './metaphor.js';
7
+ /**
8
+ * Fast, lightweight project detection. No git log analysis, no heavy scanning.
9
+ * Each step is wrapped in try/catch for graceful fallback.
10
+ */
11
+ export function runLightweightDetection(cwd) {
12
+ const detected = {
13
+ detectedPlatforms: [],
14
+ };
15
+ // 1. Read package.json for projectName and techStack hints
16
+ try {
17
+ const pkgPath = join(cwd, 'package.json');
18
+ if (existsSync(pkgPath)) {
19
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
20
+ if (typeof pkg.name === 'string' && pkg.name.trim()) {
21
+ detected.projectName = pkg.name;
22
+ }
23
+ // Extract tech stack from dependencies
24
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
25
+ if (deps && typeof deps === 'object') {
26
+ detected.techStack = Object.keys(deps).slice(0, 20);
27
+ }
28
+ }
29
+ }
30
+ catch {
31
+ // No package.json or malformed — skip
32
+ }
33
+ // Fall back to directory name if no package.json name
34
+ if (!detected.projectName) {
35
+ detected.projectName = basename(cwd);
36
+ }
37
+ // 2. Read git remote for repoUrl
38
+ try {
39
+ const raw = execSync('git remote get-url origin 2>/dev/null', {
40
+ cwd,
41
+ encoding: 'utf8',
42
+ timeout: 2000,
43
+ }).trim();
44
+ // Convert SSH to HTTPS if needed
45
+ if (raw.startsWith('https://github.com/')) {
46
+ detected.repoUrl = raw.replace(/\.git$/, '');
47
+ }
48
+ else if (raw.startsWith('git@github.com:')) {
49
+ detected.repoUrl = raw
50
+ .replace('git@github.com:', 'https://github.com/')
51
+ .replace(/\.git$/, '');
52
+ }
53
+ }
54
+ catch {
55
+ // No git repo or no remote — skip
56
+ }
57
+ // 3. Find highest sprint number from docs/retros/sprint-*.json
58
+ try {
59
+ const retrosDir = join(cwd, 'docs', 'retros');
60
+ if (existsSync(retrosDir)) {
61
+ const files = readdirSync(retrosDir);
62
+ let highest = 0;
63
+ for (const f of files) {
64
+ const match = f.match(/^sprint-(\d+)\.json$/);
65
+ if (match) {
66
+ const n = parseInt(match[1], 10);
67
+ if (n > highest)
68
+ highest = n;
69
+ }
70
+ }
71
+ if (highest > 0) {
72
+ detected.existingSprintNumber = highest;
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ // No retros dir or unreadable — skip
78
+ }
79
+ // 4. Detect platforms
80
+ try {
81
+ detected.detectedPlatforms = detectPlatformsLightweight(cwd);
82
+ }
83
+ catch {
84
+ detected.detectedPlatforms = [];
85
+ }
86
+ return detected;
87
+ }
88
+ /**
89
+ * Lightweight platform detection — checks for config files without importing adapters.
90
+ */
91
+ function detectPlatformsLightweight(cwd) {
92
+ const platforms = [];
93
+ if (existsSync(join(cwd, '.claude')) || existsSync(join(cwd, 'CLAUDE.md')) || existsSync(join(cwd, '.mcp.json'))) {
94
+ platforms.push('claude-code');
95
+ }
96
+ if (existsSync(join(cwd, '.cursor')) || existsSync(join(cwd, '.cursorrules'))) {
97
+ platforms.push('cursor');
98
+ }
99
+ if (existsSync(join(cwd, '.windsurf')) || existsSync(join(cwd, '.windsurfrules'))) {
100
+ platforms.push('windsurf');
101
+ }
102
+ if (existsSync(join(cwd, '.clinerules'))) {
103
+ platforms.push('cline');
104
+ }
105
+ if (existsSync(join(cwd, 'opencode.json')) || existsSync(join(cwd, 'AGENTS.md'))) {
106
+ platforms.push('opencode');
107
+ }
108
+ return platforms;
109
+ }
110
+ /**
111
+ * Build the full interview context from cwd.
112
+ */
113
+ export function buildInterviewContext(cwd) {
114
+ return {
115
+ cwd,
116
+ detected: runLightweightDetection(cwd),
117
+ };
118
+ }
119
+ /**
120
+ * Validate interview answers against step definitions.
121
+ * Returns an array of { field, message } errors (empty = valid).
122
+ */
123
+ export function validateInterviewAnswers(answers) {
124
+ const errors = [];
125
+ // project-name is required
126
+ const name = String(answers['project-name'] ?? '').trim();
127
+ if (!name) {
128
+ errors.push({ field: 'project-name', message: 'Project name is required' });
129
+ }
130
+ // metaphor validation (if provided)
131
+ const metaphor = String(answers['metaphor'] ?? '').trim();
132
+ if (metaphor && metaphor !== 'custom' && !hasMetaphor(metaphor)) {
133
+ errors.push({ field: 'metaphor', message: `Unknown metaphor "${metaphor}". Use listMetaphors() to see available options.` });
134
+ }
135
+ // repo-url validation (if provided)
136
+ const repoUrl = String(answers['repo-url'] ?? '').trim();
137
+ if (repoUrl) {
138
+ const ghPattern = /^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(\.git)?\/?$/;
139
+ if (!ghPattern.test(repoUrl)) {
140
+ errors.push({ field: 'repo-url', message: 'Must be a valid GitHub URL (https://github.com/owner/repo)' });
141
+ }
142
+ }
143
+ // sprint-number validation (if provided)
144
+ const sprintStr = String(answers['sprint-number'] ?? '').trim();
145
+ if (sprintStr) {
146
+ const n = parseInt(sprintStr, 10);
147
+ if (isNaN(n) || n < 1 || !Number.isInteger(n)) {
148
+ errors.push({ field: 'sprint-number', message: 'Must be a positive integer' });
149
+ }
150
+ }
151
+ return errors;
152
+ }
153
+ /**
154
+ * Transform interview answers map into InitInput for core initFromInterview().
155
+ */
156
+ export function answersToInitInput(answers) {
157
+ const input = {
158
+ projectName: String(answers['project-name'] ?? '').trim(),
159
+ };
160
+ const repoUrl = String(answers['repo-url'] ?? '').trim();
161
+ if (repoUrl)
162
+ input.repoUrl = repoUrl;
163
+ const metaphor = String(answers['metaphor'] ?? '').trim();
164
+ if (metaphor)
165
+ input.metaphor = metaphor;
166
+ const sprintStr = String(answers['sprint-number'] ?? '').trim();
167
+ if (sprintStr) {
168
+ const n = parseInt(sprintStr, 10);
169
+ if (!isNaN(n) && n >= 1)
170
+ input.currentSprint = n;
171
+ }
172
+ const vision = String(answers['vision'] ?? '').trim();
173
+ if (vision)
174
+ input.vision = vision;
175
+ // Parse team members: "alice:Alice Smith, bob:Bob Jones"
176
+ const teamStr = String(answers['team-members'] ?? '').trim();
177
+ if (teamStr) {
178
+ const members = {};
179
+ for (const pair of teamStr.split(',')) {
180
+ const trimmed = pair.trim();
181
+ const colonIdx = trimmed.indexOf(':');
182
+ if (colonIdx > 0) {
183
+ const slug = trimmed.slice(0, colonIdx).trim();
184
+ const name = trimmed.slice(colonIdx + 1).trim();
185
+ if (slug && name)
186
+ members[slug] = name;
187
+ }
188
+ }
189
+ if (Object.keys(members).length > 0) {
190
+ input.teamMembers = members;
191
+ }
192
+ }
193
+ return input;
194
+ }
195
+ //# sourceMappingURL=interview-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-engine.js","sourceRoot":"","sources":["../../src/core/interview-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { InterviewContext } from './interview-engine.js';
2
+ export type StepType = 'text' | 'select' | 'multiselect' | 'confirm';
3
+ export interface StepOption {
4
+ value: string;
5
+ label: string;
6
+ description?: string;
7
+ hint?: string;
8
+ preview?: unknown;
9
+ }
10
+ export interface InterviewStep {
11
+ id: string;
12
+ question: string;
13
+ type: StepType;
14
+ description?: string;
15
+ options?: StepOption[];
16
+ default?: string | string[] | boolean;
17
+ required?: boolean;
18
+ validate?: (value: unknown) => string | null;
19
+ condition?: (answers: Record<string, unknown>) => boolean;
20
+ }
21
+ /**
22
+ * Generate interview steps with smart defaults from detected context.
23
+ * Steps are returned in presentation order.
24
+ * Caller must ensure metaphors are registered before calling (import metaphors/index.js).
25
+ */
26
+ export declare function generateInterviewSteps(ctx: InterviewContext): InterviewStep[];
27
+ //# sourceMappingURL=interview-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-steps.d.ts","sourceRoot":"","sources":["../../src/core/interview-steps.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7C,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;CAC3D;AAaD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAuG7E"}
@@ -0,0 +1,157 @@
1
+ // SLOPE — Interview Step Definitions
2
+ // Structured representation of init questions for CLI and agent consumption.
3
+ import { listMetaphors } from './metaphor.js';
4
+ import { buildAllPreviews } from './metaphor-preview.js';
5
+ /** All available platform options for multiselect */
6
+ const PLATFORM_OPTIONS = [
7
+ { value: 'claude-code', label: 'Claude Code', description: 'Anthropic CLI with MCP + rules + hooks' },
8
+ { value: 'cursor', label: 'Cursor', description: 'Cursor IDE with MCP + rules' },
9
+ { value: 'windsurf', label: 'Windsurf', description: 'Windsurf IDE with MCP + rules' },
10
+ { value: 'cline', label: 'Cline', description: 'VS Code extension with rules' },
11
+ { value: 'opencode', label: 'OpenCode', description: 'OpenCode with MCP + plugin' },
12
+ ];
13
+ const BUILTIN_IDS = ['golf', 'tennis', 'baseball', 'gaming', 'dnd', 'matrix', 'agile'];
14
+ /**
15
+ * Generate interview steps with smart defaults from detected context.
16
+ * Steps are returned in presentation order.
17
+ * Caller must ensure metaphors are registered before calling (import metaphors/index.js).
18
+ */
19
+ export function generateInterviewSteps(ctx) {
20
+ const { detected } = ctx;
21
+ const steps = [];
22
+ // 1. Project name
23
+ steps.push({
24
+ id: 'project-name',
25
+ question: 'What is your project name?',
26
+ type: 'text',
27
+ description: 'Used in config, roadmap, and display output.',
28
+ default: detected.projectName,
29
+ required: true,
30
+ validate: (v) => {
31
+ const s = String(v ?? '').trim();
32
+ return s.length === 0 ? 'Project name is required' : null;
33
+ },
34
+ });
35
+ // 2. Metaphor (select) — previews attached by metaphor-preview module
36
+ steps.push(buildMetaphorStep());
37
+ // 3. Repo URL
38
+ steps.push({
39
+ id: 'repo-url',
40
+ question: 'What is your GitHub repo URL?',
41
+ type: 'text',
42
+ description: 'Optional. Used for remote git analysis and PR integration.',
43
+ default: detected.repoUrl,
44
+ required: false,
45
+ validate: (v) => {
46
+ const s = String(v ?? '').trim();
47
+ if (!s)
48
+ return null;
49
+ const ghPattern = /^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(\.git)?$/;
50
+ return ghPattern.test(s) ? null : 'Must be a valid GitHub URL (https://github.com/owner/repo)';
51
+ },
52
+ });
53
+ // 4. Sprint number
54
+ const defaultSprint = detected.existingSprintNumber
55
+ ? String(detected.existingSprintNumber + 1)
56
+ : '1';
57
+ steps.push({
58
+ id: 'sprint-number',
59
+ question: 'What sprint number are you starting?',
60
+ type: 'text',
61
+ description: 'The current or next sprint number.',
62
+ default: defaultSprint,
63
+ required: false,
64
+ validate: (v) => {
65
+ const s = String(v ?? '').trim();
66
+ if (!s)
67
+ return null;
68
+ const n = parseInt(s, 10);
69
+ if (isNaN(n) || n < 1 || !Number.isInteger(n))
70
+ return 'Must be a positive integer';
71
+ return null;
72
+ },
73
+ });
74
+ // 5. Platforms
75
+ const detectedPlatformValues = detected.detectedPlatforms;
76
+ const platformOptions = PLATFORM_OPTIONS.map((opt) => ({
77
+ ...opt,
78
+ hint: detectedPlatformValues.includes(opt.value) ? '(detected)' : undefined,
79
+ }));
80
+ steps.push({
81
+ id: 'platforms',
82
+ question: 'Which platforms do you use?',
83
+ type: 'multiselect',
84
+ description: 'SLOPE installs rules, MCP config, and hooks for each selected platform.',
85
+ options: platformOptions,
86
+ default: detectedPlatformValues.length > 0 ? detectedPlatformValues : undefined,
87
+ });
88
+ // 6. Team members
89
+ steps.push({
90
+ id: 'team-members',
91
+ question: 'Team members (slug:name, comma-separated)?',
92
+ type: 'text',
93
+ description: 'Optional. Example: alice:Alice Smith, bob:Bob Jones',
94
+ required: false,
95
+ });
96
+ // 7. Vision
97
+ steps.push({
98
+ id: 'vision',
99
+ question: 'Project vision or purpose?',
100
+ type: 'text',
101
+ description: 'Optional. Used in roadmap description and vision document.',
102
+ required: false,
103
+ });
104
+ // 8. Deep analysis (CLI-only, skipped in agent mode)
105
+ steps.push({
106
+ id: 'deep-analysis',
107
+ question: 'Run repo analysis for better suggestions?',
108
+ type: 'confirm',
109
+ description: 'Scans your repo for tech stack, structure, and complexity. Takes 5-15 seconds.',
110
+ default: false,
111
+ condition: (answers) => {
112
+ return answers._mode !== 'agent';
113
+ },
114
+ });
115
+ return steps;
116
+ }
117
+ /**
118
+ * Build the metaphor selection step with all registered metaphors.
119
+ */
120
+ function buildMetaphorStep() {
121
+ const allMetaphors = listMetaphors();
122
+ const previews = buildAllPreviews();
123
+ const previewMap = new Map(previews.map((p) => [p.id, p]));
124
+ const builtins = BUILTIN_IDS
125
+ .map((id) => allMetaphors.find((m) => m.id === id))
126
+ .filter((m) => m !== undefined);
127
+ const customs = allMetaphors.filter((m) => !BUILTIN_IDS.includes(m.id));
128
+ const options = [
129
+ ...builtins.map((m) => ({
130
+ value: m.id,
131
+ label: m.name,
132
+ description: m.description,
133
+ preview: previewMap.get(m.id),
134
+ })),
135
+ ...customs.map((m) => ({
136
+ value: m.id,
137
+ label: m.name,
138
+ description: m.description,
139
+ hint: '(custom)',
140
+ preview: previewMap.get(m.id),
141
+ })),
142
+ {
143
+ value: 'custom',
144
+ label: 'Custom',
145
+ description: 'Describe a theme and your AI agent will generate it',
146
+ },
147
+ ];
148
+ return {
149
+ id: 'metaphor',
150
+ question: 'Choose a display metaphor for SLOPE output:',
151
+ type: 'select',
152
+ description: 'Metaphors change display terms (e.g., "sprint" becomes "hole" in golf, "quest" in gaming). Internal types are unaffected.',
153
+ options,
154
+ default: 'golf',
155
+ };
156
+ }
157
+ //# sourceMappingURL=interview-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interview-steps.js","sourceRoot":"","sources":["../../src/core/interview-steps.ts"],"names":[],"mappings":"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"}
@@ -27,5 +27,25 @@ export declare function validateInitInput(input: InitInput): string[];
27
27
  * Creates config, example scorecard, roadmap, and common-issues.
28
28
  * Does NOT initialize a store — that's the caller's responsibility.
29
29
  */
30
+ /** Structured result for agent-facing initFromAnswers */
31
+ export type InitFromAnswersResult = {
32
+ success: true;
33
+ configPath: string;
34
+ filesCreated: string[];
35
+ providers: string[];
36
+ } | {
37
+ success: false;
38
+ errors: Array<{
39
+ field: string;
40
+ message: string;
41
+ }>;
42
+ };
43
+ /**
44
+ * Initialize a SLOPE project from raw interview answers.
45
+ * Validates answers and creates core files.
46
+ * Provider installation is the caller's responsibility (CLI or MCP layer).
47
+ * Returns a structured result (never throws on validation errors).
48
+ */
49
+ export declare function initFromAnswers(cwd: string, answers: Record<string, unknown>, providers?: string[]): Promise<InitFromAnswersResult>;
30
50
  export declare function initFromInterview(cwd: string, input: InitInput): Promise<InitResult>;
31
51
  //# sourceMappingURL=interview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../src/core/interview.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAqC5D;AA6CD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAwF1F"}
1
+ {"version":3,"file":"interview.d.ts","sourceRoot":"","sources":["../../src/core/interview.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAqC5D;AA+CD;;;;GAIG;AACH,yDAAyD;AACzD,MAAM,MAAM,qBAAqB,GAC7B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAClF;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAE1E;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,qBAAqB,CAAC,CA0BhC;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAuF1F"}
@@ -1,10 +1,11 @@
1
1
  // SLOPE — Interview-Based Init
2
2
  // Structured project initialization from collected input fields.
3
3
  // Core defines only what it needs — no CLI/infrastructure concerns.
4
- import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
4
+ import { writeFileSync, mkdirSync, existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { createConfig } from './config.js';
7
7
  import { hasMetaphor } from './metaphor.js';
8
+ import { validateInterviewAnswers, answersToInitInput } from './interview-engine.js';
8
9
  /**
9
10
  * Validate InitInput fields.
10
11
  * Returns an array of error strings (empty = valid).
@@ -21,7 +22,7 @@ export function validateInitInput(input) {
21
22
  }
22
23
  }
23
24
  if (input.repoUrl !== undefined) {
24
- const ghPattern = /^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(\.git)?$/;
25
+ const ghPattern = /^https:\/\/github\.com\/[\w.-]+\/[\w.-]+(\.git)?\/?$/;
25
26
  if (!ghPattern.test(input.repoUrl)) {
26
27
  errors.push(`repoUrl "${input.repoUrl}" does not match expected GitHub URL pattern`);
27
28
  }
@@ -41,34 +42,36 @@ export function validateInitInput(input) {
41
42
  }
42
43
  return errors;
43
44
  }
44
- const EXAMPLE_SCORECARD = {
45
- sprint_number: 1,
46
- theme: 'Getting Started',
47
- par: 3,
48
- slope: 0,
49
- score: 3,
50
- score_label: 'par',
51
- date: new Date().toISOString().split('T')[0],
52
- shots: [
53
- {
54
- ticket_key: 'S1-1',
55
- title: 'Set up project',
56
- club: 'short_iron',
57
- result: 'green',
58
- hazards: [],
45
+ function buildExampleScorecard() {
46
+ return {
47
+ sprint_number: 1,
48
+ theme: 'Getting Started',
49
+ par: 3,
50
+ slope: 0,
51
+ score: 3,
52
+ score_label: 'par',
53
+ date: new Date().toISOString().split('T')[0],
54
+ shots: [
55
+ {
56
+ ticket_key: 'S1-1',
57
+ title: 'Set up project',
58
+ club: 'short_iron',
59
+ result: 'green',
60
+ hazards: [],
61
+ },
62
+ ],
63
+ conditions: [],
64
+ special_plays: [],
65
+ stats: {
66
+ fairways_hit: 1, fairways_total: 1, greens_in_regulation: 1,
67
+ greens_total: 1, putts: 0, penalties: 0, hazards_hit: 0, hazard_penalties: 0,
68
+ miss_directions: { long: 0, short: 0, left: 0, right: 0 },
59
69
  },
60
- ],
61
- conditions: [],
62
- special_plays: [],
63
- stats: {
64
- fairways_hit: 1, fairways_total: 1, greens_in_regulation: 1,
65
- greens_total: 1, putts: 0, penalties: 0, hazards_hit: 0, hazard_penalties: 0,
66
- miss_directions: { long: 0, short: 0, left: 0, right: 0 },
67
- },
68
- yardage_book_updates: [],
69
- bunker_locations: [],
70
- course_management_notes: [],
71
- };
70
+ yardage_book_updates: [],
71
+ bunker_locations: [],
72
+ course_management_notes: [],
73
+ };
74
+ }
72
75
  const EXAMPLE_COMMON_ISSUES = {
73
76
  recurring_patterns: [
74
77
  {
@@ -83,10 +86,35 @@ const EXAMPLE_COMMON_ISSUES = {
83
86
  ],
84
87
  };
85
88
  /**
86
- * Initialize a SLOPE project from structured interview input.
87
- * Creates config, example scorecard, roadmap, and common-issues.
88
- * Does NOT initialize a store — that's the caller's responsibility.
89
+ * Initialize a SLOPE project from raw interview answers.
90
+ * Validates answers and creates core files.
91
+ * Provider installation is the caller's responsibility (CLI or MCP layer).
92
+ * Returns a structured result (never throws on validation errors).
89
93
  */
94
+ export async function initFromAnswers(cwd, answers, providers) {
95
+ const validationErrors = validateInterviewAnswers(answers);
96
+ if (validationErrors.length > 0) {
97
+ return { success: false, errors: validationErrors };
98
+ }
99
+ const input = answersToInitInput(answers);
100
+ let result;
101
+ try {
102
+ result = await initFromInterview(cwd, input);
103
+ }
104
+ catch (err) {
105
+ const message = err instanceof Error ? err.message : String(err);
106
+ return { success: false, errors: [{ field: '_init', message }] };
107
+ }
108
+ const platformsRaw = answers.platforms;
109
+ const effectiveProviders = providers
110
+ ?? (Array.isArray(platformsRaw) ? platformsRaw : []);
111
+ return {
112
+ success: true,
113
+ configPath: result.configPath,
114
+ filesCreated: result.filesCreated,
115
+ providers: effectiveProviders,
116
+ };
117
+ }
90
118
  export async function initFromInterview(cwd, input) {
91
119
  const errors = validateInitInput(input);
92
120
  if (errors.length > 0) {
@@ -97,7 +125,6 @@ export async function initFromInterview(cwd, input) {
97
125
  const configPath = createConfig(cwd);
98
126
  filesCreated.push(configPath);
99
127
  // Read back the config and augment with interview data
100
- const { readFileSync } = await import('node:fs');
101
128
  const configData = JSON.parse(readFileSync(configPath, 'utf8'));
102
129
  configData.projectName = input.projectName;
103
130
  configData.projectId = input.projectName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
@@ -120,7 +147,7 @@ export async function initFromInterview(cwd, input) {
120
147
  }
121
148
  const examplePath = join(scorecardDir, 'sprint-1.json');
122
149
  if (!existsSync(examplePath)) {
123
- writeFileSync(examplePath, JSON.stringify(EXAMPLE_SCORECARD, null, 2) + '\n');
150
+ writeFileSync(examplePath, JSON.stringify(buildExampleScorecard(), null, 2) + '\n');
124
151
  filesCreated.push(examplePath);
125
152
  }
126
153
  // Create common issues
@@ -1 +1 @@
1
- {"version":3,"file":"interview.js","sourceRoot":"","sources":["../../src/core/interview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interview.js","sourceRoot":"","sources":["../../src/core/interview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { MetaphorDefinition } from './metaphor.js';
2
+ export interface MetaphorPreview {
3
+ id: string;
4
+ name: string;
5
+ tagline: string;
6
+ vocabulary: {
7
+ sprint: string;
8
+ ticket: string;
9
+ scorecard: string;
10
+ perfectScore: string;
11
+ onTarget: string;
12
+ review: string;
13
+ };
14
+ sampleTerms: Array<{
15
+ category: string;
16
+ key: string;
17
+ term: string;
18
+ }>;
19
+ sampleOutput: string;
20
+ }
21
+ /**
22
+ * Build a preview for a single metaphor definition.
23
+ * Uses defensive fallbacks for custom metaphors with missing optional terms.
24
+ */
25
+ export declare function buildMetaphorPreview(metaphor: MetaphorDefinition): MetaphorPreview;
26
+ /**
27
+ * Build previews for all registered metaphors.
28
+ */
29
+ export declare function buildAllPreviews(): MetaphorPreview[];
30
+ /**
31
+ * Format a preview as plain text for CLI display and agent consumption.
32
+ */
33
+ export declare function formatPreviewText(preview: MetaphorPreview): string;
34
+ //# sourceMappingURL=metaphor-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaphor-preview.d.ts","sourceRoot":"","sources":["../../src/core/metaphor-preview.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,YAAY,EAAE,MAAM,CAAC;CACtB;AAYD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,CA6ClF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,eAAe,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAsBlE"}