gl-life-claude-zen 1.0.3 → 1.3.1

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +255 -0
  2. package/README.md +166 -0
  3. package/bin/create-gl-life-claude.js +56 -1
  4. package/dist/hooks/auto-format.js +1 -1
  5. package/dist/hooks/complete-task.js +1 -1
  6. package/dist/hooks/enforce-migration-workflow.js +1 -1
  7. package/dist/hooks/enforce-structured-development.js +1 -1
  8. package/dist/hooks/enforce-test-pyramid.js +1 -1
  9. package/dist/hooks/init-task-tracker.js +1 -1
  10. package/dist/hooks/start-task.js +1 -1
  11. package/dist/hooks/task-status.js +1 -1
  12. package/dist/hooks/validate-database-changes.js +1 -1
  13. package/dist/hooks/validate-e2e-coverage.js +1 -1
  14. package/dist/hooks/validate-git-workflow.js +1 -1
  15. package/dist/hooks/validate-integration-site.js +2 -0
  16. package/dist/hooks/validate-migration-impact.js +1 -1
  17. package/dist/hooks/validate-task-completion.js +1 -1
  18. package/dist/hooks/validate-test-quality.js +1 -1
  19. package/dist/hooks/validate-test-results.js +1 -1
  20. package/dist/hooks/validate-ui-integration.js +1 -1
  21. package/dist/scripts/help.js +1 -1
  22. package/dist/scripts/plan-amend.js +1 -1
  23. package/dist/scripts/plan-create.js +1 -1
  24. package/dist/scripts/plan-help.js +1 -1
  25. package/dist/scripts/plan-init.js +1 -1
  26. package/dist/scripts/plan-manager.js +1 -1
  27. package/dist/scripts/setup-git-hooks.js +1 -1
  28. package/dist/scripts/task-done.js +1 -1
  29. package/dist/scripts/task-merge.js +1 -1
  30. package/dist/scripts/task-next.js +1 -1
  31. package/dist/scripts/task-start.js +1 -1
  32. package/dist/scripts/task-status.js +1 -1
  33. package/lib/init.js +13 -5
  34. package/package.json +7 -2
  35. package/templates/.claude/CLAUDE.md +196 -0
  36. package/templates/.claude/settings.json +40 -0
  37. package/templates/.gitignore +14 -0
  38. package/templates/README.md +4 -0
  39. package/templates/test-site/README.md +271 -0
  40. package/templates/test-site/index.html +13 -0
  41. package/templates/test-site/package.json +25 -0
  42. package/templates/test-site/server.js +125 -0
  43. package/templates/test-site/src/App.css +130 -0
  44. package/templates/test-site/src/App.jsx +78 -0
  45. package/templates/test-site/src/index.css +39 -0
  46. package/templates/test-site/src/main.jsx +10 -0
  47. package/templates/test-site/vite.config.js +12 -0
package/CHANGELOG.md CHANGED
@@ -57,6 +57,259 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
57
57
  - Git integration optional
58
58
  - Cross-platform support (Windows, macOS, Linux)
59
59
 
