gl-life-claude-zen 1.0.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +213 -0
- package/README.md +165 -0
- 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 +9 -1
- package/package.json +6 -2
- package/templates/.claude/CLAUDE.md +196 -0
- package/templates/.claude/settings.json +40 -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,217 @@ 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.0] - 2025-12-20
|
|
246
|
+
|
|
247
|
+
### Changed
|
|
248
|
+
- **BREAKING: All UI Testing Requirements Now Hard Requirements**
|
|
249
|
+
- All 10 UI testing validations now always block commits (cannot be disabled)
|
|
250
|
+
- Previously soft requirements (controlled by strictMode):
|
|
251
|
+
- requireProps - Tests must provide required props
|
|
252
|
+
- requireEventTests - Tests must simulate user events
|
|
253
|
+
- requireApiMocking - Tests must mock API calls
|
|
254
|
+
- requireStateTests - Tests must validate state changes
|
|
255
|
+
- requireFormTests - Tests must validate form submission
|
|
256
|
+
- requireConditionalTests - Tests must cover conditional branches
|
|
257
|
+
- requireIntegrationSite - Components must be in test-site/
|
|
258
|
+
- These join existing hard requirements (requireTestFile, requireImport, requireRender)
|
|
259
|
+
- Rationale: Zero-compromise quality - ensures production-ready UI components
|
|
260
|
+
- Migration: All projects must now meet full UI testing standards (no opt-out)
|
|
261
|
+
- Updated validate-ui-integration.js hook to enforce all requirements
|
|
262
|
+
- Updated README.md with "Hard Requirements" section
|
|
263
|
+
- Updated settings.json template with warning comment
|
|
264
|
+
|
|
265
|
+
### Technical Details
|
|
266
|
+
- Updated hook: validate-ui-integration.js (16KB bundled)
|
|
267
|
+
- All 10 requirements enforced in shouldBlock() function
|
|
268
|
+
- No configuration options to disable requirements
|
|
269
|
+
- Breaking change for projects relying on soft requirement warnings
|
|
270
|
+
|
|
60
271
|
## [Unreleased]
|
|
61
272
|
|
|
62
273
|
### Planned
|
|
@@ -65,6 +276,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
65
276
|
- Custom hook support
|
|
66
277
|
- Plugin system
|
|
67
278
|
- Web dashboard for progress visualization
|
|
279
|
+
- Contract generator CLI tool
|
|
280
|
+
- Visual regression testing
|
|
68
281
|
|
|
69
282
|
---
|
|
70
283
|
|
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,150 @@ 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
|
+
|
|
237
|
+
### UI Testing Configuration
|
|
238
|
+
|
|
239
|
+
The framework enforces strict UI testing requirements by default. Configure these in `.claude/settings.json`:
|
|
240
|
+
|
|
241
|
+
#### Global Strict Mode
|
|
242
|
+
|
|
243
|
+
```json
|
|
244
|
+
{
|
|
245
|
+
"testing": {
|
|
246
|
+
"ui": {
|
|
247
|
+
"strictMode": true // false = warnings only, true = blocks commits
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
#### Per-Requirement Controls
|
|
254
|
+
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"testing": {
|
|
258
|
+
"ui": {
|
|
259
|
+
"strictMode": true,
|
|
260
|
+
"requireProps": true, // Tests must provide required props
|
|
261
|
+
"requireEventTests": true, // Tests must simulate user events
|
|
262
|
+
"requireApiMocking": true, // Tests must mock API calls
|
|
263
|
+
"requireStateTests": true, // Tests must validate state changes
|
|
264
|
+
"requireFormTests": true, // Tests must validate form submission
|
|
265
|
+
"requireConditionalTests": true,// Tests must cover conditional branches
|
|
266
|
+
"requireIntegrationSite": true // Components must be in test-site/
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### UI Testing Requirements (Hard Requirements - Always Enforced)
|
|
273
|
+
|
|
274
|
+
All UI testing requirements are **hard requirements** that **always block** commits if violated:
|
|
275
|
+
|
|
276
|
+
- **requireTestFile** - UI component must have test file
|
|
277
|
+
- **requireImport** - Test must import the component
|
|
278
|
+
- **requireRender** - Test must render the component
|
|
279
|
+
- **requireProps** - Tests must provide required props (validates prop passing)
|
|
280
|
+
- **requireEventTests** - Tests must simulate user events (validates user interactions)
|
|
281
|
+
- **requireApiMocking** - Tests must mock API calls (validates async behavior)
|
|
282
|
+
- **requireStateTests** - Tests must validate state changes (validates state management)
|
|
283
|
+
- **requireFormTests** - Tests must validate form submission (validates form behavior)
|
|
284
|
+
- **requireConditionalTests** - Tests must cover conditional branches (validates logic paths)
|
|
285
|
+
- **requireIntegrationSite** - Components must be in test-site/ (validates stakeholder preview)
|
|
286
|
+
|
|
287
|
+
**Important Notes:**
|
|
288
|
+
- ⚠️ **These requirements CANNOT be disabled** - They always enforce strict UI testing standards
|
|
289
|
+
- 🚫 **Commits will be blocked** if any requirement is violated
|
|
290
|
+
- ✅ **Zero compromise on quality** - All UI components must have comprehensive tests
|
|
291
|
+
- 🎯 **Best practice enforcement** - Ensures production-ready components
|
|
292
|
+
|
|
293
|
+
**Configuration (for reference only):**
|
|
294
|
+
|
|
295
|
+
```json
|
|
296
|
+
{
|
|
297
|
+
"testing": {
|
|
298
|
+
"ui": {
|
|
299
|
+
"strictMode": true, // Always true (hard requirement)
|
|
300
|
+
"requireTestFile": true, // Cannot disable
|
|
301
|
+
"requireImport": true, // Cannot disable
|
|
302
|
+
"requireRender": true, // Cannot disable
|
|
303
|
+
"requireProps": true, // Cannot disable
|
|
304
|
+
"requireEventTests": true, // Cannot disable
|
|
305
|
+
"requireApiMocking": true, // Cannot disable
|
|
306
|
+
"requireStateTests": true, // Cannot disable
|
|
307
|
+
"requireFormTests": true, // Cannot disable
|
|
308
|
+
"requireConditionalTests": true, // Cannot disable
|
|
309
|
+
"requireIntegrationSite": true // Cannot disable
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**Why Hard Requirements?**
|
|
316
|
+
|
|
317
|
+
This framework enforces production-grade quality standards:
|
|
318
|
+
- **No shortcuts** - Every UI component gets proper test coverage
|
|
319
|
+
- **Stakeholder confidence** - Integration site ensures visual validation
|
|
320
|
+
- **Maintainability** - Comprehensive tests prevent regressions
|
|
321
|
+
- **Professional standards** - Enforces industry best practices
|
|
322
|
+
|
|
323
|
+
#### Integration Test Website
|
|
324
|
+
|
|
325
|
+
UI components must be added to the `test-site/` directory for stakeholder validation:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
cd test-site
|
|
329
|
+
npm install
|
|
330
|
+
npm run dev # Runs at http://localhost:3000
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
**Deploy to stakeholders:**
|
|
334
|
+
```bash
|
|
335
|
+
cd test-site
|
|
336
|
+
npm run deploy # Deploys to GitHub Pages
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Configuration:**
|
|
340
|
+
```json
|
|
341
|
+
{
|
|
342
|
+
"testing": {
|
|
343
|
+
"ui": {
|
|
344
|
+
"requireIntegrationSite": true,
|
|
345
|
+
"integrationSiteDir": "test-site" // Or custom directory
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
See `test-site/README.md` for full integration testing guide.
|
|
352
|
+
|
|
188
353
|
### CLAUDE.md
|
|
189
354
|
|
|
190
355
|
Project-specific development guidelines and rules. Customize for your team's workflow.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var _0x1e448f=_0x5f4d;function _0x47be(){var _0x1bd032=['Mwshs','match','stdio','Warning:\x20Could\x20not\x20format\x20','ZaVrf','(((.+)+)+)+$','1931800hcNVwA','parse','fELwD','Formatted:\x20','MLheR','NyLcs','npx\x20prettier\x20--write\x20\x22','python\x20-m\x20black\x20--version','237885tqchVf','constructor','131684zPhEhu','XOIaf','vhlIe','WzQFD','TDHXS','log','apply','183494wVSXRf','file_path','PQvPx','taNPm','existsSync','ignore','wpOet','6qCGEfN','search','python\x20-m\x20black\x20\x22','child_process','8LEOPvQ','2764629SyZzeV','TfOQP','56553vYLgDK','WDQgB','842820yTLYLB','warn','fklKo','exit','npx\x20prettier\x20--version','NPheL','4QRvQtT','\x22\x20is\x20not\x20supported'];_0x47be=function(){return _0x1bd032;};return _0x47be();}function _0x5f4d(_0x3ba3af,_0x2d8d7e){_0x3ba3af=_0x3ba3af-0x12f;var _0x2b7ef6=_0x47be();var _0x27dac2=_0x2b7ef6[_0x3ba3af];return _0x27dac2;}(function(_0x3b4e4a,_0x2e76cf){var _0x5de888=_0x5f4d,_0x2e2a26=_0x3b4e4a();while(!![]){try{var _0x15a58c=parseInt(_0x5de888(0x143))/0x1+-parseInt(_0x5de888(0x13c))/0x2+-parseInt(_0x5de888(0x13a))/0x3*(parseInt(_0x5de888(0x159))/0x4)+parseInt(_0x5de888(0x132))/0x5*(parseInt(_0x5de888(0x14a))/0x6)+-parseInt(_0x5de888(0x151))/0x7+parseInt(_0x5de888(0x14e))/0x8*(-parseInt(_0x5de888(0x14f))/0x9)+parseInt(_0x5de888(0x153))/0xa;if(_0x15a58c===_0x2e76cf)break;else _0x2e2a26['push'](_0x2e2a26['shift']());}catch(_0x54c63c){_0x2e2a26['push'](_0x2e2a26['shift']());}}}(_0x47be,0x2f4cb));var _0x54df33=(function(){var _0x5db676=_0x5f4d,_0x579104={};_0x579104[_0x5db676(0x137)]='npx\x20prettier\x20--version',_0x579104[_0x5db676(0x13e)]=_0x5db676(0x148),_0x579104[_0x5db676(0x158)]=_0x5db676(0x145),_0x579104['WDQgB']=function(_0x4f0598,_0x33d7a9){return _0x4f0598!==_0x33d7a9;},_0x579104['MLheR']='wxndk';var _0x53e3c2=_0x579104,_0x46e6c2=!![];return function(_0x207acd,_0x1e252f){var _0xe6027=_0x5db676,_0x2dd66b={};_0x2dd66b[_0xe6027(0x134)]=_0x53e3c2[_0xe6027(0x137)],_0x2dd66b[_0xe6027(0x149)]=_0x53e3c2[_0xe6027(0x13e)],_0x2dd66b['TfOQP']=function(_0x58d375,_0x161e73){return _0x58d375!==_0x161e73;},_0x2dd66b['ZaVrf']=_0x53e3c2[_0xe6027(0x158)];var _0x459a26=_0x2dd66b;if(_0x53e3c2[_0xe6027(0x152)](_0x53e3c2['MLheR'],_0x53e3c2[_0xe6027(0x136)])){var _0xd40d78=_0x9b5412[_0xe6027(0x142)](_0x1e7f6a,arguments);return _0x18207e=null,_0xd40d78;}else{var _0x43e010=_0x46e6c2?function(){var _0xc99660=_0xe6027,_0x31b078={'WzQFD':_0x459a26['fELwD'],'Mwshs':_0x459a26['wpOet'],'taNPm':function(_0x2babe5,_0x49c8b1,_0x238cfc){return _0x2babe5(_0x49c8b1,_0x238cfc);}};if(_0x1e252f){if(_0x459a26[_0xc99660(0x150)](_0xc99660(0x145),_0x459a26[_0xc99660(0x130)]))_0x14ab71(_0x31b078[_0xc99660(0x13f)],{'stdio':_0x31b078['Mwshs']}),_0x31b078[_0xc99660(0x146)](_0xb4f8db,'npx\x20prettier\x20--write\x20\x22'+_0x3a7e05+'\x22',{'stdio':_0x31b078[_0xc99660(0x15b)]}),_0x1c8d4[_0xc99660(0x141)](_0xc99660(0x135)+_0xcc2758);else{var _0x3c6610=_0x1e252f[_0xc99660(0x142)](_0x207acd,arguments);return _0x1e252f=null,_0x3c6610;}}}:function(){};return _0x46e6c2=![],_0x43e010;}};}()),_0x27dac2=_0x54df33(this,function(){var _0x31cd9e=_0x5f4d,_0x43ba21={};_0x43ba21[_0x31cd9e(0x13d)]=_0x31cd9e(0x131);var _0x2a63c7=_0x43ba21;return _0x27dac2['toString']()[_0x31cd9e(0x14b)]('(((.+)+)+)+$')['toString']()[_0x31cd9e(0x13b)](_0x27dac2)[_0x31cd9e(0x14b)](_0x2a63c7['XOIaf']);});_0x27dac2();var r=(_0x2f17d2=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x2f17d2,{'get':(_0x2167e8,_0x228e44)=>(typeof require<'u'?require:_0x2167e8)[_0x228e44]}):_0x2f17d2)(function(_0x3ba5fa){var _0x3b85ba=_0x5f4d,_0x5e4b05={};_0x5e4b05[_0x3b85ba(0x155)]=function(_0x7c9779,_0xa0643d){return _0x7c9779<_0xa0643d;},_0x5e4b05[_0x3b85ba(0x140)]=function(_0x4e1811,_0x4cdd07){return _0x4e1811+_0x4cdd07;};var _0x5c241b=_0x5e4b05;if(_0x5c241b[_0x3b85ba(0x155)](typeof require,'u'))return require[_0x3b85ba(0x142)](this,arguments);throw Error(_0x5c241b['TDHXS'](_0x5c241b[_0x3b85ba(0x140)]('Dynamic\x20require\x20of\x20\x22',_0x3ba5fa),_0x3b85ba(0x15a)));}),{execSync:e}=r(_0x1e448f(0x14d)),i=r('fs'),c=process['argv'][0x2]||'{}',a=JSON[_0x1e448f(0x133)](c),t=a['tool_input']?.[_0x1e448f(0x144)];(!t||!i[_0x1e448f(0x147)](t))&&process[_0x1e448f(0x156)](0x0);try{if(t[_0x1e448f(0x15c)](/\.(ts|tsx|js|jsx|json)$/))try{var _0x135ef9={};_0x135ef9[_0x1e448f(0x15d)]=_0x1e448f(0x148);var _0x4489d0={};_0x4489d0['stdio']=_0x1e448f(0x148),(e(_0x1e448f(0x157),_0x135ef9),e(_0x1e448f(0x138)+t+'\x22',_0x4489d0),console[_0x1e448f(0x141)](_0x1e448f(0x135)+t));}catch{}else{if(t[_0x1e448f(0x15c)](/\.py$/))try{var _0x4aa679={};_0x4aa679[_0x1e448f(0x15d)]='ignore';var _0x1e4de5={};_0x1e4de5[_0x1e448f(0x15d)]=_0x1e448f(0x148),(e(_0x1e448f(0x139),_0x4aa679),e(_0x1e448f(0x14c)+t+'\x22',_0x1e4de5),console[_0x1e448f(0x141)](_0x1e448f(0x135)+t));}catch{}}}catch{console[_0x1e448f(0x154)](_0x1e448f(0x12f)+t);}process['exit'](0x0);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var _0x5e04e6=_0x4bbd;function _0x4bbd(_0x30e729,_0x29a3d6){_0x30e729=_0x30e729-0x198;var _0x23e92d=_0x34a5();var _0x55579e=_0x23e92d[_0x30e729];return _0x55579e;}(function(_0x2ba039,_0x5d2a85){var _0x15eafd=_0x4bbd,_0x591ddf=_0x2ba039();while(!![]){try{var _0x1a0979=-parseInt(_0x15eafd(0x1e0))/0x1*(parseInt(_0x15eafd(0x1c1))/0x2)+parseInt(_0x15eafd(0x1d2))/0x3+-parseInt(_0x15eafd(0x1a3))/0x4+parseInt(_0x15eafd(0x1cf))/0x5+-parseInt(_0x15eafd(0x1d4))/0x6+parseInt(_0x15eafd(0x1e9))/0x7+parseInt(_0x15eafd(0x1b3))/0x8;if(_0x1a0979===_0x5d2a85)break;else _0x591ddf['push'](_0x591ddf['shift']());}catch(_0x20b35e){_0x591ddf['push'](_0x591ddf['shift']());}}}(_0x34a5,0xd3dd6));var _0x6dbc9b=(function(){var _0x142815=_0x4bbd,_0x5ee09f={};_0x5ee09f[_0x142815(0x19e)]=_0x142815(0x1ae),_0x5ee09f[_0x142815(0x19d)]=_0x142815(0x1af),_0x5ee09f[_0x142815(0x19f)]='utf8',_0x5ee09f['FDGWZ']=_0x142815(0x1df);var _0x5bef35=_0x5ee09f,_0x37d2ad=!![];return function(_0x343246,_0x3d70fc){var _0x4be59d=_0x142815,_0x10e063={'YEqOV':function(_0x4612ae,_0xe969f4,_0x490385){return _0x4612ae(_0xe969f4,_0x490385);},'PLYVR':_0x5bef35['Cqsub'],'Vhtwv':_0x5bef35[_0x4be59d(0x19f)],'QtblS':_0x5bef35['FDGWZ']},_0x143490=_0x37d2ad?function(){var _0x5f4de3=_0x4be59d;if(_0x3d70fc){if(_0x5bef35['YtZfc']!==_0x5bef35[_0x5f4de3(0x19e)]){let _0x513613=_0x10e063['YEqOV'](_0x31cb54,_0x10e063['PLYVR'],{'encoding':_0x10e063[_0x5f4de3(0x1e1)]});_0x513613[_0x5f4de3(0x1f2)]()&&(_0x5ac9e3['error']('\x0a❌\x20ERROR:\x20You\x20have\x20uncommitted\x20changes'),_0x158c4b[_0x5f4de3(0x1bb)](_0x5f4de3(0x1ea)),_0x48cc50[_0x5f4de3(0x1bb)](_0x513613),_0x34cbca['error'](_0x5f4de3(0x1b4)),_0x214f6d[_0x5f4de3(0x1bb)](_0x10e063[_0x5f4de3(0x1db)]),_0x165349[_0x5f4de3(0x1bb)](_0x5f4de3(0x1a4)+_0x44a21e+_0x5f4de3(0x1b2)),_0x580569[_0x5f4de3(0x1bb)](''),_0x1783b9[_0x5f4de3(0x1ef)](0x1));}else{var _0x4dec73=_0x3d70fc[_0x5f4de3(0x1ec)](_0x343246,arguments);return _0x3d70fc=null,_0x4dec73;}}}:function(){};return _0x37d2ad=![],_0x143490;};}()),_0x55579e=_0x6dbc9b(this,function(){var _0x522834=_0x4bbd,_0x1eafb1={};_0x1eafb1[_0x522834(0x1c7)]=_0x522834(0x1cb);var _0x5243a1=_0x1eafb1;return _0x55579e['toString']()['search'](_0x5243a1[_0x522834(0x1c7)])[_0x522834(0x1c5)]()[_0x522834(0x1d6)](_0x55579e)[_0x522834(0x1ce)](_0x5243a1[_0x522834(0x1c7)]);});_0x55579e();var i=(_0x103d1a=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x103d1a,{'get':(_0x52719b,_0x470757)=>(typeof require<'u'?require:_0x52719b)[_0x470757]}):_0x103d1a)(function(_0x2e8211){var _0x3141ae=_0x4bbd,_0x522d3b={'iQaQi':function(_0x4fde4a,_0x31a666){return _0x4fde4a<_0x31a666;},'cUMVd':function(_0x552a3a,_0x4c2d10){return _0x552a3a(_0x4c2d10);},'FdhGc':function(_0x575232,_0x425827){return _0x575232+_0x425827;},'RtMOl':_0x3141ae(0x1f0),'BRyfW':_0x3141ae(0x1ed)};if(_0x522d3b[_0x3141ae(0x1be)](typeof require,'u'))return require[_0x3141ae(0x1ec)](this,arguments);throw _0x522d3b[_0x3141ae(0x1e4)](Error,_0x522d3b[_0x3141ae(0x1a8)](_0x522d3b[_0x3141ae(0x1f3)],_0x2e8211)+_0x522d3b['BRyfW']);}),n=i('fs'),d=i(_0x5e04e6(0x19c)),a=process[_0x5e04e6(0x1a7)][0x2];a||(console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1ad)),console['error'](_0x5e04e6(0x1e3)),process[_0x5e04e6(0x1ef)](0x1));var p=_0x5e04e6(0x1bf);n[_0x5e04e6(0x198)](p)||(console[_0x5e04e6(0x1bb)]('\x0a❌\x20ERROR:\x20No\x20active\x20plan\x20found'),console[_0x5e04e6(0x1bb)]('Set\x20active\x20plan\x20first:\x20npm\x20run\x20plan:manager\x0a'),process[_0x5e04e6(0x1ef)](0x1));var u=n[_0x5e04e6(0x1d7)](p,_0x5e04e6(0x1c2))['trim'](),k=d[_0x5e04e6(0x1ab)](_0x5e04e6(0x1bd),u),r=d[_0x5e04e6(0x1ab)](k,_0x5e04e6(0x1c8)),l=d[_0x5e04e6(0x1ab)](k,'tasks',a+_0x5e04e6(0x1b5));n[_0x5e04e6(0x198)](r)||(console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1c4)),console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1b0)+u),console[_0x5e04e6(0x1bb)](_0x5e04e6(0x19a)),process['exit'](0x1)),n[_0x5e04e6(0x198)](l)||(console[_0x5e04e6(0x1bb)]('\x0a❌\x20ERROR:\x20Task\x20file\x20not\x20found:\x20'+l+'\x0a'),process[_0x5e04e6(0x1ef)](0x1));var e=JSON[_0x5e04e6(0x1c9)](n[_0x5e04e6(0x1d7)](r,_0x5e04e6(0x1c2))),s=JSON[_0x5e04e6(0x1c9)](n[_0x5e04e6(0x1d7)](l,_0x5e04e6(0x1c2))),f=s[_0x5e04e6(0x1c3)]==='completed';if(f){console['log'](_0x5e04e6(0x1a5)+a+_0x5e04e6(0x1eb)),console[_0x5e04e6(0x1d9)]('Syncing\x20tracker\x20status...\x0a');let t=e[_0x5e04e6(0x1cc)][_0x5e04e6(0x1d0)](_0x2aeafb=>_0x2aeafb['id']===a);t&&t[_0x5e04e6(0x1c3)]!==_0x5e04e6(0x1e5)?(t[_0x5e04e6(0x1c3)]='completed',e[_0x5e04e6(0x1b8)]={'totalTasks':e[_0x5e04e6(0x1cc)]['length'],'pending':e[_0x5e04e6(0x1cc)][_0x5e04e6(0x1d3)](_0x19deec=>_0x19deec[_0x5e04e6(0x1c3)]===_0x5e04e6(0x1e2))[_0x5e04e6(0x1c0)],'inProgress':e['taskFiles'][_0x5e04e6(0x1d3)](_0x1acf1c=>_0x1acf1c['status']==='in_progress')[_0x5e04e6(0x1c0)],'completed':e[_0x5e04e6(0x1cc)][_0x5e04e6(0x1d3)](_0x129968=>_0x129968['status']===_0x5e04e6(0x1e5))[_0x5e04e6(0x1c0)],'blocked':e[_0x5e04e6(0x1cc)]['filter'](_0x55b73b=>_0x55b73b[_0x5e04e6(0x1c3)]===_0x5e04e6(0x1e8))[_0x5e04e6(0x1c0)]},e[_0x5e04e6(0x1ac)]=null,e['lastUpdated']=new Date()[_0x5e04e6(0x1e6)](),n[_0x5e04e6(0x1a0)](r,JSON['stringify'](e,null,0x2)),console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1b1))):console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1aa)),process[_0x5e04e6(0x1ef)](0x0);}var {execSync:S}=i('child_process');try{var _0x1f0d37={};_0x1f0d37[_0x5e04e6(0x1a2)]=_0x5e04e6(0x1c2);let t=S('git\x20status\x20--porcelain',_0x1f0d37);t[_0x5e04e6(0x1f2)]()&&(console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1ee)),console[_0x5e04e6(0x1bb)]('\x0aUncommitted\x20files:'),console['error'](t),console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1b4)),console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1df)),console[_0x5e04e6(0x1bb)](_0x5e04e6(0x1a4)+a+_0x5e04e6(0x1b2)),console[_0x5e04e6(0x1bb)](''),process[_0x5e04e6(0x1ef)](0x1));}catch{console['warn'](_0x5e04e6(0x1a9)),console[_0x5e04e6(0x1d5)]('Make\x20sure\x20all\x20changes\x20are\x20committed!\x0a');}s[_0x5e04e6(0x1c3)]=_0x5e04e6(0x1e5),s[_0x5e04e6(0x199)]=new Date()['toISOString']();if(s['startedAt']){let t=new Date(s[_0x5e04e6(0x1b9)]),o=new Date(s[_0x5e04e6(0x199)]);s[_0x5e04e6(0x1d1)]=Math[_0x5e04e6(0x1ba)]((o-t)/(0x3e8*0x3c*0x3c)*0xa)/0xa;}n[_0x5e04e6(0x1a0)](l,JSON['stringify'](s,null,0x2)),e[_0x5e04e6(0x1ac)]=null,e['lastUpdated']=new Date()[_0x5e04e6(0x1e6)]();var g=e[_0x5e04e6(0x1cc)]['find'](_0x22a4e7=>_0x22a4e7['id']===a);g&&(g['status']=_0x5e04e6(0x1e5)),e[_0x5e04e6(0x1b8)]={'totalTasks':e['taskFiles'][_0x5e04e6(0x1c0)],'pending':e[_0x5e04e6(0x1cc)][_0x5e04e6(0x1d3)](_0x5509a7=>_0x5509a7[_0x5e04e6(0x1c3)]===_0x5e04e6(0x1e2))[_0x5e04e6(0x1c0)],'inProgress':e[_0x5e04e6(0x1cc)]['filter'](_0x4de949=>_0x4de949['status']===_0x5e04e6(0x1d8))[_0x5e04e6(0x1c0)],'completed':e['taskFiles'][_0x5e04e6(0x1d3)](_0xe8ec46=>_0xe8ec46['status']===_0x5e04e6(0x1e5))[_0x5e04e6(0x1c0)],'blocked':e[_0x5e04e6(0x1cc)]['filter'](_0x110c82=>_0x110c82['status']===_0x5e04e6(0x1e8))[_0x5e04e6(0x1c0)]},n[_0x5e04e6(0x1a0)](r,JSON[_0x5e04e6(0x1f1)](e,null,0x2)),console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1b6)+a),console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1ca)+u+'\x0a'),console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1a1)+s[_0x5e04e6(0x1cd)]),s[_0x5e04e6(0x1d1)]&&console[_0x5e04e6(0x1d9)](_0x5e04e6(0x19b)+s['actualHours']+_0x5e04e6(0x1da));if(s[_0x5e04e6(0x1de)]&&s[_0x5e04e6(0x1d1)]){let t=((s[_0x5e04e6(0x1d1)]-s[_0x5e04e6(0x1de)])/s['estimatedHours']*0x64)[_0x5e04e6(0x1b7)](0x1);console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1dc)+s['estimatedHours']+_0x5e04e6(0x1bc)+t+'%');}var h=(e[_0x5e04e6(0x1b8)]['completed']/e[_0x5e04e6(0x1b8)][_0x5e04e6(0x1dd)]*0x64)[_0x5e04e6(0x1b7)](0x1);console[_0x5e04e6(0x1d9)]('\x0a📈\x20Project\x20progress:\x20'+e[_0x5e04e6(0x1b8)][_0x5e04e6(0x1e5)]+'/'+e[_0x5e04e6(0x1b8)][_0x5e04e6(0x1dd)]+_0x5e04e6(0x1e7)+h+_0x5e04e6(0x1a6));var c=e[_0x5e04e6(0x1cc)]['find'](_0x2adfc1=>_0x2adfc1['status']===_0x5e04e6(0x1e2));function _0x34a5(){var _0x5283c7=['2251855kwdpec','find','actualHours','34809NUGpdJ','filter','9987042cOqPQN','warn','constructor','readFileSync','in_progress','log','\x20hours','QtblS','📊\x20Estimated:\x20','totalTasks','estimatedHours','\x20\x20git\x20add\x20.','14lEGdGe','Vhtwv','pending','Usage:\x20npm\x20run\x20task:done\x20TASK-001\x0a','cUMVd','completed','toISOString','\x20tasks\x20(','blocked','448980XbJbXY','\x0aUncommitted\x20files:','\x20is\x20already\x20completed','apply','\x22\x20is\x20not\x20supported','\x0a❌\x20ERROR:\x20You\x20have\x20uncommitted\x20changes','exit','Dynamic\x20require\x20of\x20\x22','stringify','trim','RtMOl','existsSync','completedAt','Initialize\x20first:\x20npm\x20run\x20plan:init\x0a','⏱️\x20\x20Time\x20taken:\x20','path','Cqsub','YtZfc','WfjJh','writeFileSync','📌\x20','encoding','6690988pMKTjZ','\x20\x20git\x20commit\x20-m\x20\x22[','\x0a✅\x20Task\x20','%)\x0a','argv','FdhGc','\x0a⚠️\x20\x20WARNING:\x20Could\x20not\x20check\x20git\x20status','✅\x20Tracker\x20already\x20synchronized\x0a','join','activeTask','\x0a❌\x20ERROR:\x20Task\x20ID\x20required','wKRID','git\x20status\x20--porcelain','Plan:\x20','✅\x20Tracker\x20synchronized\x0a',']\x20Description\x20of\x20changes\x22','30813584UZIWSx','\x0aCommit\x20all\x20changes\x20before\x20completing\x20task:','.json','\x0a✅\x20Completed\x20task:\x20','toFixed','statistics','startedAt','round','error','h\x20|\x20Variance:\x20','.claude/plans','iQaQi','.claude/ACTIVE-PLAN','length','24680GrJYgh','utf8','status','\x0a❌\x20ERROR:\x20Task\x20tracker\x20not\x20found','toString','🎉\x20ALL\x20TASKS\x20COMPLETED!\x20Project\x20finished.\x0a','iTzQS','TASK-TRACKER.json','parse','📋\x20Plan:\x20','(((.+)+)+)+$','taskFiles','title','search'];_0x34a5=function(){return _0x5283c7;};return _0x34a5();}c?(console['log']('📌\x20Next\x20task\x20available:'),console[_0x5e04e6(0x1d9)]('\x20\x20'+c['id']+':\x20'+c[_0x5e04e6(0x1cd)]),console[_0x5e04e6(0x1d9)]('\x20\x20Start:\x20npm\x20run\x20task:next\x0a')):e[_0x5e04e6(0x1b8)][_0x5e04e6(0x1e5)]===e['statistics'][_0x5e04e6(0x1dd)]&&console[_0x5e04e6(0x1d9)](_0x5e04e6(0x1c6)),process[_0x5e04e6(0x1ef)](0x0);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var _0x1bcf99=_0x287a;(function(_0x4ee6e1,_0x7da514){var _0x410bb9=_0x287a,_0x181bef=_0x4ee6e1();while(!![]){try{var _0x3fb984=parseInt(_0x410bb9(0x229))/0x1*(-parseInt(_0x410bb9(0x200))/0x2)+parseInt(_0x410bb9(0x1f7))/0x3*(-parseInt(_0x410bb9(0x233))/0x4)+-parseInt(_0x410bb9(0x21d))/0x5*(parseInt(_0x410bb9(0x20a))/0x6)+-parseInt(_0x410bb9(0x21c))/0x7*(parseInt(_0x410bb9(0x22b))/0x8)+parseInt(_0x410bb9(0x231))/0x9*(-parseInt(_0x410bb9(0x210))/0xa)+-parseInt(_0x410bb9(0x236))/0xb+parseInt(_0x410bb9(0x232))/0xc;if(_0x3fb984===_0x7da514)break;else _0x181bef['push'](_0x181bef['shift']());}catch(_0x116e68){_0x181bef['push'](_0x181bef['shift']());}}}(_0x278d,0xd442b));var _0x33deb4=(function(){var _0x7db972=_0x287a,_0x5c6417={'aanSK':function(_0x159343,_0x26f21c){return _0x159343<_0x26f21c;},'dgpEv':function(_0x1d1ba1,_0x1a9ea4){return _0x1d1ba1(_0x1a9ea4);},'wxHgK':function(_0x578e27,_0x5cad56){return _0x578e27+_0x5cad56;},'JyPTO':_0x7db972(0x1f0),'BwpNj':'\x22\x20is\x20not\x20supported','Lxiak':function(_0x4392f6,_0x568c6d){return _0x4392f6===_0x568c6d;},'jCBLE':_0x7db972(0x223),'wJiYE':'Migrations\x20must\x20be\x20tested\x20in\x20development/staging\x20first','JHZwu':_0x7db972(0x21a),'BMaKk':'BbELI','oKvry':_0x7db972(0x20f),'ErjOz':_0x7db972(0x1ff),'IykRH':_0x7db972(0x201)},_0xb073ba=!![];return function(_0x1661cc,_0x4f5d80){var _0x832593=_0x7db972,_0x4f0e5f={'wxMfl':function(_0x1bb361,_0x4f4358){return _0x5c6417['Lxiak'](_0x1bb361,_0x4f4358);},'TVyKX':_0x5c6417['jCBLE'],'zEePa':_0x832593(0x230),'lvRzJ':_0x5c6417['wJiYE'],'MVqYD':_0x5c6417[_0x832593(0x206)],'Wszrn':function(_0x2a796c,_0x5c1e40){return _0x2a796c===_0x5c1e40;},'IweYn':_0x5c6417[_0x832593(0x212)],'IJyVF':_0x5c6417[_0x832593(0x228)]};if(_0x5c6417['ErjOz']===_0x5c6417['IykRH']){if(_0x5c6417[_0x832593(0x20e)](typeof _0x483672,'u'))return _0x26785c['apply'](this,arguments);throw _0x5c6417[_0x832593(0x23a)](_0x5cd4a7,_0x5c6417[_0x832593(0x21f)](_0x5c6417[_0x832593(0x21f)](_0x5c6417[_0x832593(0x224)],_0x1210dd),_0x5c6417[_0x832593(0x21e)]));}else{var _0x54b973=_0xb073ba?function(){var _0x3fb457=_0x832593;if(_0x4f0e5f['wxMfl'](_0x3fb457(0x22d),_0x4f0e5f[_0x3fb457(0x1ed)])){var _0x2aefcb=_0x576c59?function(){var _0x5149f1=_0x3fb457;if(_0x3f3bf5){var _0x423e3f=_0x7418df[_0x5149f1(0x1fb)](_0x3ac63a,arguments);return _0x4a8f8f=null,_0x423e3f;}}:function(){};return _0x35fe4e=![],_0x2aefcb;}else{if(_0x4f5d80){if(_0x4f0e5f[_0x3fb457(0x1eb)](_0x4f0e5f[_0x3fb457(0x222)],_0x4f0e5f[_0x3fb457(0x203)])){let _0x41e73e=_0x2c440c[_0x3fb457(0x208)]['NODE_ENV']||_0x3fb457(0x213);_0x2369d4[_0x3fb457(0x239)]('\x20\x20Environment:\x20'+_0x41e73e),_0x4f0e5f[_0x3fb457(0x22a)](_0x41e73e,_0x4f0e5f['TVyKX'])&&(_0x5719e1['push'](_0x4f0e5f[_0x3fb457(0x1f3)]),_0xc410d0[_0x3fb457(0x214)](_0x4f0e5f[_0x3fb457(0x237)]),_0xfd1901[_0x3fb457(0x214)](_0x3fb457(0x20d)));}else{var _0x51aa4a=_0x4f5d80[_0x3fb457(0x1fb)](_0x1661cc,arguments);return _0x4f5d80=null,_0x51aa4a;}}}}:function(){};return _0xb073ba=![],_0x54b973;}};}()),_0x55206c=_0x33deb4(this,function(){var _0x24b3d3=_0x287a,_0x5a5d44={};_0x5a5d44['Alagz']=_0x24b3d3(0x1fd);var _0x53e8b9=_0x5a5d44;return _0x55206c[_0x24b3d3(0x225)]()[_0x24b3d3(0x20b)](_0x53e8b9[_0x24b3d3(0x220)])['toString']()[_0x24b3d3(0x1fe)](_0x55206c)[_0x24b3d3(0x20b)](_0x53e8b9[_0x24b3d3(0x220)]);});_0x55206c();var e=(_0x496356=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x496356,{'get':(_0x2fd53a,_0x442392)=>(typeof require<'u'?require:_0x2fd53a)[_0x442392]}):_0x496356)(function(_0x2a87d6){var _0x167e6f=_0x287a,_0x526ce9={'kvPbK':function(_0x19ec8f,_0x5435e8){return _0x19ec8f<_0x5435e8;},'cISTZ':function(_0x499b07,_0x1cc35f){return _0x499b07(_0x1cc35f);},'clDSN':function(_0xbe7a22,_0x5508d0){return _0xbe7a22+_0x5508d0;},'WjJbk':_0x167e6f(0x1f1)};if(_0x526ce9[_0x167e6f(0x1fc)](typeof require,'u'))return require[_0x167e6f(0x1fb)](this,arguments);throw _0x526ce9[_0x167e6f(0x1ee)](Error,_0x526ce9['clDSN'](_0x526ce9[_0x167e6f(0x1f4)](_0x167e6f(0x1f0),_0x2a87d6),_0x526ce9[_0x167e6f(0x235)]));}),p=e('fs'),h=e(_0x1bcf99(0x1ea)),{execSync:l}=e('child_process'),u=process[_0x1bcf99(0x22c)][0x2]||'{}',s=JSON['parse'](u),i=s[_0x1bcf99(0x1f6)]?.[_0x1bcf99(0x23b)]||'';i['match'](/migrate|migration/i)||process[_0x1bcf99(0x211)](0x0);function _0x287a(_0x161874,_0x227417){_0x161874=_0x161874-0x1ea;var _0x4573d7=_0x278d();var _0x55206c=_0x4573d7[_0x161874];return _0x55206c;}var n=[],t=[],a=s[_0x1bcf99(0x238)]||'';console[_0x1bcf99(0x239)](_0x1bcf99(0x227));try{let o=process['env'][_0x1bcf99(0x226)]||'development';console[_0x1bcf99(0x239)](_0x1bcf99(0x207)+o),o==='production'&&(n[_0x1bcf99(0x214)]('BLOCKED:\x20Cannot\x20run\x20migrations\x20directly\x20in\x20production'),n[_0x1bcf99(0x214)](_0x1bcf99(0x23c)),n[_0x1bcf99(0x214)](_0x1bcf99(0x20d)));}catch{}try{var _0x2202b9={};_0x2202b9[_0x1bcf99(0x217)]='utf8',l('git\x20status\x20--short',_0x2202b9)[_0x1bcf99(0x1f9)](/migrations?\//)&&(t['push'](_0x1bcf99(0x216)),t[_0x1bcf99(0x214)](_0x1bcf99(0x20c)));}catch{}function _0x278d(){var _0x485d15=['oKSZR','\x20\x20🔙\x20Rolling\x20back\x20migration...\x0a','42SrtoIe','1146135wIWkgh','BwpNj','wxHgK','Alagz','BLOCKED:\x20Migration\x20rollback\x20failed','IweYn','production','JyPTO','toString','NODE_ENV','\x0a🔄\x20MIGRATION\x20WORKFLOW\x20VALIDATION\x0a','oKvry','187970njQLfh','wxMfl','1893352YCrQLE','argv','JyzuF','Check\x20database\x20logs\x20for\x20details','\x20\x20\x20\x20\x203.\x20Check\x20for\x20type\x20errors:\x20npm\x20run\x20build','BLOCKED:\x20Cannot\x20run\x20migrations\x20directly\x20in\x20production','106560fWdJtq','89157180LAkBwK','1431992HmqAdQ','Fix\x20migration\x20errors\x20before\x20proceeding','WjJbk','15298646jvlxDi','lvRzJ','tool_output','log','dgpEv','command','Migrations\x20must\x20be\x20tested\x20in\x20development/staging\x20first','path','Wszrn','BLOCKED:\x20Migration\x20execution\x20failed','MVqYD','cISTZ','\x20\x20⚠️\x20\x20After\x20running\x20migrations,\x20you\x20MUST:\x0a','Dynamic\x20require\x20of\x20\x22','\x22\x20is\x20not\x20supported','forEach','zEePa','clDSN','length','tool_input','3AkxlPW','\x0a⚠️\x20\x20MIGRATION\x20WORKFLOW\x20WARNINGS\x0a','match','Manual\x20intervention\x20required','apply','kvPbK','(((.+)+)+)+$','constructor','XFYVG','16JIarTI','VatfY','\x20\x20\x20\x20\x202.\x20Verify\x20all\x20tests\x20pass\x20with\x20new\x20schema','IJyVF','\x0a❌\x20MIGRATION\x20WORKFLOW\x20FAILED\x0a','error','JHZwu','\x20\x20Environment:\x20','env','\x20\x20\x20\x20\x204.\x20Test\x20rollback:\x20npm\x20run\x20migrate:down\x20(or\x20equivalent)\x0a','24nTDfxY','search','Commit\x20migrations\x20to\x20version\x20control\x20before\x20running\x20them','Use\x20deployment\x20pipeline\x20to\x20run\x20production\x20migrations','aanSK','GAvqr','820ysTJSP','exit','BMaKk','development','push','After\x20migration,\x20run\x20npm\x20test\x20to\x20verify\x20schema\x20compatibility','Uncommitted\x20migration\x20files\x20detected','encoding','test','warn'];_0x278d=function(){return _0x485d15;};return _0x278d();}var g=[/error/i,/failed/i,/exception/i,/syntax error/i,/constraint/i];for(let o of g)if(o[_0x1bcf99(0x218)](a)){n[_0x1bcf99(0x214)](_0x1bcf99(0x1ec)),n[_0x1bcf99(0x214)](_0x1bcf99(0x234)),n[_0x1bcf99(0x214)](_0x1bcf99(0x22e));break;}i[_0x1bcf99(0x1f9)](/migrate.*up|migration.*run/i)&&(console[_0x1bcf99(0x239)](_0x1bcf99(0x1ef)),console[_0x1bcf99(0x239)]('\x20\x20\x20\x20\x201.\x20Run:\x20npm\x20test'),console[_0x1bcf99(0x239)](_0x1bcf99(0x202)),console[_0x1bcf99(0x239)](_0x1bcf99(0x22f)),console[_0x1bcf99(0x239)](_0x1bcf99(0x209)),t[_0x1bcf99(0x214)](_0x1bcf99(0x215))),i['match'](/migrate.*down|migration.*rollback/i)&&(console[_0x1bcf99(0x239)](_0x1bcf99(0x21b)),a[_0x1bcf99(0x1f9)](/error|failed/i)?(n[_0x1bcf99(0x214)](_0x1bcf99(0x221)),n['push']('Database\x20may\x20be\x20in\x20inconsistent\x20state'),n[_0x1bcf99(0x214)](_0x1bcf99(0x1fa))):console['log']('\x20\x20✅\x20Migration\x20rollback\x20successful\x0a')),n['length']>0x0&&(console[_0x1bcf99(0x205)](_0x1bcf99(0x204)),n[_0x1bcf99(0x1f2)](_0x4992b0=>console['error']('\x20\x20'+_0x4992b0)),console[_0x1bcf99(0x205)]('\x0a'),process[_0x1bcf99(0x211)](0x2)),t[_0x1bcf99(0x1f5)]>0x0&&(console[_0x1bcf99(0x219)](_0x1bcf99(0x1f8)),t['forEach'](_0x2da80e=>console[_0x1bcf99(0x219)]('\x20\x20'+_0x2da80e)),console[_0x1bcf99(0x219)]('\x0a')),process['exit'](0x0);
|