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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wogiflow",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "AI-powered development workflow management system with multi-model support",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
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 " install Interactive setup wizard"
41
- echo " install --quick Quick setup with defaults"
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
- echo -e "${CYAN}Initializing Wogi Flow${NC}"
16
- echo "======================"
17
- echo ""
18
-
19
- # Create directories
20
- echo -e "${YELLOW}Creating directories...${NC}"
21
-
22
- dirs=(
23
- "$WORKFLOW_DIR/state/components"
24
- "$WORKFLOW_DIR/specs/capabilities"
25
- "$WORKFLOW_DIR/changes"
26
- "$WORKFLOW_DIR/archive"
27
- "$WORKFLOW_DIR/bugs"
28
- "$WORKFLOW_DIR/tests/flows"
29
- )
30
-
31
- for dir in "${dirs[@]}"; do
32
- mkdir -p "$dir"
33
- echo -e " ${GREEN}✓${NC} $dir"
34
- done
35
-
36
- # Create state files if missing
37
- echo ""
38
- echo -e "${YELLOW}Creating state files...${NC}"
39
-
40
- # config.json
41
- if [ ! -f "$WORKFLOW_DIR/config.json" ]; then
42
- cat > "$WORKFLOW_DIR/config.json" << 'EOF'
43
- {
44
- "version": "1.2",
45
- "projectName": "",
46
- "mandatorySteps": {
47
- "afterTask": [],
48
- "beforeCommit": [],
49
- "onSessionEnd": ["updateRequestLog", "updateAppMap"]
50
- },
51
- "autoLog": true,
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 STATE_DIR = TMP_DIR; // Alias for backward compatibility
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 (err) {
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 (err) {}
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 (err) {}
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 (err) {}
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 (err) {}
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 expectingTimestamp = false;
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
- expectingTimestamp = false;
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
- expectingTimestamp = true;
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
- expectingTimestamp = false;
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 (err) {
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 (err) {
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 saveTopics(t) { requireInit(); return digestCore.saveTopics(t); }
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 isVagueStatement(s) { requireInit(); return digestCore.isVagueStatement(s); }
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 STATE_DIR = TMP_DIR; // Alias for backward compatibility
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, topic) {
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 (err) {
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, options = {}) {
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 (unlinkErr) {
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
- const { writeJson } = require('./flow-utils');
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 (err) {
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 (err) {
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 (err) {
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, existingTopics) {
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 (err) {
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 (err) {
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 (err) {
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, type } of UI_PATTERNS) {
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, type } of DATA_PATTERNS) {
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, type } of INTERACTION_PATTERNS) {
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, options = {}) {
7738
+ function quickProcess(input, _options = {}) {
7741
7739
  if (!input || typeof input !== 'string') {
7742
7740
  return { error: 'No input provided' };
7743
7741
  }