60
+ ## [1.1.0] - 2025-12-19
61
+
62
+ ### Added
63
+ - **Strict UI Testing Enforcement** with configurable requirements
64
+ - Global `strictMode` toggle (true = blocks, false = warnings only)
65
+ - Per-requirement configuration for props, events, API mocking, state, forms, conditionals
66
+ - Hard requirements (test file, import, render) always enforced
67
+ - Integration test website requirement for stakeholder validation
68
+ - **New Hook: `validate-integration-site.js`**
69
+ - Validates integration test website exists when UI components are modified
70
+ - Checks for package.json, dev script, and component imports
71
+ - Configurable via `testing.ui.integrationSiteDir` setting
72
+ - **Integration Test Website Template** (`test-site/`)
73
+ - Vite + React development environment
74
+ - Dev server with hot reload (`npm run dev`)
75
+ - Production build system (`npm run build`)
76
+ - GitHub Pages deployment (`npm run deploy`)
77
+ - Comprehensive README with migration guides for Vue/Svelte/Angular
78
+ - 9 template files included (.gitignore, index.html, package.json, README, vite.config.js, App.jsx, App.css, index.css, main.jsx)
79
+ - **Configuration System** for UI testing
80
+ - `testing.ui.strictMode` - Global enforcement toggle
81
+ - `testing.ui.requireTestFile` - Require test file exists (hard requirement)
82
+ - `testing.ui.requireImport` - Require test imports component (hard requirement)
83
+ - `testing.ui.requireRender` - Require test renders component (hard requirement)
84
+ - `testing.ui.requireProps` - Require test provides required props
85
+ - `testing.ui.requireEventTests` - Require event simulation tests
86
+ - `testing.ui.requireApiMocking` - Require API call mocking
87
+ - `testing.ui.requireStateTests` - Require state validation tests
88
+ - `testing.ui.requireFormTests` - Require form submission tests
89
+ - `testing.ui.requireConditionalTests` - Require conditional branch coverage
90
+ - `testing.ui.requireIntegrationSite` - Require integration test website
91
+ - `testing.ui.integrationSiteDir` - Custom test site directory (default: "test-site")
92
+ - `testing.ui.conditionalThreshold` - Minimum conditionals before validation (default: 3)
93
+ - **Updated Documentation**
94
+ - README.md: Added "UI Testing Configuration" section with examples
95
+ - CLAUDE.md template: Added "Integration Test Website" section (195 lines)
96
+ - Deployment guides for GitHub Pages, Netlify, Vercel
97
+ - Best practices for component integration testing
98
+
99
+ ### Changed
100
+ - **validate-ui-integration.js** hook now supports configuration
101
+ - Reads settings from `.claude/settings.json`
102
+ - Falls back to strict defaults if no config found
103
+ - Uses `shouldBlock()` helper to determine error vs warning
104
+ - All 6 configurable validations updated to respect settings
105
+
106
+ ### Fixed
107
+ - Shebang duplication issue resolved in bundling process
108
+ - esbuild config now strips existing shebangs before bundling
109
+ - Single `#!/usr/bin/env node` preserved on all hooks
110
+
111
+ ### Technical Details
112
+ - Total hooks bundled: 17 (16 enforcement + 1 new integration-site)
113
+ - validate-ui-integration.js: 14,291 bytes (includes config system)
114
+ - validate-integration-site.js: 12,848 bytes (new hook)
115
+ - test-site template: 9 files, production-ready
116
+ - Backward compatible: Existing projects work without configuration changes
117
+
118
+ ## [1.2.0] - 2025-12-20
119
+
120
+ ### Added
121
+ - **UI Verification System** - Automated multi-stage validation for UI components
122
+ - **Syntax Validation Hook** (`validate-ui-syntax.js`) - TypeScript/JSX compilation and import resolution
123
+ - Validates TypeScript compilation with `tsc --noEmit`
124
+ - Checks import resolution (local files and npm packages)
125
+ - Detects missing dependencies in package.json
126
+ - Supports .tsx, .jsx, .vue, .svelte files
127
+ - **Runtime Validation Hook** (`validate-ui-runtime.js`) - Browser-based error detection
128
+ - Uses Playwright for headless browser testing
129
+ - Captures console errors, runtime exceptions, React errors
130
+ - Auto-starts dev server on allocated port
131
+ - Graceful cleanup with port release
132
+ - **Visual Validation Hook** (`validate-ui-visual.js`) - AI-powered appearance analysis
133
+ - Claude Vision API integration for screenshot analysis
134
+ - Detects broken layouts, missing elements, CSS issues
135
+ - Uses component contracts for visual expectations
136
+ - Saves screenshots to `.claude/screenshots/`
137
+ - **Contract Validation Hook** (`validate-component-contract.js`) - Contract compliance checking
138
+ - Validates required props, events, state, DOM structure
139
+ - Loads `.contract.json` files alongside components
140
+ - Errors for missing props/events/DOM, warnings for missing state
141
+ - Supports hierarchical contract schemas
142
+
143
+ - **Port Management System** - Fixed port allocation with auto-cleanup
144
+ - **PortManager Utility** (`utils/port-manager.js`) - Cross-platform port management
145
+ - Fixed port ranges: Vite (3000-3009), UI validation (3010-3019), Custom (3020-3029)
146
+ - Auto-cleanup kills stale processes before allocation
147
+ - Graceful shutdown (SIGTERM) with force kill fallback (SIGKILL)
148
+ - Configuration persistence in `.claude/port-config.json`
149
+ - Cross-platform support (Windows: netstat/taskkill, macOS/Linux: lsof/kill)
150
+ - **Test Site Integration** - Port-managed dev server for test-site
151
+ - `test-site/server.js` with PortManager integration
152
+ - Auto-allocates port 3000-3009 with conflict resolution
153
+ - `npm run dev` uses port management, `npm run dev:simple` bypasses it
154
+ - Graceful shutdown releases port on Ctrl+C
155
+
156
+ - **Component Contracts** - Formal component specifications
157
+ - **Contract Schema** - Comprehensive component definition format
158
+ - Props (required/optional with types and validation)
159
+ - State (variables with initial values and update triggers)
160
+ - Events (triggers, payloads, required status)
161
+ - DOM structure (required elements with selectors and attributes)
162
+ - Visual expectations (layout, critical elements, spacing, breakpoints)
163
+ - Behavior (user interactions, state changes, side effects)
164
+ - Test cases (setup, steps, assertions, expected outcomes)
165
+ - **Contract Examples** - Reference implementations
166
+ - `LoginForm.contract.json` - Form with email/password validation
167
+ - `UserCard.contract.json` - Data display component
168
+ - `DataTable.contract.json` - Complex interactive component
169
+
170
+ - **Comprehensive Documentation** - Three new guides
171
+ - **UI-VERIFICATION-GUIDE.md** - Complete validation system documentation
172
+ - Quick start and configuration
173
+ - Detailed hook documentation with examples
174
+ - Troubleshooting guide
175
+ - Best practices
176
+ - **PORT-MANAGEMENT.md** - Port allocation and management guide
177
+ - API reference with TypeScript types
178
+ - Integration examples (Vite, Express, Webpack)
179
+ - Cross-platform behavior details
180
+ - Troubleshooting guide
181
+ - **COMPONENT-CONTRACTS.md** - Contract schema reference
182
+ - Complete schema documentation
183
+ - Validation rules
184
+ - Contract evolution guide
185
+ - Best practices and examples
186
+
187
+ - **E2E Testing** - Comprehensive end-to-end validation tests
188
+ - 19 E2E tests for UI verification system
189
+ - Tests verify hook execution order (syntax → runtime → visual → contract)
190
+ - Tests validate blocking conditions and passing scenarios
191
+ - Integration tests verify full validation chain
192
+
193
+ - **Integration Testing** - Component test suite additions
194
+ - 35 tests for port management integration
195
+ - 17 tests for settings.json hooks integration
196
+ - Test site server validation
197
+
198
+ ### Changed
199
+ - **settings.json Template** - Updated with new hooks and configuration
200
+ - Added 4 UI verification hooks to PostToolUse section
201
+ - Execution order: enforce-structured-development → auto-format → validate-ui-syntax → validate-ui-runtime → validate-ui-visual → validate-component-contract → validate-test-quality → validate-ui-integration → validate-integration-site → validate-database-changes → validate-migration-impact
202
+ - Added `testing.ui.requireVisualCheck` (default: true)
203
+ - Added `testing.ui.requireContract` (default: false)
204
+
205
+ - **README.md** - Updated with new features
206
+ - Added UI Verification System to features list
207
+ - Added Port Management feature
208
+ - Added Component Contracts feature
209
+ - Added Integration Test Site feature
210
+ - Added new "UI Verification System" section with documentation links
211
+
212
+ - **Test Site** - Enhanced with port management
213
+ - Updated `package.json` with `dev` and `dev:simple` scripts
214
+ - Enhanced README with port management documentation
215
+ - Server auto-allocates ports and cleans up on restart
216
+
217
+ ### Technical Details
218
+ - **Total Hooks**: 20 (16 original + 4 new UI verification hooks)
219
+ - validate-ui-syntax.js: Syntax validation
220
+ - validate-ui-runtime.js: Runtime validation
221
+ - validate-ui-visual.js: Visual validation
222
+ - validate-component-contract.js: Contract validation
223
+ - **Total Tests**: 193 tests across unit, integration, and E2E
224
+ - Syntax validation: 24 tests
225
+ - Runtime validation: 17 tests
226
+ - Visual validation: 17 tests
227
+ - Contract validation: 35 tests
228
+ - Port management: 35 tests + integration tests
229
+ - E2E tests: 19 tests
230
+ - Settings integration: 17 tests
231
+ - **Dependencies**: Optional Playwright and @anthropic-ai/sdk for full functionality
232
+ - **Port Ranges**:
233
+ - Vite dev servers: 3000-3009
234
+ - UI validation: 3010-3019
235
+ - Custom services: 3020-3029
236
+ - **Cross-Platform**: Full Windows/macOS/Linux support for port management
237
+ - **Backward Compatible**: All features opt-in via configuration
238
+
239
+ ### Performance
240
+ - Syntax validation: <3 seconds (no external dependencies)
241
+ - Runtime validation: 10-30 seconds (Playwright startup overhead)
242
+ - Visual validation: 5-15 seconds (screenshot + AI analysis)
243
+ - Contract validation: <1 second (static analysis)
244
+
245
+ ## [1.3.1] - 2025-12-20
246
+
247
+ ### Fixed
248
+ - **CRITICAL: .gitignore Template Handling**
249
+ - Fixed npm renaming `.gitignore` to `.npmignore` during package extraction
250
+ - Added dynamic source resolution in lib/init.js to handle both filenames
251
+ - Added missing `existsSync` import
252
+
253
+ - **CLI Version/Help Flags on Windows**
254
+ - Fixed Windows path handling in getVersion() function
255
+ - Changed from dynamic ESM import to readFileSync for cross-platform compatibility
256
+ - Resolved ERR_UNSUPPORTED_ESM_URL_SCHEME and ERR_IMPORT_ATTRIBUTE_MISSING errors
257
+
258
+ ### Technical Details
259
+ - Package now works correctly on Windows, macOS, and Linux
260
+ - All project creation scenarios tested and verified
261
+ - Task management scripts verified working with bundled hooks
262
+
263
+ ## [1.3.0] - 2025-12-20
264
+
265
+ ### Changed
266
+ - **BREAKING: All UI Testing Requirements Now Hard Requirements**
267
+ - All 10 UI testing validations now always block commits (cannot be disabled)
268
+ - Previously soft requirements (controlled by strictMode):
269
+ - requireProps - Tests must provide required props
270
+ - requireEventTests - Tests must simulate user events
271
+ - requireApiMocking - Tests must mock API calls
272
+ - requireStateTests - Tests must validate state changes
273
+ - requireFormTests - Tests must validate form submission
274
+ - requireConditionalTests - Tests must cover conditional branches
275
+ - requireIntegrationSite - Components must be in test-site/
276
+ - These join existing hard requirements (requireTestFile, requireImport, requireRender)
277
+ - Rationale: Zero-compromise quality - ensures production-ready UI components
278
+ - Migration: All projects must now meet full UI testing standards (no opt-out)
279
+ - Updated validate-ui-integration.js hook to enforce all requirements
280
+ - Updated README.md with "Hard Requirements" section
281
+ - Updated settings.json template with warning comment
282
+
283
+ ### Added
284
+ - **CLI Help and Version Flags**
285
+ - Added `--help` and `-h` flags to display usage information
286
+ - Added `--version` and `-v` flags to show package version
287
+ - Prevents accidental project creation with invalid names like `--help`
288
+ - Self-documenting CLI with comprehensive usage examples
289
+
290
+ ### Fixed
291
+ - **CRITICAL: Missing .gitignore Template File in Published Package**
292
+ - Fixed npm excluding `.gitignore` template during package publish
293
+ - Added explicit `templates/.gitignore` entry to package.json files array
294
+ - Without this fix, all project creation attempts fail with ENOENT error
295
+ - Impact: Package is now usable via npm install and npx
296
+
297
+ - **CRITICAL: Task Management Scripts Hook Path Resolution**
298
+ - Fixed incorrect hook paths in bundled scripts that prevented task management
299
+ - Scripts were looking for hooks at `node_modules/.gl-life-claude/.claude/hooks/` (wrong)
300
+ - Now correctly resolve to `node_modules/.gl-life-claude/hooks/` (bundled location)
301
+ - Added dynamic path resolution with fallback to dev workspace location
302
+ - Affected scripts: task-status.js, task-start.js, task-done.js, plan-init.js
303
+ - Impact: Task management commands (npm run task:*) now work correctly
304
+ - Error message now shows both attempted paths for easier debugging
305
+
306
+ ### Technical Details
307
+ - Updated hook: validate-ui-integration.js (16KB bundled)
308
+ - All 10 requirements enforced in shouldBlock() function
309
+ - No configuration options to disable requirements
310
+ - Breaking change for projects relying on soft requirement warnings
311
+ - Fixed scripts: 4 task management scripts with dynamic hook resolution
312
+
60
313
  ## [Unreleased]
61
314
 
62
315
  ### Planned
@@ -65,6 +318,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
65
318
  - Custom hook support
66
319
  - Plugin system
67
320
  - Web dashboard for progress visualization
