gl-life-claude-zen 1.0.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +69 -0
  3. package/README.md +237 -0
  4. package/bin/create-gl-life-claude.js +126 -0
  5. package/dist/hooks/auto-format.js +2 -0
  6. package/dist/hooks/complete-task.js +2 -0
  7. package/dist/hooks/enforce-migration-workflow.js +2 -0
  8. package/dist/hooks/enforce-structured-development.js +2 -0
  9. package/dist/hooks/enforce-test-pyramid.js +2 -0
  10. package/dist/hooks/init-task-tracker.js +2 -0
  11. package/dist/hooks/start-task.js +2 -0
  12. package/dist/hooks/task-status.js +2 -0
  13. package/dist/hooks/validate-database-changes.js +2 -0
  14. package/dist/hooks/validate-e2e-coverage.js +2 -0
  15. package/dist/hooks/validate-git-workflow.js +2 -0
  16. package/dist/hooks/validate-migration-impact.js +2 -0
  17. package/dist/hooks/validate-task-completion.js +2 -0
  18. package/dist/hooks/validate-test-quality.js +2 -0
  19. package/dist/hooks/validate-test-results.js +2 -0
  20. package/dist/hooks/validate-ui-integration.js +2 -0
  21. package/dist/scripts/help.js +3 -0
  22. package/dist/scripts/plan-amend.js +3 -0
  23. package/dist/scripts/plan-create.js +3 -0
  24. package/dist/scripts/plan-help.js +3 -0
  25. package/dist/scripts/plan-init.js +3 -0
  26. package/dist/scripts/plan-manager.js +3 -0
  27. package/dist/scripts/setup-git-hooks.js +3 -0
  28. package/dist/scripts/task-done.js +3 -0
  29. package/dist/scripts/task-merge.js +3 -0
  30. package/dist/scripts/task-next.js +3 -0
  31. package/dist/scripts/task-start.js +3 -0
  32. package/dist/scripts/task-status.js +3 -0
  33. package/lib/init.js +113 -0
  34. package/package.json +41 -0
  35. package/templates/.claude/CLAUDE.md +204 -0
  36. package/templates/.claude/PLAN-SCHEMA.json +240 -0
  37. package/templates/.claude/PROJECT-PLAN-TEMPLATE.json +223 -0
  38. package/templates/.claude/settings.json +157 -0
  39. package/templates/README.md +72 -0
  40. package/templates/package.json +27 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,73 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.0] - 2025-12-19
