@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.
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +190 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/distill.d.ts.map +1 -1
- package/dist/cli/commands/distill.js +13 -4
- package/dist/cli/commands/distill.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +5 -0
- package/dist/cli/commands/docs.d.ts.map +1 -0
- package/dist/cli/commands/docs.js +303 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/enrich.d.ts +2 -0
- package/dist/cli/commands/enrich.d.ts.map +1 -0
- package/dist/cli/commands/enrich.js +140 -0
- package/dist/cli/commands/enrich.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +2 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/index-cmd.d.ts +2 -0
- package/dist/cli/commands/index-cmd.d.ts.map +1 -0
- package/dist/cli/commands/index-cmd.js +296 -0
- package/dist/cli/commands/index-cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +73 -182
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/initiative.d.ts +2 -0
- package/dist/cli/commands/initiative.d.ts.map +1 -0
- package/dist/cli/commands/initiative.js +207 -0
- package/dist/cli/commands/initiative.js.map +1 -0
- package/dist/cli/commands/loop.d.ts +2 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +388 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/prep.d.ts +2 -0
- package/dist/cli/commands/prep.d.ts.map +1 -0
- package/dist/cli/commands/prep.js +94 -0
- package/dist/cli/commands/prep.js.map +1 -0
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +134 -46
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +2 -0
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/store.js +76 -10
- package/dist/cli/commands/store.js.map +1 -1
- package/dist/cli/commands/vision.d.ts.map +1 -1
- package/dist/cli/commands/vision.js +104 -7
- package/dist/cli/commands/vision.js.map +1 -1
- package/dist/cli/guards/stop-check.d.ts +6 -1
- package/dist/cli/guards/stop-check.d.ts.map +1 -1
- package/dist/cli/guards/stop-check.js +84 -5
- package/dist/cli/guards/stop-check.js.map +1 -1
- package/dist/cli/guards/worktree-check.d.ts +14 -0
- package/dist/cli/guards/worktree-check.d.ts.map +1 -0
- package/dist/cli/guards/worktree-check.js +137 -0
- package/dist/cli/guards/worktree-check.js.map +1 -0
- package/dist/cli/index.js +56 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive-init.d.ts +19 -0
- package/dist/cli/interactive-init.d.ts.map +1 -0
- package/dist/cli/interactive-init.js +132 -0
- package/dist/cli/interactive-init.js.map +1 -0
- package/dist/cli/loop/analyze.d.ts +8 -0
- package/dist/cli/loop/analyze.d.ts.map +1 -0
- package/dist/cli/loop/analyze.js +62 -0
- package/dist/cli/loop/analyze.js.map +1 -0
- package/dist/cli/loop/backlog.d.ts +26 -0
- package/dist/cli/loop/backlog.d.ts.map +1 -0
- package/dist/cli/loop/backlog.js +95 -0
- package/dist/cli/loop/backlog.js.map +1 -0
- package/dist/cli/loop/config.d.ts +10 -0
- package/dist/cli/loop/config.d.ts.map +1 -0
- package/dist/cli/loop/config.js +75 -0
- package/dist/cli/loop/config.js.map +1 -0
- package/dist/cli/loop/continuous.d.ts +6 -0
- package/dist/cli/loop/continuous.d.ts.map +1 -0
- package/dist/cli/loop/continuous.js +108 -0
- package/dist/cli/loop/continuous.js.map +1 -0
- package/dist/cli/loop/executor.d.ts +8 -0
- package/dist/cli/loop/executor.d.ts.map +1 -0
- package/dist/cli/loop/executor.js +600 -0
- package/dist/cli/loop/executor.js.map +1 -0
- package/dist/cli/loop/guard-runner.d.ts +14 -0
- package/dist/cli/loop/guard-runner.d.ts.map +1 -0
- package/dist/cli/loop/guard-runner.js +53 -0
- package/dist/cli/loop/guard-runner.js.map +1 -0
- package/dist/cli/loop/logger.d.ts +9 -0
- package/dist/cli/loop/logger.d.ts.map +1 -0
- package/dist/cli/loop/logger.js +37 -0
- package/dist/cli/loop/logger.js.map +1 -0
- package/dist/cli/loop/model-selector.d.ts +14 -0
- package/dist/cli/loop/model-selector.d.ts.map +1 -0
- package/dist/cli/loop/model-selector.js +59 -0
- package/dist/cli/loop/model-selector.js.map +1 -0
- package/dist/cli/loop/parallel.d.ts +6 -0
- package/dist/cli/loop/parallel.d.ts.map +1 -0
- package/dist/cli/loop/parallel.js +109 -0
- package/dist/cli/loop/parallel.js.map +1 -0
- package/dist/cli/loop/pr-lifecycle.d.ts +26 -0
- package/dist/cli/loop/pr-lifecycle.d.ts.map +1 -0
- package/dist/cli/loop/pr-lifecycle.js +244 -0
- package/dist/cli/loop/pr-lifecycle.js.map +1 -0
- package/dist/cli/loop/types.d.ts +98 -0
- package/dist/cli/loop/types.d.ts.map +1 -0
- package/dist/cli/loop/types.js +37 -0
- package/dist/cli/loop/types.js.map +1 -0
- package/dist/cli/loop/worktree.d.ts +30 -0
- package/dist/cli/loop/worktree.d.ts.map +1 -0
- package/dist/cli/loop/worktree.js +134 -0
- package/dist/cli/loop/worktree.js.map +1 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +9 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/core/analyzers/stack.d.ts +2 -0
- package/dist/core/analyzers/stack.d.ts.map +1 -1
- package/dist/core/analyzers/stack.js +9 -6
- package/dist/core/analyzers/stack.js.map +1 -1
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +2 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +2 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/context.d.ts +20 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +59 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/docs.d.ts +50 -0
- package/dist/core/docs.d.ts.map +1 -0
- package/dist/core/docs.js +67 -0
- package/dist/core/docs.js.map +1 -0
- package/dist/core/embedding-client.d.ts +11 -0
- package/dist/core/embedding-client.d.ts.map +1 -0
- package/dist/core/embedding-client.js +92 -0
- package/dist/core/embedding-client.js.map +1 -0
- package/dist/core/embedding-store.d.ts +44 -0
- package/dist/core/embedding-store.d.ts.map +1 -0
- package/dist/core/embedding-store.js +7 -0
- package/dist/core/embedding-store.js.map +1 -0
- package/dist/core/embedding.d.ts +32 -0
- package/dist/core/embedding.d.ts.map +1 -0
- package/dist/core/embedding.js +114 -0
- package/dist/core/embedding.js.map +1 -0
- package/dist/core/enrich.d.ts +76 -0
- package/dist/core/enrich.d.ts.map +1 -0
- package/dist/core/enrich.js +115 -0
- package/dist/core/enrich.js.map +1 -0
- package/dist/core/generators/roadmap.d.ts +6 -1
- package/dist/core/generators/roadmap.d.ts.map +1 -1
- package/dist/core/generators/roadmap.js +150 -0
- package/dist/core/generators/roadmap.js.map +1 -1
- package/dist/core/guard.d.ts +1 -1
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js +8 -0
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +27 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +25 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/initiative.d.ts +72 -0
- package/dist/core/initiative.d.ts.map +1 -0
- package/dist/core/initiative.js +421 -0
- package/dist/core/initiative.js.map +1 -0
- package/dist/core/interview-engine.d.ts +34 -0
- package/dist/core/interview-engine.d.ts.map +1 -0
- package/dist/core/interview-engine.js +195 -0
- package/dist/core/interview-engine.js.map +1 -0
- package/dist/core/interview-steps.d.ts +27 -0
- package/dist/core/interview-steps.d.ts.map +1 -0
- package/dist/core/interview-steps.js +157 -0
- package/dist/core/interview-steps.js.map +1 -0
- package/dist/core/interview.d.ts +20 -0
- package/dist/core/interview.d.ts.map +1 -1
- package/dist/core/interview.js +61 -34
- package/dist/core/interview.js.map +1 -1
- package/dist/core/metaphor-preview.d.ts +34 -0
- package/dist/core/metaphor-preview.d.ts.map +1 -0
- package/dist/core/metaphor-preview.js +94 -0
- package/dist/core/metaphor-preview.js.map +1 -0
- package/dist/core/prep.d.ts +88 -0
- package/dist/core/prep.d.ts.map +1 -0
- package/dist/core/prep.js +302 -0
- package/dist/core/prep.js.map +1 -0
- package/dist/core/roles.d.ts +3 -0
- package/dist/core/roles.d.ts.map +1 -1
- package/dist/core/roles.js +36 -0
- package/dist/core/roles.js.map +1 -1
- package/dist/core/store.d.ts +1 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/vision.d.ts +10 -0
- package/dist/core/vision.d.ts.map +1 -1
- package/dist/core/vision.js +37 -0
- package/dist/core/vision.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +55 -7
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +44 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +12 -1
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/store/index.d.ts +26 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +193 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +25 -0
- package/dist/store-pg/index.js.map +1 -1
- 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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"}
|
package/dist/core/interview.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/core/interview.js
CHANGED
|
@@ -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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
87
|
-
*
|
|
88
|
-
*
|
|
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(
|
|
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":"AAAA,+BAA+B;AAC/B,iEAAiE;AACjE,oEAAoE;AAEpE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
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"}
|