321
+ - Contract generator CLI tool
322
+ - Visual regression testing
68
323
 
69
324
  ---
70
325
 
package/README.md CHANGED
@@ -8,9 +8,13 @@ A project generator that sets up a structured development environment with Claud
8
8
 
9
9
  - **Interactive CLI** - Guided project setup with prompts
10
10
  - **Structured Development** - Enforced task-based workflow with plan tracking
11
+ - **UI Verification System** - Automated validation: syntax, runtime, visual, contracts
12
+ - **Port Management** - Fixed port allocation with auto-cleanup (3000-3009 range)
13
+ - **Component Contracts** - Define and enforce component specifications
11
14
  - **Protected Scripts** - Minified, bundled scripts and hooks (27% smaller than source)
12
15
  - **Git Integration** - Automatic repository initialization with structured commits
13
16
  - **Hook System** - Pre/post tool-use hooks for code quality and workflow enforcement
17
+ - **Integration Test Site** - Hot-reloading site for stakeholder validation
14
18
  - **Zero Configuration** - Works out of the box with sensible defaults
15
19
 
16
20
  ## Installation
@@ -178,6 +182,23 @@ Configure Claude Code behavior:
178
182
  "ask": ["Edit(./package.json)"],
179
183
  "deny": ["Edit(**/*.md)", "Bash(rm -rf*)"]
180
184
  },
185
+ "testing": {
186
+ "ui": {
187
+ "strictMode": true,
188
+ "requireTestFile": true,
189
+ "requireImport": true,
190
+ "requireRender": true,
191
+ "requireProps": true,
192
+ "requireEventTests": true,
193
+ "requireApiMocking": true,
194
+ "requireStateTests": true,
195
+ "requireFormTests": true,
196
+ "requireConditionalTests": true,
197
+ "requireIntegrationSite": true,
198
+ "integrationSiteDir": "test-site",
199
+ "conditionalThreshold": 3
200
+ }
201
+ },
181
202
  "hooks": {
182
203
  "PreToolUse": [...],
183
204
  "PostToolUse": [...]
@@ -185,6 +206,151 @@ Configure Claude Code behavior:
185
206
  }
