popeye-cli 1.5.0 → 1.6.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/CHANGELOG.md +54 -0
- package/README.md +50 -8
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +54 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts +29 -0
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +90 -7
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts +4 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +36 -316
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +18 -3
- package/dist/generators/doc-parser.d.ts.map +1 -1
- package/dist/generators/doc-parser.js +81 -10
- package/dist/generators/doc-parser.js.map +1 -1
- package/dist/generators/frontend-design-analyzer.d.ts +30 -0
- package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
- package/dist/generators/frontend-design-analyzer.js +208 -0
- package/dist/generators/frontend-design-analyzer.js.map +1 -0
- package/dist/generators/shared-packages.d.ts +45 -0
- package/dist/generators/shared-packages.d.ts.map +1 -0
- package/dist/generators/shared-packages.js +456 -0
- package/dist/generators/shared-packages.js.map +1 -0
- package/dist/generators/templates/index.d.ts +4 -0
- package/dist/generators/templates/index.d.ts.map +1 -1
- package/dist/generators/templates/index.js +4 -0
- package/dist/generators/templates/index.js.map +1 -1
- package/dist/generators/templates/website-components.d.ts.map +1 -1
- package/dist/generators/templates/website-components.js +36 -11
- package/dist/generators/templates/website-components.js.map +1 -1
- package/dist/generators/templates/website-config.d.ts +15 -1
- package/dist/generators/templates/website-config.d.ts.map +1 -1
- package/dist/generators/templates/website-config.js +155 -13
- package/dist/generators/templates/website-config.js.map +1 -1
- package/dist/generators/templates/website-landing.d.ts +24 -0
- package/dist/generators/templates/website-landing.d.ts.map +1 -0
- package/dist/generators/templates/website-landing.js +276 -0
- package/dist/generators/templates/website-landing.js.map +1 -0
- package/dist/generators/templates/website-layout.d.ts +42 -0
- package/dist/generators/templates/website-layout.d.ts.map +1 -0
- package/dist/generators/templates/website-layout.js +408 -0
- package/dist/generators/templates/website-layout.js.map +1 -0
- package/dist/generators/templates/website-pricing.d.ts +11 -0
- package/dist/generators/templates/website-pricing.d.ts.map +1 -0
- package/dist/generators/templates/website-pricing.js +313 -0
- package/dist/generators/templates/website-pricing.js.map +1 -0
- package/dist/generators/templates/website-sections.d.ts +102 -0
- package/dist/generators/templates/website-sections.d.ts.map +1 -0
- package/dist/generators/templates/website-sections.js +444 -0
- package/dist/generators/templates/website-sections.js.map +1 -0
- package/dist/generators/templates/website.d.ts +10 -50
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +12 -788
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-scanner.d.ts +37 -0
- package/dist/generators/website-content-scanner.d.ts.map +1 -0
- package/dist/generators/website-content-scanner.js +165 -0
- package/dist/generators/website-content-scanner.js.map +1 -0
- package/dist/generators/website-context.d.ts +38 -2
- package/dist/generators/website-context.d.ts.map +1 -1
- package/dist/generators/website-context.js +179 -19
- package/dist/generators/website-context.js.map +1 -1
- package/dist/generators/website-debug.d.ts +68 -0
- package/dist/generators/website-debug.d.ts.map +1 -0
- package/dist/generators/website-debug.js +93 -0
- package/dist/generators/website-debug.js.map +1 -0
- package/dist/generators/website.d.ts +2 -0
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +66 -4
- package/dist/generators/website.js.map +1 -1
- package/dist/generators/workspace-root.d.ts +27 -0
- package/dist/generators/workspace-root.d.ts.map +1 -0
- package/dist/generators/workspace-root.js +100 -0
- package/dist/generators/workspace-root.js.map +1 -0
- package/dist/state/index.d.ts +8 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +10 -0
- package/dist/state/index.js.map +1 -1
- package/dist/types/workflow.d.ts +6 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts +15 -0
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +52 -0
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/auto-fix-bundler.d.ts +37 -0
- package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
- package/dist/workflow/auto-fix-bundler.js +320 -0
- package/dist/workflow/auto-fix-bundler.js.map +1 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -1
- package/dist/workflow/auto-fix.js +10 -3
- package/dist/workflow/auto-fix.js.map +1 -1
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +12 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/overview.d.ts.map +1 -1
- package/dist/workflow/overview.js +4 -0
- package/dist/workflow/overview.js.map +1 -1
- package/dist/workflow/plan-mode.d.ts +4 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +69 -5
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/website-strategy.d.ts +9 -0
- package/dist/workflow/website-strategy.d.ts.map +1 -1
- package/dist/workflow/website-strategy.js +73 -1
- package/dist/workflow/website-strategy.js.map +1 -1
- package/dist/workflow/website-updater.d.ts.map +1 -1
- package/dist/workflow/website-updater.js +15 -4
- package/dist/workflow/website-updater.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/create.ts +58 -4
- package/src/cli/interactive.ts +96 -7
- package/src/generators/all.ts +44 -332
- package/src/generators/doc-parser.ts +87 -10
- package/src/generators/frontend-design-analyzer.ts +261 -0
- package/src/generators/shared-packages.ts +500 -0
- package/src/generators/templates/index.ts +4 -0
- package/src/generators/templates/website-components.ts +36 -11
- package/src/generators/templates/website-config.ts +166 -13
- package/src/generators/templates/website-landing.ts +331 -0
- package/src/generators/templates/website-layout.ts +443 -0
- package/src/generators/templates/website-pricing.ts +330 -0
- package/src/generators/templates/website-sections.ts +541 -0
- package/src/generators/templates/website.ts +38 -851
- package/src/generators/website-content-scanner.ts +208 -0
- package/src/generators/website-context.ts +248 -20
- package/src/generators/website-debug.ts +130 -0
- package/src/generators/website.ts +71 -3
- package/src/generators/workspace-root.ts +113 -0
- package/src/state/index.ts +14 -0
- package/src/types/workflow.ts +6 -0
- package/src/upgrade/handlers.ts +65 -0
- package/src/workflow/auto-fix-bundler.ts +392 -0
- package/src/workflow/auto-fix.ts +11 -3
- package/src/workflow/index.ts +12 -0
- package/src/workflow/overview.ts +6 -0
- package/src/workflow/plan-mode.ts +81 -7
- package/src/workflow/website-strategy.ts +75 -1
- package/src/workflow/website-updater.ts +17 -6
- package/tests/cli/project-naming.test.ts +136 -0
- package/tests/generators/doc-parser.test.ts +121 -0
- package/tests/generators/frontend-design-analyzer.test.ts +90 -0
- package/tests/generators/quality-gate.test.ts +183 -0
- package/tests/generators/shared-packages.test.ts +83 -0
- package/tests/generators/website-components.test.ts +1 -1
- package/tests/generators/website-config.test.ts +84 -0
- package/tests/generators/website-content-scanner.test.ts +181 -0
- package/tests/generators/website-context.test.ts +109 -0
- package/tests/generators/website-debug.test.ts +77 -0
- package/tests/generators/website-landing.test.ts +188 -0
- package/tests/generators/website-pricing.test.ts +98 -0
- package/tests/generators/website-sections.test.ts +245 -0
- package/tests/generators/workspace-root.test.ts +105 -0
- package/tests/upgrade/handlers.test.ts +162 -0
- package/tests/workflow/auto-fix-bundler.test.ts +242 -0
- package/tests/workflow/plan-mode.test.ts +111 -1
- package/tests/workflow/website-strategy.test.ts +55 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Popeye CLI are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.6.0] - 2026-02-17
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Dual-Mode Website Validation** - `validateWebsiteContext()` (soft/non-throwing) and `validateWebsiteContextOrThrow()` (hard). All 4 website entry points now validate context quality (was 1 of 4). Returns `ValidationResult` with `passed`, `issues`, `warnings`, and `contentScore` (0-100).
|
|
9
|
+
- **Post-Generation Content Scanner** - `scanGeneratedContent()` scans generated `.tsx`/`.ts` files for placeholder fingerprints: TODO comments, default taglines, generic descriptions, default pricing tiers ($29/mo, Starter/Pro/Enterprise), default "How It Works" steps, lorem ipsum. Integrated into website generator (non-blocking warnings).
|
|
10
|
+
- **Workspace Root Detection** - `workspace-root.ts` detects monorepo roots via `.popeye/`, `package.json` workspaces, `pnpm-workspace.yaml`, `turbo.json`. Doc discovery and brand asset scanning now traverse workspace boundaries.
|
|
11
|
+
- **Shared Packages Module** - Extracted `generateDesignTokensPackage()` and `generateUiPackage()` from `all.ts` into `shared-packages.ts`. Brand-specific color scale generation (hex to HSL to 10-stop scale).
|
|
12
|
+
- **Frontend Design Analyzer** - `analyzeFrontendDesign()` extracts colors, fonts, and component library info from `apps/frontend/` CSS vars, Tailwind config, and package.json.
|
|
13
|
+
- **Bundler Error Auto-Fix** - `auto-fix-bundler.ts` handles CSS/PostCSS/Tailwind/webpack errors that the TypeScript-only parser misses. Discovers related config files, sends to Claude for fix.
|
|
14
|
+
- **CWD-Aware Project Naming** - `generateProjectName()` now checks docs first, then CWD basename, then idea text. Skips generic dir names (Projects, Desktop, tmp).
|
|
15
|
+
- **Project Brief Generation** - `generateProjectBrief()` creates `PROJECT_BRIEF.md` in `.popeye/` with product name, tagline, color, and source doc paths.
|
|
16
|
+
- **`[WEB]` App Tag Support** - Plan parser recognizes `[WEB]` tags on tasks, maps to `website` app target, counted in `webTasks` stat.
|
|
17
|
+
- **Website Debug Tracing** - `POPEYE_DEBUG_WEBSITE=1` env var enables detailed pipeline trace showing doc discovery, brand assets, template values, and validation results.
|
|
18
|
+
- **Strategy Context Packing** - `packProductContext()` with priority-based doc packing (spec > pricing > brand > features) and 16K budget.
|
|
19
|
+
- `skipValidation` option on `WebsiteGeneratorOptions` as escape hatch for scaffold-only use.
|
|
20
|
+
- `sourceDocPaths` field on `ProjectState` for doc awareness across sessions.
|
|
21
|
+
- `strategyError` field on `ProjectState` for strategy failure visibility.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- **Critical**: Website generation pipeline produced generic/broken output (TODO placeholders, wrong product names, default $29/mo pricing). Root cause: validation existed but was bypassed by 3 of 4 entry points. Now all entry points validate.
|
|
25
|
+
- **Critical**: Upgrade pipeline (`/upgrade fullstack -> all`) generated website with TODO placeholders. `buildUpgradeContentContext()` now builds full content context from user docs, brand assets, and strategy.
|
|
26
|
+
- **Critical**: `extractProductName()` returned directory names instead of product names. Now uses 5-step priority chain (docs heading > spec heading > spec label > package.json > undefined).
|
|
27
|
+
- **Critical**: `extractPricing()` matched design doc sections ("Plan-Based Color Usage") as pricing tiers. Now uses strict price validation and `Pricing` keyword only.
|
|
28
|
+
- `readProjectDocs` maxLength increased from 6K to 25K with per-file 8K cap. Brand/color docs sorted first to prevent truncation.
|
|
29
|
+
- `extractFeatures()` removed `enforce` keyword (matched "Enforcement Colors" in design docs), tightened `feature` to require plural or prefix.
|
|
30
|
+
- `extractTagline()` now prefers tagline from heading matching product name exactly (avoids wrong doc in multi-doc concatenation).
|
|
31
|
+
- `extractDescription()` prefers "What Is [Product]?" over generic "What is a [thing]?" sections.
|
|
32
|
+
- Logo copy path mismatch: `public/logo{ext}` corrected to `public/brand/logo{ext}` per `BrandAssetsContract`.
|
|
33
|
+
- Logo path in Header component: strips `public/` prefix for Next.js serving.
|
|
34
|
+
- Auto-fix false success: first attempt with zero parsed errors now returns `success: false` instead of `success: true`.
|
|
35
|
+
- `parseTypeScriptErrors` now supports both tsc and bundler output formats, strips ANSI codes, deduplicates.
|
|
36
|
+
- Plan parser: `[FE]`/`[BE]`/`[WEB]`/`[INT]` tags no longer block task name extraction by `isActionableTask()`.
|
|
37
|
+
- Tailwind config: brand color scale generated from hex instead of defaulting to sky-blue.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
- `validateWebsiteContextOrThrow()` now delegates to `validateWebsiteContext()` internally.
|
|
41
|
+
- `all.ts` website context building: validates with soft mode, logs warnings without blocking.
|
|
42
|
+
- `website-updater.ts`: reports quality issues via `onProgress` callback.
|
|
43
|
+
- `upgrade/handlers.ts`: `buildUpgradeContentContext()` includes validation warnings in return value.
|
|
44
|
+
- Website template files split into focused modules: `website-landing.ts`, `website-pricing.ts`, `website-layout.ts`, `website-sections.ts`.
|
|
45
|
+
|
|
46
|
+
## [1.5.0] - 2026-02-13
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
- **Strategy-First Website Generation** - AI-powered marketing strategy generation with ICP analysis, positioning, messaging, SEO strategy, site architecture, conversion strategy, and competitive context.
|
|
50
|
+
- **Reviewer Persona Switching** - `reviewerPersona` field in ConsensusConfig for marketing-specific consensus review.
|
|
51
|
+
- **Website Components** - Header (logo/text fallback, nav, CTA, mobile menu), Footer (multi-column, brand), Navigation config.
|
|
52
|
+
- **SEO Infrastructure** - JsonLd component, enhanced sitemap/robots, 404/500 error pages, web manifest, meta helper.
|
|
53
|
+
- **Lead Capture System** - API route with webhook/resend/postmark support, contact form, env examples.
|
|
54
|
+
- **Brand Assets Contract** - `BrandAssetsContract` interface and `resolveBrandAssets()` for deterministic logo/favicon placement.
|
|
55
|
+
- **Website Strategy Caching** - SHA-256 hash-based staleness detection, store/load with metadata.
|
|
56
|
+
- `'website-strategy'` workflow stage.
|
|
57
|
+
- `websiteStrategy` and `storeWebsiteStrategyPath()` in project state.
|
|
58
|
+
|
|
5
59
|
## [1.4.0] - 2026-02-08
|
|
6
60
|
|
|
7
61
|
### Added
|
package/README.md
CHANGED
|
@@ -18,12 +18,14 @@ Popeye is an autonomous software development agent that takes a simple project i
|
|
|
18
18
|
1. **Understands** your idea and expands it into a detailed specification
|
|
19
19
|
2. **Designs** the UI automatically based on the project context
|
|
20
20
|
3. **Strategizes** (website projects) by generating a marketing strategy with ICP, positioning, SEO, and conversion goals
|
|
21
|
-
4. **
|
|
22
|
-
5. **
|
|
23
|
-
6. **
|
|
24
|
-
7. **
|
|
25
|
-
8. **
|
|
26
|
-
9. **
|
|
21
|
+
4. **Validates context** (website projects) by checking content quality before generation and warning about missing docs, default pricing, or placeholder content
|
|
22
|
+
5. **Plans** a complete development roadmap with milestones and tasks
|
|
23
|
+
6. **Validates** the plan through AI consensus (multiple AI systems must agree)
|
|
24
|
+
7. **Implements** each task autonomously, writing production-quality code
|
|
25
|
+
8. **Scans** generated website files for placeholder fingerprints (TODO comments, lorem ipsum, default tiers) and reports quality warnings
|
|
26
|
+
9. **Styles** the application with a professional design system and component library
|
|
27
|
+
10. **Tests** the implementation and fixes issues automatically
|
|
28
|
+
11. **Delivers** a complete, working project with polished UI
|
|
27
29
|
|
|
28
30
|
## How It Works
|
|
29
31
|
|
|
@@ -360,6 +362,8 @@ Popeye provides real-time feedback:
|
|
|
360
362
|
[Website Strategy] Generating website strategy via AI...
|
|
361
363
|
[Website Strategy] Validating strategy schema...
|
|
362
364
|
[Website Strategy] Strategy cached to .popeye/website-strategy.json
|
|
365
|
+
[Validation] Website context score: 85/100
|
|
366
|
+
[Validation] Warning: No tagline extracted from docs. Footer and meta tags will use generic defaults.
|
|
363
367
|
[Consensus] Review round 1: 78% agreement (Marketing Strategist persona)
|
|
364
368
|
[Consensus] Addressing concerns...
|
|
365
369
|
[Consensus] Review round 2: 92% agreement
|
|
@@ -373,10 +377,12 @@ Popeye provides real-time feedback:
|
|
|
373
377
|
[UI Setup] Installing UI component dependencies...
|
|
374
378
|
[UI Setup] Setting up theme and styles...
|
|
375
379
|
[UI Setup] UI setup complete: 5 components installed
|
|
380
|
+
[Content Scan] Scanned 14 files, score: 95/100
|
|
381
|
+
[Content Scan] Warning: src/app/pricing/page.tsx - Default pricing amount ($29/mo)
|
|
376
382
|
[Complete] Project built successfully!
|
|
377
383
|
```
|
|
378
384
|
|
|
379
|
-
**Note:** The `[Website Strategy]` steps appear only for `website` and `all` project types. The marketing strategist persona for consensus review is also specific to website projects.
|
|
385
|
+
**Note:** The `[Website Strategy]`, `[Validation]`, and `[Content Scan]` steps appear only for `website` and `all` project types. The marketing strategist persona for consensus review is also specific to website projects. Validation warnings are informational and do not block generation (except in direct `website.ts` generation, where blocking issues cause an error).
|
|
380
386
|
|
|
381
387
|
## Features
|
|
382
388
|
|
|
@@ -477,6 +483,41 @@ Popeye automatically discovers brand assets (logos, favicons, color schemes) fro
|
|
|
477
483
|
- Primary brand color is extracted from design docs or CSS variables
|
|
478
484
|
- The `BrandAssetsContract` interface ensures consistent logo placement across Header, manifest, and metadata
|
|
479
485
|
|
|
486
|
+
#### Dual-Mode Website Context Validation
|
|
487
|
+
|
|
488
|
+
Website generation includes a two-layer quality system that prevents generic, placeholder-filled websites:
|
|
489
|
+
|
|
490
|
+
**Pre-Generation Validation** checks the content context before any code is written. It operates in two modes:
|
|
491
|
+
|
|
492
|
+
| Mode | Function | Behavior | Used By |
|
|
493
|
+
|------|----------|----------|---------|
|
|
494
|
+
| **Hard (throwing)** | `validateWebsiteContextOrThrow()` | Throws an error and blocks generation | `website.ts` (direct generation) |
|
|
495
|
+
| **Soft (non-throwing)** | `validateWebsiteContext()` | Returns `ValidationResult` with issues/warnings, logs but does not block | `all.ts`, `website-updater.ts`, `upgrade/handlers.ts` |
|
|
496
|
+
|
|
497
|
+
The `ValidationResult` includes:
|
|
498
|
+
- `passed` -- whether the context has no blocking issues
|
|
499
|
+
- `issues` -- blocking problems (suspicious product name, missing docs, no features, missing strategy)
|
|
500
|
+
- `warnings` -- non-blocking concerns (default pricing tiers, missing tagline/description/brand color)
|
|
501
|
+
- `contentScore` -- 0-100 quality score, deducted for each default or missing piece
|
|
502
|
+
|
|
503
|
+
Checks include: suspicious product name detection (e.g., `my-app`), missing documentation, zero features extracted, missing strategy, brand/color doc parsing failures, default pricing fingerprint detection (Starter/Pro/Enterprise at $0/$29/Custom), and missing tagline/description/brand color.
|
|
504
|
+
|
|
505
|
+
**Post-Generation Content Scanner** (`website-content-scanner.ts`) scans the generated `.tsx`/`.ts` files for known placeholder fingerprints after code has been written:
|
|
506
|
+
|
|
507
|
+
| Pattern | Severity | Description |
|
|
508
|
+
|---------|----------|-------------|
|
|
509
|
+
| TODO comments | error | `// TODO`, `/* TODO */`, `{/* TODO */}` |
|
|
510
|
+
| Lorem ipsum | error | Placeholder text left in templates |
|
|
511
|
+
| Default tagline | warning | "Build something amazing" |
|
|
512
|
+
| Generic description | warning | "Your modern web application" |
|
|
513
|
+
| Default pricing | warning | `$29/mo` amounts in generated files |
|
|
514
|
+
| Default pricing tiers | warning | Starter/Pro/Enterprise tier names together |
|
|
515
|
+
| Default How It Works | warning | Sign Up/Configure/Deploy steps together |
|
|
516
|
+
|
|
517
|
+
The scanner returns a `ScanResult` with all issues, the number of files scanned, and a 0-100 quality score. Issues are logged as warnings so developers can review and fix placeholder content.
|
|
518
|
+
|
|
519
|
+
Both layers work together: pre-generation validation catches missing inputs, while post-generation scanning catches placeholder content that slipped through into the generated code. The `skipValidation` option in `generateWebsiteProject()` provides an escape hatch for edge cases.
|
|
520
|
+
|
|
480
521
|
#### Reviewer Persona Switching
|
|
481
522
|
|
|
482
523
|
For website projects, the consensus reviewer automatically switches to a **Senior Product Marketing Strategist** persona instead of the default technical reviewer. This ensures the plan is evaluated for marketing effectiveness, conversion optimization, and SEO quality rather than purely technical criteria. The `reviewerPersona` field in `ConsensusConfig` controls this behavior and is threaded through all adapter implementations (OpenAI, Gemini, Grok).
|
|
@@ -1303,7 +1344,8 @@ src/
|
|
|
1303
1344
|
│ ├── typescript.ts # TypeScript scaffolding
|
|
1304
1345
|
│ ├── fullstack.ts # Fullstack scaffolding (React + FastAPI)
|
|
1305
1346
|
│ ├── website.ts # Website scaffolding (Next.js, strategy-aware)
|
|
1306
|
-
│ ├── website-context.ts # Doc discovery, brand assets, content context
|
|
1347
|
+
│ ├── website-context.ts # Doc discovery, brand assets, content context, dual-mode validation
|
|
1348
|
+
│ ├── website-content-scanner.ts # Post-generation placeholder fingerprint scanner
|
|
1307
1349
|
│ ├── doc-parser.ts # Product doc parsing (name, tagline, features, pricing, color)
|
|
1308
1350
|
│ ├── all.ts # ALL project scaffolding (exports 5 generator functions)
|
|
1309
1351
|
│ └── templates/ # File templates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAgO7C"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Command } from 'commander';
|
|
6
6
|
import path from 'node:path';
|
|
7
|
+
import { promises as fs } from 'node:fs';
|
|
7
8
|
import { ProjectSpecSchema } from '../../types/project.js';
|
|
8
9
|
import { requireAuth } from '../../auth/index.js';
|
|
9
10
|
import { runWorkflow } from '../../workflow/index.js';
|
|
@@ -58,8 +59,8 @@ export function createCreateCommand() {
|
|
|
58
59
|
process.exit(1);
|
|
59
60
|
}
|
|
60
61
|
// Generate project name from idea if not provided
|
|
61
|
-
const projectName = options.name || generateProjectName(idea);
|
|
62
62
|
const outputDir = path.resolve(options.output);
|
|
63
|
+
const projectName = options.name || await generateProjectName(idea, outputDir);
|
|
63
64
|
const projectDir = path.join(outputDir, projectName);
|
|
64
65
|
const threshold = parseInt(options.threshold, 10);
|
|
65
66
|
const maxIterations = parseInt(options.maxIterations, 10);
|
|
@@ -188,10 +189,59 @@ export function createCreateCommand() {
|
|
|
188
189
|
return create;
|
|
189
190
|
}
|
|
190
191
|
/**
|
|
191
|
-
*
|
|
192
|
+
* Directories that are too generic to use as project names
|
|
192
193
|
*/
|
|
193
|
-
|
|
194
|
-
|
|
194
|
+
const GENERIC_DIR_NAMES = new Set([
|
|
195
|
+
'home', 'desktop', 'documents', 'downloads', 'projects', 'project',
|
|
196
|
+
'repos', 'code', 'dev', 'workspace', 'workspaces', 'src', 'tmp',
|
|
197
|
+
'temp', 'users', 'user', 'root', 'var', 'opt',
|
|
198
|
+
]);
|
|
199
|
+
/**
|
|
200
|
+
* Generate a project name, preferring CWD-derived names over prompt text.
|
|
201
|
+
*
|
|
202
|
+
* Priority: docs in CWD -> CWD basename -> idea text extraction
|
|
203
|
+
*
|
|
204
|
+
* @param idea - The user's project idea text
|
|
205
|
+
* @param cwd - Optional directory for context-aware naming
|
|
206
|
+
* @returns A kebab-case project name
|
|
207
|
+
*/
|
|
208
|
+
async function generateProjectName(idea, cwd) {
|
|
209
|
+
const toKebab = (name) => name
|
|
210
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
211
|
+
.toLowerCase()
|
|
212
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
213
|
+
.replace(/-+/g, '-')
|
|
214
|
+
.replace(/^-|-$/g, '');
|
|
215
|
+
if (cwd) {
|
|
216
|
+
// Check for doc-derived name
|
|
217
|
+
try {
|
|
218
|
+
const entries = await fs.readdir(cwd, { withFileTypes: true });
|
|
219
|
+
const mdFiles = entries
|
|
220
|
+
.filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.toLowerCase().startsWith('readme'))
|
|
221
|
+
.map(e => path.join(cwd, e.name));
|
|
222
|
+
for (const mdFile of mdFiles) {
|
|
223
|
+
try {
|
|
224
|
+
const content = await fs.readFile(mdFile, 'utf-8');
|
|
225
|
+
const headingMatch = content.match(/^#\s+([A-Z][a-zA-Z0-9]+)/m);
|
|
226
|
+
if (headingMatch && headingMatch[1] && headingMatch[1].length >= 3 && headingMatch[1].length <= 30) {
|
|
227
|
+
return toKebab(headingMatch[1]);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Skip unreadable files
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// Directory not readable
|
|
237
|
+
}
|
|
238
|
+
// Check CWD basename
|
|
239
|
+
const dirName = path.basename(cwd);
|
|
240
|
+
if (dirName.length >= 3 && !GENERIC_DIR_NAMES.has(dirName.toLowerCase())) {
|
|
241
|
+
return toKebab(dirName);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Fallback: extract from idea text
|
|
195
245
|
return idea
|
|
196
246
|
.toLowerCase()
|
|
197
247
|
.replace(/[^a-z0-9\s]/g, '')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
* Interactive mode
|
|
3
3
|
* Claude Code-style interface for Popeye CLI
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Try to extract a product name from .md files in a directory.
|
|
7
|
+
* Looks for top-level headings (# ProductName) in markdown files.
|
|
8
|
+
*
|
|
9
|
+
* @param dir - Directory to scan for .md files
|
|
10
|
+
* @returns Product name if found, null otherwise
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractNameFromDocs(dir: string): Promise<string | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Generate a meaningful project name from an idea, with CWD-aware logic.
|
|
15
|
+
*
|
|
16
|
+
* Priority chain:
|
|
17
|
+
* 1. If CWD contains .md docs with a "# ProductName" heading, use that
|
|
18
|
+
* 2. If CWD basename is a meaningful name (not generic), use it
|
|
19
|
+
* 3. Fall back to extracting a name from the idea text
|
|
20
|
+
*
|
|
21
|
+
* @param idea - The user's project idea text
|
|
22
|
+
* @param cwd - Optional current working directory for context-aware naming
|
|
23
|
+
* @returns A kebab-case project name
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateProjectName(idea: string, cwd?: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Extract a project name from the idea text alone.
|
|
28
|
+
* This is the original generateProjectName logic, used as a fallback.
|
|
29
|
+
*
|
|
30
|
+
* @param idea - The user's project idea text
|
|
31
|
+
* @returns A kebab-case project name
|
|
32
|
+
*/
|
|
33
|
+
export declare function generateProjectNameFromIdea(idea: string): string;
|
|
5
34
|
/**
|
|
6
35
|
* Start interactive mode with auto-authentication
|
|
7
36
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8tEH;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2B7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BrF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4EhE;AAiVD;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E1D"}
|
package/dist/cli/interactive.js
CHANGED
|
@@ -1909,10 +1909,93 @@ async function handleResume(state, args) {
|
|
|
1909
1909
|
}
|
|
1910
1910
|
}
|
|
1911
1911
|
/**
|
|
1912
|
-
*
|
|
1913
|
-
*
|
|
1912
|
+
* Directories that are too generic to use as project names.
|
|
1913
|
+
* If the CWD basename matches one of these, we skip CWD-based naming.
|
|
1914
1914
|
*/
|
|
1915
|
-
|
|
1915
|
+
const GENERIC_DIR_NAMES = new Set([
|
|
1916
|
+
'home', 'desktop', 'documents', 'downloads', 'projects', 'project',
|
|
1917
|
+
'repos', 'code', 'dev', 'workspace', 'workspaces', 'src', 'tmp',
|
|
1918
|
+
'temp', 'users', 'user', 'root', 'var', 'opt',
|
|
1919
|
+
]);
|
|
1920
|
+
/**
|
|
1921
|
+
* Try to extract a product name from .md files in a directory.
|
|
1922
|
+
* Looks for top-level headings (# ProductName) in markdown files.
|
|
1923
|
+
*
|
|
1924
|
+
* @param dir - Directory to scan for .md files
|
|
1925
|
+
* @returns Product name if found, null otherwise
|
|
1926
|
+
*/
|
|
1927
|
+
export async function extractNameFromDocs(dir) {
|
|
1928
|
+
try {
|
|
1929
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
1930
|
+
const mdFiles = entries
|
|
1931
|
+
.filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.toLowerCase().startsWith('readme'))
|
|
1932
|
+
.map(e => path.join(dir, e.name));
|
|
1933
|
+
for (const mdFile of mdFiles) {
|
|
1934
|
+
try {
|
|
1935
|
+
const content = await fs.readFile(mdFile, 'utf-8');
|
|
1936
|
+
// Look for a top-level heading like "# Gateco" or "# Gateco - Subtitle"
|
|
1937
|
+
const headingMatch = content.match(/^#\s+([A-Z][a-zA-Z0-9]+)/m);
|
|
1938
|
+
if (headingMatch && headingMatch[1]) {
|
|
1939
|
+
const name = headingMatch[1];
|
|
1940
|
+
// Validate: must be a reasonable product name (3-30 chars, not a generic word)
|
|
1941
|
+
if (name.length >= 3 && name.length <= 30 && !GENERIC_DIR_NAMES.has(name.toLowerCase())) {
|
|
1942
|
+
return name;
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
}
|
|
1946
|
+
catch {
|
|
1947
|
+
// Skip unreadable files
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
catch {
|
|
1952
|
+
// Directory not readable
|
|
1953
|
+
}
|
|
1954
|
+
return null;
|
|
1955
|
+
}
|
|
1956
|
+
/**
|
|
1957
|
+
* Generate a meaningful project name from an idea, with CWD-aware logic.
|
|
1958
|
+
*
|
|
1959
|
+
* Priority chain:
|
|
1960
|
+
* 1. If CWD contains .md docs with a "# ProductName" heading, use that
|
|
1961
|
+
* 2. If CWD basename is a meaningful name (not generic), use it
|
|
1962
|
+
* 3. Fall back to extracting a name from the idea text
|
|
1963
|
+
*
|
|
1964
|
+
* @param idea - The user's project idea text
|
|
1965
|
+
* @param cwd - Optional current working directory for context-aware naming
|
|
1966
|
+
* @returns A kebab-case project name
|
|
1967
|
+
*/
|
|
1968
|
+
export async function generateProjectName(idea, cwd) {
|
|
1969
|
+
// Normalize to kebab-case helper
|
|
1970
|
+
const toKebab = (name) => name
|
|
1971
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
1972
|
+
.toLowerCase()
|
|
1973
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
1974
|
+
.replace(/-+/g, '-')
|
|
1975
|
+
.replace(/^-|-$/g, '');
|
|
1976
|
+
if (cwd) {
|
|
1977
|
+
// Priority 1: Check for doc-derived name in CWD
|
|
1978
|
+
const docName = await extractNameFromDocs(cwd);
|
|
1979
|
+
if (docName) {
|
|
1980
|
+
return toKebab(docName);
|
|
1981
|
+
}
|
|
1982
|
+
// Priority 2: Use CWD basename if it's meaningful
|
|
1983
|
+
const dirName = path.basename(cwd);
|
|
1984
|
+
if (dirName.length >= 3 && !GENERIC_DIR_NAMES.has(dirName.toLowerCase())) {
|
|
1985
|
+
return toKebab(dirName);
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
// Priority 3: Extract from idea text (original logic)
|
|
1989
|
+
return generateProjectNameFromIdea(idea);
|
|
1990
|
+
}
|
|
1991
|
+
/**
|
|
1992
|
+
* Extract a project name from the idea text alone.
|
|
1993
|
+
* This is the original generateProjectName logic, used as a fallback.
|
|
1994
|
+
*
|
|
1995
|
+
* @param idea - The user's project idea text
|
|
1996
|
+
* @returns A kebab-case project name
|
|
1997
|
+
*/
|
|
1998
|
+
export function generateProjectNameFromIdea(idea) {
|
|
1916
1999
|
// 1. First, try to find explicit project name patterns
|
|
1917
2000
|
const explicitPatterns = [
|
|
1918
2001
|
/(?:called|named|for|planning|project)\s+["']?([A-Z][a-zA-Z0-9]+)["']?/i,
|
|
@@ -2080,8 +2163,8 @@ async function handleIdea(idea, state) {
|
|
|
2080
2163
|
return;
|
|
2081
2164
|
}
|
|
2082
2165
|
}
|
|
2083
|
-
// Generate a meaningful project name
|
|
2084
|
-
const projectName = generateProjectName(idea);
|
|
2166
|
+
// Generate a meaningful project name (CWD-aware: checks docs and dir name first)
|
|
2167
|
+
const projectName = await generateProjectName(idea, cwd);
|
|
2085
2168
|
const projectDir = path.join(cwd, projectName);
|
|
2086
2169
|
console.log();
|
|
2087
2170
|
console.log(theme.primary.bold(' Creating Project'));
|
|
@@ -2183,8 +2266,8 @@ async function handleNewProject(idea, state) {
|
|
|
2183
2266
|
}
|
|
2184
2267
|
}
|
|
2185
2268
|
const cwd = state.projectDir || process.cwd();
|
|
2186
|
-
// Generate a meaningful project name
|
|
2187
|
-
const projectName = generateProjectName(idea);
|
|
2269
|
+
// Generate a meaningful project name (CWD-aware: checks docs and dir name first)
|
|
2270
|
+
const projectName = await generateProjectName(idea, cwd);
|
|
2188
2271
|
const projectDir = path.join(cwd, projectName);
|
|
2189
2272
|
console.log();
|
|
2190
2273
|
console.log(theme.primary.bold(' Creating New Project'));
|