wogiflow 1.0.13 → 1.0.14
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/package.json +1 -1
- package/scripts/flow +3 -7
- package/scripts/flow-init +40 -242
- package/scripts/flow-long-input-chunking.js +6 -6
- package/scripts/flow-long-input-parsing.js +6 -6
- package/scripts/flow-long-input-stories.js +7 -7
- package/scripts/flow-long-input.js +13 -15
- package/scripts/flow-onboard +38 -1242
- package/scripts/hooks/core/index.js +6 -1
- package/scripts/hooks/core/session-context.js +40 -26
- package/scripts/hooks/core/setup-check.js +153 -0
- package/scripts/postinstall.js +73 -23
- package/lib/unified-wizard.js +0 -1465
package/package.json
CHANGED
package/scripts/flow
CHANGED
|
@@ -37,9 +37,8 @@ show_help() {
|
|
|
37
37
|
echo "Usage: flow <command> [options]"
|
|
38
38
|
echo ""
|
|
39
39
|
echo "Setup & Updates:"
|
|
40
|
-
echo "
|
|
41
|
-
echo "
|
|
42
|
-
echo " onboard Analyze existing project & set up context"
|
|
40
|
+
echo " init Setup guide (directs to AI assistant)"
|
|
41
|
+
echo " onboard Project onboarding (directs to AI assistant)"
|
|
43
42
|
echo " migrate Migrate to universal CLI-agnostic structure"
|
|
44
43
|
echo " migrate --dry-run Preview migration without changes"
|
|
45
44
|
echo " update Update to latest version (preserves data)"
|
|
@@ -383,12 +382,9 @@ case "${1:-}" in
|
|
|
383
382
|
session-end)
|
|
384
383
|
node "$SCRIPT_DIR/flow-session-end.js" "${@:2}"
|
|
385
384
|
;;
|
|
386
|
-
init)
|
|
385
|
+
init|install)
|
|
387
386
|
"$SCRIPT_DIR/flow-init" "${@:2}"
|
|
388
387
|
;;
|
|
389
|
-
install)
|
|
390
|
-
"$SCRIPT_DIR/flow-install" "${@:2}"
|
|
391
|
-
;;
|
|
392
388
|
onboard)
|
|
393
389
|
"$SCRIPT_DIR/flow-onboard" "${@:2}"
|
|
394
390
|
;;
|
package/scripts/flow-init
CHANGED
|
@@ -1,253 +1,51 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
3
|
# Wogi Flow - Initialize Workflow
|
|
4
|
-
|
|
5
|
-
set -e
|
|
4
|
+
# This script redirects to AI-driven setup
|
|
6
5
|
|
|
7
6
|
WORKFLOW_DIR=".workflow"
|
|
8
7
|
|
|
9
8
|
# Colors
|
|
10
|
-
GREEN='\033[0;32m'
|
|
11
|
-
YELLOW='\033[1;33m'
|
|
12
9
|
CYAN='\033[0;36m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
GREEN='\033[0;32m'
|
|
13
12
|
NC='\033[0m'
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
echo ""
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
echo
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"$
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
echo ""
|
|
38
|
-
echo -e "${
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
{
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"autoUpdateAppMap": true,
|
|
53
|
-
"qualityGates": {
|
|
54
|
-
"feature": {
|
|
55
|
-
"require": ["tests", "appMapUpdate", "requestLogEntry"],
|
|
56
|
-
"optional": ["review", "docs"]
|
|
57
|
-
},
|
|
58
|
-
"bugfix": {
|
|
59
|
-
"require": ["tests", "requestLogEntry"],
|
|
60
|
-
"optional": ["review"]
|
|
61
|
-
},
|
|
62
|
-
"refactor": {
|
|
63
|
-
"require": ["tests", "noNewFeatures"],
|
|
64
|
-
"optional": ["review"]
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
"requireApproval": [],
|
|
68
|
-
"componentRules": {
|
|
69
|
-
"preferVariants": true,
|
|
70
|
-
"requireAppMapEntry": true,
|
|
71
|
-
"requireDetailDoc": false
|
|
72
|
-
},
|
|
73
|
-
"testing": {
|
|
74
|
-
"runAfterTask": false,
|
|
75
|
-
"runBeforeCommit": false,
|
|
76
|
-
"browserTests": false
|
|
77
|
-
},
|
|
78
|
-
"agents": {
|
|
79
|
-
"enabled": ["orchestrator", "developer", "reviewer", "tester"],
|
|
80
|
-
"optional": ["accessibility", "security", "performance", "docs", "design-system", "onboarding"]
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
EOF
|
|
84
|
-
echo -e " ${GREEN}✓${NC} config.json"
|
|
85
|
-
else
|
|
86
|
-
echo -e " ${YELLOW}○${NC} config.json (exists)"
|
|
87
|
-
fi
|
|
88
|
-
|
|
89
|
-
# ready.json
|
|
90
|
-
if [ ! -f "$WORKFLOW_DIR/state/ready.json" ]; then
|
|
91
|
-
cat > "$WORKFLOW_DIR/state/ready.json" << 'EOF'
|
|
92
|
-
{
|
|
93
|
-
"lastUpdated": "",
|
|
94
|
-
"ready": [],
|
|
95
|
-
"inProgress": [],
|
|
96
|
-
"blocked": [],
|
|
97
|
-
"recentlyCompleted": []
|
|
98
|
-
}
|
|
99
|
-
EOF
|
|
100
|
-
echo -e " ${GREEN}✓${NC} ready.json"
|
|
101
|
-
else
|
|
102
|
-
echo -e " ${YELLOW}○${NC} ready.json (exists)"
|
|
103
|
-
fi
|
|
104
|
-
|
|
105
|
-
# request-log.md
|
|
106
|
-
if [ ! -f "$WORKFLOW_DIR/state/request-log.md" ]; then
|
|
107
|
-
cat > "$WORKFLOW_DIR/state/request-log.md" << 'EOF'
|
|
108
|
-
# Request Log
|
|
109
|
-
|
|
110
|
-
Automatic log of all requests that changed files. Searchable by tags.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
EOF
|
|
115
|
-
echo -e " ${GREEN}✓${NC} request-log.md"
|
|
116
|
-
else
|
|
117
|
-
echo -e " ${YELLOW}○${NC} request-log.md (exists)"
|
|
118
|
-
fi
|
|
119
|
-
|
|
120
|
-
# app-map.md
|
|
121
|
-
if [ ! -f "$WORKFLOW_DIR/state/app-map.md" ]; then
|
|
122
|
-
cat > "$WORKFLOW_DIR/state/app-map.md" << 'EOF'
|
|
123
|
-
# App Map
|
|
124
|
-
|
|
125
|
-
Quick reference of all screens and components. Check before creating anything new.
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Screens
|
|
130
|
-
|
|
131
|
-
| Screen | Route | Status |
|
|
132
|
-
|--------|-------|--------|
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## Modals
|
|
137
|
-
|
|
138
|
-
| Modal | Trigger | Status |
|
|
139
|
-
|-------|---------|--------|
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## Components
|
|
144
|
-
|
|
145
|
-
| Component | Variants | Path | Details |
|
|
146
|
-
|-----------|----------|------|---------|
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
EOF
|
|
150
|
-
echo -e " ${GREEN}✓${NC} app-map.md"
|
|
151
|
-
else
|
|
152
|
-
echo -e " ${YELLOW}○${NC} app-map.md (exists)"
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
# decisions.md
|
|
156
|
-
if [ ! -f "$WORKFLOW_DIR/state/decisions.md" ]; then
|
|
157
|
-
cat > "$WORKFLOW_DIR/state/decisions.md" << 'EOF'
|
|
158
|
-
# Project Decisions
|
|
159
|
-
|
|
160
|
-
Project-specific rules that agents must follow.
|
|
161
|
-
|
|
162
|
-
---
|
|
163
|
-
|
|
164
|
-
## Component Architecture
|
|
165
|
-
|
|
166
|
-
### Component Reuse Policy
|
|
167
|
-
**Rule**: Always check `app-map.md` before creating any component.
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## Coding Standards
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## UI/UX Decisions
|
|
176
|
-
|
|
177
|
-
---
|
|
178
|
-
EOF
|
|
179
|
-
echo -e " ${GREEN}✓${NC} decisions.md"
|
|
180
|
-
else
|
|
181
|
-
echo -e " ${YELLOW}○${NC} decisions.md (exists)"
|
|
182
|
-
fi
|
|
183
|
-
|
|
184
|
-
# progress.md
|
|
185
|
-
if [ ! -f "$WORKFLOW_DIR/state/progress.md" ]; then
|
|
186
|
-
cat > "$WORKFLOW_DIR/state/progress.md" << 'EOF'
|
|
187
|
-
# Progress & Handoff Notes
|
|
188
|
-
|
|
189
|
-
## Last Updated
|
|
190
|
-
|
|
191
|
-
## Last Session
|
|
192
|
-
|
|
193
|
-
## In Progress
|
|
194
|
-
|
|
195
|
-
## Next
|
|
196
|
-
|
|
197
|
-
## Blockers
|
|
198
|
-
EOF
|
|
199
|
-
echo -e " ${GREEN}✓${NC} progress.md"
|
|
200
|
-
else
|
|
201
|
-
echo -e " ${YELLOW}○${NC} progress.md (exists)"
|
|
202
|
-
fi
|
|
203
|
-
|
|
204
|
-
# feedback-patterns.md
|
|
205
|
-
if [ ! -f "$WORKFLOW_DIR/state/feedback-patterns.md" ]; then
|
|
206
|
-
cat > "$WORKFLOW_DIR/state/feedback-patterns.md" << 'EOF'
|
|
207
|
-
# Feedback Patterns
|
|
208
|
-
|
|
209
|
-
Tracks corrections to identify patterns for workflow improvement.
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Patterns Log
|
|
214
|
-
|
|
215
|
-
| Date | Correction | Count | Promoted To | Status |
|
|
216
|
-
|------|------------|-------|-------------|--------|
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
EOF
|
|
220
|
-
echo -e " ${GREEN}✓${NC} feedback-patterns.md"
|
|
221
|
-
else
|
|
222
|
-
echo -e " ${YELLOW}○${NC} feedback-patterns.md (exists)"
|
|
223
|
-
fi
|
|
224
|
-
|
|
225
|
-
# project.md
|
|
226
|
-
if [ ! -f "$WORKFLOW_DIR/specs/project.md" ]; then
|
|
227
|
-
cat > "$WORKFLOW_DIR/specs/project.md" << 'EOF'
|
|
228
|
-
# Project Overview
|
|
229
|
-
|
|
230
|
-
## Summary
|
|
231
|
-
[Brief description]
|
|
232
|
-
|
|
233
|
-
## Users
|
|
234
|
-
[Who uses this]
|
|
235
|
-
|
|
236
|
-
## Features
|
|
237
|
-
[Main features]
|
|
238
|
-
|
|
239
|
-
## Tech Stack
|
|
240
|
-
[Technologies used]
|
|
241
|
-
EOF
|
|
242
|
-
echo -e " ${GREEN}✓${NC} specs/project.md"
|
|
243
|
-
else
|
|
244
|
-
echo -e " ${YELLOW}○${NC} specs/project.md (exists)"
|
|
245
|
-
fi
|
|
246
|
-
|
|
247
|
-
echo ""
|
|
248
|
-
echo -e "${GREEN}✓ Wogi Flow initialized!${NC}"
|
|
14
|
+
# Check if already initialized
|
|
15
|
+
if [ -f "$WORKFLOW_DIR/config.json" ]; then
|
|
16
|
+
echo -e "${CYAN}WogiFlow:${NC} Already initialized."
|
|
17
|
+
echo ""
|
|
18
|
+
echo "Run ${YELLOW}flow status${NC} to see project state."
|
|
19
|
+
echo "Run ${YELLOW}flow health${NC} to check workflow health."
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Check if pending-setup.json exists (postinstall created it)
|
|
24
|
+
if [ -f "$WORKFLOW_DIR/state/pending-setup.json" ]; then
|
|
25
|
+
echo -e "${CYAN}WogiFlow:${NC} Setup pending."
|
|
26
|
+
echo ""
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Direct users to AI assistant
|
|
30
|
+
echo -e "${CYAN}╔══════════════════════════════════════════════════════════════╗${NC}"
|
|
31
|
+
echo -e "${CYAN}║${NC} ${GREEN}WogiFlow Setup${NC} ${CYAN}║${NC}"
|
|
32
|
+
echo -e "${CYAN}╠══════════════════════════════════════════════════════════════╣${NC}"
|
|
33
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
34
|
+
echo -e "${CYAN}║${NC} WogiFlow setup is handled by your AI assistant. ${CYAN}║${NC}"
|
|
35
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
36
|
+
echo -e "${CYAN}║${NC} ${YELLOW}Start your AI assistant:${NC} ${CYAN}║${NC}"
|
|
37
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
38
|
+
echo -e "${CYAN}║${NC} ${GREEN}claude${NC} (Claude Code) ${CYAN}║${NC}"
|
|
39
|
+
echo -e "${CYAN}║${NC} ${GREEN}gemini${NC} (Gemini CLI) ${CYAN}║${NC}"
|
|
40
|
+
echo -e "${CYAN}║${NC} ${GREEN}opencode${NC} (OpenCode) ${CYAN}║${NC}"
|
|
41
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
42
|
+
echo -e "${CYAN}║${NC} Then say: ${YELLOW}\"setup wogiflow\"${NC} or run ${YELLOW}/wogi-init${NC} ${CYAN}║${NC}"
|
|
43
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
44
|
+
echo -e "${CYAN}║${NC} The AI will guide you through: ${CYAN}║${NC}"
|
|
45
|
+
echo -e "${CYAN}║${NC} • Project name confirmation ${CYAN}║${NC}"
|
|
46
|
+
echo -e "${CYAN}║${NC} • Tech stack selection ${CYAN}║${NC}"
|
|
47
|
+
echo -e "${CYAN}║${NC} • Importing patterns from other projects ${CYAN}║${NC}"
|
|
48
|
+
echo -e "${CYAN}║${NC} • Generating skills and rules ${CYAN}║${NC}"
|
|
49
|
+
echo -e "${CYAN}║${NC} ${CYAN}║${NC}"
|
|
50
|
+
echo -e "${CYAN}╚══════════════════════════════════════════════════════════════╝${NC}"
|
|
249
51
|
echo ""
|
|
250
|
-
echo "Next steps:"
|
|
251
|
-
echo " 1. Edit .workflow/specs/project.md with project details"
|
|
252
|
-
echo " 2. Run: ./scripts/flow health"
|
|
253
|
-
echo " 3. Start working: ./scripts/flow ready"
|
|
@@ -39,7 +39,7 @@ function measureInputMetrics(t) { requireInit(); return digestCore.measureInputM
|
|
|
39
39
|
|
|
40
40
|
// Paths - temp processing files, cleaned up after completion
|
|
41
41
|
const TMP_DIR = path.join(process.cwd(), '.workflow', 'tmp', 'long-input');
|
|
42
|
-
const
|
|
42
|
+
const _STATE_DIR = TMP_DIR; // Alias for backward compatibility (kept for reference)
|
|
43
43
|
|
|
44
44
|
// ==========================================================================
|
|
45
45
|
// E5-S3: Durable Digest Session Persistence
|
|
@@ -62,7 +62,7 @@ function loadDurableSessions() {
|
|
|
62
62
|
|
|
63
63
|
try {
|
|
64
64
|
return JSON.parse(fs.readFileSync(DURABLE_DIGEST_PATH, 'utf8'));
|
|
65
|
-
} catch (
|
|
65
|
+
} catch (_err) {
|
|
66
66
|
return {
|
|
67
67
|
version: DURABLE_DIGEST_VERSION,
|
|
68
68
|
sessions: [],
|
|
@@ -134,7 +134,7 @@ function getSessionProgress(digestPath) {
|
|
|
134
134
|
progress.topics_count = topics.topics?.length || 0;
|
|
135
135
|
progress.passes_completed.push('topics');
|
|
136
136
|
progress.phase = 'topics';
|
|
137
|
-
} catch (
|
|
137
|
+
} catch (_err) { /* ignore parse errors */ }
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
// Check statements
|
|
@@ -145,7 +145,7 @@ function getSessionProgress(digestPath) {
|
|
|
145
145
|
progress.statements_count = stmtMap.statements?.length || 0;
|
|
146
146
|
progress.passes_completed.push('statements');
|
|
147
147
|
progress.phase = 'statements';
|
|
148
|
-
} catch (
|
|
148
|
+
} catch (_err) { /* ignore parse errors */ }
|
|
149
149
|
}
|
|
150
150
|
|
|
151
151
|
// Check orphans pass
|
|
@@ -164,7 +164,7 @@ function getSessionProgress(digestPath) {
|
|
|
164
164
|
progress.questions_total = clar.questions?.length || 0;
|
|
165
165
|
progress.questions_answered = clar.questions?.filter(q => q.status === 'answered')?.length || 0;
|
|
166
166
|
progress.phase = 'clarification';
|
|
167
|
-
} catch (
|
|
167
|
+
} catch (_err) { /* ignore parse errors */ }
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
// Check stories
|
|
@@ -175,7 +175,7 @@ function getSessionProgress(digestPath) {
|
|
|
175
175
|
progress.stories_generated = stories.stories?.length || 0;
|
|
176
176
|
progress.stories_approved = stories.stories?.filter(s => s.approval_status === 'approved')?.length || 0;
|
|
177
177
|
progress.phase = 'stories';
|
|
178
|
-
} catch (
|
|
178
|
+
} catch (_err) { /* ignore parse errors */ }
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
// Check queue for presentation phase
|
|
@@ -292,7 +292,7 @@ function parseSRT(content) {
|
|
|
292
292
|
const lines = content.split('\n');
|
|
293
293
|
const cues = [];
|
|
294
294
|
let currentCue = null;
|
|
295
|
-
let
|
|
295
|
+
let _expectingTimestamp = false;
|
|
296
296
|
|
|
297
297
|
try {
|
|
298
298
|
for (let i = 0; i < lines.length; i++) {
|
|
@@ -303,14 +303,14 @@ function parseSRT(content) {
|
|
|
303
303
|
if (currentCue && currentCue.textLines.length > 0) {
|
|
304
304
|
cues.push(finalizeCue(currentCue));
|
|
305
305
|
currentCue = null;
|
|
306
|
-
|
|
306
|
+
_expectingTimestamp = false;
|
|
307
307
|
}
|
|
308
308
|
continue;
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
// Check for cue number
|
|
312
312
|
if (/^\d+$/.test(line) && !currentCue) {
|
|
313
|
-
|
|
313
|
+
_expectingTimestamp = true;
|
|
314
314
|
continue;
|
|
315
315
|
}
|
|
316
316
|
|
|
@@ -329,7 +329,7 @@ function parseSRT(content) {
|
|
|
329
329
|
textLines: [],
|
|
330
330
|
rawLines: []
|
|
331
331
|
};
|
|
332
|
-
|
|
332
|
+
_expectingTimestamp = false;
|
|
333
333
|
continue;
|
|
334
334
|
}
|
|
335
335
|
|
|
@@ -815,7 +815,7 @@ function parseTeamsJSON(content, options = {}) {
|
|
|
815
815
|
let data;
|
|
816
816
|
try {
|
|
817
817
|
data = JSON.parse(content);
|
|
818
|
-
} catch (
|
|
818
|
+
} catch (_err) {
|
|
819
819
|
return { error: 'Invalid JSON format', format: 'unknown' };
|
|
820
820
|
}
|
|
821
821
|
|
|
@@ -870,7 +870,7 @@ function detectMeetingType(content) {
|
|
|
870
870
|
try {
|
|
871
871
|
JSON.parse(trimmed);
|
|
872
872
|
return 'teams_json';
|
|
873
|
-
} catch (
|
|
873
|
+
} catch (_err) {
|
|
874
874
|
// Not valid JSON
|
|
875
875
|
}
|
|
876
876
|
}
|
|
@@ -45,16 +45,16 @@ function requireInit() {
|
|
|
45
45
|
function loadActiveDigest() { requireInit(); return digestCore.loadActiveDigest(); }
|
|
46
46
|
function saveActiveDigest(d) { requireInit(); return digestCore.saveActiveDigest(d); }
|
|
47
47
|
function loadTopics() { requireInit(); return digestCore.loadTopics(); }
|
|
48
|
-
function
|
|
48
|
+
function _saveTopics(t) { requireInit(); return digestCore.saveTopics(t); } // Available if needed
|
|
49
49
|
function loadStatementMap() { requireInit(); return digestCore.loadStatementMap(); }
|
|
50
50
|
function loadClarifications() { requireInit(); return digestCore.loadClarifications(); }
|
|
51
51
|
function isRequirement(s) { requireInit(); return digestCore.isRequirement(s); }
|
|
52
|
-
function
|
|
52
|
+
function _isVagueStatement(s) { requireInit(); return digestCore.isVagueStatement(s); } // Available if needed
|
|
53
53
|
function analyzeComplexity() { requireInit(); return digestCore.analyzeComplexity(); }
|
|
54
54
|
|
|
55
55
|
// Temp directory for processing (cleaned up after completion)
|
|
56
56
|
const TMP_DIR = path.join(process.cwd(), '.workflow', 'tmp', 'long-input');
|
|
57
|
-
const
|
|
57
|
+
const _STATE_DIR = TMP_DIR; // Alias for backward compatibility (kept for reference)
|
|
58
58
|
|
|
59
59
|
// ==========================================================================
|
|
60
60
|
// E3-S2: Story Generation with Source Tracing
|
|
@@ -283,7 +283,7 @@ function extractThen(requirement) {
|
|
|
283
283
|
/**
|
|
284
284
|
* Generate criteria from clarification answers
|
|
285
285
|
*/
|
|
286
|
-
function generateCriteriaFromClarification(clarification,
|
|
286
|
+
function generateCriteriaFromClarification(clarification, _topic) {
|
|
287
287
|
const criteria = [];
|
|
288
288
|
const question = (clarification.question || '').toLowerCase();
|
|
289
289
|
const answer = clarification.answer || '';
|
|
@@ -604,7 +604,7 @@ function loadAllStories() {
|
|
|
604
604
|
try {
|
|
605
605
|
const files = fs.readdirSync(storiesPath).filter(f => f.endsWith('.json'));
|
|
606
606
|
return files.map(f => safeJsonParse(path.join(storiesPath, f), null)).filter(Boolean);
|
|
607
|
-
} catch (
|
|
607
|
+
} catch (_err) {
|
|
608
608
|
return [];
|
|
609
609
|
}
|
|
610
610
|
}
|
|
@@ -1916,7 +1916,7 @@ function createFeatureTask(stories, featureName) {
|
|
|
1916
1916
|
/**
|
|
1917
1917
|
* Add tasks to ready.json
|
|
1918
1918
|
*/
|
|
1919
|
-
function addTasksToReadyJson(tasks,
|
|
1919
|
+
function addTasksToReadyJson(tasks, _options = {}) {
|
|
1920
1920
|
const readyPath = path.join(process.cwd(), '.workflow', 'state', 'ready.json');
|
|
1921
1921
|
|
|
1922
1922
|
const defaultReady = {
|
|
@@ -2143,7 +2143,7 @@ function cleanupTempFiles(digestId) {
|
|
|
2143
2143
|
if (active && active.session?.digest_id === digestId) {
|
|
2144
2144
|
try {
|
|
2145
2145
|
fs.unlinkSync(activeFile);
|
|
2146
|
-
} catch (
|
|
2146
|
+
} catch (_unlinkErr) {
|
|
2147
2147
|
// Ignore errors unlinking active file - main cleanup succeeded
|
|
2148
2148
|
}
|
|
2149
2149
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
const fs = require('fs');
|
|
17
17
|
const path = require('path');
|
|
18
18
|
const crypto = require('crypto');
|
|
19
|
-
|
|
19
|
+
// Note: writeJson available from flow-utils if needed
|
|
20
20
|
|
|
21
21
|
// Import extracted modules (renamed from transcript-* to long-input-*)
|
|
22
22
|
const transcriptParsing = require('./flow-long-input-parsing');
|
|
@@ -74,7 +74,7 @@ const {
|
|
|
74
74
|
loadStory,
|
|
75
75
|
loadAllStories,
|
|
76
76
|
formatStoryAsMarkdown,
|
|
77
|
-
initializePresentation
|
|
77
|
+
// initializePresentation - available if needed
|
|
78
78
|
getPresentationStatus,
|
|
79
79
|
getNextStory,
|
|
80
80
|
getCurrentStory,
|
|
@@ -126,7 +126,7 @@ function loadConfig() {
|
|
|
126
126
|
try {
|
|
127
127
|
const config = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
128
128
|
return config.transcriptDigestion || {};
|
|
129
|
-
} catch (
|
|
129
|
+
} catch (_err) {
|
|
130
130
|
return {};
|
|
131
131
|
}
|
|
132
132
|
}
|
|
@@ -151,7 +151,7 @@ function now() {
|
|
|
151
151
|
function loadActiveDigest() {
|
|
152
152
|
try {
|
|
153
153
|
return JSON.parse(fs.readFileSync(ACTIVE_DIGEST_FILE, 'utf8'));
|
|
154
|
-
} catch (
|
|
154
|
+
} catch (_err) {
|
|
155
155
|
return { session: { status: 'inactive' } };
|
|
156
156
|
}
|
|
157
157
|
}
|
|
@@ -658,7 +658,7 @@ function loadStatementMap() {
|
|
|
658
658
|
const mapPath = path.join(activeDigest.session.digest_path, 'statement-map.json');
|
|
659
659
|
try {
|
|
660
660
|
return JSON.parse(fs.readFileSync(mapPath, 'utf8'));
|
|
661
|
-
} catch (
|
|
661
|
+
} catch (_err) {
|
|
662
662
|
return null;
|
|
663
663
|
}
|
|
664
664
|
}
|
|
@@ -854,7 +854,7 @@ function resolveOrphan(orphan, topics) {
|
|
|
854
854
|
/**
|
|
855
855
|
* Create a new topic from orphan statements
|
|
856
856
|
*/
|
|
857
|
-
function createTopicFromOrphans(orphans,
|
|
857
|
+
function createTopicFromOrphans(orphans, _existingTopics) {
|
|
858
858
|
// Guard against empty orphans array
|
|
859
859
|
if (!orphans || orphans.length === 0) {
|
|
860
860
|
const topicId = 't-auto-' + crypto.randomBytes(3).toString('hex');
|
|
@@ -959,7 +959,7 @@ function loadOrphans() {
|
|
|
959
959
|
const orphansPath = path.join(activeDigest.session.digest_path, 'orphans.json');
|
|
960
960
|
try {
|
|
961
961
|
return JSON.parse(fs.readFileSync(orphansPath, 'utf8'));
|
|
962
|
-
} catch (
|
|
962
|
+
} catch (_err) {
|
|
963
963
|
return null;
|
|
964
964
|
}
|
|
965
965
|
}
|
|
@@ -1345,7 +1345,7 @@ function loadClarifications() {
|
|
|
1345
1345
|
const clarPath = path.join(activeDigest.session.digest_path, 'clarifications.json');
|
|
1346
1346
|
try {
|
|
1347
1347
|
return JSON.parse(fs.readFileSync(clarPath, 'utf8'));
|
|
1348
|
-
} catch (
|
|
1348
|
+
} catch (_err) {
|
|
1349
1349
|
return {
|
|
1350
1350
|
questions: [],
|
|
1351
1351
|
contradictions: [],
|
|
@@ -3621,7 +3621,7 @@ function loadTopics() {
|
|
|
3621
3621
|
const topicsPath = path.join(activeDigest.session.digest_path, 'topics.json');
|
|
3622
3622
|
try {
|
|
3623
3623
|
return JSON.parse(fs.readFileSync(topicsPath, 'utf8'));
|
|
3624
|
-
} catch (
|
|
3624
|
+
} catch (_err) {
|
|
3625
3625
|
return null;
|
|
3626
3626
|
}
|
|
3627
3627
|
}
|
|
@@ -3676,8 +3676,6 @@ function shouldTriggerDigestion(text) {
|
|
|
3676
3676
|
* Basic content classification
|
|
3677
3677
|
*/
|
|
3678
3678
|
function classifyContent(text) {
|
|
3679
|
-
const lowerText = text.toLowerCase();
|
|
3680
|
-
|
|
3681
3679
|
// Check for code patterns
|
|
3682
3680
|
const codePatterns = [
|
|
3683
3681
|
/```[\s\S]*```/g,
|
|
@@ -4496,7 +4494,7 @@ function extractEntities(statements) {
|
|
|
4496
4494
|
if (!statement.text) continue;
|
|
4497
4495
|
|
|
4498
4496
|
// Check UI patterns
|
|
4499
|
-
for (const { pattern
|
|
4497
|
+
for (const { pattern } of UI_PATTERNS) {
|
|
4500
4498
|
const match = statement.text.match(pattern);
|
|
4501
4499
|
if (match) {
|
|
4502
4500
|
entities.ui_components.add(match[1].toLowerCase());
|
|
@@ -4504,7 +4502,7 @@ function extractEntities(statements) {
|
|
|
4504
4502
|
}
|
|
4505
4503
|
|
|
4506
4504
|
// Check data patterns
|
|
4507
|
-
for (const { pattern
|
|
4505
|
+
for (const { pattern } of DATA_PATTERNS) {
|
|
4508
4506
|
const match = statement.text.match(pattern);
|
|
4509
4507
|
if (match) {
|
|
4510
4508
|
entities.data_entities.add(match[1].toLowerCase());
|
|
@@ -4512,7 +4510,7 @@ function extractEntities(statements) {
|
|
|
4512
4510
|
}
|
|
4513
4511
|
|
|
4514
4512
|
// Check interaction patterns
|
|
4515
|
-
for (const { pattern
|
|
4513
|
+
for (const { pattern } of INTERACTION_PATTERNS) {
|
|
4516
4514
|
const match = statement.text.match(pattern);
|
|
4517
4515
|
if (match) {
|
|
4518
4516
|
entities.interactions.add(match[1].toLowerCase());
|
|
@@ -7737,7 +7735,7 @@ ${c.dim}Examples:${c.reset}
|
|
|
7737
7735
|
* @param {Object} options - Processing options
|
|
7738
7736
|
* @returns {Object} Quick scan results
|
|
7739
7737
|
*/
|
|
7740
|
-
function quickProcess(input,
|
|
7738
|
+
function quickProcess(input, _options = {}) {
|
|
7741
7739
|
if (!input || typeof input !== 'string') {
|
|
7742
7740
|
return { error: 'No input provided' };
|
|
7743
7741
|
}
|