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(sprintDir, 'tasks'), label: `docs/sprint-${sprintNum}/tasks/` },
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(sprintDir, 'tasks');
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/tasks"
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
- content = content.replace(
2254
- /Current Sprint\nSprint \d+ \(not started\)/,
2255
- `Current Sprint\nSprint ${completedSprint + 1}`
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;AAC7C,CAAC;AAED,iFAAiF;AAEjF;;GAEG;AACH,SAAgB,WAAW,CACzB,MAAuB,EACvB,aAAqB,EACrB,GAAW,EACX,eAAwB;IAExB,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAC3E,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,YAAY;IACZ,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAClC,MAAM,CAAC,MAAM,EACb,OAAO,CACR,CAAC;IAEF,YAAY;IACZ,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAClC,MAAM,CAAC,MAAM,EACb,OAAO,CACR,CAAC;IAEF,cAAc;IACd,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EACtC,OAAO,CACR,CAAC;IAEF,0BAA0B;IAC1B,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EACrC,iBAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EACxB,OAAO,CACR,CAAC;IAEF,qBAAqB;IACrB,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAC5C,OAAO,CACR,CAAC;IAEF,sBAAsB;IACtB,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,EAC5C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7C,OAAO,CACR,CAAC;IAEF,0CAA0C;IAC1C,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAChC,UAAU,EACR,QAAQ,IAAI,aAAa;YACvB,CAAC,CAAE,aAAuC,CAAC,MAAM,CAAC,MAAM;YACxD,CAAC,CAAC,CAAC;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,OAAO,CACR,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,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",
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 ───────────────────────────────────────────────────────────