186
207
  ```
187
208
 
209
+ ### UI Verification System
210
+
211
+ The framework includes automated UI component validation with four validation stages:
212
+
213
+ 1. **Syntax Validation** - TypeScript/JSX compilation and import resolution
214
+ 2. **Runtime Validation** - Browser-based runtime error detection (requires Playwright)
215
+ 3. **Visual Validation** - AI-powered visual appearance analysis (requires Claude Vision API)
216
+ 4. **Contract Validation** - Component contract compliance checking
217
+
218
+ **Quick Configuration:**
219
+
220
+ ```json
221
+ {
222
+ "testing": {
223
+ "ui": {
224
+ "strictMode": true,
225
+ "requireVisualCheck": true,
226
+ "requireContract": false
227
+ }
228
+ }
229
+ }
230
+ ```
231
+
232
+ **Documentation:**
233
+ - [UI Verification Guide](./docs/UI-VERIFICATION-GUIDE.md) - Complete validation system guide
234
+ - [Port Management](./docs/PORT-MANAGEMENT.md) - Fixed port allocation and auto-cleanup
235
+ - [Component Contracts](./docs/COMPONENT-CONTRACTS.md) - Contract schema reference
236
+ - [CHANGELOG](./CHANGELOG.md) - Version history and breaking changes
237
+
238
+ ### UI Testing Configuration
239
+
240
+ The framework enforces strict UI testing requirements by default. Configure these in `.claude/settings.json`:
241
+
242
+ #### Global Strict Mode
243
+
244
+ ```json
245
+ {
246
+ "testing": {
247
+ "ui": {
248
+ "strictMode": true // false = warnings only, true = blocks commits
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ #### Per-Requirement Controls
255
+
256
+ ```json
257
+ {
258
+ "testing": {
259
+ "ui": {
260
+ "strictMode": true,
261
+ "requireProps": true, // Tests must provide required props
262
+ "requireEventTests": true, // Tests must simulate user events
263
+ "requireApiMocking": true, // Tests must mock API calls
264
+ "requireStateTests": true, // Tests must validate state changes
265
+ "requireFormTests": true, // Tests must validate form submission
266
+ "requireConditionalTests": true,// Tests must cover conditional branches
267
+ "requireIntegrationSite": true // Components must be in test-site/
268
+ }
269
+ }
270
+ }
271
+ ```
272
+
273
+ #### UI Testing Requirements (Hard Requirements - Always Enforced)
274
+
275
+ All UI testing requirements are **hard requirements** that **always block** commits if violated:
276
+
277
+ - **requireTestFile** - UI component must have test file
278
+ - **requireImport** - Test must import the component
279
+ - **requireRender** - Test must render the component
280
+ - **requireProps** - Tests must provide required props (validates prop passing)
281
+ - **requireEventTests** - Tests must simulate user events (validates user interactions)
282
+ - **requireApiMocking** - Tests must mock API calls (validates async behavior)
283
+ - **requireStateTests** - Tests must validate state changes (validates state management)
284
+ - **requireFormTests** - Tests must validate form submission (validates form behavior)
285
+ - **requireConditionalTests** - Tests must cover conditional branches (validates logic paths)
286
+ - **requireIntegrationSite** - Components must be in test-site/ (validates stakeholder preview)
287
+
288
+ **Important Notes:**
289
+ - ⚠️ **These requirements CANNOT be disabled** - They always enforce strict UI testing standards
290
+ - 🚫 **Commits will be blocked** if any requirement is violated
291
+ - ✅ **Zero compromise on quality** - All UI components must have comprehensive tests
292
+ - 🎯 **Best practice enforcement** - Ensures production-ready components
293
+
294
+ **Configuration (for reference only):**
295
+
296
+ ```json
297
+ {
298
+ "testing": {
299
+ "ui": {
300
+ "strictMode": true, // Always true (hard requirement)
301
+ "requireTestFile": true, // Cannot disable
302
+ "requireImport": true, // Cannot disable
303
+ "requireRender": true, // Cannot disable
304
+ "requireProps": true, // Cannot disable
305
+ "requireEventTests": true, // Cannot disable
306
+ "requireApiMocking": true, // Cannot disable
307
+ "requireStateTests": true, // Cannot disable
308
+ "requireFormTests": true, // Cannot disable
309
+ "requireConditionalTests": true, // Cannot disable
310
+ "requireIntegrationSite": true // Cannot disable
311
+ }
312
+ }
313
+ }
314
+ ```
315
+
316
+ **Why Hard Requirements?**
317
+
318
+ This framework enforces production-grade quality standards:
319
+ - **No shortcuts** - Every UI component gets proper test coverage
320
+ - **Stakeholder confidence** - Integration site ensures visual validation
321
+ - **Maintainability** - Comprehensive tests prevent regressions
322
+ - **Professional standards** - Enforces industry best practices
323
+
324
+ #### Integration Test Website
325
+
326
+ UI components must be added to the `test-site/` directory for stakeholder validation:
327
+
328
+ ```bash
329
+ cd test-site
330
+ npm install
331
+ npm run dev # Runs at http://localhost:3000
332
+ ```
333
+
334
+ **Deploy to stakeholders:**
335
+ ```bash
336
+ cd test-site
337
+ npm run deploy # Deploys to GitHub Pages
338
+ ```
339
+
340
+ **Configuration:**
341
+ ```json
342
+ {
343
+ "testing": {
344
+ "ui": {
345
+ "requireIntegrationSite": true,
346
+ "integrationSiteDir": "test-site" // Or custom directory
347
+ }
348
+ }
349
+ }
350
+ ```
351
+
352
+ See `test-site/README.md` for full integration testing guide.
353
+
188
354
  ### CLAUDE.md
189
355
 
190
356
  Project-specific development guidelines and rules. Customize for your team's workflow.
@@ -10,12 +10,54 @@
10
10
 
11
11
  import { fileURLToPath } from 'url';
12
12
  import { dirname, join } from 'path';
13
- import { existsSync } from 'fs';
13
+ import { existsSync, readFileSync } from 'fs';
14
14
  import { createInterface } from 'readline';
15
15
 
16
16
  const __filename = fileURLToPath(import.meta.url);
17
17
  const __dirname = dirname(__filename);
18
18
 
19
+ // Get package version
20
+ function getVersion() {
21
+ const pkgPath = join(__dirname, '..', 'package.json');
22
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
23
+ return pkg.version;
24
+ }
25
+
26
+ // Show help message
27
+ function showHelp() {
28
+ const version = getVersion();
29
+ console.log(`
30
+ GL.Life Claude Project Generator v${version}
31
+
32
+ Usage:
33
+ npm create gl-life-claude [project-name] [options]
34
+ npx gl-life-claude-zen [project-name] [options]
35
+
36
+ Options:
37
+ --help, -h Show this help message
38
+ --version, -v Show version number
39
+
40
+ Examples:
41
+ npm create gl-life-claude my-project Create project with defaults
42
+ npx gl-life-claude-zen Interactive mode with prompts
43
+
44
+ Interactive Mode:
45
+ When run without a project name, you will be prompted for:
46
+ - Project name (lowercase, numbers, hyphens, underscores)
47
+ - Git initialization (Y/n)
48
+ - Install dependencies (Y/n)
49
+
50
+ Project Structure:
51
+ - Structured task-based development workflow
52
+ - Git workflow enforcement with hooks
53
+ - Pre-commit validation and auto-formatting
54
+ - Task tracking with dependencies
55
+ - Project plan management
56
+
57
+ For more information: https://github.com/ajayhanda/gl-life-claude
58
+ `);
59
+ }
60
+
19
61
  // Helper: Create readline interface
20
62
  function createPrompt() {
21
63
  return createInterface({
@@ -37,6 +79,19 @@ function isValidProjectName(name) {
37
79
  // Main execution
38
80
  async function main() {
39
81
  const args = process.argv.slice(2);
82
+
83
+ // Handle --help flag
84
+ if (args.includes('--help') || args.includes('-h')) {
85
+ showHelp();
86
+ process.exit(0);
87
+ }
88
+
89
+ // Handle --version flag
90
+ if (args.includes('--version') || args.includes('-v')) {
91
+ console.log(getVersion());
92
+ process.exit(0);
93
+ }
94
+
40
95
  let projectName = args[0];
41
96
  let initGit = true;
42
97
  let installDeps = true;
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- var _0x27d7b4=_0x3d97;(function(_0x570c74,_0xd5c80f){var _0xc70f8b=_0x3d97,_0x5babbd=_0x570c74();while(!![]){try{var _0x585045=-parseInt(_0xc70f8b(0x1df))/0x1+-parseInt(_0xc70f8b(0x1ed))/0x2*(parseInt(_0xc70f8b(0x1e7))/0x3)+-parseInt(_0xc70f8b(0x1fa))/0x4+-parseInt(_0xc70f8b(0x1e9))/0x5*(parseInt(_0xc70f8b(0x1fe))/0x6)+-parseInt(_0xc70f8b(0x1e3))/0x7*(-parseInt(_0xc70f8b(0x1ef))/0x8)+parseInt(_0xc70f8b(0x1f9))/0x9+parseInt(_0xc70f8b(0x1ea))/0xa*(parseInt(_0xc70f8b(0x1e8))/0xb);if(_0x585045===_0xd5c80f)break;else _0x5babbd['push'](_0x5babbd['shift']());}catch(_0x1c6b89){_0x5babbd['push'](_0x5babbd['shift']());}}}(_0x3c58,0x5822c));var _0x55c671=(function(){var _0xd876df=_0x3d97,_0x5cba1f={};_0x5cba1f[_0xd876df(0x1e1)]=function(_0x43cddc,_0x1ae235){return _0x43cddc===_0x1ae235;},_0x5cba1f[_0xd876df(0x200)]=_0xd876df(0x1f1);var _0x1d54f3=_0x5cba1f,_0x1a94b1=!![];return function(_0x1e3406,_0x136c7d){var _0x347ae7=_0x1a94b1?function(){var _0x667959=_0x3d97;if(_0x1d54f3['GQUcs'](_0x1d54f3['ZZEGv'],_0x1d54f3['ZZEGv'])){if(_0x136c7d){var _0x49eb88=_0x136c7d[_0x667959(0x1f4)](_0x1e3406,arguments);return _0x136c7d=null,_0x49eb88;}}else{if(_0x537dbb){var _0x33d3bf=_0xc7d1cf[_0x667959(0x1f4)](_0x9a02c3,arguments);return _0x75f116=null,_0x33d3bf;}}}:function(){};return _0x1a94b1=![],_0x347ae7;};}()),_0x4b0564=_0x55c671(this,function(){var _0x2d61f3=_0x3d97,_0x3ea002={};_0x3ea002[_0x2d61f3(0x1fc)]=_0x2d61f3(0x1fd);var _0x546ca7=_0x3ea002;return _0x4b0564[_0x2d61f3(0x201)]()[_0x2d61f3(0x1eb)](_0x546ca7['fdIwr'])[_0x2d61f3(0x201)]()[_0x2d61f3(0x1f2)](_0x4b0564)['search'](_0x546ca7[_0x2d61f3(0x1fc)]);});_0x4b0564();function _0x3d97(_0x4d78fb,_0x5b7c95){_0x4d78fb=_0x4d78fb-0x1db;var _0x518ba8=_0x3c58();var _0x4b0564=_0x518ba8[_0x4d78fb];return _0x4b0564;}var r=(_0x5b1999=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x5b1999,{'get':(_0x241d3f,_0x37eb5a)=>(typeof require<'u'?require:_0x241d3f)[_0x37eb5a]}):_0x5b1999)(function(_0x26c511){var _0x42d501=_0x3d97,_0x1a6c27={'eNDXd':function(_0x1956fc,_0x13eee8){return _0x1956fc<_0x13eee8;},'Fkbnd':function(_0x50684b,_0x12d3e6){return _0x50684b(_0x12d3e6);},'tLiTC':function(_0x19f778,_0x6c6e31){return _0x19f778+_0x6c6e31;},'IYycC':_0x42d501(0x1de),'cgwgS':_0x42d501(0x1f6)};if(_0x1a6c27[_0x42d501(0x1f0)](typeof require,'u'))return require['apply'](this,arguments);throw _0x1a6c27[_0x42d501(0x1e5)](Error,_0x1a6c27[_0x42d501(0x1ec)](_0x1a6c27[_0x42d501(0x1f3)],_0x26c511)+_0x1a6c27['cgwgS']);}),{execSync:e}=r('child_process'),i=r('fs'),c=process[_0x27d7b4(0x1e2)][0x2]||'{}',a=JSON[_0x27d7b4(0x1dd)](c),t=a[_0x27d7b4(0x1f8)]?.[_0x27d7b4(0x202)];function _0x3c58(){var _0x33071e=['stdio','\x22\x20is\x20not\x20supported','Warning:\x20Could\x20not\x20format\x20','tool_input','1211229acjDUU','470868PzZjQO','ignore','fdIwr','(((.+)+)+)+$','420iVsoZM','npx\x20prettier\x20--write\x20\x22','ZZEGv','toString','file_path','log','match','npx\x20prettier\x20--version','parse','Dynamic\x20require\x20of\x20\x22','230747RKGLBc','Formatted:\x20','GQUcs','argv','266UohoDa','exit','Fkbnd','existsSync','27nFpKDp','11LAxJuL','45280QdtUsR','16186580eTSHmQ','search','tLiTC','119882hBQXNt','python\x20-m\x20black\x20--version','27288DlLGVm','eNDXd','thRXQ','constructor','IYycC','apply'];_0x3c58=function(){return _0x33071e;};return _0x3c58();}(!t||!i[_0x27d7b4(0x1e6)](t))&&process[_0x27d7b4(0x1e4)](0x0);try{if(t[_0x27d7b4(0x1db)](/\.(ts|tsx|js|jsx|json)$/))try{var _0x477f11={};_0x477f11['stdio']=_0x27d7b4(0x1fb);var _0x13c94b={};_0x13c94b[_0x27d7b4(0x1f5)]=_0x27d7b4(0x1fb),(e(_0x27d7b4(0x1dc),_0x477f11),e(_0x27d7b4(0x1ff)+t+'\x22',_0x13c94b),console['log'](_0x27d7b4(0x1e0)+t));}catch{}else{if(t[_0x27d7b4(0x1db)](/\.py$/))try{var _0x319a47={};_0x319a47['stdio']=_0x27d7b4(0x1fb);var _0x1de411={};_0x1de411[_0x27d7b4(0x1f5)]='ignore',(e(_0x27d7b4(0x1ee),_0x319a47),e('python\x20-m\x20black\x20\x22'+t+'\x22',_0x1de411),console[_0x27d7b4(0x203)](_0x27d7b4(0x1e0)+t));}catch{}}}catch{console['warn'](_0x27d7b4(0x1f7)+t);}process[_0x27d7b4(0x1e4)](0x0);
2
+ var _0x44463e=_0x4ada;(function(_0xec130b,_0x50e4d4){var _0x2b88a6=_0x4ada,_0x46cba6=_0xec130b();while(!![]){try{var _0x4302d3=-parseInt(_0x2b88a6(0xe0))/0x1+-parseInt(_0x2b88a6(0xd3))/0x2*(-parseInt(_0x2b88a6(0xc7))/0x3)+-parseInt(_0x2b88a6(0xe3))/0x4+-parseInt(_0x2b88a6(0xdb))/0x5+-parseInt(_0x2b88a6(0xdc))/0x6*(parseInt(_0x2b88a6(0xcd))/0x7)+-parseInt(_0x2b88a6(0xdd))/0x8+-parseInt(_0x2b88a6(0xd8))/0x9*(-parseInt(_0x2b88a6(0xdf))/0xa);if(_0x4302d3===_0x50e4d4)break;else _0x46cba6['push'](_0x46cba6['shift']());}catch(_0x189f7a){_0x46cba6['push'](_0x46cba6['shift']());}}}(_0x4b38,0x629a4));var _0x2a8bec=(function(){var _0x3a4e3c=!![];return function(_0x10eb2e,_0x30fa00){var _0x3a140d=_0x3a4e3c?function(){var _0x209df1=_0x4ada;if(_0x30fa00){var _0x152b53=_0x30fa00[_0x209df1(0xde)](_0x10eb2e,arguments);return _0x30fa00=null,_0x152b53;}}:function(){};return _0x3a4e3c=![],_0x3a140d;};}()),_0x3b4698=_0x2a8bec(this,function(){var _0x469e73=_0x4ada,_0x3c5f28={};_0x3c5f28[_0x469e73(0xe6)]=_0x469e73(0xda);var _0x47ac53=_0x3c5f28;return _0x3b4698[_0x469e73(0xc6)]()[_0x469e73(0xcb)](_0x47ac53[_0x469e73(0xe6)])[_0x469e73(0xc6)]()['constructor'](_0x3b4698)[_0x469e73(0xcb)](_0x47ac53[_0x469e73(0xe6)]);});_0x3b4698();function _0x4b38(){var _0x523572=['tool_input','python\x20-m\x20black\x20\x22','search','exit','287QaKuIp','stdio','log','eZfhT','wCeZa','Formatted:\x20','4268hsjjTY','child_process','\x22\x20is\x20not\x20supported','ignore','match','18183321NFSqtH','parse','(((.+)+)+)+$','1913955TfKzjl','26934ovbCAw','5891848goIMdZ','apply','10AcVdmM','433565NbvdAF','file_path','warn','1771932TAYroH','existsSync','npx\x20prettier\x20--version','GZAle','toString','792dyEVkf','Dynamic\x20require\x20of\x20\x22'];_0x4b38=function(){return _0x523572;};return _0x4b38();}var r=(_0x262417=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x262417,{'get':(_0xc9894,_0x24bd60)=>(typeof require<'u'?require:_0xc9894)[_0x24bd60]}):_0x262417)(function(_0x1db36b){var _0x30d5d5=_0x4ada,_0x49c1ce={'eZfhT':function(_0x50b902,_0x3d45cf){return _0x50b902<_0x3d45cf;},'vUHvS':function(_0xfb21cb,_0xa1cb05){return _0xfb21cb(_0xa1cb05);},'LjxFV':function(_0x112641,_0xe23eb6){return _0x112641+_0xe23eb6;},'wCeZa':_0x30d5d5(0xc8)};if(_0x49c1ce[_0x30d5d5(0xd0)](typeof require,'u'))return require[_0x30d5d5(0xde)](this,arguments);throw _0x49c1ce['vUHvS'](Error,_0x49c1ce['LjxFV'](_0x49c1ce[_0x30d5d5(0xd1)],_0x1db36b)+_0x30d5d5(0xd5));}),{execSync:e}=r(_0x44463e(0xd4)),i=r('fs'),c=process['argv'][0x2]||'{}',a=JSON[_0x44463e(0xd9)](c),t=a[_0x44463e(0xc9)]?.[_0x44463e(0xe1)];(!t||!i[_0x44463e(0xe4)](t))&&process[_0x44463e(0xcc)](0x0);try{if(t[_0x44463e(0xd7)](/\.(ts|tsx|js|jsx|json)$/))try{var _0x207431={};_0x207431[_0x44463e(0xce)]=_0x44463e(0xd6);var _0x2dae03={};_0x2dae03['stdio']=_0x44463e(0xd6),(e(_0x44463e(0xe5),_0x207431),e('npx\x20prettier\x20--write\x20\x22'+t+'\x22',_0x2dae03),console['log'](_0x44463e(0xd2)+t));}catch{}else{if(t[_0x44463e(0xd7)](/\.py$/))try{var _0x56d2a0={};_0x56d2a0['stdio']=_0x44463e(0xd6);var _0x213fd7={};_0x213fd7[_0x44463e(0xce)]=_0x44463e(0xd6),(e('python\x20-m\x20black\x20--version',_0x56d2a0),e(_0x44463e(0xca)+t+'\x22',_0x213fd7),console[_0x44463e(0xcf)](_0x44463e(0xd2)+t));}catch{}}}catch{console[_0x44463e(0xe2)]('Warning:\x20Could\x20not\x20format\x20'+t);}function _0x4ada(_0x20f30c,_0x274eca){_0x20f30c=_0x20f30c-0xc6;var _0x34a68e=_0x4b38();var _0x3b4698=_0x34a68e[_0x20f30c];return _0x3b4698;}process[_0x44463e(0xcc)](0x0);
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- var _0x423695=_0x40a3;(function(_0x2ba13a,_0x54f7ae){var _0x2c214d=_0x40a3,_0x474241=_0x2ba13a();while(!![]){try{var _0x36a39b=parseInt(_0x2c214d(0x1fc))/0x1*(parseInt(_0x2c214d(0x208))/0x2)+parseInt(_0x2c214d(0x202))/0x3*(parseInt(_0x2c214d(0x1b9))/0x4)+-parseInt(_0x2c214d(0x201))/0x5*(-parseInt(_0x2c214d(0x204))/0x6)+parseInt(_0x2c214d(0x1c8))/0x7*(parseInt(_0x2c214d(0x1db))/0x8)+-parseInt(_0x2c214d(0x1ed))/0x9+-parseInt(_0x2c214d(0x1f7))/0xa+-parseInt(_0x2c214d(0x1d7))/0xb*(parseInt(_0x2c214d(0x1fa))/0xc);if(_0x36a39b===_0x54f7ae)break;else _0x474241['push'](_0x474241['shift']());}catch(_0x396b46){_0x474241['push'](_0x474241['shift']());}}}(_0x3153,0x22962));var _0x4e4d11=(function(){var _0x400159=_0x40a3,_0x55d6ba={};_0x55d6ba[_0x400159(0x1cc)]=_0x400159(0x1b1),_0x55d6ba[_0x400159(0x1f6)]=function(_0x48310c,_0x59c64a){return _0x48310c!==_0x59c64a;},_0x55d6ba[_0x400159(0x1dc)]=_0x400159(0x1d1);var _0x18bcef=_0x55d6ba,_0x52ab4e=!![];return function(_0x5d7742,_0x3616bb){var _0x4dbfc2=_0x400159;if(_0x18bcef[_0x4dbfc2(0x1f6)](_0x18bcef[_0x4dbfc2(0x1dc)],_0x18bcef['wjSnw']))return _0x46f69d[_0x4dbfc2(0x1f9)]()[_0x4dbfc2(0x1b5)](_0x18bcef[_0x4dbfc2(0x1cc)])[_0x4dbfc2(0x1f9)]()[_0x4dbfc2(0x1ce)](_0xf037f5)[_0x4dbfc2(0x1b5)](_0x18bcef[_0x4dbfc2(0x1cc)]);else{var _0x52067f=_0x52ab4e?function(){var _0x2ba1d4=_0x4dbfc2;if(_0x3616bb){var _0x258df3=_0x3616bb[_0x2ba1d4(0x1af)](_0x5d7742,arguments);return _0x3616bb=null,_0x258df3;}}:function(){};return _0x52ab4e=![],_0x52067f;}};}()),_0x215695=_0x4e4d11(this,function(){var _0x50ad77=_0x40a3,_0x3a8c9f={};_0x3a8c9f[_0x50ad77(0x1e1)]=_0x50ad77(0x1b1);var _0x16cc09=_0x3a8c9f;return _0x215695[_0x50ad77(0x1f9)]()['search'](_0x16cc09[_0x50ad77(0x1e1)])[_0x50ad77(0x1f9)]()[_0x50ad77(0x1ce)](_0x215695)['search'](_0x16cc09[_0x50ad77(0x1e1)]);});_0x215695();var i=(_0x47ffa0=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x47ffa0,{'get':(_0x3a196a,_0x3274a6)=>(typeof require<'u'?require:_0x3a196a)[_0x3274a6]}):_0x47ffa0)(function(_0x3cfe35){var _0xd5b44e=_0x40a3,_0x59e6b0={'eIrJJ':function(_0x38ddb2,_0x58044c){return _0x38ddb2<_0x58044c;},'akQFl':function(_0x442192,_0x406a9d){return _0x442192(_0x406a9d);},'jHGQa':_0xd5b44e(0x1e5)};if(_0x59e6b0[_0xd5b44e(0x1ff)](typeof require,'u'))return require['apply'](this,arguments);throw _0x59e6b0[_0xd5b44e(0x1c3)](Error,_0x59e6b0['jHGQa']+_0x3cfe35+_0xd5b44e(0x1b3));}),n=i('fs'),d=i(_0x423695(0x1fb)),a=process[_0x423695(0x1fe)][0x2];a||(console['error']('\x0a❌\x20ERROR:\x20Task\x20ID\x20required'),console[_0x423695(0x1fd)](_0x423695(0x1da)),process[_0x423695(0x203)](0x1));var p=_0x423695(0x1f1);n[_0x423695(0x1d3)](p)||(console[_0x423695(0x1fd)]('\x0a❌\x20ERROR:\x20No\x20active\x20plan\x20found'),console[_0x423695(0x1fd)](_0x423695(0x1f5)),process[_0x423695(0x203)](0x1));var u=n[_0x423695(0x1eb)](p,_0x423695(0x206))[_0x423695(0x1bd)](),k=d[_0x423695(0x1be)](_0x423695(0x1ee),u),r=d[_0x423695(0x1be)](k,_0x423695(0x1d8)),l=d[_0x423695(0x1be)](k,_0x423695(0x1de),a+_0x423695(0x1c1));function _0x40a3(_0x18b40b,_0x1e9045){_0x18b40b=_0x18b40b-0x1ae;var _0x20bd81=_0x3153();var _0x215695=_0x20bd81[_0x18b40b];return _0x215695;}n[_0x423695(0x1d3)](r)||(console['error'](_0x423695(0x1d5)),console[_0x423695(0x1fd)](_0x423695(0x1c9)+u),console['error']('Initialize\x20first:\x20npm\x20run\x20plan:init\x0a'),process[_0x423695(0x203)](0x1)),n['existsSync'](l)||(console['error'](_0x423695(0x205)+l+'\x0a'),process[_0x423695(0x203)](0x1));var e=JSON[_0x423695(0x1ef)](n[_0x423695(0x1eb)](r,_0x423695(0x206))),s=JSON[_0x423695(0x1ef)](n[_0x423695(0x1eb)](l,_0x423695(0x206))),f=s['status']===_0x423695(0x1cb);if(f){console[_0x423695(0x1bb)]('\x0a✅\x20Task\x20'+a+_0x423695(0x1cf)),console[_0x423695(0x1bb)](_0x423695(0x1c4));let t=e['taskFiles'][_0x423695(0x1c2)](_0x1c5c81=>_0x1c5c81['id']===a);t&&t[_0x423695(0x1b4)]!==_0x423695(0x1cb)?(t['status']=_0x423695(0x1cb),e[_0x423695(0x1e0)]={'totalTasks':e[_0x423695(0x1e9)]['length'],'pending':e[_0x423695(0x1e9)][_0x423695(0x1f0)](_0x24d52e=>_0x24d52e[_0x423695(0x1b4)]===_0x423695(0x1d9))['length'],'inProgress':e['taskFiles'][_0x423695(0x1f0)](_0x77128f=>_0x77128f['status']===_0x423695(0x1ec))[_0x423695(0x1dd)],'completed':e[_0x423695(0x1e9)]['filter'](_0xed3052=>_0xed3052[_0x423695(0x1b4)]===_0x423695(0x1cb))[_0x423695(0x1dd)],'blocked':e[_0x423695(0x1e9)]['filter'](_0x3bf229=>_0x3bf229['status']===_0x423695(0x200))[_0x423695(0x1dd)]},e[_0x423695(0x1e3)]=null,e['lastUpdated']=new Date()[_0x423695(0x1bc)](),n[_0x423695(0x1d6)](r,JSON[_0x423695(0x1b6)](e,null,0x2)),console[_0x423695(0x1bb)](_0x423695(0x1c6))):console[_0x423695(0x1bb)](_0x423695(0x1e8)),process[_0x423695(0x203)](0x0);}var {execSync:S}=i('child_process');try{var _0x39f54f={};_0x39f54f[_0x423695(0x1ba)]=_0x423695(0x206);let t=S(_0x423695(0x1d2),_0x39f54f);t[_0x423695(0x1bd)]()&&(console[_0x423695(0x1fd)]('\x0a❌\x20ERROR:\x20You\x20have\x20uncommitted\x20changes'),console[_0x423695(0x1fd)]('\x0aUncommitted\x20files:'),console[_0x423695(0x1fd)](t),console[_0x423695(0x1fd)](_0x423695(0x1ca)),console[_0x423695(0x1fd)]('\x20\x20git\x20add\x20.'),console[_0x423695(0x1fd)]('\x20\x20git\x20commit\x20-m\x20\x22['+a+']\x20Description\x20of\x20changes\x22'),console[_0x423695(0x1fd)](''),process['exit'](0x1));}catch{console[_0x423695(0x1e2)](_0x423695(0x1b2)),console[_0x423695(0x1e2)](_0x423695(0x207));}s[_0x423695(0x1b4)]=_0x423695(0x1cb),s['completedAt']=new Date()[_0x423695(0x1bc)]();if(s[_0x423695(0x1b7)]){let t=new Date(s[_0x423695(0x1b7)]),o=new Date(s[_0x423695(0x1f3)]);s[_0x423695(0x1c5)]=Math[_0x423695(0x1d4)]((o-t)/(0x3e8*0x3c*0x3c)*0xa)/0xa;}n['writeFileSync'](l,JSON[_0x423695(0x1b6)](s,null,0x2)),e['activeTask']=null,e[_0x423695(0x1f2)]=new Date()[_0x423695(0x1bc)]();var g=e[_0x423695(0x1e9)]['find'](_0x361c8c=>_0x361c8c['id']===a);g&&(g[_0x423695(0x1b4)]=_0x423695(0x1cb)),e[_0x423695(0x1e0)]={'totalTasks':e['taskFiles']['length'],'pending':e[_0x423695(0x1e9)][_0x423695(0x1f0)](_0x27d37c=>_0x27d37c[_0x423695(0x1b4)]===_0x423695(0x1d9))[_0x423695(0x1dd)],'inProgress':e[_0x423695(0x1e9)][_0x423695(0x1f0)](_0x2dfdc5=>_0x2dfdc5[_0x423695(0x1b4)]===_0x423695(0x1ec))[_0x423695(0x1dd)],'completed':e[_0x423695(0x1e9)][_0x423695(0x1f0)](_0x76c401=>_0x76c401[_0x423695(0x1b4)]===_0x423695(0x1cb))['length'],'blocked':e[_0x423695(0x1e9)][_0x423695(0x1f0)](_0xadc9f0=>_0xadc9f0[_0x423695(0x1b4)]===_0x423695(0x200))[_0x423695(0x1dd)]},n[_0x423695(0x1d6)](r,JSON[_0x423695(0x1b6)](e,null,0x2)),console['log'](_0x423695(0x1f8)+a),console[_0x423695(0x1bb)](_0x423695(0x1ea)+u+'\x0a'),console[_0x423695(0x1bb)]('📌\x20'+s[_0x423695(0x1f4)]),s[_0x423695(0x1c5)]&&console[_0x423695(0x1bb)](_0x423695(0x1bf)+s[_0x423695(0x1c5)]+_0x423695(0x209));if(s[_0x423695(0x1df)]&&s[_0x423695(0x1c5)]){let t=((s['actualHours']-s[_0x423695(0x1df)])/s['estimatedHours']*0x64)[_0x423695(0x1cd)](0x1);console[_0x423695(0x1bb)](_0x423695(0x1d0)+s[_0x423695(0x1df)]+_0x423695(0x1e7)+t+'%');}var h=(e[_0x423695(0x1e0)]['completed']/e[_0x423695(0x1e0)][_0x423695(0x1c0)]*0x64)[_0x423695(0x1cd)](0x1);console['log'](_0x423695(0x1e4)+e['statistics'][_0x423695(0x1cb)]+'/'+e['statistics'][_0x423695(0x1c0)]+_0x423695(0x1b8)+h+_0x423695(0x1e6));function _0x3153(){var _0xbc1098=['254480HMBJND','12Oqgpsy','exit','6XJIEkA','\x0a❌\x20ERROR:\x20Task\x20file\x20not\x20found:\x20','utf8','Make\x20sure\x20all\x20changes\x20are\x20committed!\x0a','6070jqGYeW','\x20hours','\x20\x20Start:\x20npm\x20run\x20task:next\x0a','apply','📌\x20Next\x20task\x20available:','(((.+)+)+)+$','\x0a⚠️\x20\x20WARNING:\x20Could\x20not\x20check\x20git\x20status','\x22\x20is\x20not\x20supported','status','search','stringify','startedAt','\x20tasks\x20(','232784tuGpTX','encoding','log','toISOString','trim','join','⏱️\x20\x20Time\x20taken:\x20','totalTasks','.json','find','akQFl','Syncing\x20tracker\x20status...\x0a','actualHours','✅\x20Tracker\x20synchronized\x0a','🎉\x20ALL\x20TASKS\x20COMPLETED!\x20Project\x20finished.\x0a','1235759DHLubW','Plan:\x20','\x0aCommit\x20all\x20changes\x20before\x20completing\x20task:','completed','VrpDl','toFixed','constructor','\x20is\x20already\x20completed','📊\x20Estimated:\x20','SCPGh','git\x20status\x20--porcelain','existsSync','round','\x0a❌\x20ERROR:\x20Task\x20tracker\x20not\x20found','writeFileSync','11PYYEQp','TASK-TRACKER.json','pending','Usage:\x20npm\x20run\x20task:done\x20TASK-001\x0a','8UOpdCa','wjSnw','length','tasks','estimatedHours','statistics','qenSL','warn','activeTask','\x0a📈\x20Project\x20progress:\x20','Dynamic\x20require\x20of\x20\x22','%)\x0a','h\x20|\x20Variance:\x20','✅\x20Tracker\x20already\x20synchronized\x0a','taskFiles','📋\x20Plan:\x20','readFileSync','in_progress','792009EFBWJQ','.claude/plans','parse','filter','.claude/ACTIVE-PLAN','lastUpdated','completedAt','title','Set\x20active\x20plan\x20first:\x20npm\x20run\x20plan:manager\x0a','dcrIT','1735210pcqzyk','\x0a✅\x20Completed\x20task:\x20','toString','3452268BdNJUJ','path','76wafwJd','error','argv','eIrJJ','blocked'];_0x3153=function(){return _0xbc1098;};return _0x3153();}var c=e[_0x423695(0x1e9)][_0x423695(0x1c2)](_0x2ef2da=>_0x2ef2da['status']===_0x423695(0x1d9));c?(console[_0x423695(0x1bb)](_0x423695(0x1b0)),console['log']('\x20\x20'+c['id']+':\x20'+c['title']),console[_0x423695(0x1bb)](_0x423695(0x1ae))):e['statistics'][_0x423695(0x1cb)]===e['statistics'][_0x423695(0x1c0)]&&console['log'](_0x423695(0x1c7)),process[_0x423695(0x203)](0x0);
2
+ var _0x581323=_0x193b;(function(_0x11ee6a,_0x2b4585){var _0x32ee12=_0x193b,_0x2bacb8=_0x11ee6a();while(!![]){try{var _0x1f94f4=parseInt(_0x32ee12(0x155))/0x1+-parseInt(_0x32ee12(0x170))/0x2*(parseInt(_0x32ee12(0x146))/0x3)+parseInt(_0x32ee12(0x147))/0x4*(parseInt(_0x32ee12(0x161))/0x5)+-parseInt(_0x32ee12(0x13a))/0x6+-parseInt(_0x32ee12(0x14c))/0x7*(-parseInt(_0x32ee12(0x12c))/0x8)+-parseInt(_0x32ee12(0x15b))/0x9*(-parseInt(_0x32ee12(0x15c))/0xa)+-parseInt(_0x32ee12(0x174))/0xb*(-parseInt(_0x32ee12(0x153))/0xc);if(_0x1f94f4===_0x2b4585)break;else _0x2bacb8['push'](_0x2bacb8['shift']());}catch(_0x6e662){_0x2bacb8['push'](_0x2bacb8['shift']());}}}(_0x2ad4,0x639c7));var _0x1cb99a=(function(){var _0x2697b6=_0x193b,_0x341cd8={};_0x341cd8[_0x2697b6(0x17a)]=function(_0x17d659,_0x3ee894){return _0x17d659!==_0x3ee894;},_0x341cd8['sstSE']='LDdYf',_0x341cd8[_0x2697b6(0x16b)]=function(_0x39e42d,_0x422efa){return _0x39e42d!==_0x422efa;},_0x341cd8['iofTp']=_0x2697b6(0x162);var _0x7cf14e=_0x341cd8,_0x345b32=!![];return function(_0x427321,_0x5eb729){var _0x556a9f=_0x2697b6;if(_0x7cf14e[_0x556a9f(0x16b)](_0x7cf14e['iofTp'],_0x7cf14e[_0x556a9f(0x12b)])){var _0x1b86f7=_0x4e8349[_0x556a9f(0x12f)](_0xc8a1e4,arguments);return _0x3e0914=null,_0x1b86f7;}else{var _0x41a635=_0x345b32?function(){var _0x193499=_0x556a9f;if(_0x5eb729){if(_0x7cf14e[_0x193499(0x17a)](_0x7cf14e[_0x193499(0x127)],_0x7cf14e[_0x193499(0x127)])){var _0x3c1eca=_0x3dec05?function(){if(_0x3e46fb){var _0x482db5=_0x3a5b57['apply'](_0x5685b6,arguments);return _0x3d881f=null,_0x482db5;}}:function(){};return _0x43e723=![],_0x3c1eca;}else{var _0x1a61f0=_0x5eb729['apply'](_0x427321,arguments);return _0x5eb729=null,_0x1a61f0;}}}:function(){};return _0x345b32=![],_0x41a635;}};}()),_0x13b14c=_0x1cb99a(this,function(){var _0x27465e=_0x193b,_0x283cd1={};_0x283cd1['RvVep']=_0x27465e(0x13b);var _0xbc117b=_0x283cd1;return _0x13b14c[_0x27465e(0x166)]()[_0x27465e(0x140)](_0xbc117b[_0x27465e(0x137)])[_0x27465e(0x166)]()[_0x27465e(0x179)](_0x13b14c)['search'](_0xbc117b[_0x27465e(0x137)]);});_0x13b14c();var i=(_0x14856d=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x14856d,{'get':(_0x267d74,_0x1acd04)=>(typeof require<'u'?require:_0x267d74)[_0x1acd04]}):_0x14856d)(function(_0x1a157d){var _0x2a81c9=_0x193b,_0x104f95={'RpaMk':function(_0x4896d0,_0x16dbe3){return _0x4896d0<_0x16dbe3;},'iNnUs':function(_0x162167,_0x4c3fa3){return _0x162167(_0x4c3fa3);},'oVchj':function(_0xe34c4f,_0x5e8c7c){return _0xe34c4f+_0x5e8c7c;},'SWGfo':_0x2a81c9(0x175),'oqIZN':_0x2a81c9(0x142)};if(_0x104f95[_0x2a81c9(0x15e)](typeof require,'u'))return require['apply'](this,arguments);throw _0x104f95[_0x2a81c9(0x148)](Error,_0x104f95[_0x2a81c9(0x171)](_0x104f95[_0x2a81c9(0x171)](_0x104f95[_0x2a81c9(0x16e)],_0x1a157d),_0x104f95[_0x2a81c9(0x158)]));}),n=i('fs'),d=i('path'),a=process[_0x581323(0x136)][0x2];function _0x193b(_0x4ea56c,_0x4709b4){_0x4ea56c=_0x4ea56c-0x121;var _0x385623=_0x2ad4();var _0x13b14c=_0x385623[_0x4ea56c];return _0x13b14c;}a||(console[_0x581323(0x172)]('\x0a❌\x20ERROR:\x20Task\x20ID\x20required'),console['error']('Usage:\x20npm\x20run\x20task:done\x20TASK-001\x0a'),process[_0x581323(0x178)](0x1));var p=_0x581323(0x13d);n[_0x581323(0x169)](p)||(console[_0x581323(0x172)]('\x0a❌\x20ERROR:\x20No\x20active\x20plan\x20found'),console[_0x581323(0x172)](_0x581323(0x167)),process[_0x581323(0x178)](0x1));var u=n[_0x581323(0x16a)](p,_0x581323(0x143))[_0x581323(0x151)](),k=d[_0x581323(0x125)](_0x581323(0x16d),u),r=d['join'](k,'TASK-TRACKER.json'),l=d['join'](k,'tasks',a+'.json');n[_0x581323(0x169)](r)||(console[_0x581323(0x172)]('\x0a❌\x20ERROR:\x20Task\x20tracker\x20not\x20found'),console[_0x581323(0x172)](_0x581323(0x163)+u),console[_0x581323(0x172)](_0x581323(0x14a)),process[_0x581323(0x178)](0x1)),n[_0x581323(0x169)](l)||(console['error'](_0x581323(0x14f)+l+'\x0a'),process[_0x581323(0x178)](0x1));var e=JSON[_0x581323(0x12a)](n[_0x581323(0x16a)](r,_0x581323(0x143))),s=JSON[_0x581323(0x12a)](n[_0x581323(0x16a)](l,_0x581323(0x143))),f=s['status']===_0x581323(0x152);if(f){console[_0x581323(0x15a)](_0x581323(0x157)+a+_0x581323(0x14b)),console[_0x581323(0x15a)](_0x581323(0x16f));let t=e[_0x581323(0x13c)]['find'](_0x2acdf5=>_0x2acdf5['id']===a);t&&t['status']!==_0x581323(0x152)?(t[_0x581323(0x154)]='completed',e[_0x581323(0x14e)]={'totalTasks':e[_0x581323(0x13c)][_0x581323(0x134)],'pending':e['taskFiles']['filter'](_0x5f5cb6=>_0x5f5cb6[_0x581323(0x154)]===_0x581323(0x122))[_0x581323(0x134)],'inProgress':e[_0x581323(0x13c)][_0x581323(0x177)](_0x2af0b3=>_0x2af0b3[_0x581323(0x154)]===_0x581323(0x159))['length'],'completed':e[_0x581323(0x13c)][_0x581323(0x177)](_0x90bec6=>_0x90bec6[_0x581323(0x154)]===_0x581323(0x152))['length'],'blocked':e[_0x581323(0x13c)][_0x581323(0x177)](_0x13c800=>_0x13c800[_0x581323(0x154)]==='blocked')['length']},e[_0x581323(0x12d)]=null,e[_0x581323(0x145)]=new Date()[_0x581323(0x135)](),n[_0x581323(0x173)](r,JSON[_0x581323(0x168)](e,null,0x2)),console[_0x581323(0x15a)](_0x581323(0x138))):console['log']('✅\x20Tracker\x20already\x20synchronized\x0a'),process[_0x581323(0x178)](0x0);}var {execSync:S}=i(_0x581323(0x121));try{var _0x4206db={};_0x4206db[_0x581323(0x14d)]=_0x581323(0x143);let t=S('git\x20status\x20--porcelain',_0x4206db);t[_0x581323(0x151)]()&&(console[_0x581323(0x172)](_0x581323(0x144)),console['error']('\x0aUncommitted\x20files:'),console[_0x581323(0x172)](t),console['error'](_0x581323(0x139)),console[_0x581323(0x172)](_0x581323(0x126)),console['error'](_0x581323(0x156)+a+_0x581323(0x165)),console[_0x581323(0x172)](''),process[_0x581323(0x178)](0x1));}catch{console[_0x581323(0x130)](_0x581323(0x132)),console[_0x581323(0x130)](_0x581323(0x128));}s[_0x581323(0x154)]=_0x581323(0x152),s[_0x581323(0x149)]=new Date()[_0x581323(0x135)]();if(s[_0x581323(0x123)]){let t=new Date(s[_0x581323(0x123)]),o=new Date(s[_0x581323(0x149)]);s['actualHours']=Math['round']((o-t)/(0x3e8*0x3c*0x3c)*0xa)/0xa;}n['writeFileSync'](l,JSON['stringify'](s,null,0x2)),e[_0x581323(0x12d)]=null,e[_0x581323(0x145)]=new Date()[_0x581323(0x135)]();var g=e[_0x581323(0x13c)]['find'](_0x131e4a=>_0x131e4a['id']===a);function _0x2ad4(){var _0x46df88=['3183649VgXdDn','encoding','statistics','\x0a❌\x20ERROR:\x20Task\x20file\x20not\x20found:\x20','totalTasks','trim','completed','240oOdvlE','status','510123KyikJQ','\x20\x20git\x20commit\x20-m\x20\x22[','\x0a✅\x20Task\x20','oqIZN','in_progress','log','74403TVWsfg','110jNJmox','title','RpaMk','h\x20|\x20Variance:\x20','actualHours','495aZCmOE','cNjsq','Plan:\x20','estimatedHours',']\x20Description\x20of\x20changes\x22','toString','Set\x20active\x20plan\x20first:\x20npm\x20run\x20plan:manager\x0a','stringify','existsSync','readFileSync','llVvS','find','.claude/plans','SWGfo','Syncing\x20tracker\x20status...\x0a','2PyxdPF','oVchj','error','writeFileSync','213697QoHVOH','Dynamic\x20require\x20of\x20\x22','blocked','filter','exit','constructor','fyOYc','child_process','pending','startedAt','📋\x20Plan:\x20','join','\x20\x20git\x20add\x20.','sstSE','Make\x20sure\x20all\x20changes\x20are\x20committed!\x0a','\x20\x20Start:\x20npm\x20run\x20task:next\x0a','parse','iofTp','8YywbvZ','activeTask','%)\x0a','apply','warn','📌\x20Next\x20task\x20available:','\x0a⚠️\x20\x20WARNING:\x20Could\x20not\x20check\x20git\x20status','📊\x20Estimated:\x20','length','toISOString','argv','RvVep','✅\x20Tracker\x20synchronized\x0a','\x0aCommit\x20all\x20changes\x20before\x20completing\x20task:','3679596WuMHfC','(((.+)+)+)+$','taskFiles','.claude/ACTIVE-PLAN','toFixed','\x0a✅\x20Completed\x20task:\x20','search','\x0a📈\x20Project\x20progress:\x20','\x22\x20is\x20not\x20supported','utf8','\x0a❌\x20ERROR:\x20You\x20have\x20uncommitted\x20changes','lastUpdated','2438691XTNNsm','15748fPxody','iNnUs','completedAt','Initialize\x20first:\x20npm\x20run\x20plan:init\x0a','\x20is\x20already\x20completed'];_0x2ad4=function(){return _0x46df88;};return _0x2ad4();}g&&(g[_0x581323(0x154)]=_0x581323(0x152)),e[_0x581323(0x14e)]={'totalTasks':e[_0x581323(0x13c)][_0x581323(0x134)],'pending':e[_0x581323(0x13c)][_0x581323(0x177)](_0x1287dc=>_0x1287dc['status']===_0x581323(0x122))[_0x581323(0x134)],'inProgress':e['taskFiles'][_0x581323(0x177)](_0x3b9769=>_0x3b9769[_0x581323(0x154)]==='in_progress')[_0x581323(0x134)],'completed':e[_0x581323(0x13c)]['filter'](_0x4447ec=>_0x4447ec[_0x581323(0x154)]===_0x581323(0x152))['length'],'blocked':e[_0x581323(0x13c)][_0x581323(0x177)](_0x549beb=>_0x549beb['status']===_0x581323(0x176))[_0x581323(0x134)]},n['writeFileSync'](r,JSON[_0x581323(0x168)](e,null,0x2)),console['log'](_0x581323(0x13f)+a),console[_0x581323(0x15a)](_0x581323(0x124)+u+'\x0a'),console[_0x581323(0x15a)]('📌\x20'+s[_0x581323(0x15d)]),s[_0x581323(0x160)]&&console[_0x581323(0x15a)]('⏱️\x20\x20Time\x20taken:\x20'+s[_0x581323(0x160)]+'\x20hours');if(s[_0x581323(0x164)]&&s['actualHours']){let t=((s[_0x581323(0x160)]-s['estimatedHours'])/s[_0x581323(0x164)]*0x64)['toFixed'](0x1);console[_0x581323(0x15a)](_0x581323(0x133)+s[_0x581323(0x164)]+_0x581323(0x15f)+t+'%');}var h=(e[_0x581323(0x14e)][_0x581323(0x152)]/e[_0x581323(0x14e)][_0x581323(0x150)]*0x64)[_0x581323(0x13e)](0x1);console[_0x581323(0x15a)](_0x581323(0x141)+e['statistics'][_0x581323(0x152)]+'/'+e[_0x581323(0x14e)][_0x581323(0x150)]+'\x20tasks\x20('+h+_0x581323(0x12e));var c=e[_0x581323(0x13c)][_0x581323(0x16c)](_0x515a20=>_0x515a20['status']==='pending');c?(console[_0x581323(0x15a)](_0x581323(0x131)),console[_0x581323(0x15a)]('\x20\x20'+c['id']+':\x20'+c[_0x581323(0x15d)]),console[_0x581323(0x15a)](_0x581323(0x129))):e['statistics'][_0x581323(0x152)]===e['statistics'][_0x581323(0x150)]&&console['log']('🎉\x20ALL\x20TASKS\x20COMPLETED!\x20Project\x20finished.\x0a'),process[_0x581323(0x178)](0x0);