myaidev-method 0.2.15 → 0.2.17

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.
@@ -52,14 +52,20 @@ async function getVertexAIToken() {
52
52
 
53
53
  // Pricing (USD per image/video) - GPT-Image-1 pricing
54
54
  const PRICING = {
55
- gemini: 0.02, // Gemini 2.5 Flash Image
56
- imagen: 0.03, // Imagen 3
55
+ gemini: 0.02, // Gemini 2.5 Flash Image (direct Google API)
56
+ imagen: 0.03, // Imagen 3 (direct Google API)
57
57
  dalle_low: 0.02, // GPT-Image-1 low quality
58
58
  dalle_medium: 0.07, // GPT-Image-1 medium quality
59
59
  dalle_standard: 0.07, // GPT-Image-1 medium quality (alias for standard)
60
60
  dalle_high: 0.19, // GPT-Image-1 high quality
61
61
  dalle_hd: 0.19, // GPT-Image-1 high quality (alias for hd)
62
- veo: 0.10 // Veo 2 (estimated per video)
62
+ veo: 0.10, // Veo 2 (estimated per video)
63
+ // Fal.ai pricing
64
+ flux_pro: 0.06, // FLUX Pro v1.1 Ultra
65
+ flux_dev: 0.025, // FLUX Dev (per megapixel)
66
+ veo3: 0.40, // Veo 3 (per second)
67
+ gemini_fal: 0.0398, // Gemini via fal.ai (fallback)
68
+ imagen_fal: 0.05 // Imagen via fal.ai (fallback)
63
69
  };
64
70
 
65
71
  /**
@@ -74,9 +80,11 @@ const PRICING = {
74
80
  export function validateAPIKeys() {
75
81
  const googleKey = process.env.GOOGLE_API_KEY;
76
82
  const openaiKey = process.env.OPENAI_API_KEY;
83
+ const falKey = process.env.FAL_KEY;
77
84
 
78
85
  const hasGoogle = !!(googleKey && googleKey.length > 20);
79
86
  const hasOpenAI = !!(openaiKey && openaiKey.length > 20);
87
+ const hasFal = !!(falKey && falKey.length > 20);
80
88
 
81
89
  const availableServices = [];
82
90
  if (hasGoogle) {
@@ -85,11 +93,15 @@ export function validateAPIKeys() {
85
93
  if (hasOpenAI) {
86
94
  availableServices.push('dalle');
87
95
  }
96
+ if (hasFal) {
97
+ availableServices.push('flux', 'flux-pro', 'flux-dev', 'veo3');
98
+ }
88
99
 
89
100
  return {
90
101
  hasGoogle,
91
102
  hasOpenAI,
92
- hasAny: hasGoogle || hasOpenAI,
103
+ hasFal,
104
+ hasAny: hasGoogle || hasOpenAI || hasFal,
93
105
  availableServices
94
106
  };
95
107
  }
@@ -127,6 +139,17 @@ export function estimateCost(service, options = {}) {
127
139
  case 'veo':
128
140
  return PRICING.veo;
129
141
 
142
+ case 'flux':
143
+ case 'flux-pro':
144
+ return PRICING.flux_pro;
145
+
146
+ case 'flux-dev':
147
+ return PRICING.flux_dev;
148
+
149
+ case 'veo3':
150
+ case 'veo3-fast':
151
+ return PRICING.veo3; // per second, will multiply by duration
152
+
130
153
  default:
131
154
  return 0;
132
155
  }
@@ -514,6 +537,182 @@ export async function generateVideoVeo(prompt, options = {}) {
514
537
  throw lastError;
515
538
  }
516
539
 
540
+ /**
541
+ * Generate image using Fal.ai
542
+ * Access to FLUX and other premium models
543
+ *
544
+ * @param {string} prompt - Image description
545
+ * @param {Object} options - Generation options
546
+ * @param {string} options.model - Fal.ai model (flux-pro, flux-dev, nano-banana, imagen-3-fast)
547
+ * @param {string} options.size - Image size
548
+ * @param {number} options.maxRetries - Maximum retry attempts
549
+ * @returns {Promise<Object>} Generated image data
550
+ */
551
+ export async function generateImageFal(prompt, options = {}) {
552
+ const {
553
+ model = 'flux-pro',
554
+ size = '1024x1024',
555
+ maxRetries = 3
556
+ } = options;
557
+
558
+ const apiKey = process.env.FAL_KEY;
559
+ if (!apiKey) {
560
+ throw new Error('FAL_KEY not configured. Get your key from https://fal.ai/dashboard/keys');
561
+ }
562
+
563
+ // Import fal.ai client
564
+ const { fal } = await import('@fal-ai/client');
565
+
566
+ // Configure credentials
567
+ fal.config({ credentials: apiKey });
568
+
569
+ // Map model names to fal.ai endpoints
570
+ const modelMap = {
571
+ 'flux-pro': 'fal-ai/flux-pro/v1.1-ultra',
572
+ 'flux-dev': 'fal-ai/flux/dev',
573
+ 'nano-banana': 'fal-ai/nano-banana',
574
+ 'imagen-3-fast': 'fal-ai/fast-imagen'
575
+ };
576
+
577
+ const endpoint = modelMap[model] || modelMap['flux-pro'];
578
+
579
+ let lastError;
580
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
581
+ try {
582
+ const result = await fal.subscribe(endpoint, {
583
+ input: {
584
+ prompt: prompt,
585
+ image_size: size === '1024x1024' ? 'square' : 'landscape',
586
+ num_images: 1
587
+ },
588
+ logs: false
589
+ });
590
+
591
+ // Fal.ai can return images in different formats
592
+ let imageUrl;
593
+ let contentType = 'image/png';
594
+
595
+ if (result.data && result.data.images && result.data.images[0]) {
596
+ imageUrl = result.data.images[0].url;
597
+ contentType = result.data.images[0].content_type || 'image/png';
598
+ } else if (result.images && result.images[0]) {
599
+ imageUrl = result.images[0].url;
600
+ contentType = result.images[0].content_type || 'image/png';
601
+ } else if (result.image && result.image.url) {
602
+ imageUrl = result.image.url;
603
+ } else if (result.data && result.data[0] && result.data[0].url) {
604
+ imageUrl = result.data[0].url;
605
+ } else if (typeof result === 'string') {
606
+ imageUrl = result;
607
+ }
608
+
609
+ if (imageUrl) {
610
+ // Fal.ai returns URL, need to fetch and convert to base64
611
+ const imageResponse = await fetch(imageUrl);
612
+ const imageBuffer = await imageResponse.arrayBuffer();
613
+ const base64Data = Buffer.from(imageBuffer).toString('base64');
614
+
615
+ return {
616
+ data: base64Data,
617
+ mimeType: contentType,
618
+ service: 'fal',
619
+ model: model,
620
+ cost: PRICING[`${model.replace('-', '_')}`] || PRICING.flux_pro
621
+ };
622
+ }
623
+
624
+ throw new Error('No image data in Fal.ai response');
625
+
626
+ } catch (error) {
627
+ lastError = error;
628
+
629
+ if (attempt < maxRetries) {
630
+ const backoff = Math.pow(2, attempt) * 1000;
631
+ console.log(`⚠️ Fal.ai attempt ${attempt} failed. Retrying in ${backoff/1000}s...`);
632
+ await sleep(backoff);
633
+ }
634
+ }
635
+ }
636
+
637
+ throw lastError;
638
+ }
639
+
640
+ /**
641
+ * Generate video using Fal.ai (Veo 3)
642
+ * Latest video generation models
643
+ *
644
+ * @param {string} prompt - Video description
645
+ * @param {Object} options - Generation options
646
+ * @param {string} options.model - Model (veo3, veo3-fast)
647
+ * @param {number} options.duration - Video duration in seconds
648
+ * @param {string} options.aspectRatio - Aspect ratio
649
+ * @param {number} options.maxRetries - Maximum retry attempts
650
+ * @returns {Promise<Object>} Generated video data
651
+ */
652
+ export async function generateVideoFal(prompt, options = {}) {
653
+ const {
654
+ model = 'veo3',
655
+ duration = 5,
656
+ aspectRatio = '16:9',
657
+ maxRetries = 3
658
+ } = options;
659
+
660
+ const apiKey = process.env.FAL_KEY;
661
+ if (!apiKey) {
662
+ throw new Error('FAL_KEY not configured. Get your key from https://fal.ai/dashboard/keys');
663
+ }
664
+
665
+ // Import fal.ai client
666
+ const { fal } = await import('@fal-ai/client');
667
+
668
+ // Configure credentials
669
+ fal.config({ credentials: apiKey });
670
+
671
+ const endpoint = model === 'veo3-fast' ? 'fal-ai/veo3-fast' : 'fal-ai/veo3';
672
+
673
+ let lastError;
674
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
675
+ try {
676
+ const result = await fal.subscribe(endpoint, {
677
+ input: {
678
+ prompt: prompt,
679
+ duration: Math.min(duration, 10),
680
+ aspect_ratio: aspectRatio
681
+ },
682
+ logs: false
683
+ });
684
+
685
+ if (result.video && result.video.url) {
686
+ // Fal.ai returns video URL
687
+ const videoResponse = await fetch(result.video.url);
688
+ const videoBuffer = await videoResponse.arrayBuffer();
689
+ const base64Data = Buffer.from(videoBuffer).toString('base64');
690
+
691
+ return {
692
+ data: base64Data,
693
+ mimeType: 'video/mp4',
694
+ service: 'fal',
695
+ model: model,
696
+ cost: PRICING.veo3 * duration
697
+ };
698
+ }
699
+
700
+ throw new Error('No video data in Fal.ai response');
701
+
702
+ } catch (error) {
703
+ lastError = error;
704
+
705
+ if (attempt < maxRetries) {
706
+ const backoff = Math.pow(2, attempt) * 1000;
707
+ console.log(`⚠️ Fal.ai video attempt ${attempt} failed. Retrying in ${backoff/1000}s...`);
708
+ await sleep(backoff);
709
+ }
710
+ }
711
+ }
712
+
713
+ throw lastError;
714
+ }
715
+
517
716
  /**
518
717
  * Download image from URL and return buffer
519
718
  *
@@ -568,6 +767,12 @@ export async function generateImage(prompt, options = {}) {
568
767
  result = await generateImageDALLE(enhancedPrompt, serviceOptions);
569
768
  break;
570
769
 
770
+ case 'flux':
771
+ case 'flux-pro':
772
+ case 'flux-dev':
773
+ result = await generateImageFal(enhancedPrompt, { ...serviceOptions, model: service });
774
+ break;
775
+
571
776
  default:
572
777
  throw new Error(`Unknown service: ${service}`);
573
778
  }
@@ -636,7 +841,8 @@ export function getServiceInfo(service) {
636
841
  speed: 'Fast',
637
842
  cost: '$0.02/image',
638
843
  quality: 'Good',
639
- bestFor: 'Quick hero images, high volume'
844
+ bestFor: 'Quick hero images, high volume',
845
+ provider: 'Google AI (Direct)'
640
846
  },
641
847
  imagen: {
642
848
  name: 'Imagen 3',
@@ -644,7 +850,8 @@ export function getServiceInfo(service) {
644
850
  speed: 'Medium',
645
851
  cost: '$0.03/image',
646
852
  quality: 'Excellent',
647
- bestFor: 'Premium hero images, photorealistic'
853
+ bestFor: 'Premium hero images, photorealistic',
854
+ provider: 'Google Vertex AI (Direct)'
648
855
  },
649
856
  dalle: {
650
857
  name: 'DALL-E 3',
@@ -652,7 +859,8 @@ export function getServiceInfo(service) {
652
859
  speed: 'Medium',
653
860
  cost: '$0.04-0.12/image',
654
861
  quality: 'Excellent',
655
- bestFor: 'Creative illustrations, concept art'
862
+ bestFor: 'Creative illustrations, concept art',
863
+ provider: 'OpenAI (Direct)'
656
864
  },
657
865
  veo: {
658
866
  name: 'Veo 2',
@@ -660,7 +868,44 @@ export function getServiceInfo(service) {
660
868
  speed: 'Slow',
661
869
  cost: '$0.10/video (estimated)',
662
870
  quality: 'Good',
663
- bestFor: 'Product demos, animated diagrams'
871
+ bestFor: 'Product demos, animated diagrams',
872
+ provider: 'Google AI (Direct)'
873
+ },
874
+ flux: {
875
+ name: 'FLUX Pro v1.1 Ultra',
876
+ nickname: 'Premium Artistic',
877
+ speed: 'Medium',
878
+ cost: '$0.06/image',
879
+ quality: 'Outstanding',
880
+ bestFor: 'Premium artistic images, highest quality',
881
+ provider: 'Fal.ai'
882
+ },
883
+ 'flux-pro': {
884
+ name: 'FLUX Pro v1.1 Ultra',
885
+ nickname: 'Premium Artistic',
886
+ speed: 'Medium',
887
+ cost: '$0.06/image',
888
+ quality: 'Outstanding',
889
+ bestFor: 'Premium artistic images, highest quality',
890
+ provider: 'Fal.ai'
891
+ },
892
+ 'flux-dev': {
893
+ name: 'FLUX Dev',
894
+ nickname: 'Developer Friendly',
895
+ speed: 'Fast',
896
+ cost: '$0.025/MP',
897
+ quality: 'Excellent',
898
+ bestFor: 'Developer workflows, rapid iteration',
899
+ provider: 'Fal.ai'
900
+ },
901
+ veo3: {
902
+ name: 'Veo 3',
903
+ nickname: 'Cutting Edge Video',
904
+ speed: 'Slow',
905
+ cost: '$0.40/second',
906
+ quality: 'Outstanding',
907
+ bestFor: 'Premium video content, latest features',
908
+ provider: 'Fal.ai'
664
909
  }
665
910
  };
666
911
 
@@ -65,13 +65,62 @@ if (hasAnyAPIKeys()) {
65
65
  - Understanding the target audience
66
66
  - Competitive content analysis
67
67
 
68
+ ## Custom Content Rules
69
+
70
+ The content-writer agent supports custom content generation rules via a `content-rules.md` file in your project root. If this file exists, the agent will incorporate your custom guidelines into the content generation process.
71
+
72
+ **To use custom rules:**
73
+
74
+ 1. Create a `content-rules.md` file in your project directory
75
+ 2. Define your content preferences, style guidelines, brand voice, or formatting requirements
76
+ 3. The agent will automatically detect and apply these rules
77
+
78
+ **Example content-rules.md:**
79
+ ```markdown
80
+ # Content Generation Rules
81
+
82
+ ## Brand Voice
83
+ - Use conversational, friendly tone
84
+ - Avoid jargon unless explaining technical concepts
85
+ - Include real-world examples
86
+
87
+ ## Formatting Preferences
88
+ - Keep paragraphs under 3 sentences
89
+ - Use numbered lists for sequential steps
90
+ - Use bullet points for non-sequential items
91
+
92
+ ## SEO Guidelines
93
+ - Target keyword density: 1-2%
94
+ - Include FAQ section for articles over 1000 words
95
+ - Add "Related Resources" section at the end
96
+
97
+ ## Topics to Avoid
98
+ - Political opinions
99
+ - Medical advice
100
+ - Financial recommendations
101
+
102
+ ## Required Elements
103
+ - Author bio at the end
104
+ - Call-to-action in conclusion
105
+ - Social sharing snippet
106
+ ```
107
+
108
+ **Note:** If `content-rules.md` doesn't exist, the agent will use its default professional content creation guidelines.
109
+
68
110
  ## Writing Process
69
111
 
112
+ ### Phase 0: Load Custom Rules (if available)
113
+ - Check for `content-rules.md` in project root
114
+ - If found, read and incorporate custom guidelines
115
+ - Merge custom rules with default best practices
116
+ - Continue with standard process if file doesn't exist
117
+
70
118
  ### Phase 1: Understanding
71
119
  - Identify the content purpose and goals
72
120
  - Define the target audience
73
121
  - Determine the desired tone and style
74
122
  - Clarify key messages and takeaways
123
+ - **Apply custom content rules if available**
75
124
 
76
125
  ### Phase 2: Research
77
126
  - Conduct thorough topic research using WebSearch
package/.claude/CLAUDE.md DELETED
@@ -1,98 +0,0 @@
1
- # Claude Code Configuration
2
-
3
- This project uses the MyAIDev Method package for enhanced AI-assisted development.
4
-
5
- ## Available Commands
6
-
7
- - `/myai-content-writer` - Create SEO-optimized content
8
- - `/myai-wordpress-publish` - Publish content to WordPress
9
- - `/myai-coordinate-content` - Coordinate content production workflow (verify and publish)
10
- - `/myai-configure` - Configure settings
11
-
12
- ## Available Agents
13
-
14
- - `content-writer` - Professional content creation agent
15
- - `content-production-coordinator` - Orchestrate content verification and publishing workflow
16
- - `proprietary-content-verifier` - Verify content uniqueness and quality
17
-
18
- ## WordPress Integration
19
-
20
- To use WordPress features, configure your credentials using:
21
-
22
- ```bash
23
- /myai-configure wordpress
24
- ```
25
-
26
- This will guide you through setting up:
27
- - WordPress site URL
28
- - Username
29
- - Application Password
30
-
31
- ### Publishing Content
32
-
33
- To publish markdown content to WordPress:
34
-
35
- ```bash
36
- /myai-wordpress-publish "your-file.md" --status draft
37
- ```
38
-
39
- **Note**: This is a Claude Code slash command, not a terminal command. Run it inside Claude Code, not in your terminal.
40
-
41
- ## Content Production Workflow
42
-
43
- The MyAIDev Method includes a comprehensive content production workflow:
44
-
45
- ### Coordinated Publishing
46
-
47
- Use the content production coordinator to verify and publish multiple pieces of content:
48
-
49
- ```bash
50
- /myai-coordinate-content ./content-queue/
51
- ```
52
-
53
- **Workflow:**
54
- 1. **Verification**: Automatically checks content for uniqueness and quality
55
- 2. **Categorization**: Separates content into "Ready for Publishing" and "Needs Review"
56
- 3. **Reports**: Generates timestamped reports with detailed analysis
57
- 4. **Publishing**: Publishes approved content in parallel for efficiency
58
- 5. **Tracking**: Reports all published URLs back to you
59
-
60
- **Options:**
61
- - `--dry-run` - Only verify content, don't publish
62
- - `--force` - Skip confirmation prompts
63
- - `--verbose` - Show detailed progress
64
- - `--output-dir` - Specify report directory
65
-
66
- ### Content Verification
67
-
68
- The proprietary-content-verifier agent evaluates:
69
- - **Knowledge Redundancy**: Whether content is unique or duplicates existing knowledge
70
- - **AI Detection**: Identifies characteristics of AI-generated content
71
- - **Quality Assessment**: Provides recommendations for improvement
72
-
73
- Content is scored as: **High | Medium | Low | Minimal** redundancy
74
-
75
- ### Agent Architecture
76
-
77
- The content production system uses a coordinator pattern:
78
- - `content-production-coordinator` orchestrates the workflow
79
- - `proprietary-content-verifier` validates content quality
80
- - `content-writer` creates and publishes approved content
81
-
82
- All agents work in parallel for maximum efficiency.
83
-
84
- ## Project Conventions
85
-
86
- - All custom commands are in `.claude/commands/`
87
- - All agents are in `.claude/agents/`
88
- - Commands and agents use Markdown format with YAML frontmatter
89
-
90
- ## Build Commands
91
-
92
- - `npm install` - Install dependencies
93
- - `npm test` - Run tests
94
- - `npm run build` - Build the project
95
-
96
- ## Notes
97
-
98
- This configuration follows Claude Code's official standards for custom commands and agents.
@@ -1,111 +0,0 @@
1
- ---
2
- name: content-production-coordinator
3
- description: The Content Production Coordinator Assistant helps you take a repository of Titles, Proprietary Content, References, and Goals and publish them to your website
4
- tools: Read, Write, Edit, WebSearch, WebFetch, Task
5
- ---
6
-
7
- You are a Content Production Coordinator specializing in taking a task list and calling your specified subagents to process that list.
8
-
9
- ## Task
10
-
11
- ### 1. Initialize Work List
12
- - Read the provided directory: `$WORK_LIST`
13
- - Create your "Requested for Publishing List" from the files in that directory
14
- - Ensure each list item has: Title, Proprietary Content, References, and Goals
15
- - Display the list to the user for confirmation before proceeding
16
-
17
- ### 2. Verify Proprietary Content
18
- - For each list item, call the `proprietary-content-verifier` subagent to check the **Proprietary Content**
19
- - Send these jobs **in parallel** to your subagent for efficiency
20
- - You will receive back a REDUNDANCY SCORE and RECOMMENDATION
21
- - If REDUNDANCY SCORE is Low or Minimal and RECOMMENDATION is "Proceed with publishing", add to Ready for Publishing list
22
- - If REDUNDANCY SCORE is Medium or High, or RECOMMENDATION is "Needs review" or "Reject", add to Needs Review list
23
-
24
- ### 3. Categorize Results
25
- - **Ready for Publishing**: Items with Low/Minimal redundancy scores and "Proceed with publishing" recommendation
26
- - **Needs Review**: Items with Medium/High redundancy scores or "Needs review"/"Reject" recommendations (include feedback from proprietary-content-verifier)
27
-
28
- ### 4. Write Output Lists
29
- - Write both lists to your working directory with clear categorization
30
- - Use clear filenames with timestamps: `ready-for-publishing-YYYY-MM-DD-HH-MM-SS.md` and `needs-review-YYYY-MM-DD-HH-MM-SS.md`
31
- - Include all details: Title, Proprietary Content score, Verifier feedback, References, Goals
32
-
33
- ### 5. User Notification
34
- - If "Needs Review" list has items: Notify User they need to address them and explain why each item needs review
35
- - If "Ready for Publishing" list has items: Notify User you will begin publishing and ask for confirmation
36
-
37
- ### 6. Publish Content
38
- - For all items on the "Ready for Publishing" list:
39
- - Call the `content-writer` subagent **in parallel** for each item
40
- - Instruct each subagent to use the markdown file containing that list item's content
41
- - Provide the Title, Proprietary Content, References, and Goals to the content-writer
42
- - Report the published URL to the User as each subagent finishes
43
- - URLs are pre-verified by the subagent's Playwright MCP, no additional verification needed
44
-
45
- ## Core Competencies
46
-
47
- 1. **Production Goal**
48
- - Verify you have the proper list with your User before beginning
49
- - Keep the User informed of followup work they may need to do with the Needs Review list
50
- - Process items efficiently in parallel where possible
51
-
52
- 2. **Quality Control**
53
- - Ensure all proprietary content is verified before publishing
54
- - Maintain clear documentation of decisions and outcomes
55
- - Provide transparency in the verification and publishing process
56
-
57
- 3. **Efficiency**
58
- - Use parallel processing for verification and publishing tasks
59
- - Minimize wait times by batching operations
60
- - Keep the user informed of progress at each stage
61
-
62
- ## User Communication
63
-
64
- 1. **Understanding**: Be sure you have the list from the provided directory `$ARGUMENTS`
65
- 2. **Formatting**: Ensure proper Markdown formatting when writing files
66
- 3. **Transparency**: Clearly communicate progress, issues, and next steps
67
- 4. **Confirmation**: Always ask for user confirmation before beginning the publishing phase
68
-
69
- ## Output Requirements
70
-
71
- Save the content as markdown files with descriptive names plus datetime stamps in the filename:
72
- - `ready-for-publishing-YYYY-MM-DD-HH-MM-SS.md`
73
- - `needs-review-YYYY-MM-DD-HH-MM-SS.md`
74
-
75
- Each file should include:
76
- - Summary of total items in the category
77
- - Detailed list of each item with all metadata
78
- - For Needs Review: Include specific feedback from verification
79
- - For Ready for Publishing: Include verification scores and confirmation
80
-
81
- ## Workflow Example
82
-
83
- ```
84
- 1. User provides: /coordinate-content-production ./content-queue/
85
- 2. Read all files in ./content-queue/
86
- 3. Display list to user: "Found 10 items for publishing. Proceed with verification? (Y/N)"
87
- 4. User confirms: Y
88
- 5. Launch 10 parallel proprietary-content-verifier agents
89
- 6. Collect results: 7 Ready, 3 Need Review
90
- 7. Write output files with timestamp
91
- 8. Notify user: "3 items need review (see needs-review-2025-11-13-14-30-00.md)"
92
- 9. Notify user: "7 items ready for publishing. Proceed? (Y/N)"
93
- 10. User confirms: Y
94
- 11. Launch 7 parallel content-writer agents
95
- 12. Report each published URL as completed
96
- ```
97
-
98
- ## Error Handling
99
-
100
- - If a file in the work list is malformed, add it to Needs Review with explanation
101
- - If a subagent fails, report the error and add item to Needs Review
102
- - If verification takes too long, notify user of progress periodically
103
- - Always complete the process even if some items fail
104
-
105
- ## Success Criteria
106
-
107
- - All items from the work list are processed
108
- - Items are correctly categorized based on verification
109
- - User receives clear output files for both categories
110
- - Publishing proceeds only after user confirmation
111
- - All published URLs are reported back to the user