@agentic15.com/agentic15-claude-zen 2.0.6 ā 2.0.9
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 +115 -0
- package/bin/create-agentic15-claude-zen.js +1 -1
- package/package.json +3 -6
- package/src/cli/CommitCommand.js +19 -3
- package/src/cli/PlanCommand.js +150 -21
- package/src/cli/TaskCommand.js +3 -1
- package/src/core/ProjectInitializer.js +19 -23
- package/src/core/TaskIssueMapper.js +15 -11
- package/src/core/TemplateManager.js +2 -1
- package/templates/.github/ISSUE_TEMPLATE/task.md +23 -0
- package/templates/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- package/templates/README.md +52 -55
- package/dist/hooks/auto-format.js +0 -2
- package/dist/hooks/check-pending-reviews.js +0 -2
- package/dist/hooks/complete-task.js +0 -2
- package/dist/hooks/detect-pending-reviews.js +0 -2
- package/dist/hooks/enforce-hard-requirements.js +0 -2
- package/dist/hooks/enforce-migration-workflow.js +0 -2
- package/dist/hooks/enforce-plan-template.js +0 -2
- package/dist/hooks/enforce-structured-development.js +0 -2
- package/dist/hooks/enforce-test-pyramid.js +0 -2
- package/dist/hooks/init-task-tracker.js +0 -2
- package/dist/hooks/performance-cache.js +0 -2
- package/dist/hooks/prevent-read-bypass.js +0 -2
- package/dist/hooks/session-start-context.js +0 -2
- package/dist/hooks/start-task.js +0 -2
- package/dist/hooks/task-status.js +0 -2
- package/dist/hooks/validate-component-contract.js +0 -2
- package/dist/hooks/validate-database-changes.js +0 -2
- package/dist/hooks/validate-e2e-coverage.js +0 -2
- package/dist/hooks/validate-git-workflow.js +0 -2
- package/dist/hooks/validate-integration-site.js +0 -2
- package/dist/hooks/validate-migration-impact.js +0 -2
- package/dist/hooks/validate-task-completion.js +0 -2
- package/dist/hooks/validate-test-quality.js +0 -2
- package/dist/hooks/validate-test-results.js +0 -2
- package/dist/hooks/validate-ui-integration.js +0 -2
- package/dist/hooks/validate-ui-runtime.js +0 -2
- package/dist/hooks/validate-ui-syntax.js +0 -2
- package/dist/hooks/validate-ui-visual-native.js +0 -2
- package/dist/hooks/validate-ui-visual.js +0 -2
- package/dist/hooks/validate-visual-regression.js +0 -2
- package/dist/index.js +0 -24
- package/dist/index.js.map +0 -7
- package/dist/scripts/add-version-headers.js +0 -2
- package/dist/scripts/help.js +0 -2
- package/dist/scripts/plan-amend.js +0 -2
- package/dist/scripts/plan-create.js +0 -2
- package/dist/scripts/plan-generate.js +0 -2
- package/dist/scripts/plan-help.js +0 -2
- package/dist/scripts/plan-init.js +0 -2
- package/dist/scripts/plan-manager.js +0 -2
- package/dist/scripts/pre-publish-checklist.js +0 -2
- package/dist/scripts/production-test.js +0 -2
- package/dist/scripts/profile-hooks.js +0 -2
- package/dist/scripts/setup-git-hooks.js +0 -2
- package/dist/scripts/task-done.js +0 -2
- package/dist/scripts/task-merge.js +0 -2
- package/dist/scripts/task-next.js +0 -2
- package/dist/scripts/task-start.js +0 -2
- package/dist/scripts/task-status.js +0 -2
- package/dist/scripts/verify-hooks.js +0 -2
- package/templates/.claude/CLAUDE.md +0 -408
- package/templates/.claude/ONBOARDING.md +0 -723
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,121 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
Copyright 2024-2025 agentic15.com
|
|
9
9
|
|
|
10
|
+
## [2.0.9] - 2025-12-25
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- **BREAKING**: Removed obfuscated scripts directory (contained old v1.x minified code)
|
|
14
|
+
- **BREAKING**: Removed npm scripts (plan:generate, plan:init) - no longer needed
|
|
15
|
+
- Refactored PlanCommand.js to have plan generation/locking logic built-in (no external scripts)
|
|
16
|
+
- Package now uses ONLY CLI commands as documented in WORKFLOWS.md
|
|
17
|
+
- Package size: 45.7 kB compressed, 176.5 kB unpacked (52 files)
|
|
18
|
+
- TaskIssueMapper now follows .github/ISSUE_TEMPLATE/task.md structure for consistency
|
|
19
|
+
- CommitCommand now follows .github/PULL_REQUEST_TEMPLATE.md structure for PRs
|
|
20
|
+
- Updated onboarding instructions to show v2.0 CLI commands (removed outdated npm scripts)
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- GitHub issue and PR templates (.github/ISSUE_TEMPLATE/task.md, PULL_REQUEST_TEMPLATE.md)
|
|
24
|
+
- CLI now uses templates for consistent issue/PR formatting
|
|
25
|
+
- Built-in plan generation logic in PlanCommand class
|
|
26
|
+
- Built-in plan locking logic with task extraction
|
|
27
|
+
- Support for v2.0 schema (singular 'project' at root) in extractTasks()
|
|
28
|
+
- Standardized issue body format with sections: Task Description, Completion Criteria, Dependencies, Phase
|
|
29
|
+
- Standardized PR body format with sections: Task, Description, Changes, Testing, Notes
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- **BUG #1**: Incorrect import path in bin/create-agentic15-claude-zen.js (dist/index.js ā src/index.js)
|
|
33
|
+
- **BUG #2**: Wrong template path in TemplateManager.js (needed to go up 2 levels from src/core/)
|
|
34
|
+
- **BUG #3**: Removed obsolete extractBundledFiles() call (tried to copy non-existent scripts)
|
|
35
|
+
- **BUG #4**: extractTasks() now handles v2.0 schema with singular 'project' key
|
|
36
|
+
- **BUG #5**: TaskCommand.js calls correct TaskIssueMapper methods (not non-existent mapTaskToIssue)
|
|
37
|
+
|
|
38
|
+
### Removed
|
|
39
|
+
- All obfuscated v1.x scripts (19 files, ~248KB of minified code)
|
|
40
|
+
- npm run plan:* commands from templates
|
|
41
|
+
- extractBundledFiles() method call from ProjectInitializer
|
|
42
|
+
|
|
43
|
+
### Testing
|
|
44
|
+
- Black box testing completed with 5 bugs found and fixed
|
|
45
|
+
- Successfully tested: project creation, auth setup, plan generation, plan locking, task extraction, feature branch creation
|
|
46
|
+
- Test repository: https://github.com/agentic15/agentic15-test-v2
|
|
47
|
+
|
|
48
|
+
## [2.0.8] - 2025-12-25
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
- Removed entire dist/ folder (48 minified files)
|
|
52
|
+
- Changed to ship source code only (no minification)
|
|
53
|
+
- Updated package.json main entry from dist/index.js to src/index.js
|
|
54
|
+
- Removed all build/minification scripts
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
- Fixed obfuscated/minified code showing wrong v1.x commands
|
|
58
|
+
|
|
59
|
+
## [2.0.7] - 2025-12-25
|
|
60
|
+
|
|
61
|
+
### Removed
|
|
62
|
+
- Deleted CLAUDE.md (1,100+ lines of obsolete v1.x documentation)
|
|
63
|
+
- Deleted ONBOARDING.md (86 lines of obsolete v1.x onboarding)
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- Updated templates/README.md with v2.0 commands
|
|
67
|
+
|
|
68
|
+
## [2.0.6] - 2025-12-25
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
- Added PowerShell syntax to README.md and WORKFLOWS.md
|
|
72
|
+
- PowerShell requires quotes: `npx "@agentic15.com/agentic15-claude-zen" my-project`
|
|
73
|
+
|
|
74
|
+
## [2.0.5] - 2025-12-25
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
- Simplified README.md from 307 lines to 68 lines
|
|
78
|
+
- README now just points to WORKFLOWS.md for detailed workflows
|
|
79
|
+
|
|
80
|
+
## [2.0.4] - 2025-12-25
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
- Fixed package README.md with broken documentation links
|
|
84
|
+
- Removed references to deleted docs/ folder
|
|
85
|
+
|
|
86
|
+
## [2.0.3] - 2025-12-25
|
|
87
|
+
|
|
88
|
+
### Changed
|
|
89
|
+
- Further simplified README.md to match WORKFLOWS.md style
|
|
90
|
+
- Consolidated all workflow documentation
|
|
91
|
+
|
|
92
|
+
## [2.0.2] - 2025-12-25
|
|
93
|
+
|
|
94
|
+
### Changed
|
|
95
|
+
- Simplified README.md to focus on quick start and command reference
|
|
96
|
+
- All detailed workflows now in WORKFLOWS.md
|
|
97
|
+
|
|
98
|
+
## [2.0.1] - 2025-12-25
|
|
99
|
+
|
|
100
|
+
### Changed
|
|
101
|
+
- Updated package README with correct v2.0 commands
|
|
102
|
+
- Fixed mermaid diagram syntax errors in WORKFLOWS.md
|
|
103
|
+
|
|
104
|
+
## [2.0.0] - 2025-12-25
|
|
105
|
+
|
|
106
|
+
### Added
|
|
107
|
+
- CLI-based architecture (`npx agentic15` commands)
|
|
108
|
+
- Dedicated agentic15 CLI binary for all automation
|
|
109
|
+
- Single WORKFLOWS.md with mermaid diagrams
|
|
110
|
+
- Visual testing feedback loop
|
|
111
|
+
- Auto-generated commit messages
|
|
112
|
+
- Feature branch workflow with PRs
|
|
113
|
+
- GitHub issue/PR integration
|
|
114
|
+
|
|
115
|
+
### Removed
|
|
116
|
+
- All npm run task:* commands (replaced by CLI)
|
|
117
|
+
- 9 workflow documentation files (3,526 lines)
|
|
118
|
+
- docs/ folder
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
- Workflow now requires feature branches + PRs (no direct main commits)
|
|
122
|
+
- Simplified documentation to <20 line POST-INSTALL.md + WORKFLOWS.md
|
|
123
|
+
- Commit messages auto-generated as [TASK-XXX] title
|
|
124
|
+
|
|
10
125
|
## [1.0.1] - 2025-12-24
|
|
11
126
|
|
|
12
127
|
### Changed
|
|
@@ -176,7 +176,7 @@ async function main() {
|
|
|
176
176
|
|
|
177
177
|
// Import and run initialization
|
|
178
178
|
try {
|
|
179
|
-
const { initializeProject } = await import('../
|
|
179
|
+
const { initializeProject } = await import('../src/index.js');
|
|
180
180
|
await initializeProject(projectName, targetDir, { initGit, installDeps });
|
|
181
181
|
|
|
182
182
|
console.log('\nā
Project created successfully!\n');
|
package/package.json
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentic15.com/agentic15-claude-zen",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.9",
|
|
4
4
|
"description": "Structured AI-assisted development framework for Claude Code with enforced quality standards",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"agentic15-claude-zen": "./bin/create-agentic15-claude-zen.js",
|
|
8
8
|
"agentic15": "./bin/agentic15.js"
|
|
9
9
|
},
|
|
10
10
|
"type": "module",
|
|
11
11
|
"scripts": {
|
|
12
|
-
"build": "node esbuild.config.js",
|
|
13
12
|
"test": "node test/integration.test.js",
|
|
14
13
|
"test:e2e": "node test/e2e-verification.test.js",
|
|
15
|
-
"test:site": "node test/verify-test-site.js"
|
|
16
|
-
"prepublishOnly": "npm run build"
|
|
14
|
+
"test:site": "node test/verify-test-site.js"
|
|
17
15
|
},
|
|
18
16
|
"keywords": [
|
|
19
17
|
"agentic15",
|
|
@@ -44,7 +42,6 @@
|
|
|
44
42
|
"files": [
|
|
45
43
|
"bin/",
|
|
46
44
|
"src/",
|
|
47
|
-
"dist/",
|
|
48
45
|
"templates/",
|
|
49
46
|
"templates/.gitignore",
|
|
50
47
|
"README.md",
|
package/src/cli/CommitCommand.js
CHANGED
|
@@ -178,13 +178,29 @@ export class CommitCommand {
|
|
|
178
178
|
taskData = task;
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
// Build PR body
|
|
182
|
-
let prBody =
|
|
181
|
+
// Build PR body following .github/PULL_REQUEST_TEMPLATE.md structure
|
|
182
|
+
let prBody = `## Task\n\n`;
|
|
183
183
|
|
|
184
184
|
if (taskData.githubIssue) {
|
|
185
|
-
prBody +=
|
|
185
|
+
prBody += `Closes #${taskData.githubIssue}\n\n`;
|
|
186
|
+
} else {
|
|
187
|
+
prBody += `${task.id}\n\n`;
|
|
186
188
|
}
|
|
187
189
|
|
|
190
|
+
prBody += `## Description\n\n`;
|
|
191
|
+
prBody += `${taskData.description || task.description || commitMessage}\n\n`;
|
|
192
|
+
|
|
193
|
+
prBody += `## Changes\n\n`;
|
|
194
|
+
prBody += `- Implemented ${task.title}\n\n`;
|
|
195
|
+
|
|
196
|
+
prBody += `## Testing\n\n`;
|
|
197
|
+
prBody += `- [x] Unit tests pass (\`npm test\`)\n`;
|
|
198
|
+
prBody += `- [ ] Visual tests pass (if applicable) (\`npx playwright test\`)\n`;
|
|
199
|
+
prBody += `- [ ] Code follows project conventions\n\n`;
|
|
200
|
+
|
|
201
|
+
prBody += `## Notes\n\n`;
|
|
202
|
+
prBody += `Auto-generated by Agentic15 Claude Zen`;
|
|
203
|
+
|
|
188
204
|
// Create PR using gh CLI
|
|
189
205
|
const prCommand = `gh pr create --title "${commitMessage}" --body "${prBody}" --base ${mainBranch}`;
|
|
190
206
|
const prOutput = execSync(prCommand, { encoding: 'utf-8' });
|
package/src/cli/PlanCommand.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { execSync } from 'child_process';
|
|
2
1
|
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
3
2
|
import { join } from 'path';
|
|
4
3
|
|
|
@@ -49,31 +48,75 @@ export class PlanCommand {
|
|
|
49
48
|
console.log('\nš Generating new plan...\n');
|
|
50
49
|
|
|
51
50
|
try {
|
|
52
|
-
//
|
|
53
|
-
|
|
51
|
+
// Create plan ID
|
|
52
|
+
const planId = this.getNextPlanId();
|
|
53
|
+
const planPath = join(process.cwd(), '.claude', 'plans', planId);
|
|
54
54
|
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
const plans = readdirSync(plansDir)
|
|
58
|
-
.filter(name => name.startsWith('plan-') && name.includes('-generated'));
|
|
55
|
+
// Create plan directory
|
|
56
|
+
mkdirSync(planPath, { recursive: true });
|
|
59
57
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
// Create PROJECT-REQUIREMENTS.txt
|
|
59
|
+
const requirementsPath = join(planPath, 'PROJECT-REQUIREMENTS.txt');
|
|
60
|
+
const requirementsContent = `PROJECT REQUIREMENTS
|
|
61
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
62
|
+
|
|
63
|
+
${description}
|
|
64
|
+
|
|
65
|
+
Generated: ${new Date().toISOString()}
|
|
66
|
+
PLAN ID: ${planId}
|
|
67
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
68
|
+
|
|
69
|
+
INSTRUCTIONS FOR CLAUDE
|
|
70
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
71
|
+
|
|
72
|
+
Please analyze the requirements above and create a comprehensive project plan.
|
|
73
|
+
|
|
74
|
+
1. Read the PLAN-SCHEMA.json to understand the plan structure
|
|
75
|
+
2. Read the PROJECT-PLAN-TEMPLATE.json for the format
|
|
76
|
+
3. Create a PROJECT-PLAN.json file in this directory with:
|
|
77
|
+
- Clear project/subproject/milestone hierarchy
|
|
78
|
+
- Detailed tasks with IDs (TASK-001, TASK-002, etc.)
|
|
79
|
+
- Proper dependencies between tasks
|
|
80
|
+
- Realistic time estimates
|
|
81
|
+
- Phases: design, implementation, testing, deployment
|
|
82
|
+
- Completion criteria for each task
|
|
83
|
+
|
|
84
|
+
4. Structure the plan to follow these phases:
|
|
85
|
+
- DESIGN: Architecture, UI/UX, database schema
|
|
86
|
+
- IMPLEMENTATION: Core features, API, frontend
|
|
87
|
+
- TESTING: Unit tests, integration tests, E2E tests
|
|
88
|
+
- DEPLOYMENT: Build, CI/CD, documentation
|
|
89
|
+
|
|
90
|
+
5. Ensure tasks are:
|
|
91
|
+
- Granular (2-8 hours each)
|
|
92
|
+
- Clearly defined with specific deliverables
|
|
93
|
+
- Properly sequenced with dependencies
|
|
94
|
+
- Grouped logically by feature/component
|
|
95
|
+
|
|
96
|
+
6. After creating the plan, tell the user to run:
|
|
97
|
+
npx agentic15 plan
|
|
64
98
|
|
|
65
|
-
|
|
66
|
-
|
|
99
|
+
This will lock the plan and generate the task tracker.
|
|
100
|
+
|
|
101
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
102
|
+
GENERATED: ${new Date().toISOString()}
|
|
103
|
+
`;
|
|
104
|
+
|
|
105
|
+
writeFileSync(requirementsPath, requirementsContent);
|
|
67
106
|
|
|
68
107
|
// Set as active plan
|
|
69
|
-
const
|
|
108
|
+
const claudeDir = join(process.cwd(), '.claude');
|
|
109
|
+
if (!existsSync(claudeDir)) {
|
|
110
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
const activePlanPath = join(claudeDir, 'ACTIVE-PLAN');
|
|
70
113
|
writeFileSync(activePlanPath, planId);
|
|
71
114
|
|
|
72
|
-
console.log(
|
|
115
|
+
console.log(`ā
Plan requirements created: ${planId}`);
|
|
73
116
|
console.log(` Location: .claude/plans/${planId}/PROJECT-REQUIREMENTS.txt\n`);
|
|
74
117
|
console.log('š” Next steps:');
|
|
75
118
|
console.log(` 1. Tell Claude: "Create the project plan"`);
|
|
76
|
-
console.log(` 2. When Claude is done, run: agentic15 plan\n`);
|
|
119
|
+
console.log(` 2. When Claude is done, run: npx agentic15 plan\n`);
|
|
77
120
|
} catch (error) {
|
|
78
121
|
console.log(`\nā Failed to generate plan: ${error.message}\n`);
|
|
79
122
|
process.exit(1);
|
|
@@ -84,20 +127,106 @@ export class PlanCommand {
|
|
|
84
127
|
console.log(`š Locking plan: ${planId}\n`);
|
|
85
128
|
|
|
86
129
|
try {
|
|
87
|
-
|
|
88
|
-
|
|
130
|
+
const planPath = join(process.cwd(), '.claude', 'plans', planId);
|
|
131
|
+
const projectPlanPath = join(planPath, 'PROJECT-PLAN.json');
|
|
89
132
|
|
|
90
|
-
|
|
133
|
+
// Verify PROJECT-PLAN.json exists
|
|
134
|
+
if (!existsSync(projectPlanPath)) {
|
|
135
|
+
console.log('\nā PROJECT-PLAN.json not found');
|
|
136
|
+
console.log(' Tell Claude to create the plan first\n');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
91
139
|
|
|
92
|
-
|
|
140
|
+
// Read the plan
|
|
141
|
+
const plan = JSON.parse(readFileSync(projectPlanPath, 'utf-8'));
|
|
93
142
|
|
|
94
|
-
|
|
143
|
+
// Extract tasks from plan
|
|
144
|
+
const tasks = [];
|
|
145
|
+
this.extractTasks(plan, tasks);
|
|
146
|
+
|
|
147
|
+
// Create task files
|
|
148
|
+
const tasksDir = join(planPath, 'tasks');
|
|
149
|
+
if (!existsSync(tasksDir)) {
|
|
150
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Write individual task files
|
|
154
|
+
tasks.forEach(task => {
|
|
155
|
+
const taskPath = join(tasksDir, `${task.id}.json`);
|
|
156
|
+
writeFileSync(taskPath, JSON.stringify(task, null, 2));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Create task tracker
|
|
160
|
+
const tracker = {
|
|
161
|
+
planId,
|
|
162
|
+
lockedAt: new Date().toISOString(),
|
|
163
|
+
taskFiles: tasks.map(task => ({
|
|
164
|
+
id: task.id,
|
|
165
|
+
title: task.title,
|
|
166
|
+
phase: task.phase || 'implementation',
|
|
167
|
+
status: 'pending',
|
|
168
|
+
description: task.description
|
|
169
|
+
}))
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const trackerPath = join(planPath, 'TASK-TRACKER.json');
|
|
173
|
+
writeFileSync(trackerPath, JSON.stringify(tracker, null, 2));
|
|
174
|
+
|
|
175
|
+
// Mark as locked
|
|
176
|
+
const lockedPath = join(planPath, '.plan-locked');
|
|
177
|
+
writeFileSync(lockedPath, new Date().toISOString());
|
|
178
|
+
|
|
179
|
+
console.log('ā
Plan locked successfully\n');
|
|
180
|
+
this.showPlanStatus(planId);
|
|
181
|
+
console.log('š” Next step: npx agentic15 task next\n');
|
|
95
182
|
} catch (error) {
|
|
96
183
|
console.log(`\nā Failed to lock plan: ${error.message}\n`);
|
|
97
184
|
process.exit(1);
|
|
98
185
|
}
|
|
99
186
|
}
|
|
100
187
|
|
|
188
|
+
static extractTasks(obj, tasks) {
|
|
189
|
+
// Recursively extract all tasks from the plan structure
|
|
190
|
+
if (obj.tasks && Array.isArray(obj.tasks)) {
|
|
191
|
+
tasks.push(...obj.tasks);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Check nested structures
|
|
195
|
+
if (obj.milestones && Array.isArray(obj.milestones)) {
|
|
196
|
+
obj.milestones.forEach(milestone => this.extractTasks(milestone, tasks));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (obj.subprojects && Array.isArray(obj.subprojects)) {
|
|
200
|
+
obj.subprojects.forEach(subproject => this.extractTasks(subproject, tasks));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (obj.projects && Array.isArray(obj.projects)) {
|
|
204
|
+
obj.projects.forEach(project => this.extractTasks(project, tasks));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Handle singular 'project' at root level (v2.0 schema)
|
|
208
|
+
if (obj.project && typeof obj.project === 'object') {
|
|
209
|
+
this.extractTasks(obj.project, tasks);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
static getNextPlanId() {
|
|
214
|
+
const plansDir = join(process.cwd(), '.claude', 'plans');
|
|
215
|
+
|
|
216
|
+
if (!existsSync(plansDir)) {
|
|
217
|
+
mkdirSync(plansDir, { recursive: true });
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const existingPlans = readdirSync(plansDir)
|
|
221
|
+
.filter(name => name.match(/^plan-\d{3}-/i))
|
|
222
|
+
.map(name => parseInt(name.match(/^plan-(\d{3})-/i)[1]))
|
|
223
|
+
.filter(num => !isNaN(num));
|
|
224
|
+
|
|
225
|
+
const nextNum = existingPlans.length > 0 ? Math.max(...existingPlans) + 1 : 1;
|
|
226
|
+
|
|
227
|
+
return `plan-${String(nextNum).padStart(3, '0')}-generated`;
|
|
228
|
+
}
|
|
229
|
+
|
|
101
230
|
static showPlanStatus(planId) {
|
|
102
231
|
const trackerPath = join(process.cwd(), '.claude', 'plans', planId, 'TASK-TRACKER.json');
|
|
103
232
|
|
package/src/cli/TaskCommand.js
CHANGED
|
@@ -152,7 +152,9 @@ export class TaskCommand {
|
|
|
152
152
|
const taskPath = this.getTaskPath(task.id);
|
|
153
153
|
const taskData = JSON.parse(readFileSync(taskPath, 'utf-8'));
|
|
154
154
|
|
|
155
|
-
const
|
|
155
|
+
const title = TaskIssueMapper.taskToIssueTitle(taskData);
|
|
156
|
+
const body = TaskIssueMapper.taskToIssueBody(taskData);
|
|
157
|
+
const labels = TaskIssueMapper.taskStatusToLabels(taskData.status || 'pending', taskData.phase);
|
|
156
158
|
const issueNumber = await client.createIssue(title, body, labels);
|
|
157
159
|
|
|
158
160
|
if (issueNumber) {
|
|
@@ -53,25 +53,22 @@ export class ProjectInitializer {
|
|
|
53
53
|
// Step 1: Copy templates
|
|
54
54
|
await this.templateManager.copyTemplates(projectName, targetDir);
|
|
55
55
|
|
|
56
|
-
// Step 2:
|
|
57
|
-
await this.templateManager.extractBundledFiles(targetDir);
|
|
58
|
-
|
|
59
|
-
// Step 3: Initialize git repository
|
|
56
|
+
// Step 2: Initialize git repository
|
|
60
57
|
if (initGit) {
|
|
61
58
|
await this.gitInitializer.initialize(targetDir);
|
|
62
59
|
}
|
|
63
60
|
|
|
64
|
-
// Step
|
|
61
|
+
// Step 3: Install dependencies
|
|
65
62
|
if (installDeps) {
|
|
66
63
|
await this.dependencyInstaller.install(targetDir);
|
|
67
64
|
}
|
|
68
65
|
|
|
69
|
-
// Step
|
|
66
|
+
// Step 4: Setup git hooks
|
|
70
67
|
if (initGit) {
|
|
71
68
|
await this.hookInstaller.install(targetDir);
|
|
72
69
|
}
|
|
73
70
|
|
|
74
|
-
// Step
|
|
71
|
+
// Step 5: Display onboarding instructions
|
|
75
72
|
this.displayOnboarding();
|
|
76
73
|
}
|
|
77
74
|
|
|
@@ -80,26 +77,25 @@ export class ProjectInitializer {
|
|
|
80
77
|
*/
|
|
81
78
|
displayOnboarding() {
|
|
82
79
|
console.log('\n' + 'ā'.repeat(70));
|
|
83
|
-
console.log('šÆ
|
|
80
|
+
console.log('šÆ PROJECT CREATED SUCCESSFULLY');
|
|
84
81
|
console.log('ā'.repeat(70));
|
|
85
82
|
console.log('\nš READ THIS FILE: .claude/POST-INSTALL.md');
|
|
86
|
-
console.log('\n
|
|
87
|
-
console.log('
|
|
88
|
-
console.log('
|
|
89
|
-
console.log('
|
|
90
|
-
console.log('
|
|
91
|
-
console.log('
|
|
92
|
-
console.log('
|
|
93
|
-
console.log('
|
|
94
|
-
console.log('
|
|
83
|
+
console.log('\n Complete workflow documentation with examples.\n');
|
|
84
|
+
console.log('š QUICK START:');
|
|
85
|
+
console.log(' 1. npx agentic15 auth');
|
|
86
|
+
console.log(' 2. npx agentic15 plan "Your project description"');
|
|
87
|
+
console.log(' 3. Tell Claude: "Create the project plan"');
|
|
88
|
+
console.log(' 4. npx agentic15 plan (locks the plan)');
|
|
89
|
+
console.log(' 5. npx agentic15 task next');
|
|
90
|
+
console.log(' 6. Tell Claude: "Write code for TASK-001"');
|
|
91
|
+
console.log(' 7. npx agentic15 commit');
|
|
95
92
|
console.log('\nš Your Workspace:');
|
|
96
|
-
console.log(' ./Agent/ -
|
|
97
|
-
console.log(' ./
|
|
98
|
-
console.log('
|
|
99
|
-
console.log('
|
|
100
|
-
console.log('ā ļø Hooks enforce rules - violations will be BLOCKED');
|
|
93
|
+
console.log(' ./Agent/src/ - Your source code');
|
|
94
|
+
console.log(' ./Agent/tests/ - Your test files');
|
|
95
|
+
console.log(' ./test-site/ - Test site for visual verification');
|
|
96
|
+
console.log(' ./.claude/ - Framework files (auto-managed)');
|
|
101
97
|
console.log('\n' + 'ā'.repeat(70));
|
|
102
|
-
console.log('ā
Setup complete!
|
|
98
|
+
console.log('ā
Setup complete! See .claude/POST-INSTALL.md for details.');
|
|
103
99
|
console.log('ā'.repeat(70) + '\n');
|
|
104
100
|
}
|
|
105
101
|
}
|
|
@@ -34,48 +34,52 @@ export class TaskIssueMapper {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
|
-
* Generate GitHub issue body from task
|
|
37
|
+
* Generate GitHub issue body from task using issue template format
|
|
38
38
|
*
|
|
39
39
|
* @param {Object} task - Task object
|
|
40
40
|
* @returns {string} Issue body in markdown format
|
|
41
41
|
*/
|
|
42
42
|
static taskToIssueBody(task) {
|
|
43
|
-
|
|
43
|
+
// Follow .github/ISSUE_TEMPLATE/task.md structure
|
|
44
|
+
let body = `## Task Description\n\n`;
|
|
44
45
|
|
|
45
46
|
if (task.description) {
|
|
46
47
|
body += `${task.description}\n\n`;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
if (task.phase) {
|
|
50
|
-
body += `**Phase:** ${task.phase}\n`;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
50
|
if (task.estimatedHours) {
|
|
54
|
-
body += `**Estimated Hours:** ${task.estimatedHours}h\n`;
|
|
51
|
+
body += `**Estimated Hours:** ${task.estimatedHours}h\n\n`;
|
|
55
52
|
}
|
|
56
53
|
|
|
54
|
+
body += `## Completion Criteria\n\n`;
|
|
57
55
|
if (task.completionCriteria && task.completionCriteria.length > 0) {
|
|
58
|
-
body += `\n### Completion Criteria\n\n`;
|
|
59
56
|
task.completionCriteria.forEach(criteria => {
|
|
60
57
|
body += `- [ ] ${criteria}\n`;
|
|
61
58
|
});
|
|
59
|
+
} else {
|
|
60
|
+
body += `*No specific criteria defined*\n`;
|
|
62
61
|
}
|
|
63
62
|
|
|
63
|
+
body += `\n## Dependencies\n\n`;
|
|
64
64
|
if (task.dependencies && task.dependencies.length > 0) {
|
|
65
|
-
body += `\n### Dependencies\n\n`;
|
|
66
65
|
task.dependencies.forEach(dep => {
|
|
67
66
|
body += `- ${dep}\n`;
|
|
68
67
|
});
|
|
68
|
+
} else {
|
|
69
|
+
body += `*No dependencies*\n`;
|
|
69
70
|
}
|
|
70
71
|
|
|
72
|
+
body += `\n## Phase\n\n`;
|
|
73
|
+
body += `${task.phase || 'implementation'}\n`;
|
|
74
|
+
|
|
71
75
|
if (task.testCases && task.testCases.length > 0) {
|
|
72
|
-
body += `\n
|
|
76
|
+
body += `\n## Test Cases\n\n`;
|
|
73
77
|
task.testCases.forEach(test => {
|
|
74
78
|
body += `- ${test}\n`;
|
|
75
79
|
});
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
body += `\n---\n*Auto-
|
|
82
|
+
body += `\n---\n*Auto-generated by Agentic15 Claude Zen*`;
|
|
79
83
|
|
|
80
84
|
return body;
|
|
81
85
|
}
|
|
@@ -28,7 +28,8 @@ const __dirname = dirname(__filename);
|
|
|
28
28
|
*/
|
|
29
29
|
export class TemplateManager {
|
|
30
30
|
constructor() {
|
|
31
|
-
|
|
31
|
+
// From src/core/, go up two levels to package root, then into templates
|
|
32
|
+
this.templatesDir = join(__dirname, '..', '..', 'templates');
|
|
32
33
|
this.distDir = join(__dirname, '.');
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Task
|
|
3
|
+
about: Auto-generated task from Agentic15 plan
|
|
4
|
+
title: '[TASK-XXX] '
|
|
5
|
+
labels: 'task'
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Task Description
|
|
10
|
+
|
|
11
|
+
<!-- Auto-generated from PROJECT-PLAN.json -->
|
|
12
|
+
|
|
13
|
+
## Completion Criteria
|
|
14
|
+
|
|
15
|
+
<!-- Auto-populated from task definition -->
|
|
16
|
+
|
|
17
|
+
## Dependencies
|
|
18
|
+
|
|
19
|
+
<!-- Auto-populated from task definition -->
|
|
20
|
+
|
|
21
|
+
## Phase
|
|
22
|
+
|
|
23
|
+
<!-- Auto-populated from task definition -->
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Pull Request
|
|
2
|
+
|
|
3
|
+
## Task
|
|
4
|
+
|
|
5
|
+
Closes #
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
<!-- Auto-generated from task description -->
|
|
10
|
+
|
|
11
|
+
## Changes
|
|
12
|
+
|
|
13
|
+
-
|
|
14
|
+
|
|
15
|
+
## Testing
|
|
16
|
+
|
|
17
|
+
- [ ] Unit tests pass (`npm test`)
|
|
18
|
+
- [ ] Visual tests pass (if applicable) (`npx playwright test`)
|
|
19
|
+
- [ ] Code follows project conventions
|
|
20
|
+
|
|
21
|
+
## Notes
|
|
22
|
+
|
|
23
|
+
<!-- Additional context or notes -->
|