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.
- package/CHANGELOG.md +255 -0
- package/README.md +166 -0
- package/bin/create-gl-life-claude.js +56 -1
- package/dist/hooks/auto-format.js +1 -1
- package/dist/hooks/complete-task.js +1 -1
- package/dist/hooks/enforce-migration-workflow.js +1 -1
- package/dist/hooks/enforce-structured-development.js +1 -1
- package/dist/hooks/enforce-test-pyramid.js +1 -1
- package/dist/hooks/init-task-tracker.js +1 -1
- package/dist/hooks/start-task.js +1 -1
- package/dist/hooks/task-status.js +1 -1
- package/dist/hooks/validate-database-changes.js +1 -1
- package/dist/hooks/validate-e2e-coverage.js +1 -1
- package/dist/hooks/validate-git-workflow.js +1 -1
- package/dist/hooks/validate-integration-site.js +2 -0
- package/dist/hooks/validate-migration-impact.js +1 -1
- package/dist/hooks/validate-task-completion.js +1 -1
- package/dist/hooks/validate-test-quality.js +1 -1
- package/dist/hooks/validate-test-results.js +1 -1
- package/dist/hooks/validate-ui-integration.js +1 -1
- package/dist/scripts/help.js +1 -1
- package/dist/scripts/plan-amend.js +1 -1
- package/dist/scripts/plan-create.js +1 -1
- package/dist/scripts/plan-help.js +1 -1
- package/dist/scripts/plan-init.js +1 -1
- package/dist/scripts/plan-manager.js +1 -1
- package/dist/scripts/setup-git-hooks.js +1 -1
- package/dist/scripts/task-done.js +1 -1
- package/dist/scripts/task-merge.js +1 -1
- package/dist/scripts/task-next.js +1 -1
- package/dist/scripts/task-start.js +1 -1
- package/dist/scripts/task-status.js +1 -1
- package/lib/init.js +13 -5
- package/package.json +7 -2
- package/templates/.claude/CLAUDE.md +196 -0
- package/templates/.claude/settings.json +40 -0
- package/templates/.gitignore +14 -0
- package/templates/README.md +4 -0
- package/templates/test-site/README.md +271 -0
- package/templates/test-site/index.html +13 -0
- package/templates/test-site/package.json +25 -0
- package/templates/test-site/server.js +125 -0
- package/templates/test-site/src/App.css +130 -0
- package/templates/test-site/src/App.jsx +78 -0
- package/templates/test-site/src/index.css +39 -0
- package/templates/test-site/src/main.jsx +10 -0
- 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
|
|
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
|
|
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);
|