imhcode 1.0.3 → 1.0.5
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/bin/imhcode.js
CHANGED
|
@@ -296,6 +296,7 @@ async function runExecuteCommand(restArgs) {
|
|
|
296
296
|
|
|
297
297
|
console.log(`─`.repeat(60));
|
|
298
298
|
try {
|
|
299
|
+
await markSprintStarted(cwd, sprintNum);
|
|
299
300
|
execSync(`sh "${masterScript}"`, { stdio: 'inherit', cwd });
|
|
300
301
|
console.log(`─`.repeat(60));
|
|
301
302
|
console.log(`\n🏁 Sprint ${sprintNum} execution complete!\n`);
|
|
@@ -704,6 +705,11 @@ async function cmdRun(orc, args) {
|
|
|
704
705
|
const outputIdx = restArgs.indexOf('--output');
|
|
705
706
|
const outputDir = outputIdx >= 0 ? restArgs[outputIdx + 1] : undefined;
|
|
706
707
|
|
|
708
|
+
const sprintIdx = restArgs.indexOf('--sprint');
|
|
709
|
+
const sprintVal = sprintIdx >= 0 ? parseInt(restArgs[sprintIdx + 1], 10) : undefined;
|
|
710
|
+
const taskIdx = restArgs.indexOf('--task');
|
|
711
|
+
const taskVal = taskIdx >= 0 ? parseInt(restArgs[taskIdx + 1], 10) : undefined;
|
|
712
|
+
|
|
707
713
|
const agentsDir = resolveAgentsDir();
|
|
708
714
|
const cwd = process.cwd();
|
|
709
715
|
const config = loadLocalConfig(cwd);
|
|
@@ -736,6 +742,10 @@ async function cmdRun(orc, args) {
|
|
|
736
742
|
|
|
737
743
|
const agent = orc.getAgent(agents, agentId);
|
|
738
744
|
|
|
745
|
+
if (live && sprintVal !== undefined) {
|
|
746
|
+
await markSprintStarted(cwd, sprintVal);
|
|
747
|
+
}
|
|
748
|
+
|
|
739
749
|
// Pass the routed engine + model to runAgent (Fix 0b Part A)
|
|
740
750
|
const result = await orc.runAgent(
|
|
741
751
|
agent, task,
|
|
@@ -743,6 +753,12 @@ async function cmdRun(orc, args) {
|
|
|
743
753
|
criteria
|
|
744
754
|
);
|
|
745
755
|
|
|
756
|
+
if (!result.dryRun && result.errors.length === 0) {
|
|
757
|
+
if (sprintVal !== undefined && taskVal !== undefined) {
|
|
758
|
+
await markTaskCompleted(cwd, sprintVal, taskVal);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
746
762
|
console.log('\n' + '─'.repeat(72));
|
|
747
763
|
if (result.errors.length > 0 && !result.dryRun) {
|
|
748
764
|
console.error(`\n❌ [IMH-Code] Execution failed with errors:`);
|
|
@@ -797,7 +813,7 @@ async function cmdSprintDesign(restArgs) {
|
|
|
797
813
|
{ file: path.join(cwd, BRIEF_MD), label: 'PROJECT_BRIEF.md' },
|
|
798
814
|
{ file: path.join(sprintDir, 'plan.md'), label: `docs/sprint-${sprintNum}/plan.md` },
|
|
799
815
|
{ file: path.join(sprintDir, 'progress.md'), label: `docs/sprint-${sprintNum}/progress.md` },
|
|
800
|
-
{ file: path.join(
|
|
816
|
+
{ file: path.join(cwd, LOCAL_DIR_NAME, 'commands', `sprint-${sprintNum}`), label: `.imhcode/commands/sprint-${sprintNum}/` },
|
|
801
817
|
{ file: path.join(sprintDir, 'run_all_tasks.sh'), label: `docs/sprint-${sprintNum}/run_all_tasks.sh` },
|
|
802
818
|
];
|
|
803
819
|
|
|
@@ -1955,7 +1971,7 @@ async function generateStaticSprintPlans(cwd, scope, config) {
|
|
|
1955
1971
|
|
|
1956
1972
|
async function generateSprint(cwd, sprintNum, title, tasks, testingMode, config) {
|
|
1957
1973
|
const sprintDir = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`);
|
|
1958
|
-
const tasksDir = path.join(
|
|
1974
|
+
const tasksDir = path.join(cwd, LOCAL_DIR_NAME, 'commands', `sprint-${sprintNum}`);
|
|
1959
1975
|
fs.mkdirSync(tasksDir, { recursive: true });
|
|
1960
1976
|
|
|
1961
1977
|
const tddNote = testingMode === 'strict' ? '**Testing Mode: Strict TDD** — Write failing tests first, then implement.' :
|
|
@@ -2022,6 +2038,15 @@ ${tasks.map((t, i) => `- [ ] Task ${i+1}: ${t.task} [\`${t.agent}\`]`).join('\n'
|
|
|
2022
2038
|
CWD="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
2023
2039
|
cd "$CWD/../../.."
|
|
2024
2040
|
|
|
2041
|
+
# Check if task is already completed
|
|
2042
|
+
PROGRESS_FILE="$CWD/../../../docs/sprint-${sprintNum}/progress.md"
|
|
2043
|
+
if [ -f "$PROGRESS_FILE" ]; then
|
|
2044
|
+
if grep -q -e "- \\[[xX]\\] Task ${taskNum}:" "$PROGRESS_FILE"; then
|
|
2045
|
+
echo "✅ Task ${taskNum} is already completed. Skipping."
|
|
2046
|
+
exit 0
|
|
2047
|
+
fi
|
|
2048
|
+
fi
|
|
2049
|
+
|
|
2025
2050
|
TASK="${taskDesc.replace(/"/g, '\\"')}"
|
|
2026
2051
|
|
|
2027
2052
|
echo "📋 Running Task ${taskNum}: ${t.task}"
|
|
@@ -2030,9 +2055,9 @@ echo " Model: ${routedModel || 'default'} via ${routedEngine || 'default'}"
|
|
|
2030
2055
|
echo " Tier: ${t.tier}"
|
|
2031
2056
|
|
|
2032
2057
|
if command -v imhcode >/dev/null 2>&1; then
|
|
2033
|
-
imhcode agent run ${t.agent} "$TASK" --live ${engineFlag} ${modelFlag}
|
|
2058
|
+
imhcode agent run ${t.agent} "$TASK" --live ${engineFlag} ${modelFlag} --sprint ${sprintNum} --task ${taskNum}
|
|
2034
2059
|
else
|
|
2035
|
-
node "$(npm root -g)/imhcode/bin/imhcode.js" agent run ${t.agent} "$TASK" --live ${engineFlag} ${modelFlag}
|
|
2060
|
+
node "$(npm root -g)/imhcode/bin/imhcode.js" agent run ${t.agent} "$TASK" --live ${engineFlag} ${modelFlag} --sprint ${sprintNum} --task ${taskNum}
|
|
2036
2061
|
fi
|
|
2037
2062
|
`;
|
|
2038
2063
|
fs.writeFileSync(path.join(tasksDir, `task_${taskNum}.sh`), taskScript, { mode: 0o755 });
|
|
@@ -2044,7 +2069,7 @@ fi
|
|
|
2044
2069
|
# Run all tasks in dependency order with correct AI model routing
|
|
2045
2070
|
set -e
|
|
2046
2071
|
CWD="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
2047
|
-
TASKS_DIR="$CWD/
|
|
2072
|
+
TASKS_DIR="$CWD/../../.imhcode/commands/sprint-${sprintNum}"
|
|
2048
2073
|
|
|
2049
2074
|
echo ""
|
|
2050
2075
|
echo "🕌 IMH-Code — Executing Sprint ${sprintNum}: ${title}"
|
|
@@ -2250,14 +2275,182 @@ async function updateCompactContext(cwd, completedSprint) {
|
|
|
2250
2275
|
if (!fs.existsSync(contextPath)) return;
|
|
2251
2276
|
try {
|
|
2252
2277
|
let content = fs.readFileSync(contextPath, 'utf8');
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2278
|
+
const pattern = /(## Current Sprint\r?\nSprint )\d+\s*(\([^)]*\))?/i;
|
|
2279
|
+
if (pattern.test(content)) {
|
|
2280
|
+
content = content.replace(pattern, `$1${completedSprint + 1} (not started)`);
|
|
2281
|
+
} else {
|
|
2282
|
+
content = content.replace(
|
|
2283
|
+
/Current Sprint\r?\nSprint \d+ \(not started\)/,
|
|
2284
|
+
`Current Sprint\nSprint ${completedSprint + 1} (not started)`
|
|
2285
|
+
);
|
|
2286
|
+
}
|
|
2257
2287
|
fs.writeFileSync(contextPath, content, 'utf8');
|
|
2288
|
+
|
|
2289
|
+
// Update PROJECT_BRIEF.md Current Sprint
|
|
2290
|
+
const briefPath = path.join(cwd, BRIEF_MD);
|
|
2291
|
+
if (fs.existsSync(briefPath)) {
|
|
2292
|
+
try {
|
|
2293
|
+
let briefContent = fs.readFileSync(briefPath, 'utf8');
|
|
2294
|
+
const currentSprintPattern = /(Current Sprint:\s*Sprint\s*)\d+/i;
|
|
2295
|
+
if (currentSprintPattern.test(briefContent)) {
|
|
2296
|
+
briefContent = briefContent.replace(currentSprintPattern, `$1${completedSprint + 1}`);
|
|
2297
|
+
fs.writeFileSync(briefPath, briefContent, 'utf8');
|
|
2298
|
+
}
|
|
2299
|
+
} catch {}
|
|
2300
|
+
}
|
|
2258
2301
|
} catch { /* non-critical */ }
|
|
2259
2302
|
}
|
|
2260
2303
|
|
|
2304
|
+
async function markSprintStarted(cwd, sprintNum) {
|
|
2305
|
+
const progressPath = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`, 'progress.md');
|
|
2306
|
+
const briefPath = path.join(cwd, BRIEF_MD);
|
|
2307
|
+
|
|
2308
|
+
// 1. Update progress.md
|
|
2309
|
+
if (fs.existsSync(progressPath)) {
|
|
2310
|
+
try {
|
|
2311
|
+
let progressContent = fs.readFileSync(progressPath, 'utf8');
|
|
2312
|
+
if (progressContent.includes('Status: 🟡 Not Started')) {
|
|
2313
|
+
progressContent = progressContent.replace('Status: 🟡 Not Started', 'Status: 🟢 In Progress');
|
|
2314
|
+
const dateStr = new Date().toLocaleString();
|
|
2315
|
+
progressContent = progressContent.replace('Start: —', `Start: ${dateStr}`);
|
|
2316
|
+
fs.writeFileSync(progressPath, progressContent, 'utf8');
|
|
2317
|
+
console.log(` 🔄 Updated sprint progress to: 🟢 In Progress`);
|
|
2318
|
+
}
|
|
2319
|
+
} catch (err) {
|
|
2320
|
+
console.warn(` ⚠️ Could not update sprint progress.md: ${err.message}`);
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2324
|
+
// 2. Update PROJECT_BRIEF.md status
|
|
2325
|
+
if (fs.existsSync(briefPath)) {
|
|
2326
|
+
try {
|
|
2327
|
+
let briefContent = fs.readFileSync(briefPath, 'utf8');
|
|
2328
|
+
const rowPattern = new RegExp(`^\\|\\s*${sprintNum}\\s*\\|([^|]+)\\|([^|]+)\\|`, 'm');
|
|
2329
|
+
const match = briefContent.match(rowPattern);
|
|
2330
|
+
if (match) {
|
|
2331
|
+
const currentStatus = match[2].trim();
|
|
2332
|
+
if (currentStatus.includes('Not Started') || currentStatus.includes('Pending')) {
|
|
2333
|
+
briefContent = updateSprintLogTable(briefContent, sprintNum, '🟢 In Progress');
|
|
2334
|
+
|
|
2335
|
+
// Also check if Current Sprint needs updating
|
|
2336
|
+
const currentSprintPattern = /(Current Sprint:\s*Sprint\s*)\d+/i;
|
|
2337
|
+
if (currentSprintPattern.test(briefContent)) {
|
|
2338
|
+
briefContent = briefContent.replace(currentSprintPattern, `$1${sprintNum}`);
|
|
2339
|
+
}
|
|
2340
|
+
|
|
2341
|
+
fs.writeFileSync(briefPath, briefContent, 'utf8');
|
|
2342
|
+
console.log(` 🔄 Updated PROJECT_BRIEF.md sprint ${sprintNum} status to: 🟢 In Progress`);
|
|
2343
|
+
}
|
|
2344
|
+
}
|
|
2345
|
+
} catch (err) {
|
|
2346
|
+
console.warn(` ⚠️ Could not update PROJECT_BRIEF.md: ${err.message}`);
|
|
2347
|
+
}
|
|
2348
|
+
}
|
|
2349
|
+
|
|
2350
|
+
// 3. Update context.md status
|
|
2351
|
+
await updateContextSprintStatus(cwd, sprintNum, 'in progress');
|
|
2352
|
+
}
|
|
2353
|
+
|
|
2354
|
+
async function markTaskCompleted(cwd, sprintNum, taskNum) {
|
|
2355
|
+
const progressPath = path.join(cwd, DOCS_DIR, `sprint-${sprintNum}`, 'progress.md');
|
|
2356
|
+
const briefPath = path.join(cwd, BRIEF_MD);
|
|
2357
|
+
|
|
2358
|
+
if (!fs.existsSync(progressPath)) return;
|
|
2359
|
+
|
|
2360
|
+
try {
|
|
2361
|
+
let progressContent = fs.readFileSync(progressPath, 'utf8');
|
|
2362
|
+
const lines = progressContent.split('\n');
|
|
2363
|
+
let taskLineIndex = -1;
|
|
2364
|
+
for (let i = 0; i < lines.length; i++) {
|
|
2365
|
+
const taskPattern = new RegExp(`^-\\s*\\[\\s*\\]\\s*Task\\s*${taskNum}\\b`, 'i');
|
|
2366
|
+
if (taskPattern.test(lines[i])) {
|
|
2367
|
+
taskLineIndex = i;
|
|
2368
|
+
lines[i] = lines[i].replace(/-\s*\[\s*\]/, '- [x]');
|
|
2369
|
+
break;
|
|
2370
|
+
}
|
|
2371
|
+
}
|
|
2372
|
+
|
|
2373
|
+
if (taskLineIndex === -1) {
|
|
2374
|
+
console.warn(` ⚠️ Could not find Task ${taskNum} checkbox in progress.md`);
|
|
2375
|
+
return;
|
|
2376
|
+
}
|
|
2377
|
+
|
|
2378
|
+
progressContent = lines.join('\n');
|
|
2379
|
+
console.log(` ✅ Marked Task ${taskNum} as completed in progress.md`);
|
|
2380
|
+
|
|
2381
|
+
const incompleteTasksCount = (progressContent.match(/^-\s*\[\s*\]\s*Task\b/gim) || []).length;
|
|
2382
|
+
|
|
2383
|
+
if (incompleteTasksCount === 0) {
|
|
2384
|
+
progressContent = progressContent.replace(/Status:\s*🟢\s*In\s*Progress/i, 'Status: ✅ Complete');
|
|
2385
|
+
progressContent = progressContent.replace(/Status:\s*🟡\s*Not\s*Started/i, 'Status: ✅ Complete');
|
|
2386
|
+
|
|
2387
|
+
const dateStr = new Date().toLocaleString();
|
|
2388
|
+
progressContent = progressContent.replace('End: —', `End: ${dateStr}`);
|
|
2389
|
+
|
|
2390
|
+
console.log(` 🏁 All tasks in Sprint ${sprintNum} completed! Sprint is now ✅ Complete.`);
|
|
2391
|
+
|
|
2392
|
+
if (fs.existsSync(briefPath)) {
|
|
2393
|
+
try {
|
|
2394
|
+
let briefContent = fs.readFileSync(briefPath, 'utf8');
|
|
2395
|
+
briefContent = updateSprintLogTable(briefContent, sprintNum, '✅ Complete');
|
|
2396
|
+
fs.writeFileSync(briefPath, briefContent, 'utf8');
|
|
2397
|
+
console.log(` 🔄 Updated PROJECT_BRIEF.md sprint ${sprintNum} status to: ✅ Complete`);
|
|
2398
|
+
} catch (err) {
|
|
2399
|
+
console.warn(` ⚠️ Could not update PROJECT_BRIEF.md: ${err.message}`);
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
}
|
|
2403
|
+
|
|
2404
|
+
fs.writeFileSync(progressPath, progressContent, 'utf8');
|
|
2405
|
+
} catch (err) {
|
|
2406
|
+
console.warn(` ⚠️ Could not update task progress: ${err.message}`);
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2409
|
+
|
|
2410
|
+
function updateSprintLogTable(content, sprintNum, newStatus) {
|
|
2411
|
+
const lines = content.split('\n');
|
|
2412
|
+
let inSprintLog = false;
|
|
2413
|
+
for (let i = 0; i < lines.length; i++) {
|
|
2414
|
+
const line = lines[i];
|
|
2415
|
+
if (line.startsWith('## Sprint Log')) {
|
|
2416
|
+
inSprintLog = true;
|
|
2417
|
+
continue;
|
|
2418
|
+
}
|
|
2419
|
+
if (inSprintLog && line.startsWith('#')) {
|
|
2420
|
+
inSprintLog = false;
|
|
2421
|
+
}
|
|
2422
|
+
if (inSprintLog) {
|
|
2423
|
+
const match = line.match(new RegExp(`^\\|\\s*${sprintNum}\\s*\\|([^|]+)\\|([^|]+)\\|`));
|
|
2424
|
+
if (match) {
|
|
2425
|
+
const title = match[1].trim();
|
|
2426
|
+
lines[i] = `| ${sprintNum} | ${title} | ${newStatus} |`;
|
|
2427
|
+
break;
|
|
2428
|
+
}
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
return lines.join('\n');
|
|
2432
|
+
}
|
|
2433
|
+
|
|
2434
|
+
async function updateContextSprintStatus(cwd, sprintNum, status) {
|
|
2435
|
+
const contextPath = path.join(cwd, CONTEXT_MD);
|
|
2436
|
+
if (!fs.existsSync(contextPath)) return;
|
|
2437
|
+
try {
|
|
2438
|
+
let content = fs.readFileSync(contextPath, 'utf8');
|
|
2439
|
+
const pattern = /(## Current Sprint\r?\nSprint \d+)\s*\([^)]*\)/i;
|
|
2440
|
+
if (pattern.test(content)) {
|
|
2441
|
+
content = content.replace(pattern, `$1 (${status})`);
|
|
2442
|
+
} else {
|
|
2443
|
+
const simplePattern = /(## Current Sprint\r?\nSprint \d+)/i;
|
|
2444
|
+
if (simplePattern.test(content)) {
|
|
2445
|
+
content = content.replace(simplePattern, `$1 (${status})`);
|
|
2446
|
+
}
|
|
2447
|
+
}
|
|
2448
|
+
fs.writeFileSync(contextPath, content, 'utf8');
|
|
2449
|
+
} catch (err) {
|
|
2450
|
+
// non-critical
|
|
2451
|
+
}
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2261
2454
|
// ─── Utilities ────────────────────────────────────────────────────────────────
|
|
2262
2455
|
|
|
2263
2456
|
function askQuestion(query) {
|
|
@@ -40,7 +40,7 @@ function resolveSessionDir(agentId, cwd, customOutputDir) {
|
|
|
40
40
|
if (customOutputDir) {
|
|
41
41
|
return path_1.default.resolve(customOutputDir, dirName);
|
|
42
42
|
}
|
|
43
|
-
return path_1.default.join(cwd, "sessions", dirName);
|
|
43
|
+
return path_1.default.join(cwd, ".imhcode", "sessions", dirName);
|
|
44
44
|
}
|
|
45
45
|
// ─── Session Writer ───────────────────────────────────────────────────────────
|
|
46
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/orchestrator/session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;AAqBH,8CAaC;AAOD,kCAyEC;AAhHD,4CAAoB;AACpB,gDAAwB;AACxB,sDAA2B;AAG3B,iFAAiF;AAEjF,SAAS,eAAe;IACtB,OAAO,IAAI,IAAI,EAAE;SACd,WAAW,EAAE;SACb,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;SACjB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,6BAA6B;AAChD,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAC/B,OAAe,EACf,GAAW,EACX,eAAwB;IAExB,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;IAE1C,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,cAAI,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/orchestrator/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "imhcode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "IMH-Code — Imam Hussain Coding Harness Platform. A fast-first multi-agent AI coding framework with intelligent model routing. 19 generic role-based agents (planner, nextjs-executor, laravel-executor, etc.), configurable testing strategy, and 7 token-saving optimizations for rapid MVP development.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -44,7 +44,7 @@ export function resolveSessionDir(
|
|
|
44
44
|
return path.resolve(customOutputDir, dirName);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
return path.join(cwd, "sessions", dirName);
|
|
47
|
+
return path.join(cwd, ".imhcode", "sessions", dirName);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
// ─── Session Writer ───────────────────────────────────────────────────────────
|