@e0ipso/ai-task-manager 1.36.0 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -21
- package/dist/cli.js +1 -32
- package/dist/cli.js.map +1 -1
- package/dist/conflict-detector.d.ts.map +1 -1
- package/dist/conflict-detector.js +0 -4
- package/dist/conflict-detector.js.map +1 -1
- package/dist/index.d.ts +3 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -245
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +9 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +14 -0
- package/dist/metadata.js.map +1 -1
- package/dist/types.d.ts +18 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +27 -58
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +93 -219
- package/dist/utils.js.map +1 -1
- package/package.json +4 -2
- package/templates/ai-task-manager/config/TASK_MANAGER.md +3 -3
- package/templates/ai-task-manager/config/hooks/PRE_PHASE.md +6 -26
- package/templates/ai-task-manager/config/hooks/PRE_TASK_ASSIGNMENT.md +6 -24
- package/templates/ai-task-manager/config/templates/PLAN_TEMPLATE.md +1 -1
- package/templates/{assistant → harness}/agents/plan-creator.md +2 -2
- package/templates/harness/skills/task-create-plan/SKILL.md +120 -0
- package/templates/harness/skills/task-create-plan/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-create-plan/scripts/get-next-plan-id.cjs +214 -0
- package/templates/harness/skills/task-execute-blueprint/SKILL.md +139 -0
- package/templates/harness/skills/task-execute-blueprint/scripts/create-feature-branch.cjs +376 -0
- package/templates/harness/skills/task-execute-blueprint/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-execute-blueprint/scripts/validate-plan-blueprint.cjs +375 -0
- package/templates/harness/skills/task-execute-task/SKILL.md +195 -0
- package/templates/harness/skills/task-execute-task/scripts/check-task-dependencies.cjs +437 -0
- package/templates/harness/skills/task-execute-task/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-execute-task/scripts/validate-plan-blueprint.cjs +375 -0
- package/templates/harness/skills/task-full-workflow/SKILL.md +378 -0
- package/templates/harness/skills/task-full-workflow/scripts/create-feature-branch.cjs +376 -0
- package/templates/harness/skills/task-full-workflow/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-full-workflow/scripts/get-next-plan-id.cjs +214 -0
- package/templates/harness/skills/task-full-workflow/scripts/get-next-task-id.cjs +312 -0
- package/templates/harness/skills/task-full-workflow/scripts/validate-plan-blueprint.cjs +375 -0
- package/templates/harness/skills/task-generate-tasks/SKILL.md +244 -0
- package/templates/harness/skills/task-generate-tasks/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-generate-tasks/scripts/get-next-task-id.cjs +312 -0
- package/templates/harness/skills/task-generate-tasks/scripts/validate-plan-blueprint.cjs +375 -0
- package/templates/harness/skills/task-refine-plan/SKILL.md +205 -0
- package/templates/harness/skills/task-refine-plan/scripts/find-task-manager-root.cjs +116 -0
- package/templates/harness/skills/task-refine-plan/scripts/validate-plan-blueprint.cjs +375 -0
- package/dist/exec.d.ts +0 -13
- package/dist/exec.d.ts.map +0 -1
- package/dist/exec.js +0 -261
- package/dist/exec.js.map +0 -1
- package/templates/ai-task-manager/config/scripts/check-task-dependencies.cjs +0 -240
- package/templates/ai-task-manager/config/scripts/compose-prompt.cjs +0 -234
- package/templates/ai-task-manager/config/scripts/create-feature-branch.cjs +0 -204
- package/templates/ai-task-manager/config/scripts/extract-task-skills.cjs +0 -84
- package/templates/ai-task-manager/config/scripts/find-root.cjs +0 -10
- package/templates/ai-task-manager/config/scripts/get-next-plan-id.cjs +0 -49
- package/templates/ai-task-manager/config/scripts/get-next-task-id.cjs +0 -81
- package/templates/ai-task-manager/config/scripts/shared-utils.cjs +0 -418
- package/templates/ai-task-manager/config/scripts/validate-plan-blueprint.cjs +0 -138
- package/templates/assistant/commands/tasks/create-plan-auto.md +0 -174
- package/templates/assistant/commands/tasks/create-plan.md +0 -175
- package/templates/assistant/commands/tasks/execute-blueprint.md +0 -233
- package/templates/assistant/commands/tasks/execute-task.md +0 -351
- package/templates/assistant/commands/tasks/fix-broken-tests.md +0 -44
- package/templates/assistant/commands/tasks/full-workflow.md +0 -849
- package/templates/assistant/commands/tasks/generate-tasks.md +0 -348
- package/templates/assistant/commands/tasks/refine-plan-auto.md +0 -172
- package/templates/assistant/commands/tasks/refine-plan.md +0 -163
package/README.md
CHANGED
|
@@ -11,19 +11,20 @@ Transform complex AI prompts into organized, executable workflows through custom
|
|
|
11
11
|
|
|
12
12
|
## 🚀 Quick Start
|
|
13
13
|
|
|
14
|
+
This project ships in two parts: the **skills** (installed by [vercel-labs/skills](https://github.com/vercel-labs/skills)) and the **workspace** (initialized by this CLI). Run both:
|
|
15
|
+
|
|
14
16
|
```bash
|
|
15
|
-
#
|
|
16
|
-
npx
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
npx @e0ipso/ai-task-manager init --
|
|
20
|
-
npx @e0ipso/ai-task-manager init --assistants codex
|
|
21
|
-
npx @e0ipso/ai-task-manager init --assistants github
|
|
22
|
-
|
|
23
|
-
# Or configure multiple assistants
|
|
24
|
-
npx @e0ipso/ai-task-manager init --assistants claude,cursor,gemini,opencode,codex,github
|
|
17
|
+
# 1. Install the task skills for your assistant
|
|
18
|
+
npx skills add e0ipso/ai-task-manager
|
|
19
|
+
|
|
20
|
+
# 2. Initialize the .ai/task-manager/ workspace
|
|
21
|
+
npx @e0ipso/ai-task-manager init --harnesses claude --destination-directory .
|
|
25
22
|
```
|
|
26
23
|
|
|
24
|
+
The skills give your assistant the planning, decomposition, and execution workflow; the CLI bootstraps `.ai/task-manager/` with hooks, templates, and the hash-tracked diff-on-conflict UX. Each step is independently re-runnable. See the [migration guide](https://mateuaguilo.com/ai-task-manager/migration.html) for upgrade flows from 1.x.
|
|
25
|
+
|
|
26
|
+
The CLI's `init` emits the shared workspace plus harness-specific agents (e.g., `.claude/agents/` for Claude). Other harnesses rely entirely on the installed skills.
|
|
27
|
+
|
|
27
28
|
## ✨ Key Benefits
|
|
28
29
|
|
|
29
30
|
- **🔧 Fully Customizable**: Tailor hooks, templates, and workflows to your project's specific needs
|
|
@@ -45,22 +46,26 @@ Comprehensive guides covering:
|
|
|
45
46
|
|
|
46
47
|
## 🔄 Workflow Preview
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
Once the skills are installed, invoke the workflow by intent — the assistant auto-loads the matching skill. There are no slash commands to memorize.
|
|
50
|
+
|
|
51
|
+
**Automated end-to-end run:**
|
|
52
|
+
|
|
53
|
+
> "Run the full workflow to create a user authentication system."
|
|
54
|
+
|
|
55
|
+
The `task-full-workflow` skill handles plan creation, task generation, and blueprint execution in a single pass.
|
|
56
|
+
|
|
57
|
+
**Step-by-step (for manual review between phases):**
|
|
52
58
|
|
|
53
|
-
**
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
4. **🚀 Execute blueprint** → `/tasks:execute-blueprint 1`
|
|
59
|
+
1. **📝 Create a plan** → "Create a plan for a user authentication system" (`task-create-plan` skill)
|
|
60
|
+
2. **🔍 Refine the plan** → "Refine plan 1" (`task-refine-plan` skill — useful when a second assistant should red-team the plan)
|
|
61
|
+
3. **📋 Generate tasks** → "Generate tasks for plan 1" (`task-generate-tasks` skill)
|
|
62
|
+
4. **🚀 Execute blueprint** → "Execute the blueprint for plan 1" (`task-execute-blueprint` skill)
|
|
58
63
|
5. **📊 Monitor progress** → `npx @e0ipso/ai-task-manager status`
|
|
59
64
|
6. **🗂️ Manage plans** → `npx @e0ipso/ai-task-manager plan show 1`
|
|
60
65
|
|
|
61
|
-
## 🤖 Supported
|
|
66
|
+
## 🤖 Supported Harnesses
|
|
62
67
|
|
|
63
|
-
|
|
|
68
|
+
| Harness | Interface | Setup Time |
|
|
64
69
|
|-----------|-----------|------------|
|
|
65
70
|
| 🎭 **Claude** | [claude.ai/code](https://claude.ai/code) | < 30 seconds |
|
|
66
71
|
| 🖱️ **Cursor** | Cursor IDE | < 30 seconds |
|
package/dist/cli.js
CHANGED
|
@@ -11,13 +11,12 @@ const commander_1 = require("commander");
|
|
|
11
11
|
const index_1 = require("./index");
|
|
12
12
|
const status_1 = require("./status");
|
|
13
13
|
const plan_1 = require("./plan");
|
|
14
|
-
const exec_1 = require("./exec");
|
|
15
14
|
const program = new commander_1.Command();
|
|
16
15
|
program.name('ai-task-manager').version('0.1.0').description('AI-powered task management CLI tool');
|
|
17
16
|
program
|
|
18
17
|
.command('init')
|
|
19
18
|
.description('Initialize a new AI task management project')
|
|
20
|
-
.requiredOption('--
|
|
19
|
+
.requiredOption('--harnesses <value>', 'Comma-separated list of harnesses to configure (claude,codex,cursor,gemini,github,opencode)')
|
|
21
20
|
.option('--destination-directory <path>', 'Directory to create project structure in (default: current directory)')
|
|
22
21
|
.option('--force', 'Force overwrite all files without prompting')
|
|
23
22
|
.action(async (options) => {
|
|
@@ -172,36 +171,6 @@ planCommand
|
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
});
|
|
175
|
-
// Claude-exec command: validate and execute multiple plans sequentially
|
|
176
|
-
program
|
|
177
|
-
.command('claude-exec <plan-ids>')
|
|
178
|
-
.description('Validate and execute multiple plans sequentially using Claude Code CLI')
|
|
179
|
-
.action(async (planIdsStr) => {
|
|
180
|
-
try {
|
|
181
|
-
const planIds = planIdsStr.split(',').map(id => {
|
|
182
|
-
const num = parseInt(id.trim(), 10);
|
|
183
|
-
if (isNaN(num)) {
|
|
184
|
-
console.error(`Invalid plan ID: ${id.trim()}. Must be a number.`);
|
|
185
|
-
process.exit(1);
|
|
186
|
-
}
|
|
187
|
-
return num;
|
|
188
|
-
});
|
|
189
|
-
const result = await (0, exec_1.claudeExec)(planIds);
|
|
190
|
-
if (result.success) {
|
|
191
|
-
process.exit(0);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
if (result.message) {
|
|
195
|
-
console.error(result.message);
|
|
196
|
-
}
|
|
197
|
-
process.exit(1);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
202
|
-
process.exit(1);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
174
|
// Error handling for unknown commands
|
|
206
175
|
program.on('command:*', async (operands) => {
|
|
207
176
|
console.error(`Unknown command: ${operands[0]}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;AAEH,yCAAoC;AACpC,mCAA+B;AAC/B,qCAAkC;AAClC,iCAA2D;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../src/conflict-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"conflict-detector.d.ts","sourceRoot":"","sources":["../src/conflict-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAkCrD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CA2CzB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,YAAY,GACrB,OAAO,CAMT"}
|
|
@@ -57,10 +57,6 @@ async function getConfigFiles(destDir) {
|
|
|
57
57
|
for (const entry of entries) {
|
|
58
58
|
const fullPath = path.join(dir, entry.name);
|
|
59
59
|
const relativePath = path.relative(relativeTo, fullPath);
|
|
60
|
-
// Skip scripts directory (not user-editable)
|
|
61
|
-
if (relativePath.startsWith('config/scripts') || relativePath.includes('/scripts/')) {
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
60
|
if (entry.isDirectory()) {
|
|
65
61
|
await walkDir(fullPath, relativeTo);
|
|
66
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../src/conflict-detector.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"conflict-detector.js","sourceRoot":"","sources":["../src/conflict-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* This file contains the implementation of the init command
|
|
5
5
|
* Handles initialization of new AI task management projects
|
|
6
6
|
*/
|
|
7
|
-
import { InitOptions,
|
|
7
|
+
import { InitOptions, CommandResult } from './types';
|
|
8
8
|
/**
|
|
9
9
|
* Initialize a new AI Task Manager project
|
|
10
10
|
*
|
|
11
|
-
* Creates directory structures and copies template files based on the selected
|
|
11
|
+
* Creates directory structures and copies template files based on the selected harnesses.
|
|
12
12
|
* Validates input, creates necessary directories, and copies appropriate templates.
|
|
13
13
|
*
|
|
14
|
-
* @param options - Initialization options containing
|
|
14
|
+
* @param options - Initialization options containing harness selection
|
|
15
15
|
* @returns CommandResult indicating success or failure with details
|
|
16
16
|
*/
|
|
17
17
|
export declare function init(options: InitOptions): Promise<CommandResult>;
|
|
@@ -19,17 +19,4 @@ export declare function init(options: InitOptions): Promise<CommandResult>;
|
|
|
19
19
|
* Check if a directory already has AI Task Manager initialized
|
|
20
20
|
*/
|
|
21
21
|
export declare function isInitialized(baseDir?: string): Promise<boolean>;
|
|
22
|
-
/**
|
|
23
|
-
* Get information about existing initialization
|
|
24
|
-
*/
|
|
25
|
-
export declare function getInitInfo(baseDir?: string): Promise<{
|
|
26
|
-
hasAiTaskManager: boolean;
|
|
27
|
-
hasClaudeConfig: boolean;
|
|
28
|
-
hasGeminiConfig: boolean;
|
|
29
|
-
hasOpencodeConfig: boolean;
|
|
30
|
-
hasCodexConfig: boolean;
|
|
31
|
-
hasCursorConfig: boolean;
|
|
32
|
-
hasGithubConfig: boolean;
|
|
33
|
-
assistants: Assistant[];
|
|
34
|
-
}>;
|
|
35
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,WAAW,EAAW,aAAa,EAAoC,MAAM,SAAS,CAAC;AA4EhG;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA0FvE;AAuKD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGtE"}
|
package/dist/index.js
CHANGED
|
@@ -44,7 +44,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
45
|
exports.init = init;
|
|
46
46
|
exports.isInitialized = isInitialized;
|
|
47
|
-
exports.getInitInfo = getInitInfo;
|
|
48
47
|
const fs = __importStar(require("fs-extra"));
|
|
49
48
|
const path = __importStar(require("path"));
|
|
50
49
|
const chalk_1 = __importDefault(require("chalk"));
|
|
@@ -112,10 +111,10 @@ async function exists(filepath) {
|
|
|
112
111
|
/**
|
|
113
112
|
* Initialize a new AI Task Manager project
|
|
114
113
|
*
|
|
115
|
-
* Creates directory structures and copies template files based on the selected
|
|
114
|
+
* Creates directory structures and copies template files based on the selected harnesses.
|
|
116
115
|
* Validates input, creates necessary directories, and copies appropriate templates.
|
|
117
116
|
*
|
|
118
|
-
* @param options - Initialization options containing
|
|
117
|
+
* @param options - Initialization options containing harness selection
|
|
119
118
|
* @returns CommandResult indicating success or failure with details
|
|
120
119
|
*/
|
|
121
120
|
async function init(options) {
|
|
@@ -123,16 +122,16 @@ async function init(options) {
|
|
|
123
122
|
// Determine base directory
|
|
124
123
|
const baseDir = options.destinationDirectory || '.';
|
|
125
124
|
const resolvedBaseDir = resolvePath(baseDir);
|
|
126
|
-
// Parse and validate
|
|
127
|
-
const
|
|
128
|
-
(0, utils_1.
|
|
125
|
+
// Parse and validate harnesses
|
|
126
|
+
const harnesses = (0, utils_1.parseHarnesses)(options.harnesses);
|
|
127
|
+
(0, utils_1.validateHarnesses)(harnesses);
|
|
129
128
|
// ========== HEADER SECTION ==========
|
|
130
129
|
console.log(chalk_1.default.bold.white('\nAI Task Manager Initialization'));
|
|
131
130
|
console.log(chalk_1.default.gray(DIVIDER));
|
|
132
131
|
// ========== CONFIGURATION SECTION ==========
|
|
133
132
|
console.log(formatSectionHeader('Configuration'));
|
|
134
133
|
console.log(` ${chalk_1.default.cyan('●')} Target Directory: ${resolvedBaseDir}`);
|
|
135
|
-
console.log(` ${chalk_1.default.cyan('●')}
|
|
134
|
+
console.log(` ${chalk_1.default.cyan('●')} Harnesses: ${harnesses.join(', ')}`);
|
|
136
135
|
// ========== SETUP PROGRESS SECTION ==========
|
|
137
136
|
console.log(formatSectionHeader('Setup Progress'));
|
|
138
137
|
// Create .ai/task-manager structure
|
|
@@ -143,10 +142,14 @@ async function init(options) {
|
|
|
143
142
|
// Copy common templates to .ai/task-manager with conflict detection
|
|
144
143
|
console.log(` ${chalk_1.default.green('✓')} Copying common template files`);
|
|
145
144
|
await copyCommonTemplates(baseDir, options.force || false);
|
|
146
|
-
// Create
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
// Create harness-specific directories and copy templates
|
|
146
|
+
const allCreatedAgentFiles = new Map();
|
|
147
|
+
for (const harness of harnesses) {
|
|
148
|
+
console.log(` ${chalk_1.default.green('✓')} Setting up ${harness} harness configuration`);
|
|
149
|
+
const created = await createHarnessStructure(harness, baseDir);
|
|
150
|
+
if (created.length > 0) {
|
|
151
|
+
allCreatedAgentFiles.set(harness, created);
|
|
152
|
+
}
|
|
150
153
|
}
|
|
151
154
|
// ========== CREATED FILES SECTION ==========
|
|
152
155
|
console.log(formatSectionHeader('Created Files'));
|
|
@@ -156,69 +159,25 @@ async function init(options) {
|
|
|
156
159
|
for (const file of commonFiles) {
|
|
157
160
|
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
158
161
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
console.log(chalk_1.default.cyan(` ${assistantLabel} Copilot Prompts:`));
|
|
164
|
-
const files = await collectFiles(resolvePath(baseDir, '.github/prompts'));
|
|
165
|
-
for (const file of files) {
|
|
166
|
-
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
else if (assistant === 'codex') {
|
|
170
|
-
console.log(chalk_1.default.cyan(` ${assistantLabel} Prompts:`));
|
|
171
|
-
const files = await collectFiles(resolvePath(baseDir, '.codex/prompts'));
|
|
172
|
-
for (const file of files) {
|
|
173
|
-
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
const commandsPath = assistant === 'opencode' ? 'command' : 'commands';
|
|
178
|
-
console.log(chalk_1.default.cyan(` ${assistantLabel} Commands:`));
|
|
179
|
-
const cmdFiles = await collectFiles(resolvePath(baseDir, `.${assistant}/${commandsPath}`));
|
|
180
|
-
for (const file of cmdFiles) {
|
|
181
|
-
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
182
|
-
}
|
|
183
|
-
// Show agents separately (currently Claude-only)
|
|
184
|
-
const agentsDir = resolvePath(baseDir, `.${assistant}/agents`);
|
|
185
|
-
const agentFiles = await collectFiles(agentsDir);
|
|
186
|
-
if (agentFiles.length > 0) {
|
|
187
|
-
console.log(chalk_1.default.cyan(` ${assistantLabel} Agents:`));
|
|
188
|
-
for (const file of agentFiles) {
|
|
189
|
-
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
162
|
+
for (const [harness, files] of allCreatedAgentFiles) {
|
|
163
|
+
console.log(chalk_1.default.cyan(` ${harness} Agents:`));
|
|
164
|
+
for (const file of files) {
|
|
165
|
+
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
192
166
|
}
|
|
193
167
|
}
|
|
194
168
|
// ========== FOOTER SECTION ==========
|
|
195
169
|
console.log(`\n${chalk_1.default.green('✓')} AI Task Manager initialized successfully!`);
|
|
196
170
|
console.log(chalk_1.default.gray(DIVIDER));
|
|
171
|
+
// Post-init nudge directing users to install the task skills
|
|
172
|
+
console.log('\nNext: run `npx skills add e0ipso/ai-task-manager` to install the task skills for your harness(es).');
|
|
197
173
|
// Add documentation link
|
|
198
174
|
console.log(`\n 📚 Documentation: ${chalk_1.default.cyan('https://mateuaguilo.com/ai-task-manager')}\n`);
|
|
199
|
-
// Add Codex-specific post-init message
|
|
200
|
-
if (assistants.includes('codex')) {
|
|
201
|
-
console.log(formatSectionHeader('Codex CLI Setup Instructions'));
|
|
202
|
-
console.log(chalk_1.default.yellow(' For Codex CLI users:'));
|
|
203
|
-
console.log(` ${chalk_1.default.blue('●')} Copy or symlink files from .codex/prompts/ to ~/.codex/prompts/`);
|
|
204
|
-
console.log(` ${chalk_1.default.blue('●')} Restart your Codex session to load the new commands`);
|
|
205
|
-
console.log('');
|
|
206
|
-
console.log(chalk_1.default.cyan(' Commands will be available as:'));
|
|
207
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-create-plan`);
|
|
208
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-generate-tasks`);
|
|
209
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-execute-blueprint`);
|
|
210
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-full-workflow`);
|
|
211
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-refine-plan`);
|
|
212
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-execute-task`);
|
|
213
|
-
console.log(` ${chalk_1.default.gray('●')} /prompts:tasks-fix-broken-tests`);
|
|
214
|
-
console.log('');
|
|
215
|
-
}
|
|
216
175
|
// Show suggested workflow help text
|
|
217
176
|
await displayWorkflowHelp();
|
|
218
177
|
return {
|
|
219
178
|
success: true,
|
|
220
179
|
message: 'AI Task Manager initialized successfully!',
|
|
221
|
-
data: {
|
|
180
|
+
data: { harnesses },
|
|
222
181
|
};
|
|
223
182
|
}
|
|
224
183
|
catch (error) {
|
|
@@ -279,16 +238,11 @@ async function copyCommonTemplates(baseDir, force) {
|
|
|
279
238
|
*/
|
|
280
239
|
async function createMetadata(sourceDir, destDir, metadataPath) {
|
|
281
240
|
const files = {};
|
|
282
|
-
// Get all config files (excluding scripts directory)
|
|
283
241
|
async function walkDir(dir, relativeTo) {
|
|
284
242
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
285
243
|
for (const entry of entries) {
|
|
286
244
|
const fullPath = path.join(dir, entry.name);
|
|
287
245
|
const relativePath = path.relative(relativeTo, fullPath);
|
|
288
|
-
// Skip scripts directory
|
|
289
|
-
if (relativePath.startsWith('config/scripts') || relativePath.includes('/scripts/')) {
|
|
290
|
-
continue;
|
|
291
|
-
}
|
|
292
246
|
// Skip README.md (always overwrite on init/re-init)
|
|
293
247
|
if (relativePath === 'README.md') {
|
|
294
248
|
continue;
|
|
@@ -317,6 +271,7 @@ async function createMetadata(sourceDir, destDir, metadataPath) {
|
|
|
317
271
|
// Create metadata object
|
|
318
272
|
const metadata = {
|
|
319
273
|
version: (0, metadata_1.getPackageVersion)(),
|
|
274
|
+
workspaceSchemaVersion: metadata_1.CURRENT_WORKSPACE_SCHEMA_VERSION,
|
|
320
275
|
timestamp: new Date().toISOString(),
|
|
321
276
|
files,
|
|
322
277
|
};
|
|
@@ -336,110 +291,31 @@ async function applyResolutions(sourceDir, destDir, resolutions) {
|
|
|
336
291
|
// If 'keep', do nothing - keep user's file
|
|
337
292
|
}
|
|
338
293
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
const assistantDir = resolvePath(baseDir, `.${assistant}`);
|
|
345
|
-
// Check if source template directory exists
|
|
346
|
-
if (!(await exists(sourceDir))) {
|
|
347
|
-
throw new Error(`Template directory not found: ${sourceDir}`);
|
|
348
|
-
}
|
|
349
|
-
// GitHub uses .github/prompts/ directory with .prompt.md extension
|
|
350
|
-
if (assistant === 'github') {
|
|
351
|
-
// Create .github/prompts directory
|
|
352
|
-
const promptsDir = resolvePath(baseDir, '.github', 'prompts');
|
|
353
|
-
await fs.ensureDir(promptsDir);
|
|
354
|
-
// Copy and process all template files
|
|
355
|
-
const templateFiles = [
|
|
356
|
-
'create-plan.md',
|
|
357
|
-
'create-plan-auto.md',
|
|
358
|
-
'refine-plan.md',
|
|
359
|
-
'refine-plan-auto.md',
|
|
360
|
-
'generate-tasks.md',
|
|
361
|
-
'execute-task.md',
|
|
362
|
-
'execute-blueprint.md',
|
|
363
|
-
'fix-broken-tests.md',
|
|
364
|
-
'full-workflow.md',
|
|
365
|
-
];
|
|
366
|
-
const templateFormat = (0, utils_1.getTemplateFormat)(assistant);
|
|
367
|
-
for (const file of templateFiles) {
|
|
368
|
-
const sourcePath = resolvePath(sourceDir, 'commands', 'tasks', file);
|
|
369
|
-
const commandName = file.replace('.md', '');
|
|
370
|
-
const destFileName = `tasks-${commandName}.prompt.md`;
|
|
371
|
-
const destPath = resolvePath(promptsDir, destFileName);
|
|
372
|
-
// Read and process the template with GitHub-specific conversion
|
|
373
|
-
const processedContent = await (0, utils_1.readAndProcessTemplate)(sourcePath, templateFormat, assistant);
|
|
374
|
-
// Write processed content to destination
|
|
375
|
-
await (0, utils_1.writeProcessedTemplate)(processedContent, destPath);
|
|
376
|
-
}
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
// Codex uses flat directory structure with renamed files
|
|
380
|
-
if (assistant === 'codex') {
|
|
381
|
-
// Create flat directory structure
|
|
382
|
-
const promptsDir = resolvePath(baseDir, '.codex', 'prompts');
|
|
383
|
-
await fs.ensureDir(promptsDir);
|
|
384
|
-
// Copy and rename templates
|
|
385
|
-
const templateFiles = [
|
|
386
|
-
'create-plan.md',
|
|
387
|
-
'create-plan-auto.md',
|
|
388
|
-
'generate-tasks.md',
|
|
389
|
-
'execute-blueprint.md',
|
|
390
|
-
'execute-task.md',
|
|
391
|
-
'fix-broken-tests.md',
|
|
392
|
-
'full-workflow.md',
|
|
393
|
-
'refine-plan.md',
|
|
394
|
-
'refine-plan-auto.md',
|
|
395
|
-
];
|
|
396
|
-
const templateFormat = (0, utils_1.getTemplateFormat)(assistant);
|
|
397
|
-
for (const file of templateFiles) {
|
|
398
|
-
const sourcePath = resolvePath(sourceDir, 'commands', 'tasks', file);
|
|
399
|
-
const destFileName = `tasks-${file}`;
|
|
400
|
-
const destPath = resolvePath(promptsDir, destFileName);
|
|
401
|
-
// Read and process the template
|
|
402
|
-
const processedContent = await (0, utils_1.readAndProcessTemplate)(sourcePath, templateFormat);
|
|
403
|
-
// Write processed content to destination
|
|
404
|
-
await (0, utils_1.writeProcessedTemplate)(processedContent, destPath);
|
|
405
|
-
}
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
// Determine correct commands directory name based on assistant type
|
|
409
|
-
// OpenCode uses 'command' (singular) while Claude and Gemini use 'commands' (plural)
|
|
410
|
-
const commandsPath = assistant === 'opencode' ? 'command' : 'commands';
|
|
411
|
-
// Copy template structure with correct directory naming
|
|
412
|
-
const sourceCommandsDir = resolvePath(sourceDir, 'commands');
|
|
413
|
-
const targetCommandsDir = resolvePath(assistantDir, commandsPath);
|
|
414
|
-
// Copy the commands directory to the correct location
|
|
415
|
-
if (await exists(sourceCommandsDir)) {
|
|
416
|
-
await fs.copy(sourceCommandsDir, targetCommandsDir);
|
|
294
|
+
async function createHarnessStructure(harness, baseDir) {
|
|
295
|
+
const sourceAgentsDir = getTemplatePath(path.join('harness', 'agents'));
|
|
296
|
+
const createdFiles = [];
|
|
297
|
+
if (!(await exists(sourceAgentsDir))) {
|
|
298
|
+
return createdFiles;
|
|
417
299
|
}
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
300
|
+
const agentFiles = (await fs.readdir(sourceAgentsDir)).filter(f => f.endsWith('.md'));
|
|
301
|
+
const formatInfo = (0, utils_1.getAgentFormat)(harness);
|
|
302
|
+
const targetDir = resolvePath(baseDir, formatInfo.directory);
|
|
303
|
+
await fs.ensureDir(targetDir);
|
|
304
|
+
for (const agentFile of agentFiles) {
|
|
305
|
+
const sourcePath = path.join(sourceAgentsDir, agentFile);
|
|
306
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
307
|
+
const baseName = path.basename(agentFile, '.md');
|
|
308
|
+
const targetName = baseName + formatInfo.extension;
|
|
309
|
+
const targetPath = path.join(targetDir, targetName);
|
|
310
|
+
if (formatInfo.format === 'toml') {
|
|
311
|
+
await fs.writeFile(targetPath, (0, utils_1.convertAgentMdToToml)(content), 'utf-8');
|
|
424
312
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const templateFormat = (0, utils_1.getTemplateFormat)(assistant);
|
|
428
|
-
// If target format is different from source (md), process files in place
|
|
429
|
-
if (templateFormat !== 'md') {
|
|
430
|
-
const tasksDir = resolvePath(assistantDir, `${commandsPath}/tasks`);
|
|
431
|
-
const files = await fs.readdir(tasksDir);
|
|
432
|
-
for (const file of files.filter(f => f.endsWith('.md'))) {
|
|
433
|
-
const mdPath = resolvePath(tasksDir, file);
|
|
434
|
-
const newPath = resolvePath(tasksDir, file.replace('.md', `.${templateFormat}`));
|
|
435
|
-
// Read and process the template
|
|
436
|
-
const processedContent = await (0, utils_1.readAndProcessTemplate)(mdPath, templateFormat);
|
|
437
|
-
// Write processed content to new file
|
|
438
|
-
await (0, utils_1.writeProcessedTemplate)(processedContent, newPath);
|
|
439
|
-
// Remove original .md file
|
|
440
|
-
await fs.remove(mdPath);
|
|
313
|
+
else {
|
|
314
|
+
await fs.writeFile(targetPath, content, 'utf-8');
|
|
441
315
|
}
|
|
316
|
+
createdFiles.push(targetPath);
|
|
442
317
|
}
|
|
318
|
+
return createdFiles;
|
|
443
319
|
}
|
|
444
320
|
/**
|
|
445
321
|
* Check if a directory already has AI Task Manager initialized
|
|
@@ -448,92 +324,21 @@ async function isInitialized(baseDir) {
|
|
|
448
324
|
const targetDir = baseDir || '.';
|
|
449
325
|
return await exists(resolvePath(targetDir, '.ai/task-manager'));
|
|
450
326
|
}
|
|
451
|
-
/**
|
|
452
|
-
* Get information about existing initialization
|
|
453
|
-
*/
|
|
454
|
-
async function getInitInfo(baseDir) {
|
|
455
|
-
const targetDir = baseDir || '.';
|
|
456
|
-
const hasAiTaskManager = await exists(resolvePath(targetDir, '.ai/task-manager'));
|
|
457
|
-
const hasClaudeConfig = await exists(resolvePath(targetDir, '.claude/commands/tasks'));
|
|
458
|
-
const hasGeminiConfig = await exists(resolvePath(targetDir, '.gemini/commands/tasks'));
|
|
459
|
-
const hasOpencodeConfig = await exists(resolvePath(targetDir, '.opencode/command/tasks'));
|
|
460
|
-
const hasCodexConfig = await exists(resolvePath(targetDir, '.codex/prompts'));
|
|
461
|
-
const hasCursorConfig = await exists(resolvePath(targetDir, '.cursor/commands/tasks'));
|
|
462
|
-
const hasGithubConfig = await exists(resolvePath(targetDir, '.github/prompts'));
|
|
463
|
-
const assistants = [];
|
|
464
|
-
if (hasClaudeConfig)
|
|
465
|
-
assistants.push('claude');
|
|
466
|
-
if (hasGeminiConfig)
|
|
467
|
-
assistants.push('gemini');
|
|
468
|
-
if (hasOpencodeConfig)
|
|
469
|
-
assistants.push('opencode');
|
|
470
|
-
if (hasCodexConfig)
|
|
471
|
-
assistants.push('codex');
|
|
472
|
-
if (hasCursorConfig)
|
|
473
|
-
assistants.push('cursor');
|
|
474
|
-
if (hasGithubConfig)
|
|
475
|
-
assistants.push('github');
|
|
476
|
-
return {
|
|
477
|
-
hasAiTaskManager,
|
|
478
|
-
hasClaudeConfig,
|
|
479
|
-
hasGeminiConfig,
|
|
480
|
-
hasOpencodeConfig,
|
|
481
|
-
hasCodexConfig,
|
|
482
|
-
hasCursorConfig,
|
|
483
|
-
hasGithubConfig,
|
|
484
|
-
assistants,
|
|
485
|
-
};
|
|
486
|
-
}
|
|
487
327
|
/**
|
|
488
328
|
* Display formatted workflow help text to guide users after successful installation
|
|
489
329
|
*/
|
|
490
330
|
async function displayWorkflowHelp() {
|
|
491
331
|
console.log(formatSectionHeader('Suggested Workflow'));
|
|
492
|
-
|
|
493
|
-
console.log(chalk_1.default.
|
|
494
|
-
console.log(chalk_1.default.gray(' ────────────────────────────────────────────────────────────────────────────────'));
|
|
495
|
-
console.log(` Review and tweak AI Task Manager config prompts to match your project:`);
|
|
496
|
-
console.log(` ${chalk_1.default.blue('●')} ${chalk_1.default.gray('.ai/task-manager/config/')}`);
|
|
497
|
-
console.log('');
|
|
498
|
-
// Automated Workflow
|
|
499
|
-
console.log(chalk_1.default.cyan.bold(' Automated Workflow (Recommended for Simple Tasks)'));
|
|
500
|
-
console.log(chalk_1.default.gray(' ────────────────────────────────────────────────────────────────────────────────'));
|
|
501
|
-
console.log('');
|
|
502
|
-
console.log(` Execute:`);
|
|
503
|
-
console.log(` ${chalk_1.default.gray('/tasks:full-workflow Update product page with...')}`);
|
|
504
|
-
console.log('');
|
|
505
|
-
console.log(` This automatically:`);
|
|
506
|
-
console.log(` ${chalk_1.default.green('✓')} Creates the plan (with clarification prompts)`);
|
|
507
|
-
console.log(` ${chalk_1.default.green('✓')} Generates tasks`);
|
|
508
|
-
console.log(` ${chalk_1.default.green('✓')} Executes the blueprint`);
|
|
509
|
-
console.log(` ${chalk_1.default.green('✓')} Archives the completed plan`);
|
|
510
|
-
console.log('');
|
|
511
|
-
console.log(` ${chalk_1.default.blue('●')} Best for: Straightforward implementations`);
|
|
512
|
-
console.log('');
|
|
513
|
-
// Manual Workflow
|
|
514
|
-
console.log(chalk_1.default.cyan.bold(' Manual Workflow (Recommended for Complex Tasks)'));
|
|
515
|
-
console.log(chalk_1.default.gray(' ────────────────────────────────────────────────────────────────────────────────'));
|
|
516
|
-
console.log('');
|
|
517
|
-
console.log(` ${chalk_1.default.blue('1.')} Create a plan:`);
|
|
518
|
-
console.log(` ${chalk_1.default.gray('/tasks:create-plan Create an authentication...')}`);
|
|
519
|
-
console.log('');
|
|
520
|
-
console.log(` ${chalk_1.default.blue('2.')} Provide additional context if the assistant needs it`);
|
|
521
|
-
console.log('');
|
|
522
|
-
console.log(` ${chalk_1.default.blue('3.')} ${chalk_1.default.yellow.bold('MANUALLY REVIEW THE PLAN')} ${chalk_1.default.yellow("(don't skip this!)")}`);
|
|
523
|
-
console.log(` ${chalk_1.default.gray('Find it in: .ai/task-manager/plans/01--*/plan-[0-9]*--*.md')}`);
|
|
524
|
-
console.log('');
|
|
525
|
-
console.log(` ${chalk_1.default.blue('4.')} Create the tasks for the plan:`);
|
|
526
|
-
console.log(` ${chalk_1.default.gray('/tasks:generate-tasks 1')}`);
|
|
527
|
-
console.log('');
|
|
528
|
-
console.log(` ${chalk_1.default.blue('5.')} ${chalk_1.default.yellow.bold('REVIEW THE TASKS LIST')} ${chalk_1.default.yellow('(avoid scope creep!)')}`);
|
|
529
|
-
console.log(` ${chalk_1.default.gray('Find them in: .ai/task-manager/plans/01--*/tasks/')}`);
|
|
332
|
+
console.log(` ${chalk_1.default.cyan('●')} Install the task skills:`);
|
|
333
|
+
console.log(` ${chalk_1.default.gray('npx skills add e0ipso/ai-task-manager')}`);
|
|
530
334
|
console.log('');
|
|
531
|
-
console.log(` ${chalk_1.default.
|
|
532
|
-
console.log(`
|
|
335
|
+
console.log(` ${chalk_1.default.cyan('●')} Ask your AI to plan, decompose, then execute.`);
|
|
336
|
+
console.log(` The skills cover plan creation, refinement, task generation, and blueprint execution.`);
|
|
533
337
|
console.log('');
|
|
534
|
-
console.log(` ${chalk_1.default.
|
|
338
|
+
console.log(` ${chalk_1.default.cyan('●')} Review intermediate artifacts between steps:`);
|
|
339
|
+
console.log(` ${chalk_1.default.gray('.ai/task-manager/plans/')}`);
|
|
535
340
|
console.log('');
|
|
536
|
-
console.log(chalk_1.default.yellow(`💡
|
|
341
|
+
console.log(chalk_1.default.yellow(`💡 Reviewing the plan and the task list before execution is recommended.`));
|
|
537
342
|
console.log('');
|
|
538
343
|
}
|
|
539
344
|
//# sourceMappingURL=index.js.map
|