9
+
10
+ ### Added
11
+ - Initial release of create-gl-life-claude
12
+ - Interactive CLI for project generation
13
+ - Project name validation
14
+ - Git initialization option
15
+ - Dependency installation option
16
+ - Comprehensive template structure
17
+ - `.claude/settings.json` with permissions and hooks configuration
18
+ - `.claude/CLAUDE.md` development guidelines
19
+ - `.claude/PLAN-SCHEMA.json` plan structure definition
20
+ - `.claude/PROJECT-PLAN-TEMPLATE.json` for quick starts
21
+ - Bundle system
22
+ - 12 workflow management scripts (minified, 27% smaller)
23
+ - 16 enforcement hooks (minified, protected)
24
+ - Automatic extraction to `node_modules/.gl-life-claude/`
25
+ - Workflow commands
26
+ - Planning: `plan:create`, `plan:init`, `plan:manager`, `plan:amend`, `plan:help`
27
+ - Tasks: `task:start`, `task:next`, `task:done`, `task:status`, `task:merge`
28
+ - Utilities: `help`, `setup:git-hooks`
29
+ - Enforcement hooks
30
+ - Pre-tool-use: Git workflow validation, task completion checks
31
+ - Post-tool-use: Structured development, auto-formatting, test quality
32
+ - Integration test suite
33
+ - Project creation verification
34
+ - Template copying validation
35
+ - Bundle extraction testing
36
+ - Configuration correctness checks
37
+ - Bundle protection tests
38
+ - Minification verification
39
+ - Completeness checks
40
+ - Size optimization validation
41
+ - Shebang preservation tests
42
+
43
+ ### Features
44
+ - **Zero Configuration** - Works out of the box with sensible defaults
45
+ - **Protected Scripts** - Bundled and minified for consistency
46
+ - **Hierarchical Planning** - Projects → Subprojects → Milestones → Tasks
47
+ - **Dependency Tracking** - Tasks can depend on other tasks
48
+ - **Progress Monitoring** - Real-time progress percentage and time tracking
49
+ - **Immutable Plans** - Locked plans with amendment audit trail
50
+ - **Automatic Task Selection** - `task:next` picks next available task
51
+
52
+ ### Technical Details
53
+ - Node.js >= 18.0.0 required
54
+ - ESM modules throughout
55
+ - esbuild for bundling (minify, tree-shaking, external dependencies)
56
+ - Zero runtime dependencies (all bundled)
57
+ - Git integration optional
58
+ - Cross-platform support (Windows, macOS, Linux)
59
+
60
+ ## [Unreleased]
61
+
62
+ ### Planned
63
+ - Version update command
64
+ - Plan templates library
65
+ - Custom hook support
66
+ - Plugin system
67
+ - Web dashboard for progress visualization
68
+
69
+ ---
70
+
71
+ For migration guides and breaking changes, see [MIGRATION.md](./MIGRATION.md) (when available).
72
+
73
+ For detailed documentation, visit the [GitHub repository](https://github.com/ajayhanda/gl-life-claude).
package/LICENSE ADDED
@@ -0,0 +1,69 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
10
+
11
+ "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
12
+
13
+ "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
14
+
15
+ "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
16
+
17
+ "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
18
+
19
+ "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
20
+
21
+ "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
22
+
23
+ "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
24
+
25
+ "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
26
+
27
+ "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
28
+
29
+ 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
30
+
31
+ 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
32
+
33
+ 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
34
+
35
+ (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
36
+
37
+ (b) You must cause any modified files to carry prominent notices stating that You changed the files; and
38
+
39
+ (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
40
+
41
+ (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
42
+
43
+ You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
44
+
45
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
46
+
47
+ 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
48
+
49
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
50
+
51
+ 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
52
+
53
+ 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
54
+
55
+ END OF TERMS AND CONDITIONS
56
+
57
+ Copyright 2025 GL.Life
58
+
59
+ Licensed under the Apache License, Version 2.0 (the "License");
60
+ you may not use this file except in compliance with the License.
61
+ You may obtain a copy of the License at
62
+
63
+ http://www.apache.org/licenses/LICENSE-2.0
64
+
65
+ Unless required by applicable law or agreed to in writing, software
66
+ distributed under the License is distributed on an "AS IS" BASIS,
67
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
68
+ See the License for the specific language governing permissions and
69
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,237 @@
1
+ # create-gl-life-claude
2
+
3
+ > Scaffold new projects with the GL.Life Claude Code enforcement framework
4
+
5
+ A project generator that sets up a structured development environment with Claude Code integration, task tracking, and automated workflow enforcement.
6
+
7
+ ## Features
8
+
9
+ - **Interactive CLI** - Guided project setup with prompts
10
+ - **Structured Development** - Enforced task-based workflow with plan tracking
11
+ - **Protected Scripts** - Minified, bundled scripts and hooks (27% smaller than source)
12
+ - **Git Integration** - Automatic repository initialization with structured commits
13
+ - **Hook System** - Pre/post tool-use hooks for code quality and workflow enforcement
14
+ - **Zero Configuration** - Works out of the box with sensible defaults
15
+
16
+ ## Installation
17
+
18
+ ### Global Installation (Recommended)
19
+
20
+ ```bash
21
+ npm install -g gl-life-claude-zen
22
+ ```
23
+
24
+ Then create projects with:
25
+
26
+ ```bash
27
+ npm create gl-life-claude-zen my-project
28
+ ```
29
+
30
+ ### Per-Project Installation
31
+
32
+ ```bash
33
+ npx gl-life-claude-zen my-project
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ### Quick Start
39
+
40
+ ```bash
41
+ # Interactive mode (prompts for options)
42
+ npm create gl-life-claude
43
+
44
+ # Direct mode (uses defaults)
45
+ npm create gl-life-claude my-project
46
+ ```
47
+
48
+ ### Interactive Options
49
+
50
+ When run without arguments, the CLI prompts for:
51
+ - **Project name** (lowercase, numbers, hyphens, underscores)
52
+ - **Git initialization** (creates repo with initial commit)
53
+ - **Dependency installation** (runs npm install)
54
+
55
+ ### What Gets Created
56
+
57
+ ```
58
+ my-project/
59
+ ├── .claude/
60
+ │ ├── settings.json # Claude Code configuration
61
+ │ ├── CLAUDE.md # Development guidelines
62
+ │ ├── PLAN-SCHEMA.json # Plan structure definition
63
+ │ └── PROJECT-PLAN-TEMPLATE.json
64
+ ├── node_modules/
65
+ │ └── .gl-life-claude/
66
+ │ ├── scripts/ # 12 bundled workflow scripts
67
+ │ └── hooks/ # 16 bundled enforcement hooks
68
+ ├── package.json # With workflow scripts configured
69
+ ├── README.md # Project documentation
70
+ └── .gitignore # Standard ignores
71
+ ```
72
+
73
+ ## Available Commands
74
+
75
+ Once your project is created, navigate into it and use these commands:
76
+
77
+ ### Planning
78
+
79
+ ```bash
80
+ npm run plan:create # Create new project plan
81
+ npm run plan:init # Initialize plan and lock it
82
+ npm run plan:manager # Manage and switch between plans
83
+ npm run plan:amend # Amend locked plan (creates audit trail)
84
+ npm run plan:help # Show planning command help
85
+ ```
86
+
87
+ ### Task Management
88
+
89
+ ```bash
90
+ npm run task:start TASK-001 # Start a specific task
91
+ npm run task:next # Auto-start next available task
92
+ npm run task:done TASK-001 # Complete current task
93
+ npm run task:status # View project progress
94
+ npm run task:merge # Merge completed tasks to main
95
+ ```
96
+
97
+ ### Utilities
98
+
99
+ ```bash
100
+ npm run help # Show all available commands
101
+ npm run setup:git-hooks # Configure git hooks
102
+ ```
103
+
104
+ ## Workflow
105
+
106
+ ### 1. Create a Plan
107
+
108
+ ```bash
109
+ npm run plan:create
110
+ ```
111
+
112
+ Create a structured plan with:
113
+ - **Hierarchical organization** - Projects → Subprojects → Milestones → Tasks
114
+ - **Dependency tracking** - Tasks can depend on other tasks
115
+ - **Phase organization** - Design, implementation, testing, deployment
116
+ - **Time estimation** - Estimate hours per task
117
+
118
+ ### 2. Initialize & Lock
119
+
120
+ ```bash
121
+ npm run plan:init
122
+ ```
123
+
124
+ Locks the plan and generates:
125
+ - `TASK-TRACKER.json` - Real-time progress tracking
126
+ - Individual task files (`TASK-001.json`, etc.)
127
+ - Immutable plan structure (changes require amendments)
128
+
129
+ ### 3. Work on Tasks
130
+
131
+ ```bash
132
+ npm run task:next # Starts next available task
133
+ # ... make changes ...
134
+ git commit -m "[TASK-001] Implemented feature"
135
+ npm run task:done TASK-001
136
+ ```
137
+
138
+ ### 4. Track Progress
139
+
140
+ ```bash
141
+ npm run task:status
142
+ ```
143
+
144
+ Shows:
145
+ - Overall progress percentage
146
+ - Completed, in-progress, pending, blocked tasks
147
+ - Time estimates vs actual time spent
148
+ - Next available tasks
149
+
150
+ ## Hook System
151
+
152
+ The framework includes enforcement hooks that run automatically:
153
+
154
+ ### Pre-Tool-Use Hooks
155
+ - **validate-git-workflow** - Enforces branch naming, commit messages
156
+ - **validate-task-completion** - Ensures active task exists before code changes
157
+
158
+ ### Post-Tool-Use Hooks
159
+ - **enforce-structured-development** - Blocks modifications without active task
160
+ - **auto-format** - Formats code automatically
161
+ - **validate-test-quality** - Ensures tests have real assertions
162
+ - **validate-ui-integration** - Requires UI component tests
163
+ - **validate-database-changes** - Validates migration workflow
164
+ - **validate-test-results** - Blocks commits if tests fail
165
+ - **enforce-test-pyramid** - Ensures balanced test coverage
166
+ - **enforce-migration-workflow** - Protects immutable migrations
167
+
168
+ ## Configuration
169
+
170
+ ### settings.json
171
+
172
+ Configure Claude Code behavior:
173
+
174
+ ```json
175
+ {
176
+ "permissions": {
177
+ "allow": ["Read(**)", "Glob", "Grep", "Bash(npm run *)"],
178
+ "ask": ["Edit(./package.json)"],
179
+ "deny": ["Edit(**/*.md)", "Bash(rm -rf*)"]
180
+ },
181
+ "hooks": {
182
+ "PreToolUse": [...],
183
+ "PostToolUse": [...]
184
+ }
185
+ }
186
+ ```
187
+
188
+ ### CLAUDE.md
189
+
190
+ Project-specific development guidelines and rules. Customize for your team's workflow.
191
+
192
+ ## Examples
193
+
194
+ ### Create a new web application
195
+
196
+ ```bash
197
+ npm create gl-life-claude my-web-app
198
+ cd my-web-app
199
+ npm run plan:create
200
+ # Follow prompts to create plan with:
201
+ # - Frontend subproject (UI components, pages)
202
+ # - Backend subproject (API, database)
203
+ # - Testing subproject (unit, integration, e2e)
204
+ npm run plan:init
205
+ npm run task:next # Start first task
206
+ ```
207
+
208
+ ### Resume existing project
209
+
210
+ ```bash
211
+ cd my-project
212
+ npm run task:status # See where you left off
213
+ npm run task:next # Continue with next task
214
+ ```
215
+
216
+ ## Requirements
217
+
218
+ - Node.js >= 18.0.0
219
+ - npm, yarn, or pnpm
220
+ - Git (optional, for git integration)
221
+
222
+ ## Bundle Protection
223
+
224
+ Scripts and hooks are:
225
+ - **Minified** - 27% smaller than source
226
+ - **Bundled** - All dependencies inlined
227
+ - **Executable** - Shebang preserved for direct execution
228
+ - **Protected** - Harder to accidentally modify
229
+
230
+ ## License
231
+
232
+ APACHE 2.0
233
+
234
+ ## Support
235
+
236
+ email: packages@gl.life
237
+ website: www.gl.life
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * create-gl-life-claude
5
+ *
6
+ * CLI entry point for creating new projects with GL.Life Claude framework
7
+ * Usage: npm create gl-life-claude [project-name]
8
+ * npm create gl-life-claude (interactive mode)
9
+ */
10
+
11
+ import { fileURLToPath } from 'url';
12
+ import { dirname, join } from 'path';
13
+ import { existsSync } from 'fs';
14
+ import { createInterface } from 'readline';
15
+
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+
19
+ // Helper: Create readline interface
20
+ function createPrompt() {
21
+ return createInterface({
22
+ input: process.stdin,
23
+ output: process.stdout
24
+ });
25
+ }
26
+
27
+ // Helper: Prompt user for input
28
+ function question(rl, query) {
29
+ return new Promise(resolve => rl.question(query, resolve));
30
+ }
31
+
32
+ // Helper: Validate project name
33
+ function isValidProjectName(name) {
34
+ return /^[a-z0-9-_]+$/.test(name);
35
+ }
36
+
37
+ // Main execution
38
+ async function main() {
39
+ const args = process.argv.slice(2);
40
+ let projectName = args[0];
41
+ let initGit = true;
42
+ let installDeps = true;
43
+
44
+ console.log('\n🚀 GL.Life Claude Project Generator\n');
45
+
46
+ // Interactive mode if no project name provided
47
+ if (!projectName) {
48
+ const rl = createPrompt();
49
+
50
+ // Ask for project name
51
+ while (!projectName || !isValidProjectName(projectName)) {
52
+ projectName = await question(rl, '📁 Project name (lowercase, numbers, hyphens, underscores): ');
53
+ projectName = projectName.trim();
54
+
55
+ if (!projectName) {
56
+ console.log('❌ Project name is required');
57
+ continue;
58
+ }
59
+
60
+ if (!isValidProjectName(projectName)) {
61
+ console.log('❌ Invalid name. Use only lowercase letters, numbers, hyphens, and underscores');
62
+ projectName = null;
63
+ }
64
+ }
65
+
66
+ // Ask about git initialization
67
+ const gitAnswer = await question(rl, '\n🔧 Initialize git repository? (Y/n): ');
68
+ initGit = !gitAnswer.trim() || gitAnswer.toLowerCase() === 'y';
69
+
70
+ // Ask about npm install
71
+ const depsAnswer = await question(rl, '📦 Install dependencies after creation? (Y/n): ');
72
+ installDeps = !depsAnswer.trim() || depsAnswer.toLowerCase() === 'y';
73
+
74
+ rl.close();
75
+ console.log('');
76
+ }
77
+
78
+ // Validate project name
79
+ if (!isValidProjectName(projectName)) {
80
+ console.error('❌ ERROR: Invalid project name\n');
81
+ console.log('Project name must:');
82
+ console.log(' - Use only lowercase letters, numbers, hyphens, and underscores');
83
+ console.log(' - Not contain spaces or special characters\n');
84
+ console.log('Example: my-app, my_app, myapp123\n');
85
+ process.exit(1);
86
+ }
87
+
88
+ // Check if directory already exists
89
+ const targetDir = join(process.cwd(), projectName);
90
+ if (existsSync(targetDir)) {
91
+ console.error(`❌ ERROR: Directory "${projectName}" already exists\n`);
92
+ console.log('Please choose a different name or remove the existing directory.\n');
93
+ process.exit(1);
94
+ }
95
+
96
+ console.log('🚀 Creating new project with GL.Life Claude framework...\n');
97
+ console.log(`📁 Project: ${projectName}`);
98
+ console.log(`📂 Location: ${targetDir}`);
99
+ console.log(`🔧 Git: ${initGit ? 'Yes' : 'No'}`);
100
+ console.log(`📦 Install deps: ${installDeps ? 'Yes' : 'No'}\n`);
101
+
102
+ // Import and run initialization
103
+ try {
104
+ const { initializeProject } = await import('../lib/init.js');
105
+ await initializeProject(projectName, targetDir, { initGit, installDeps });
106
+
107
+ console.log('\n✅ Project created successfully!\n');
108
+ console.log('Next steps:');
109
+ console.log(` cd ${projectName}`);
110
+ if (!installDeps) {
111
+ console.log(' npm install');
112
+ }
113
+ console.log(' npm run help\n');
114
+
115
+ } catch (error) {
116
+ console.error('\n❌ ERROR: Failed to create project\n');
117
+ console.error(error.message);
118
+ if (error.stack) {
119
+ console.error('\nStack trace:');
120
+ console.error(error.stack);
121
+ }
122
+ process.exit(1);
123
+ }
124
+ }
125
+
126
+ main();
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var _0x258aff=_0x21f0;(function(_0x2a2f33,_0x2e58fb){var _0x4da982=_0x21f0,_0x2dfe17=_0x2a2f33();while(!![]){try{var _0x1d3a94=-parseInt(_0x4da982(0x134))/0x1*(-parseInt(_0x4da982(0x129))/0x2)+parseInt(_0x4da982(0x125))/0x3+-parseInt(_0x4da982(0x13b))/0x4*(parseInt(_0x4da982(0x12e))/0x5)+parseInt(_0x4da982(0x124))/0x6*(parseInt(_0x4da982(0x12f))/0x7)+-parseInt(_0x4da982(0x123))/0x8+parseInt(_0x4da982(0x135))/0x9*(-parseInt(_0x4da982(0x12d))/0xa)+parseInt(_0x4da982(0x12c))/0xb;if(_0x1d3a94===_0x2e58fb)break;else _0x2dfe17['push'](_0x2dfe17['shift']());}catch(_0x4f6f69){_0x2dfe17['push'](_0x2dfe17['shift']());}}}(_0x3167,0x413fe));function _0x3167(){var _0x5c0990=['stdio','tool_input','ignore','argv','child_process','NlpJF','792040NwpWrg','78tBsFBe','1179954AmCZbY','match','npx\x20prettier\x20--version','\x22\x20is\x20not\x20supported','96744JSEwfW','search','Warning:\x20Could\x20not\x20format\x20','5350026rZsIvj','2249690LFzmki','5335moAQIZ','6419FjiTeE','warn','exit','file_path','constructor','1SCyNJT','18Yeiubj','existsSync','log','MOCwP','Dynamic\x20require\x20of\x20\x22','apply','464RNWjhh','rqTKX','Formatted:\x20','toString','(((.+)+)+)+$'];_0x3167=function(){return _0x5c0990;};return _0x3167();}var _0x252e77=(function(){var _0x5cf952=!![];return function(_0x54d057,_0xf873e){var _0x1dc17a=_0x5cf952?function(){var _0x2c5d51=_0x21f0;if(_0xf873e){var _0x4bbb03=_0xf873e[_0x2c5d51(0x13a)](_0x54d057,arguments);return _0xf873e=null,_0x4bbb03;}}:function(){};return _0x5cf952=![],_0x1dc17a;};}()),_0x3bcab7=_0x252e77(this,function(){var _0x3c4b6f=_0x21f0,_0x87b9dd={};_0x87b9dd['MOCwP']=_0x3c4b6f(0x11c);var _0x3122fe=_0x87b9dd;return _0x3bcab7[_0x3c4b6f(0x11b)]()[_0x3c4b6f(0x12a)](_0x3122fe['MOCwP'])['toString']()[_0x3c4b6f(0x133)](_0x3bcab7)[_0x3c4b6f(0x12a)](_0x3122fe[_0x3c4b6f(0x138)]);});function _0x21f0(_0x3250cf,_0x18bb8d){_0x3250cf=_0x3250cf-0x119;var _0xe0d27e=_0x3167();var _0x3bcab7=_0xe0d27e[_0x3250cf];return _0x3bcab7;}_0x3bcab7();var r=(_0x133dc0=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x133dc0,{'get':(_0x4609d0,_0x2aa685)=>(typeof require<'u'?require:_0x4609d0)[_0x2aa685]}):_0x133dc0)(function(_0x13cbc6){var _0x5c391c=_0x21f0,_0x5a9d7c={'NlpJF':function(_0x572777,_0x5ca356){return _0x572777(_0x5ca356);},'xCEKW':_0x5c391c(0x139),'rqTKX':_0x5c391c(0x128)};if(typeof require<'u')return require[_0x5c391c(0x13a)](this,arguments);throw _0x5a9d7c[_0x5c391c(0x122)](Error,_0x5a9d7c['xCEKW']+_0x13cbc6+_0x5a9d7c[_0x5c391c(0x119)]);}),{execSync:e}=r(_0x258aff(0x121)),i=r('fs'),c=process[_0x258aff(0x120)][0x2]||'{}',a=JSON['parse'](c),t=a[_0x258aff(0x11e)]?.[_0x258aff(0x132)];(!t||!i[_0x258aff(0x136)](t))&&process[_0x258aff(0x131)](0x0);try{if(t['match'](/\.(ts|tsx|js|jsx|json)$/))try{var _0x5b0db1={};_0x5b0db1[_0x258aff(0x11d)]=_0x258aff(0x11f);var _0x49b276={};_0x49b276[_0x258aff(0x11d)]=_0x258aff(0x11f),(e(_0x258aff(0x127),_0x5b0db1),e('npx\x20prettier\x20--write\x20\x22'+t+'\x22',_0x49b276),console[_0x258aff(0x137)]('Formatted:\x20'+t));}catch{}else{if(t[_0x258aff(0x126)](/\.py$/))try{var _0x2115a7={};_0x2115a7[_0x258aff(0x11d)]=_0x258aff(0x11f);var _0x5a0e75={};_0x5a0e75[_0x258aff(0x11d)]=_0x258aff(0x11f),(e('python\x20-m\x20black\x20--version',_0x2115a7),e('python\x20-m\x20black\x20\x22'+t+'\x22',_0x5a0e75),console[_0x258aff(0x137)](_0x258aff(0x11a)+t));}catch{}}}catch{console[_0x258aff(0x130)](_0x258aff(0x12b)+t);}process[_0x258aff(0x131)](0x0);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var _0x13b0ea=_0x312c;(function(_0x45fa77,_0x3837a5){var _0x59befd=_0x312c,_0x1d1e0a=_0x45fa77();while(!![]){try{var _0x4c69a5=parseInt(_0x59befd(0x128))/0x1*(-parseInt(_0x59befd(0x108))/0x2)+parseInt(_0x59befd(0x125))/0x3+-parseInt(_0x59befd(0x10c))/0x4*(-parseInt(_0x59befd(0x10a))/0x5)+parseInt(_0x59befd(0xf7))/0x6+-parseInt(_0x59befd(0xdb))/0x7*(-parseInt(_0x59befd(0xe2))/0x8)+parseInt(_0x59befd(0xea))/0x9*(-parseInt(_0x59befd(0x116))/0xa)+-parseInt(_0x59befd(0xdc))/0xb;if(_0x4c69a5===_0x3837a5)break;else _0x1d1e0a['push'](_0x1d1e0a['shift']());}catch(_0xf6f3da){_0x1d1e0a['push'](_0x1d1e0a['shift']());}}}(_0x2e6a,0x5babf));var _0x57b766=(function(){var _0x35f5fd=_0x312c,_0x4aeac9={'FHZRb':function(_0x2aa362,_0x240b36){return _0x2aa362===_0x240b36;},'EXEjg':_0x35f5fd(0xdf),'fzlxT':function(_0x197876,_0x592795){return _0x197876(_0x592795);},'ImTEC':'Dynamic\x20require\x20of\x20\x22','Qbzlb':function(_0x4c6f1b,_0x318064){return _0x4c6f1b!==_0x318064;},'qgeDa':_0x35f5fd(0xe5)},_0x2d9945=!![];return function(_0x299d9d,_0x4c913a){var _0x45e6fa=_0x35f5fd,_0x51e642={'jCYVw':function(_0x411c7f,_0x226b2b){return _0x411c7f<_0x226b2b;},'bIQGn':function(_0x17c812,_0x1a2e8e){var _0x62ec41=_0x312c;return _0x4aeac9[_0x62ec41(0x10e)](_0x17c812,_0x1a2e8e);},'iOCAM':_0x4aeac9[_0x45e6fa(0xcb)],'gvzSn':_0x45e6fa(0x120)};if(_0x4aeac9[_0x45e6fa(0xd8)](_0x4aeac9['qgeDa'],_0x4aeac9[_0x45e6fa(0x101)])){if(_0x51e642[_0x45e6fa(0xec)](typeof _0xd36f38,'u'))return _0x582d63[_0x45e6fa(0x117)](this,arguments);throw _0x51e642[_0x45e6fa(0xff)](_0x516af7,_0x51e642[_0x45e6fa(0xd1)]+_0x4ac1c5+_0x51e642[_0x45e6fa(0x110)]);}else{var _0x54124e=_0x2d9945?function(){var _0x105f17=_0x45e6fa;if(_0x4c913a){if(_0x4aeac9[_0x105f17(0x10d)](_0x105f17(0xdf),_0x4aeac9[_0x105f17(0x129)])){var _0x37d23c=_0x4c913a[_0x105f17(0x117)](_0x299d9d,arguments);return _0x4c913a=null,_0x37d23c;}else{if(_0x9eff40){var _0x2a0e55=_0x5f2099['apply'](_0x20e313,arguments);return _0x14de07=null,_0x2a0e55;}}}}:function(){};return _0x2d9945=![],_0x54124e;}};}()),_0x11a08e=_0x57b766(this,function(){var _0x35499d=_0x312c,_0x4814eb={};_0x4814eb[_0x35499d(0x11e)]=_0x35499d(0x102);var _0x4dde36=_0x4814eb;return _0x11a08e[_0x35499d(0x119)]()[_0x35499d(0xfb)](_0x4dde36[_0x35499d(0x11e)])[_0x35499d(0x119)]()[_0x35499d(0x109)](_0x11a08e)['search'](_0x4dde36[_0x35499d(0x11e)]);});_0x11a08e();var i=(_0x1ba514=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x1ba514,{'get':(_0x59bbe3,_0x4a8d0b)=>(typeof require<'u'?require:_0x59bbe3)[_0x4a8d0b]}):_0x1ba514)(function(_0x177216){var _0x4d5eb2=_0x312c,_0xd3fc8={};_0xd3fc8[_0x4d5eb2(0xca)]=function(_0x641724,_0x3422f9){return _0x641724+_0x3422f9;},_0xd3fc8['IBPWf']='Dynamic\x20require\x20of\x20\x22';var _0x30e54a=_0xd3fc8;if(typeof require<'u')return require['apply'](this,arguments);throw Error(_0x30e54a[_0x4d5eb2(0xca)](_0x30e54a[_0x4d5eb2(0xca)](_0x30e54a['IBPWf'],_0x177216),_0x4d5eb2(0x120)));}),n=i('fs'),d=i(_0x13b0ea(0x103)),a=process[_0x13b0ea(0xcc)][0x2];function _0x312c(_0x5e3a86,_0x5b4a5a){_0x5e3a86=_0x5e3a86-0xc9;var _0x4cdfcd=_0x2e6a();var _0x11a08e=_0x4cdfcd[_0x5e3a86];return _0x11a08e;}a||(console['error']('\x0a❌\x20ERROR:\x20Task\x20ID\x20required'),console[_0x13b0ea(0xe3)](_0x13b0ea(0xfe)),process[_0x13b0ea(0x111)](0x1));var p=_0x13b0ea(0x127);n[_0x13b0ea(0xd5)](p)||(console[_0x13b0ea(0xe3)](_0x13b0ea(0xc9)),console[_0x13b0ea(0xe3)]('Set\x20active\x20plan\x20first:\x20npm\x20run\x20plan:manager\x0a'),process['exit'](0x1));var u=n['readFileSync'](p,_0x13b0ea(0x105))[_0x13b0ea(0xe8)](),k=d[_0x13b0ea(0xd2)](_0x13b0ea(0x118),u),r=d[_0x13b0ea(0xd2)](k,_0x13b0ea(0x11c)),l=d[_0x13b0ea(0xd2)](k,_0x13b0ea(0xe0),a+_0x13b0ea(0xf9));n[_0x13b0ea(0xd5)](r)||(console[_0x13b0ea(0xe3)]('\x0a❌\x20ERROR:\x20Task\x20tracker\x20not\x20found'),console[_0x13b0ea(0xe3)](_0x13b0ea(0xf4)+u),console[_0x13b0ea(0xe3)](_0x13b0ea(0x123)),process[_0x13b0ea(0x111)](0x1)),n[_0x13b0ea(0xd5)](l)||(console[_0x13b0ea(0xe3)](_0x13b0ea(0x124)+l+'\x0a'),process[_0x13b0ea(0x111)](0x1));var e=JSON[_0x13b0ea(0xe1)](n[_0x13b0ea(0xd7)](r,'utf8')),s=JSON[_0x13b0ea(0xe1)](n[_0x13b0ea(0xd7)](l,'utf8')),f=s[_0x13b0ea(0x112)]===_0x13b0ea(0x11b);if(f){console['log'](_0x13b0ea(0xf2)+a+_0x13b0ea(0xd9)),console[_0x13b0ea(0xdd)](_0x13b0ea(0x121));let t=e[_0x13b0ea(0xfd)][_0x13b0ea(0x12a)](_0x450bdc=>_0x450bdc['id']===a);t&&t[_0x13b0ea(0x112)]!==_0x13b0ea(0x11b)?(t['status']=_0x13b0ea(0x11b),e['statistics']={'totalTasks':e['taskFiles'][_0x13b0ea(0xd3)],'pending':e['taskFiles'][_0x13b0ea(0x106)](_0x1b47b9=>_0x1b47b9[_0x13b0ea(0x112)]===_0x13b0ea(0xe9))[_0x13b0ea(0xd3)],'inProgress':e['taskFiles']['filter'](_0x738b7c=>_0x738b7c[_0x13b0ea(0x112)]==='in_progress')[_0x13b0ea(0xd3)],'completed':e[_0x13b0ea(0xfd)][_0x13b0ea(0x106)](_0x33f750=>_0x33f750[_0x13b0ea(0x112)]===_0x13b0ea(0x11b))[_0x13b0ea(0xd3)],'blocked':e['taskFiles'][_0x13b0ea(0x106)](_0x4967fc=>_0x4967fc['status']===_0x13b0ea(0x122))['length']},e[_0x13b0ea(0xe4)]=null,e[_0x13b0ea(0x114)]=new Date()['toISOString'](),n[_0x13b0ea(0xee)](r,JSON[_0x13b0ea(0xda)](e,null,0x2)),console[_0x13b0ea(0xdd)](_0x13b0ea(0x115))):console[_0x13b0ea(0xdd)]('✅\x20Tracker\x20already\x20synchronized\x0a'),process[_0x13b0ea(0x111)](0x0);}var {execSync:S}=i(_0x13b0ea(0x10f));try{var _0x259995={};_0x259995[_0x13b0ea(0xcf)]=_0x13b0ea(0x105);let t=S(_0x13b0ea(0x12b),_0x259995);t[_0x13b0ea(0xe8)]()&&(console[_0x13b0ea(0xe3)]('\x0a❌\x20ERROR:\x20You\x20have\x20uncommitted\x20changes'),console['error'](_0x13b0ea(0xe6)),console[_0x13b0ea(0xe3)](t),console[_0x13b0ea(0xe3)](_0x13b0ea(0x10b)),console[_0x13b0ea(0xe3)]('\x20\x20git\x20add\x20.'),console[_0x13b0ea(0xe3)](_0x13b0ea(0x107)+a+_0x13b0ea(0xf0)),console[_0x13b0ea(0xe3)](''),process['exit'](0x1));}catch{console['warn'](_0x13b0ea(0xf5)),console[_0x13b0ea(0x113)](_0x13b0ea(0xfa));}s[_0x13b0ea(0x112)]=_0x13b0ea(0x11b),s['completedAt']=new Date()[_0x13b0ea(0x100)]();if(s['startedAt']){let t=new Date(s[_0x13b0ea(0xe7)]),o=new Date(s['completedAt']);s[_0x13b0ea(0xce)]=Math[_0x13b0ea(0x11f)]((o-t)/(0x3e8*0x3c*0x3c)*0xa)/0xa;}n[_0x13b0ea(0xee)](l,JSON['stringify'](s,null,0x2)),e[_0x13b0ea(0xe4)]=null,e['lastUpdated']=new Date()['toISOString']();var g=e[_0x13b0ea(0xfd)][_0x13b0ea(0x12a)](_0x5b91bb=>_0x5b91bb['id']===a);g&&(g[_0x13b0ea(0x112)]='completed'),e[_0x13b0ea(0xde)]={'totalTasks':e[_0x13b0ea(0xfd)][_0x13b0ea(0xd3)],'pending':e[_0x13b0ea(0xfd)][_0x13b0ea(0x106)](_0x1da91c=>_0x1da91c[_0x13b0ea(0x112)]==='pending')['length'],'inProgress':e[_0x13b0ea(0xfd)][_0x13b0ea(0x106)](_0x30e2ed=>_0x30e2ed['status']==='in_progress')[_0x13b0ea(0xd3)],'completed':e[_0x13b0ea(0xfd)][_0x13b0ea(0x106)](_0x4e9ab9=>_0x4e9ab9[_0x13b0ea(0x112)]===_0x13b0ea(0x11b))['length'],'blocked':e[_0x13b0ea(0xfd)][_0x13b0ea(0x106)](_0x272b85=>_0x272b85[_0x13b0ea(0x112)]===_0x13b0ea(0x122))[_0x13b0ea(0xd3)]},n[_0x13b0ea(0xee)](r,JSON[_0x13b0ea(0xda)](e,null,0x2)),console[_0x13b0ea(0xdd)](_0x13b0ea(0x11d)+a),console[_0x13b0ea(0xdd)](_0x13b0ea(0xd4)+u+'\x0a'),console[_0x13b0ea(0xdd)](_0x13b0ea(0xeb)+s[_0x13b0ea(0xd6)]),s['actualHours']&&console['log'](_0x13b0ea(0xd0)+s['actualHours']+_0x13b0ea(0xcd));if(s[_0x13b0ea(0xef)]&&s['actualHours']){let t=((s['actualHours']-s[_0x13b0ea(0xef)])/s['estimatedHours']*0x64)[_0x13b0ea(0xf1)](0x1);console['log'](_0x13b0ea(0x11a)+s[_0x13b0ea(0xef)]+_0x13b0ea(0xf8)+t+'%');}function _0x2e6a(){var _0x4f844a=['statistics','MNZYQ','tasks','parse','8XJSeqN','error','activeTask','rHFFB','\x0aUncommitted\x20files:','startedAt','trim','pending','342rNRpQH','📌\x20','jCYVw','🎉\x20ALL\x20TASKS\x20COMPLETED!\x20Project\x20finished.\x0a','writeFileSync','estimatedHours',']\x20Description\x20of\x20changes\x22','toFixed','\x0a✅\x20Task\x20','\x0a📈\x20Project\x20progress:\x20','Plan:\x20','\x0a⚠️\x20\x20WARNING:\x20Could\x20not\x20check\x20git\x20status','%)\x0a','1003530CegpGa','h\x20|\x20Variance:\x20','.json','Make\x20sure\x20all\x20changes\x20are\x20committed!\x0a','search','📌\x20Next\x20task\x20available:','taskFiles','Usage:\x20npm\x20run\x20task:done\x20TASK-001\x0a','bIQGn','toISOString','qgeDa','(((.+)+)+)+$','path','\x20tasks\x20(','utf8','filter','\x20\x20git\x20commit\x20-m\x20\x22[','82RkZnBW','constructor','5LBJScf','\x0aCommit\x20all\x20changes\x20before\x20completing\x20task:','963036MEirQo','FHZRb','fzlxT','child_process','gvzSn','exit','status','warn','lastUpdated','✅\x20Tracker\x20synchronized\x0a','81290fiOvAD','apply','.claude/plans','toString','📊\x20Estimated:\x20','completed','TASK-TRACKER.json','\x0a✅\x20Completed\x20task:\x20','MUaId','round','\x22\x20is\x20not\x20supported','Syncing\x20tracker\x20status...\x0a','blocked','Initialize\x20first:\x20npm\x20run\x20plan:init\x0a','\x0a❌\x20ERROR:\x20Task\x20file\x20not\x20found:\x20','666888LABBbL','totalTasks','.claude/ACTIVE-PLAN','9637IrjUkb','EXEjg','find','git\x20status\x20--porcelain','\x0a❌\x20ERROR:\x20No\x20active\x20plan\x20found','IHBZQ','ImTEC','argv','\x20hours','actualHours','encoding','⏱️\x20\x20Time\x20taken:\x20','iOCAM','join','length','📋\x20Plan:\x20','existsSync','title','readFileSync','Qbzlb','\x20is\x20already\x20completed','stringify','3671906oplxit','828982dBsptI','log'];_0x2e6a=function(){return _0x4f844a;};return _0x2e6a();}var h=(e[_0x13b0ea(0xde)][_0x13b0ea(0x11b)]/e[_0x13b0ea(0xde)][_0x13b0ea(0x126)]*0x64)[_0x13b0ea(0xf1)](0x1);console[_0x13b0ea(0xdd)](_0x13b0ea(0xf3)+e[_0x13b0ea(0xde)][_0x13b0ea(0x11b)]+'/'+e[_0x13b0ea(0xde)][_0x13b0ea(0x126)]+_0x13b0ea(0x104)+h+_0x13b0ea(0xf6));var c=e[_0x13b0ea(0xfd)]['find'](_0x5089cc=>_0x5089cc['status']===_0x13b0ea(0xe9));c?(console[_0x13b0ea(0xdd)](_0x13b0ea(0xfc)),console[_0x13b0ea(0xdd)]('\x20\x20'+c['id']+':\x20'+c['title']),console[_0x13b0ea(0xdd)]('\x20\x20Start:\x20npm\x20run\x20task:next\x0a')):e[_0x13b0ea(0xde)][_0x13b0ea(0x11b)]===e['statistics'][_0x13b0ea(0x126)]&&console[_0x13b0ea(0xdd)](_0x13b0ea(0xed)),process[_0x13b0ea(0x111)](0x0);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var _0x555398=_0x1b8c;(function(_0x315be3,_0x54d600){var _0x39fe14=_0x1b8c,_0x4e5bb9=_0x315be3();while(!![]){try{var _0x3eefc9=parseInt(_0x39fe14(0x1bc))/0x1*(-parseInt(_0x39fe14(0x1a8))/0x2)+-parseInt(_0x39fe14(0x1cf))/0x3+parseInt(_0x39fe14(0x1b7))/0x4*(-parseInt(_0x39fe14(0x1c7))/0x5)+-parseInt(_0x39fe14(0x1d9))/0x6+-parseInt(_0x39fe14(0x1d8))/0x7+parseInt(_0x39fe14(0x1ae))/0x8*(-parseInt(_0x39fe14(0x1ad))/0x9)+parseInt(_0x39fe14(0x1bd))/0xa*(parseInt(_0x39fe14(0x1b9))/0xb);if(_0x3eefc9===_0x54d600)break;else _0x4e5bb9['push'](_0x4e5bb9['shift']());}catch(_0x526263){_0x4e5bb9['push'](_0x4e5bb9['shift']());}}}(_0x420d,0x844ad));function _0x1b8c(_0x457fdd,_0x4ea11d){_0x457fdd=_0x457fdd-0x1a1;var _0x5d815d=_0x420d();var _0x33dfd2=_0x5d815d[_0x457fdd];return _0x33dfd2;}var _0x5dbef5=(function(){var _0x3ffc50=_0x1b8c,_0x5520a1={};_0x5520a1['ZDSTv']=_0x3ffc50(0x1d5),_0x5520a1[_0x3ffc50(0x1a3)]=_0x3ffc50(0x1be),_0x5520a1[_0x3ffc50(0x1df)]=function(_0x1b9ae8,_0x28ad0f){return _0x1b9ae8===_0x28ad0f;},_0x5520a1['cebhJ']=_0x3ffc50(0x1a1),_0x5520a1[_0x3ffc50(0x1b0)]=_0x3ffc50(0x1b4);var _0x146e62=_0x5520a1,_0x436dac=!![];return function(_0x23a0c7,_0x426144){var _0x3a6090=_0x3ffc50,_0x40389c={'eupCP':_0x146e62[_0x3a6090(0x1a3)],'LPJIx':function(_0x9f12e8,_0x213e49){var _0xd3046e=_0x3a6090;return _0x146e62[_0xd3046e(0x1df)](_0x9f12e8,_0x213e49);},'DRNmC':_0x146e62[_0x3a6090(0x1e0)],'ZQIaw':_0x146e62[_0x3a6090(0x1b0)]},_0x10d709=_0x436dac?function(){var _0x1a01e3=_0x3a6090;if(_0x426144){if(_0x1a01e3(0x1d5)===_0x146e62[_0x1a01e3(0x1d6)]){var _0x35bafd=_0x426144['apply'](_0x23a0c7,arguments);return _0x426144=null,_0x35bafd;}else{let _0x299c3a=_0x8e33c5['env'][_0x1a01e3(0x1a5)]||_0x40389c[_0x1a01e3(0x1ab)];_0x331934['log']('\x20\x20Environment:\x20'+_0x299c3a),_0x40389c[_0x1a01e3(0x1c1)](_0x299c3a,_0x40389c['DRNmC'])&&(_0x597d64[_0x1a01e3(0x1c3)](_0x1a01e3(0x1d3)),_0x22e6e0['push']('Migrations\x20must\x20be\x20tested\x20in\x20development/staging\x20first'),_0x37362d['push'](_0x40389c['ZQIaw']));}}}:function(){};return _0x436dac=![],_0x10d709;};}()),_0x33dfd2=_0x5dbef5(this,function(){var _0x3d669c=_0x1b8c;return _0x33dfd2[_0x3d669c(0x1cb)]()[_0x3d669c(0x1d1)]('(((.+)+)+)+$')[_0x3d669c(0x1cb)]()[_0x3d669c(0x1ac)](_0x33dfd2)[_0x3d669c(0x1d1)](_0x3d669c(0x1d7));});_0x33dfd2();var e=(_0x11a45a=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x11a45a,{'get':(_0x45c545,_0x5b397a)=>(typeof require<'u'?require:_0x45c545)[_0x5b397a]}):_0x11a45a)(function(_0x464bcf){var _0x15453b=_0x1b8c,_0xcd1952={};_0xcd1952[_0x15453b(0x1d2)]=function(_0x4a1431,_0x591cec){return _0x4a1431<_0x591cec;},_0xcd1952[_0x15453b(0x1c9)]=function(_0xa90357,_0x2d2b9b){return _0xa90357+_0x2d2b9b;},_0xcd1952[_0x15453b(0x1cd)]=_0x15453b(0x1b5);var _0x4ad9d4=_0xcd1952;if(_0x4ad9d4[_0x15453b(0x1d2)](typeof require,'u'))return require['apply'](this,arguments);throw Error(_0x4ad9d4[_0x15453b(0x1c9)](_0x4ad9d4[_0x15453b(0x1c9)](_0x4ad9d4[_0x15453b(0x1cd)],_0x464bcf),_0x15453b(0x1c6)));}),p=e('fs'),h=e('path'),{execSync:l}=e('child_process'),u=process[_0x555398(0x1c4)][0x2]||'{}',s=JSON[_0x555398(0x1b8)](u),i=s[_0x555398(0x1c0)]?.['command']||'';i[_0x555398(0x1c5)](/migrate|migration/i)||process[_0x555398(0x1a6)](0x0);var n=[],t=[],a=s[_0x555398(0x1e1)]||'';console[_0x555398(0x1d4)](_0x555398(0x1da));try{let o=process[_0x555398(0x1b2)]['NODE_ENV']||_0x555398(0x1be);console['log'](_0x555398(0x1c8)+o),o===_0x555398(0x1a1)&&(n['push'](_0x555398(0x1d3)),n[_0x555398(0x1c3)](_0x555398(0x1db)),n[_0x555398(0x1c3)](_0x555398(0x1b4)));}catch{}try{var _0x240c86={};_0x240c86[_0x555398(0x1a4)]=_0x555398(0x1a9),l(_0x555398(0x1a7),_0x240c86)[_0x555398(0x1c5)](/migrations?\//)&&(t[_0x555398(0x1c3)](_0x555398(0x1a2)),t[_0x555398(0x1c3)](_0x555398(0x1dc)));}catch{}function _0x420d(){var _0x35b363=['\x20\x20\x20\x20\x203.\x20Check\x20for\x20type\x20errors:\x20npm\x20run\x20build','eupCP','constructor','483651mPBqsP','128cOGCuC','test','uiAum','\x20\x20\x20\x20\x201.\x20Run:\x20npm\x20test','env','\x0a❌\x20MIGRATION\x20WORKFLOW\x20FAILED\x0a','Use\x20deployment\x20pipeline\x20to\x20run\x20production\x20migrations','Dynamic\x20require\x20of\x20\x22','Manual\x20intervention\x20required','868216eqqmEc','parse','5629151UlAltI','Fix\x20migration\x20errors\x20before\x20proceeding','\x20\x20\x20\x20\x202.\x20Verify\x20all\x20tests\x20pass\x20with\x20new\x20schema','65VfEkSF','110YZsYoB','development','After\x20migration,\x20run\x20npm\x20test\x20to\x20verify\x20schema\x20compatibility','tool_input','LPJIx','Database\x20may\x20be\x20in\x20inconsistent\x20state','push','argv','match','\x22\x20is\x20not\x20supported','15gHJjji','\x20\x20Environment:\x20','sAjys','warn','toString','BLOCKED:\x20Migration\x20rollback\x20failed','GSMQn','length','3079200GEPwzQ','Check\x20database\x20logs\x20for\x20details','search','uSPwt','BLOCKED:\x20Cannot\x20run\x20migrations\x20directly\x20in\x20production','log','Nsfot','ZDSTv','(((.+)+)+)+$','5535327KDgIkL','5514840rzeizg','\x0a🔄\x20MIGRATION\x20WORKFLOW\x20VALIDATION\x0a','Migrations\x20must\x20be\x20tested\x20in\x20development/staging\x20first','Commit\x20migrations\x20to\x20version\x20control\x20before\x20running\x20them','\x20\x20✅\x20Migration\x20rollback\x20successful\x0a','BLOCKED:\x20Migration\x20execution\x20failed','PKQKr','cebhJ','tool_output','production','Uncommitted\x20migration\x20files\x20detected','KQtKQ','encoding','NODE_ENV','exit','git\x20status\x20--short','25846KWvVcE','utf8'];_0x420d=function(){return _0x35b363;};return _0x420d();}var g=[/error/i,/failed/i,/exception/i,/syntax error/i,/constraint/i];for(let o of g)if(o[_0x555398(0x1af)](a)){n['push'](_0x555398(0x1de)),n['push'](_0x555398(0x1ba)),n[_0x555398(0x1c3)](_0x555398(0x1d0));break;}i['match'](/migrate.*up|migration.*run/i)&&(console[_0x555398(0x1d4)]('\x20\x20⚠️\x20\x20After\x20running\x20migrations,\x20you\x20MUST:\x0a'),console['log'](_0x555398(0x1b1)),console[_0x555398(0x1d4)](_0x555398(0x1bb)),console['log'](_0x555398(0x1aa)),console['log']('\x20\x20\x20\x20\x204.\x20Test\x20rollback:\x20npm\x20run\x20migrate:down\x20(or\x20equivalent)\x0a'),t[_0x555398(0x1c3)](_0x555398(0x1bf))),i[_0x555398(0x1c5)](/migrate.*down|migration.*rollback/i)&&(console['log']('\x20\x20🔙\x20Rolling\x20back\x20migration...\x0a'),a[_0x555398(0x1c5)](/error|failed/i)?(n[_0x555398(0x1c3)](_0x555398(0x1cc)),n[_0x555398(0x1c3)](_0x555398(0x1c2)),n[_0x555398(0x1c3)](_0x555398(0x1b6))):console[_0x555398(0x1d4)](_0x555398(0x1dd))),n[_0x555398(0x1ce)]>0x0&&(console['error'](_0x555398(0x1b3)),n['forEach'](_0x3b73f4=>console['error']('\x20\x20'+_0x3b73f4)),console['error']('\x0a'),process[_0x555398(0x1a6)](0x2)),t['length']>0x0&&(console[_0x555398(0x1ca)]('\x0a⚠️\x20\x20MIGRATION\x20WORKFLOW\x20WARNINGS\x0a'),t['forEach'](_0x1d8e7f=>console[_0x555398(0x1ca)]('\x20\x20'+_0x1d8e7f)),console[_0x555398(0x1ca)]('\x0a')),process[_0x555398(0x1a6)](0x0);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ const _0x1c7aca=_0x4741;(function(_0x24998,_0x3a200c){const _0x1afd5f=_0x4741,_0x27f773=_0x24998();while(!![]){try{const _0x341953=-parseInt(_0x1afd5f(0xc0))/0x1+-parseInt(_0x1afd5f(0xc7))/0x2+-parseInt(_0x1afd5f(0xcd))/0x3*(-parseInt(_0x1afd5f(0xca))/0x4)+parseInt(_0x1afd5f(0xce))/0x5*(parseInt(_0x1afd5f(0xc9))/0x6)+parseInt(_0x1afd5f(0xf0))/0x7*(-parseInt(_0x1afd5f(0xd8))/0x8)+parseInt(_0x1afd5f(0xda))/0x9+-parseInt(_0x1afd5f(0xe9))/0xa;if(_0x341953===_0x3a200c)break;else _0x27f773['push'](_0x27f773['shift']());}catch(_0x54142c){_0x27f773['push'](_0x27f773['shift']());}}}(_0x1747,0x6807d));const _0x245f0c=(function(){let _0x4a3e2d=!![];return function(_0xfe294c,_0x11cef5){const _0x1d5867=_0x4a3e2d?function(){const _0x3dcfd4=_0x4741;if(_0x11cef5){const _0x11e032=_0x11cef5[_0x3dcfd4(0xd2)](_0xfe294c,arguments);return _0x11cef5=null,_0x11e032;}}:function(){};return _0x4a3e2d=![],_0x1d5867;};}()),_0x3fd400=_0x245f0c(this,function(){const _0x2d867f=_0x4741,_0x3d7237={};_0x3d7237[_0x2d867f(0xf9)]=_0x2d867f(0xeb);const _0x352d81=_0x3d7237;return _0x3fd400[_0x2d867f(0xbf)]()[_0x2d867f(0xc2)](_0x352d81[_0x2d867f(0xf9)])[_0x2d867f(0xbf)]()[_0x2d867f(0xcf)](_0x3fd400)[_0x2d867f(0xc2)](_0x2d867f(0xeb));});_0x3fd400();var h=(_0x202fc4=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x202fc4,{'get':(_0x4cbad9,_0x525268)=>(typeof require<'u'?require:_0x4cbad9)[_0x525268]}):_0x202fc4)(function(_0x2348dc){const _0x347883=_0x4741,_0x1822d8={};_0x1822d8[_0x347883(0xf7)]=function(_0x5c1342,_0x1f3bf5){return _0x5c1342+_0x1f3bf5;},_0x1822d8[_0x347883(0xe3)]=_0x347883(0xe1);const _0x201013=_0x1822d8;if(typeof require<'u')return require[_0x347883(0xd2)](this,arguments);throw Error(_0x201013[_0x347883(0xf7)](_0x347883(0xd9)+_0x2348dc,_0x201013['wQmgo']));}),a=h('fs'),e=h(_0x1c7aca(0xbe)),E=process[_0x1c7aca(0xc6)][0x2]||'{}',m=JSON[_0x1c7aca(0xfd)](E),t=m['tool_input']?.[_0x1c7aca(0xf5)],i=m[_0x1c7aca(0xf1)],s=[],f=[],k=_0x1c7aca(0xf6),c=null,o=null;function _0x4741(_0x3c7515,_0x3b2b69){_0x3c7515=_0x3c7515-0xbe;const _0x158101=_0x1747();let _0x3fd400=_0x158101[_0x3c7515];return _0x3fd400;}function _0x1747(){const _0x5e24c3=['activeTask','parse','\x20\x20npm\x20run\x20task:start\x20TASK-XXX','path','toString','352795YKHZmH','existsSync','search','basename','Modifying:\x20','Start\x20a\x20task\x20first:','argv','237536SIZaai','match','54JAtNCH','38572ClzwmF','File:\x20','Write','198zarvpL','388945SjtwcP','constructor','readFileSync','Start\x20the\x20task:','apply','length','BLOCKED:\x20No\x20active\x20task','BLOCKED:\x20No\x20active\x20plan\x20found','utf8','in_progress','3144424gtlkPI','Dynamic\x20require\x20of\x20\x22','1073754RcfMzT','Edit','.claude/plans','Task:\x20','To\x20make\x20changes,\x20use\x20the\x20amendment\x20tool:','\x20\x20npm\x20run\x20plan:amend','BLOCKED:\x20Project\x20plan\x20is\x20locked\x20but\x20task\x20tracker\x20is\x20missing','\x22\x20is\x20not\x20supported','warn','wQmgo','forEach','push','\x0a❌\x20STRUCTURED\x20DEVELOPMENT\x20ENFORCEMENT\x20FAILED\x0a','status','BLOCKED:\x20Project\x20plan\x20is\x20LOCKED\x20and\x20immutable','1651200DghrWM','trim','(((.+)+)+)+$','Use\x20task\x20management\x20commands:','join','.plan-locked','\x20\x20npm\x20run\x20task:start\x20','7JefORU','tool','\x20\x20npm\x20run\x20plan:manager','tasks','\x20\x20npm\x20run\x20task:done\x20TASK-XXX','file_path','.claude/ACTIVE-PLAN','QLJbr','error','URNTp','BLOCKED:\x20Active\x20task\x20is\x20not\x20in_progress\x20state','exit'];_0x1747=function(){return _0x5e24c3;};return _0x1747();}a[_0x1c7aca(0xc1)](k)&&(c=a[_0x1c7aca(0xd0)](k,_0x1c7aca(0xd6))[_0x1c7aca(0xea)](),o=e['join'](_0x1c7aca(0xdc),c)),t&&t['includes']('PROJECT-PLAN.json')&&i===_0x1c7aca(0xdb)&&o&&a[_0x1c7aca(0xc1)](e[_0x1c7aca(0xed)](o,_0x1c7aca(0xee)))&&(s[_0x1c7aca(0xe5)](_0x1c7aca(0xe8)),s[_0x1c7aca(0xe5)](_0x1c7aca(0xcb)+e[_0x1c7aca(0xc3)](t)),s[_0x1c7aca(0xe5)](_0x1c7aca(0xde)),s['push'](_0x1c7aca(0xdf)));if(c&&o){let n=e[_0x1c7aca(0xed)](o,'TASK-TRACKER.json'),l=e[_0x1c7aca(0xed)](o,'.plan-locked');if(a['existsSync'](l)&&!a['existsSync'](n)&&(s[_0x1c7aca(0xe5)](_0x1c7aca(0xe0)),s[_0x1c7aca(0xe5)]('Plan:\x20'+c),s[_0x1c7aca(0xe5)]('Initialize\x20task\x20tracker\x20first:'),s[_0x1c7aca(0xe5)]('\x20\x20npm\x20run\x20plan:init')),t&&(t[_0x1c7aca(0xc8)](/^\.\/Agent\//)||t['match'](/^Agent\//))&&(i==='Write'||i===_0x1c7aca(0xdb))&&a['existsSync'](n)){let r=JSON[_0x1c7aca(0xfd)](a[_0x1c7aca(0xd0)](n,_0x1c7aca(0xd6)));if(!r['activeTask'])s['push'](_0x1c7aca(0xd4)),s['push']('Plan:\x20'+c),s[_0x1c7aca(0xe5)](_0x1c7aca(0xc4)+e[_0x1c7aca(0xc3)](t)),s['push'](_0x1c7aca(0xc5)),s[_0x1c7aca(0xe5)](_0x1c7aca(0xfe));else{let p=e['join'](o,_0x1c7aca(0xf3),r[_0x1c7aca(0xfc)]+'.json');if(a[_0x1c7aca(0xc1)](p)){let u=JSON[_0x1c7aca(0xfd)](a[_0x1c7aca(0xd0)](p,_0x1c7aca(0xd6)));u['status']!==_0x1c7aca(0xd7)&&(s[_0x1c7aca(0xe5)](_0x1c7aca(0xfa)),s[_0x1c7aca(0xe5)]('Plan:\x20'+c),s[_0x1c7aca(0xe5)](_0x1c7aca(0xdd)+r['activeTask']+'\x20['+u[_0x1c7aca(0xe7)]+']'),s[_0x1c7aca(0xe5)](_0x1c7aca(0xd1)),s[_0x1c7aca(0xe5)](_0x1c7aca(0xef)+r[_0x1c7aca(0xfc)]));}}}t&&t[_0x1c7aca(0xc8)](/\.claude\/plans\/[^/]+\/tasks\/TASK-\d{3}\.json$/)&&(i===_0x1c7aca(0xdb)||i===_0x1c7aca(0xcc))&&(s['push']('BLOCKED:\x20Task\x20files\x20are\x20read-only'),s['push'](_0x1c7aca(0xcb)+e['basename'](t)),s[_0x1c7aca(0xe5)](_0x1c7aca(0xec)),s[_0x1c7aca(0xe5)]('\x20\x20npm\x20run\x20task:start\x20TASK-XXX'),s[_0x1c7aca(0xe5)](_0x1c7aca(0xf4)));}else t&&(t['match'](/^\.\/Agent\//)||t[_0x1c7aca(0xc8)](/^Agent\//))&&(i==='Write'||i===_0x1c7aca(0xdb))&&(s['push'](_0x1c7aca(0xd5)),s['push'](_0x1c7aca(0xc4)+e['basename'](t)),s[_0x1c7aca(0xe5)]('Set\x20active\x20plan\x20first:'),s[_0x1c7aca(0xe5)](_0x1c7aca(0xf2)));s[_0x1c7aca(0xd3)]>0x0&&(console[_0x1c7aca(0xf8)](_0x1c7aca(0xe6)),s[_0x1c7aca(0xe4)](_0x37fd56=>console[_0x1c7aca(0xf8)]('\x20\x20'+_0x37fd56)),console['error']('\x0a'),process[_0x1c7aca(0xfb)](0x2)),f[_0x1c7aca(0xd3)]>0x0&&(console[_0x1c7aca(0xe2)]('\x0a⚠️\x20\x20STRUCTURED\x20DEVELOPMENT\x20WARNINGS\x0a'),f[_0x1c7aca(0xe4)](_0x33ba90=>console[_0x1c7aca(0xe2)]('\x20\x20'+_0x33ba90)),console['warn']('\x0a')),process[_0x1c7aca(0xfb)](0x0);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ const _0xf727fc=_0x408d;(function(_0x39f8d5,_0x1e86ed){const _0x20431e=_0x408d,_0x31d1b6=_0x39f8d5();while(!![]){try{const _0x4aae0a=-parseInt(_0x20431e(0x181))/0x1*(-parseInt(_0x20431e(0x16c))/0x2)+-parseInt(_0x20431e(0x182))/0x3*(-parseInt(_0x20431e(0x167))/0x4)+-parseInt(_0x20431e(0x18e))/0x5+-parseInt(_0x20431e(0x163))/0x6+parseInt(_0x20431e(0x190))/0x7+-parseInt(_0x20431e(0x179))/0x8*(-parseInt(_0x20431e(0x18c))/0x9)+-parseInt(_0x20431e(0x162))/0xa;if(_0x4aae0a===_0x1e86ed)break;else _0x31d1b6['push'](_0x31d1b6['shift']());}catch(_0x28cb3e){_0x31d1b6['push'](_0x31d1b6['shift']());}}}(_0x3edf,0x25dc1));const _0x2676f6=(function(){const _0x5201de=_0x408d,_0x256ab8={};_0x256ab8[_0x5201de(0x16d)]=_0x5201de(0x16e),_0x256ab8[_0x5201de(0x168)]=_0x5201de(0x194),_0x256ab8[_0x5201de(0x164)]=_0x5201de(0x18b);const _0x10cb78=_0x256ab8;let _0x18a441=!![];return function(_0x3c60a1,_0x4ceea7){const _0x5a73b5=_0x5201de;if(_0x10cb78[_0x5a73b5(0x168)]===_0x10cb78['fIsrY']){let _0x2019d1=_0x273858[_0x5a73b5(0x193)](_0x5ca5fa,_0x10cb78[_0x5a73b5(0x16d)]);_0x9100e3+=(_0x2019d1['match'](/\b(it|test)\s*\(/g)||[])['length'];}else{const _0x2c0136=_0x18a441?function(){const _0x5902c0=_0x5a73b5;if(_0x4ceea7){const _0x34fc13=_0x4ceea7[_0x5902c0(0x198)](_0x3c60a1,arguments);return _0x4ceea7=null,_0x34fc13;}}:function(){};return _0x18a441=![],_0x2c0136;}};}()),_0x11abdc=_0x2676f6(this,function(){const _0x34f83d=_0x408d;return _0x11abdc[_0x34f83d(0x17e)]()['search'](_0x34f83d(0x19c))[_0x34f83d(0x17e)]()[_0x34f83d(0x174)](_0x11abdc)['search']('(((.+)+)+)+$');});_0x11abdc();var g=(_0x5a6639=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x5a6639,{'get':(_0x59e73f,_0x1d808b)=>(typeof require<'u'?require:_0x59e73f)[_0x1d808b]}):_0x5a6639)(function(_0x1d763e){const _0x5629f3=_0x408d,_0x56b5f7={};_0x56b5f7[_0x5629f3(0x16a)]=function(_0x11e388,_0x1d2af2){return _0x11e388<_0x1d2af2;},_0x56b5f7['rbUWS']=function(_0x3a19fe,_0xb250f9){return _0x3a19fe+_0xb250f9;},_0x56b5f7[_0x5629f3(0x191)]='Dynamic\x20require\x20of\x20\x22';const _0x3aec95=_0x56b5f7;if(_0x3aec95[_0x5629f3(0x16a)](typeof require,'u'))return require[_0x5629f3(0x198)](this,arguments);throw Error(_0x3aec95[_0x5629f3(0x180)](_0x3aec95[_0x5629f3(0x180)](_0x3aec95['VRSFl'],_0x1d763e),_0x5629f3(0x169)));}),c=g('fs'),E=g('path'),{execSync:f}=g(_0xf727fc(0x196)),h=process[_0xf727fc(0x186)][0x2]||'{}',I=JSON[_0xf727fc(0x18f)](h),T=I[_0xf727fc(0x173)]?.['command']||'';function _0x3edf(){const _0x36ad9f=['UaXCB','find\x20./tests\x20-name\x20\x22*.test.*\x22\x20-o\x20-name\x20\x22*.spec.*\x22\x202>/dev/null\x20|\x20grep\x20-v\x20-E\x20\x22(integration|e2e|component)\x22\x20||\x20echo\x20\x22\x22','child_process','log','apply','\x0a⚠️\x20\x20TEST\x20PYRAMID\x20WARNINGS\x0a','warn','Add\x20component\x20tests\x20for\x20React/Vue/etc.\x20components','(((.+)+)+)+$','existsSync','Every\x20UI\x20component\x20should\x20have\x20component\x20tests','\x0a❌\x20TEST\x20PYRAMID\x20VALIDATION\x20FAILED\x0a','toFixed','pipe','split','692970XvzjXY','1329120uPDfMd','fIsrY','error','CRITICAL:\x20UI\x20bugs\x20are\x20slipping\x20through!','485704YVlais','ApMjT','\x22\x20is\x20not\x20supported','ZidwE','WARNING:\x20Inverted\x20test\x20pyramid\x20detected','172IXExdg','OkDGN','utf8','length','Create\x20tests\x20before\x20claiming\x20functionality\x20works','BLOCKED:\x20No\x20tests\x20found\x20in\x20the\x20project','\x20UI\x20components\x20but\x20only\x20','tool_input','constructor','encoding','forEach','\x0a📊\x20TEST\x20PYRAMID\x20ANALYSIS\x0a','push','8oPxGgP','Unit/Component\x20tests\x20should\x20be\x2060-80%\x20of\x20total,\x20currently\x20','UI\x20bugs\x20are\x20not\x20caught\x20by\x20API-only\x20tests!','find\x20./e2e\x20-name\x20\x22*.spec.*\x22\x20-o\x20find\x20./cypress\x20-name\x20\x22*.cy.*\x22\x202>/dev/null\x20||\x20echo\x20\x22\x22','ignore','toString','WARNING:\x20','rbUWS','2699dXTJiV','3paivKn','Add\x20E2E\x20tests\x20to\x20validate\x20complete\x20user\x20flows','\x20component\x20tests','WARNING:\x20Multiple\x20UI\x20components\x20but\x20NO\x20E2E\x20integration\x20tests','argv','stdio','trim','match','\x20\x20E2E\x20Tests:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','lhJnk','665919JxMoVl','filter','1018460kAbruT','parse','1554357NvySTI','VRSFl','exit','readFileSync'];_0x3edf=function(){return _0x36ad9f;};return _0x3edf();}T[_0xf727fc(0x189)](/npm\s+(run\s+)?test|jest|vitest/)||process[_0xf727fc(0x192)](0x0);var d=[],t=[],r=0x0,m=0x0,p=0x0,i=0x0;try{const _0x4dd3d3={};_0x4dd3d3['encoding']=_0xf727fc(0x16e),_0x4dd3d3[_0xf727fc(0x187)]=['pipe',_0xf727fc(0x160),_0xf727fc(0x17d)];let e=f(_0xf727fc(0x195),_0x4dd3d3)[_0xf727fc(0x188)]()[_0xf727fc(0x161)]('\x0a')[_0xf727fc(0x18d)](Boolean);for(let n of e)if(c[_0xf727fc(0x15c)](n)){let o=c[_0xf727fc(0x193)](n,_0xf727fc(0x16e)),u=(o[_0xf727fc(0x189)](/\b(it|test)\s*\(/g)||[])['length'];o[_0xf727fc(0x189)](/render\(|mount\(|screen\.|fireEvent\./)?i+=u:r+=u;}const _0x42e63b={};_0x42e63b[_0xf727fc(0x175)]=_0xf727fc(0x16e),_0x42e63b[_0xf727fc(0x187)]=[_0xf727fc(0x160),_0xf727fc(0x160),_0xf727fc(0x17d)];let l=f('find\x20./tests\x20-path\x20\x22*/integration/*\x22\x20-name\x20\x22*.test.*\x22\x20-o\x20-path\x20\x22*/integration/*\x22\x20-name\x20\x22*.spec.*\x22\x202>/dev/null\x20||\x20echo\x20\x22\x22',_0x42e63b)[_0xf727fc(0x188)]()[_0xf727fc(0x161)]('\x0a')[_0xf727fc(0x18d)](Boolean);for(let n of l)if(c[_0xf727fc(0x15c)](n)){let o=c['readFileSync'](n,_0xf727fc(0x16e));m+=(o[_0xf727fc(0x189)](/\b(it|test)\s*\(/g)||[])['length'];}const _0x4abfde={};_0x4abfde[_0xf727fc(0x175)]=_0xf727fc(0x16e),_0x4abfde[_0xf727fc(0x187)]=[_0xf727fc(0x160),_0xf727fc(0x160),_0xf727fc(0x17d)];let a=f(_0xf727fc(0x17c),_0x4abfde)['trim']()[_0xf727fc(0x161)]('\x0a')[_0xf727fc(0x18d)](Boolean);for(let n of a)if(c[_0xf727fc(0x15c)](n)){let o=c['readFileSync'](n,_0xf727fc(0x16e));p+=(o[_0xf727fc(0x189)](/\b(it|test)\s*\(/g)||[])[_0xf727fc(0x16f)];}}catch{process['exit'](0x0);}var s=r+m+p+i;s===0x0&&(d['push'](_0xf727fc(0x171)),d[_0xf727fc(0x178)](_0xf727fc(0x170)));function _0x408d(_0x3d7d00,_0x292c2d){_0x3d7d00=_0x3d7d00-0x15c;const _0xa90e28=_0x3edf();let _0x11abdc=_0xa90e28[_0x3d7d00];return _0x11abdc;}if(s>0x0){let e=(r+i)/s*0x64,l=m/s*0x64,a=p/s*0x64;console[_0xf727fc(0x197)](_0xf727fc(0x177)),console[_0xf727fc(0x197)]('\x20\x20Unit/Component\x20Tests:\x20'+(r+i)+'\x20('+e[_0xf727fc(0x15f)](0x1)+'%)'),console[_0xf727fc(0x197)]('\x20\x20Integration\x20Tests:\x20\x20\x20\x20'+m+'\x20('+l[_0xf727fc(0x15f)](0x1)+'%)'),console[_0xf727fc(0x197)](_0xf727fc(0x18a)+p+'\x20('+a[_0xf727fc(0x15f)](0x1)+'%)'),console[_0xf727fc(0x197)]('\x20\x20Total:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+s+'\x0a'),i===0x0&&r>0x0&&(t['push']('WARNING:\x20Only\x20backend\x20unit\x20tests\x20found,\x20NO\x20UI\x20component\x20tests'),t['push'](_0xf727fc(0x19b)),t[_0xf727fc(0x178)](_0xf727fc(0x17b))),r+i<s*0.5&&(t[_0xf727fc(0x178)](_0xf727fc(0x16b)),t[_0xf727fc(0x178)](_0xf727fc(0x17a)+e['toFixed'](0x1)+'%'),t[_0xf727fc(0x178)]('Add\x20more\x20unit\x20and\x20component\x20tests')),p>s*0.3&&(t[_0xf727fc(0x178)]('WARNING:\x20Too\x20many\x20E2E\x20tests\x20(>30%\x20of\x20total)'),t[_0xf727fc(0x178)]('E2E\x20tests\x20are\x20slow\x20and\x20brittle,\x20use\x20integration\x20tests\x20instead'));try{const _0xbf9f8b={};_0xbf9f8b[_0xf727fc(0x175)]='utf8',_0xbf9f8b[_0xf727fc(0x187)]=[_0xf727fc(0x160),_0xf727fc(0x160),'ignore'];let n=f('find\x20./src\x20-name\x20\x22*.tsx\x22\x20-o\x20-name\x20\x22*.jsx\x22\x202>/dev/null\x20|\x20wc\x20-l',_0xbf9f8b)[_0xf727fc(0x188)](),o=parseInt(n)||0x0;if(o>0x0){let u=i/o;u<0.5&&(t[_0xf727fc(0x178)](_0xf727fc(0x17f)+o+_0xf727fc(0x172)+i+_0xf727fc(0x184)),t[_0xf727fc(0x178)]('Component\x20test\x20coverage:\x20'+(u*0x64)[_0xf727fc(0x15f)](0x1)+'%'),t[_0xf727fc(0x178)](_0xf727fc(0x166)),t[_0xf727fc(0x178)](_0xf727fc(0x15d))),p===0x0&&o>0x5&&(t[_0xf727fc(0x178)](_0xf727fc(0x185)),t[_0xf727fc(0x178)](_0xf727fc(0x183)));}}catch{}}d['length']>0x0&&(console[_0xf727fc(0x165)](_0xf727fc(0x15e)),d[_0xf727fc(0x176)](_0x3a21f3=>console[_0xf727fc(0x165)]('\x20\x20'+_0x3a21f3)),console['error']('\x0a'),process[_0xf727fc(0x192)](0x2)),t[_0xf727fc(0x16f)]>0x0&&(console[_0xf727fc(0x19a)](_0xf727fc(0x199)),t[_0xf727fc(0x176)](_0x1b0d56=>console[_0xf727fc(0x19a)]('\x20\x20'+_0x1b0d56)),console[_0xf727fc(0x19a)]('\x0a')),process['exit'](0x0);
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ var _0x2cede7=_0x1ae8;(function(_0x10fde9,_0x150900){var _0x526413=_0x1ae8,_0x2ee9dd=_0x10fde9();while(!![]){try{var _0x1464b4=parseInt(_0x526413(0x106))/0x1*(-parseInt(_0x526413(0xf3))/0x2)+parseInt(_0x526413(0x11d))/0x3+parseInt(_0x526413(0x103))/0x4*(parseInt(_0x526413(0xef))/0x5)+parseInt(_0x526413(0x12f))/0x6+-parseInt(_0x526413(0xfe))/0x7+parseInt(_0x526413(0x13f))/0x8*(-parseInt(_0x526413(0x14a))/0x9)+-parseInt(_0x526413(0xf7))/0xa*(-parseInt(_0x526413(0x105))/0xb);if(_0x1464b4===_0x150900)break;else _0x2ee9dd['push'](_0x2ee9dd['shift']());}catch(_0x46eefa){_0x2ee9dd['push'](_0x2ee9dd['shift']());}}}(_0x5974,0x8c238));var _0x419dab=(function(){var _0x5b88e5=_0x1ae8,_0x1cc759={};_0x1cc759[_0x5b88e5(0x13e)]=function(_0x4159ad,_0xf67491){return _0x4159ad===_0xf67491;},_0x1cc759[_0x5b88e5(0x14c)]=_0x5b88e5(0x158),_0x1cc759['fBZPy']=_0x5b88e5(0xfc),_0x1cc759[_0x5b88e5(0x13a)]='utf8';var _0x19966b=_0x1cc759,_0x343f27=!![];return function(_0x85041d,_0x87c8af){var _0x1427ba=_0x5b88e5,_0x5746de={};_0x5746de['ZSJHg']=_0x19966b[_0x1427ba(0x13a)];var _0x153c55=_0x5746de,_0x3c7752=_0x343f27?function(){var _0x11d115=_0x1427ba;if(_0x19966b['BxyYh'](_0x19966b[_0x11d115(0x14c)],_0x19966b['fBZPy']))_0x10f3a8=_0x5ca020[_0x11d115(0x130)](_0x1003f[_0x11d115(0x10f)](_0x419ad9,_0x153c55[_0x11d115(0x121)]));else{if(_0x87c8af){var _0x11eaba=_0x87c8af[_0x11d115(0x150)](_0x85041d,arguments);return _0x87c8af=null,_0x11eaba;}}}:function(){};return _0x343f27=![],_0x3c7752;};}()),_0x2f8c59=_0x419dab(this,function(){var _0x1f16e5=_0x1ae8,_0x19fe36={};_0x19fe36[_0x1f16e5(0x151)]='(((.+)+)+)+$';var _0x596689=_0x19fe36;return _0x2f8c59['toString']()[_0x1f16e5(0x109)](_0x596689[_0x1f16e5(0x151)])[_0x1f16e5(0x100)]()['constructor'](_0x2f8c59)[_0x1f16e5(0x109)](_0x596689[_0x1f16e5(0x151)]);});_0x2f8c59();var u=(_0x28a891=>typeof require<'u'?require:typeof Proxy<'u'?new Proxy(_0x28a891,{'get':(_0x4d91e2,_0xaf36c4)=>(typeof require<'u'?require:_0x4d91e2)[_0xaf36c4]}):_0x28a891)(function(_0x49b88f){var _0xf3e121=_0x1ae8,_0x30be47={'bUsVm':function(_0xc56260,_0x268980){return _0xc56260<_0x268980;},'IdBYs':function(_0x27ce40,_0x2f4f72){return _0x27ce40(_0x2f4f72);},'eowAj':function(_0x28a74f,_0x4feb3e){return _0x28a74f+_0x4feb3e;},'EbWJl':_0xf3e121(0x128)};if(_0x30be47[_0xf3e121(0x102)](typeof require,'u'))return require['apply'](this,arguments);throw _0x30be47['IdBYs'](Error,_0x30be47[_0xf3e121(0x11f)](_0x30be47[_0xf3e121(0x11f)](_0xf3e121(0x139),_0x49b88f),_0x30be47[_0xf3e121(0x107)]));}),t=u('fs'),i=u(_0x2cede7(0xfb));console['log']('\x0a🚀\x20INITIALIZING\x20TASK\x20TRACKER\x0a');var g=process[_0x2cede7(0xee)][0x2],p='.claude/ACTIVE-PLAN',l;g?l=g:t[_0x2cede7(0x12a)](p)?l=t[_0x2cede7(0x10f)](p,_0x2cede7(0x136))[_0x2cede7(0x11a)]():(console[_0x2cede7(0xf8)]('❌\x20ERROR:\x20No\x20plan\x20specified\x20and\x20no\x20active\x20plan\x20found'),console[_0x2cede7(0xf8)](_0x2cede7(0x149)),console[_0x2cede7(0xf8)](_0x2cede7(0x159)),console[_0x2cede7(0xf8)](_0x2cede7(0x142)),console[_0x2cede7(0xf8)](_0x2cede7(0xf1)),process[_0x2cede7(0x153)](0x1));var r=i[_0x2cede7(0x10c)](_0x2cede7(0x155),l);function _0x1ae8(_0x583913,_0x3654ca){_0x583913=_0x583913-0xee;var _0x1191f4=_0x5974();var _0x2f8c59=_0x1191f4[_0x583913];return _0x2f8c59;}t[_0x2cede7(0x12a)](r)||(console[_0x2cede7(0xf8)](_0x2cede7(0x120)+r),console[_0x2cede7(0xf8)](_0x2cede7(0x112)),process[_0x2cede7(0x153)](0x1));var d=i['join'](r,_0x2cede7(0x10d));t[_0x2cede7(0x12a)](d)||(console['error'](_0x2cede7(0x140)+r),process[_0x2cede7(0x153)](0x1));var n;try{n=JSON['parse'](t['readFileSync'](d,_0x2cede7(0x136)));}catch(_0x5e5bd0){console[_0x2cede7(0xf8)](_0x2cede7(0x118)),console['error'](_0x5e5bd0[_0x2cede7(0x143)]),process[_0x2cede7(0x153)](0x1);}var o=[];n[_0x2cede7(0x12e)]&&n[_0x2cede7(0x12e)][_0x2cede7(0x114)]?(console[_0x2cede7(0xfd)]('📦\x20Detected\x20hierarchical\x20plan\x20structure'),console[_0x2cede7(0xfd)]('🔄\x20Flattening\x20hierarchy\x20into\x20individual\x20task\x20files...\x0a'),n['project'][_0x2cede7(0x114)]['forEach'](_0x3fa3ec=>{var _0x228d11=_0x2cede7,_0x519343={};_0x519343[_0x228d11(0x127)]=function(_0x3f5381,_0x57e95a){return _0x3f5381===_0x57e95a;},_0x519343[_0x228d11(0x104)]=_0x228d11(0xff),_0x519343[_0x228d11(0x117)]=_0x228d11(0x111);var _0x50c6ee=_0x519343;_0x3fa3ec[_0x228d11(0x147)][_0x228d11(0x11c)](_0x1588e8=>{var _0x5bfae4=_0x228d11,_0x126350={'TdEjH':function(_0x327b17,_0xf42fbc){var _0x5ba8eb=_0x1ae8;return _0x50c6ee[_0x5ba8eb(0x127)](_0x327b17,_0xf42fbc);},'lyrIB':_0x50c6ee[_0x5bfae4(0x104)],'NSIGv':_0x5bfae4(0x125)};if(_0x50c6ee[_0x5bfae4(0x117)]!==_0x50c6ee[_0x5bfae4(0x117)]){var _0x19eb63={..._0x30c2c6};_0x19eb63['subproject']=_0x18a59e['id'],_0x19eb63['subprojectName']=_0x16c78b[_0x5bfae4(0x132)],_0x19eb63[_0x5bfae4(0x14e)]=_0x180ea3['id'],_0x19eb63[_0x5bfae4(0x115)]=_0x2877b8['name'],_0x3adc12[_0x5bfae4(0x148)](_0x19eb63);}else _0x1588e8[_0x5bfae4(0xf5)]['forEach'](_0x135d66=>{var _0x3775bb=_0x5bfae4;if(_0x126350[_0x3775bb(0x12b)](_0x126350[_0x3775bb(0x134)],_0x126350[_0x3775bb(0xf0)]))_0x551d39[_0x3775bb(0x147)]['forEach'](_0x335ef8=>{var _0x1a1a47=_0x3775bb;_0x335ef8[_0x1a1a47(0xf5)]['forEach'](_0x912871=>{var _0x4fb0bb=_0x1a1a47,_0x4818b8={..._0x912871};_0x4818b8['subproject']=_0x170569['id'],_0x4818b8[_0x4fb0bb(0x122)]=_0x58f100[_0x4fb0bb(0x132)],_0x4818b8[_0x4fb0bb(0x14e)]=_0x335ef8['id'],_0x4818b8['milestoneName']=_0x335ef8[_0x4fb0bb(0x132)],_0x4047b5[_0x4fb0bb(0x148)](_0x4818b8);});});else{var _0x3965bc={..._0x135d66};_0x3965bc[_0x3775bb(0x156)]=_0x3fa3ec['id'],_0x3965bc[_0x3775bb(0x122)]=_0x3fa3ec[_0x3775bb(0x132)],_0x3965bc['milestone']=_0x1588e8['id'],_0x3965bc[_0x3775bb(0x115)]=_0x1588e8['name'],o[_0x3775bb(0x148)](_0x3965bc);}});});})):n[_0x2cede7(0xf5)]&&Array[_0x2cede7(0x145)](n['tasks'])?(console['log']('📋\x20Detected\x20flat\x20plan\x20structure'),o[_0x2cede7(0x148)](...n['tasks'])):(console[_0x2cede7(0xf8)]('❌\x20ERROR:\x20Invalid\x20plan\x20structure'),console[_0x2cede7(0xf8)](_0x2cede7(0x154)),console[_0x2cede7(0xf8)]('\x20\x20-\x20Hierarchical:\x20{\x20project:\x20{\x20subprojects:\x20[...]\x20}\x20}'),console[_0x2cede7(0xf8)](_0x2cede7(0x152)),process[_0x2cede7(0x153)](0x1)),o[_0x2cede7(0x124)]===0x0&&(console[_0x2cede7(0xf8)]('❌\x20ERROR:\x20No\x20tasks\x20found\x20in\x20PROJECT-PLAN.json'),process[_0x2cede7(0x153)](0x1)),console[_0x2cede7(0xfd)]('✅\x20Found\x20'+o[_0x2cede7(0x124)]+_0x2cede7(0xf6));var a=i[_0x2cede7(0x10c)](r,'tasks'),_0xfad14f={};_0xfad14f['recursive']=!0x0,t['existsSync'](a)||t[_0x2cede7(0x13c)](a,_0xfad14f),o[_0x2cede7(0x11c)](_0x147c77=>{var _0x5bca04=_0x2cede7,_0x5e8f34={};_0x5e8f34['tnWLO']=_0x5bca04(0xf9),_0x5e8f34[_0x5bca04(0x12d)]=_0x5bca04(0x14f);var _0x340717=_0x5e8f34,_0x52d291={};_0x52d291['design']=[],_0x52d291[_0x5bca04(0x10b)]=[],_0x52d291['tests']=[],_0x52d291[_0x5bca04(0xf4)]=[];var _0x1f204d={};_0x1f204d['id']=_0x147c77['id'],_0x1f204d[_0x5bca04(0x123)]=_0x147c77['title'],_0x1f204d['description']=_0x147c77[_0x5bca04(0x101)]||'',_0x1f204d[_0x5bca04(0x13d)]=_0x147c77[_0x5bca04(0x13d)]||_0x340717['tnWLO'],_0x1f204d[_0x5bca04(0x108)]=_0x147c77[_0x5bca04(0x108)]||_0x340717[_0x5bca04(0x12d)],_0x1f204d[_0x5bca04(0x156)]=_0x147c77['subproject']||null,_0x1f204d[_0x5bca04(0x122)]=_0x147c77[_0x5bca04(0x122)]||null,_0x1f204d[_0x5bca04(0x14e)]=_0x147c77[_0x5bca04(0x14e)]||null,_0x1f204d[_0x5bca04(0x115)]=_0x147c77[_0x5bca04(0x115)]||null,_0x1f204d[_0x5bca04(0xf2)]=_0x147c77[_0x5bca04(0xf2)]||[],_0x1f204d[_0x5bca04(0x135)]=_0x147c77[_0x5bca04(0x135)]||[],_0x1f204d['testCases']=_0x147c77[_0x5bca04(0x157)]||[],_0x1f204d[_0x5bca04(0x11b)]=_0x147c77[_0x5bca04(0x11b)]||null,_0x1f204d['actualHours']=null,_0x1f204d[_0x5bca04(0x137)]=null,_0x1f204d['completedAt']=null,_0x1f204d[_0x5bca04(0x141)]=null,_0x1f204d[_0x5bca04(0x11e)]=_0x147c77[_0x5bca04(0x11e)]||_0x52d291,_0x1f204d[_0x5bca04(0x129)]=[];let _0x2b7574=_0x1f204d,_0x5b9ea5=i[_0x5bca04(0x10c)](a,_0x147c77['id']+_0x5bca04(0x133));t[_0x5bca04(0x10e)](_0x5b9ea5,JSON['stringify'](_0x2b7574,null,0x2)),console[_0x5bca04(0xfd)](_0x5bca04(0x12c)+_0x147c77['id']+':\x20'+_0x147c77['title']);}),console['log']('\x0a✅\x20Created\x20'+o[_0x2cede7(0x124)]+_0x2cede7(0x13b)+a+'/');var S={'version':_0x2cede7(0x110),'planId':l,'projectName':n[_0x2cede7(0x14b)]||n[_0x2cede7(0x12e)]?.[_0x2cede7(0x132)]||_0x2cede7(0x144),'description':n[_0x2cede7(0x101)]||n['project']?.[_0x2cede7(0x101)]||'','createdAt':new Date()[_0x2cede7(0xfa)](),'planLockedAt':new Date()[_0x2cede7(0xfa)](),'lastUpdated':new Date()[_0x2cede7(0xfa)](),'activeTask':null,'taskFiles':o[_0x2cede7(0x126)](_0x3f7e8a=>({'id':_0x3f7e8a['id'],'title':_0x3f7e8a[_0x2cede7(0x123)],'status':_0x2cede7(0xf9),'file':a+'/'+_0x3f7e8a['id']+_0x2cede7(0x133)})),'statistics':{'totalTasks':o['length'],'pending':o['length'],'inProgress':0x0,'completed':0x0,'blocked':0x0}},m=i['join'](r,_0x2cede7(0x119));t['writeFileSync'](m,JSON[_0x2cede7(0x146)](S,null,0x2)),console['log'](_0x2cede7(0x138)+m),console['log']('📊\x20Total:\x20'+o[_0x2cede7(0x124)]+_0x2cede7(0xf6)),console[_0x2cede7(0xfd)](_0x2cede7(0x116)),console[_0x2cede7(0xfd)]('\x20\x201.\x20Set\x20as\x20active\x20plan:\x20npm\x20run\x20plan:manager'),console[_0x2cede7(0xfd)]('\x20\x202.\x20Start\x20first\x20task:\x20npm\x20run\x20task:start\x20TASK-001'),console['log']('\x20\x203.\x20View\x20status:\x20npm\x20run\x20task:status\x0a'),n[_0x2cede7(0x113)]=!0x0,n[_0x2cede7(0x10a)]=new Date()[_0x2cede7(0xfa)](),t[_0x2cede7(0x10e)](d,JSON[_0x2cede7(0x146)](n,null,0x2));function _0x5974(){var _0x29d70f=['28UEPcro','OLgAF','22220297zzIpQJ','16301BrXzCP','EbWJl','phase','search','lockedAt','code','join','PROJECT-PLAN.json','writeFileSync','readFileSync','2.0','zOFsR','Create\x20plan\x20first\x20with:\x20npm\x20run\x20plan:create\x0a','locked','subprojects','milestoneName','📋\x20Next\x20steps:','jVlcQ','❌\x20ERROR:\x20Invalid\x20JSON\x20in\x20PROJECT-PLAN.json','TASK-TRACKER.json','trim','estimatedHours','forEach','739110nqsVQa','artifacts','eowAj','❌\x20ERROR:\x20Plan\x20directory\x20not\x20found:\x20','ZSJHg','subprojectName','title','length','EHHkM','map','mZgOo','\x22\x20is\x20not\x20supported','notes','existsSync','TdEjH','\x20\x20✓\x20','hSboj','project','969990kfdbCT','parse','\x20is\x20now\x20LOCKED\x20and\x20ACTIVE\x0a','name','.json','lyrIB','completionCriteria','utf8','startedAt','\x0a✅\x20Task\x20tracker\x20created:\x20','Dynamic\x20require\x20of\x20\x22','YGsqV','\x20task\x20files\x20in\x20','mkdirSync','status','BxyYh','105768fCkwct','❌\x20ERROR:\x20PROJECT-PLAN.json\x20not\x20found\x20in\x20','blockedReason','Or\x20set\x20active\x20plan\x20first:','message','Structured\x20Coding\x20Project','isArray','stringify','milestones','push','Usage:','702FiojzM','projectName','oWNTz','.plan-locked','milestone','implementation','apply','stSzc','\x20\x20-\x20Flat:\x20{\x20tasks:\x20[...]\x20}','exit','Expected\x20either:','.claude/plans','subproject','testCases','qbvBN','\x20\x20npm\x20run\x20plan:init\x20<plan-id>','argv','774470chcYUc','NSIGv','\x20\x20npm\x20run\x20plan:manager\x0a','dependencies','122MCEbfg','documentation','tasks','\x20tasks\x0a','10jUxWty','error','pending','toISOString','path','ggvic','log','6388991lMwpfw','rxxZh','toString','description','bUsVm'];_0x5974=function(){return _0x29d70f;};return _0x5974();}var f=i['join'](r,_0x2cede7(0x14d));t['writeFileSync'](f,new Date()[_0x2cede7(0xfa)]()),t[_0x2cede7(0x10e)](p,l),console['log']('🔒\x20Plan\x20'+l+_0x2cede7(0x131)),process[_0x2cede7(0x153)](0x0);