@shepai/cli 1.35.1 → 1.35.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +4 -0
  3. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js +8 -8
  5. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +21 -1
  7. package/dist/tsconfig.build.tsbuildinfo +1 -1
  8. package/package.json +1 -1
  9. package/web/.next/BUILD_ID +1 -1
  10. package/web/.next/build-manifest.json +2 -2
  11. package/web/.next/cache/.previewinfo +1 -1
  12. package/web/.next/cache/.rscinfo +1 -1
  13. package/web/.next/cache/config.json +3 -3
  14. package/web/.next/fallback-build-manifest.json +2 -2
  15. package/web/.next/prerender-manifest.json +3 -3
  16. package/web/.next/required-server-files.js +1 -1
  17. package/web/.next/required-server-files.json +1 -1
  18. package/web/.next/server/app/_global-error.html +2 -2
  19. package/web/.next/server/app/_global-error.rsc +1 -1
  20. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  21. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  23. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  24. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  25. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  26. package/web/.next/server/pages/500.html +2 -2
  27. package/web/.next/server/server-reference-manifest.js +1 -1
  28. package/web/.next/server/server-reference-manifest.json +1 -1
  29. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  30. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  31. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  32. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  33. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  34. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  35. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  36. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  41. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  42. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  43. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +1 -1
  44. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  45. package/web/.next/trace +1 -1
  46. package/web/.next/trace-build +1 -1
  47. /package/web/.next/static/{_6QZh55r5rZlPal4MMGV8 → w8bsNzpMxMlLoIYnVl65t}/_buildManifest.js +0 -0
  48. /package/web/.next/static/{_6QZh55r5rZlPal4MMGV8 → w8bsNzpMxMlLoIYnVl65t}/_clientMiddlewareManifest.json +0 -0
  49. /package/web/.next/static/{_6QZh55r5rZlPal4MMGV8 → w8bsNzpMxMlLoIYnVl65t}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAqK7E"}
1
+ {"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CA2K7E"}
@@ -52,6 +52,8 @@ export function createImplementNode(executor) {
52
52
  reportNodeStart('implement');
53
53
  const startTime = Date.now();
54
54
  const messages = [];
55
+ // Record top-level implement phase timing (sub-phases are recorded individually below)
56
+ const implementTimingId = await recordPhaseStart('implement');
55
57
  try {
56
58
  // --- Parse plan & tasks ---
57
59
  const planContent = readSpecFile(state.specDir, 'plan.yaml');
@@ -137,6 +139,8 @@ export function createImplementNode(executor) {
137
139
  log.info(`All phases complete — ${completedTasks}/${totalTasks} tasks (${elapsed}s)`);
138
140
  updateFeatureProgress(state.specDir, totalTasks, totalTasks, 'implementation-complete', null, log);
139
141
  messages.push(`[implement] Complete: ${totalTasks} tasks across ${totalPhases} phases (${elapsed}s)`);
142
+ // Record top-level implement phase completion
143
+ await recordPhaseEnd(implementTimingId, Date.now() - startTime);
140
144
  if (shouldInterrupt('implement', state.approvalGates)) {
141
145
  log.info('Interrupting for human approval');
142
146
  interrupt({
@@ -1 +1 @@
1
- {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AACrG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAKlH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,aAAa,CAAC;IAC5B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAChF,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAiJ7E"}
1
+ {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AACrG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAMlH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,aAAa,CAAC;IAC5B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAChF,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAiJ7E"}
@@ -13,6 +13,7 @@ import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
13
13
  import { SdlcLifecycle, PrStatus } from '../../../../../domain/generated/output.js';
14
14
  import { createNodeLogger, shouldInterrupt } from './node-helpers.js';
15
15
  import { reportNodeStart } from '../heartbeat.js';
16
+ import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
16
17
  /**
17
18
  * Factory that creates the merge node function.
18
19
  *
@@ -26,6 +27,8 @@ export function createMergeNode(deps) {
26
27
  reportNodeStart('merge');
27
28
  const messages = [];
28
29
  const startTime = Date.now();
30
+ // Record merge phase timing
31
+ const mergeTimingId = await recordPhaseStart('merge');
29
32
  try {
30
33
  const { gitPrService } = deps;
31
34
  const cwd = state.worktreePath;
@@ -63,20 +66,16 @@ export function createMergeNode(deps) {
63
66
  // --- Step 3: Create PR (if openPr=true and not already created) ---
64
67
  let prUrl = state.prUrl;
65
68
  let prNumber = state.prNumber;
66
- let ciStatus = state.ciStatus;
69
+ const ciStatus = state.ciStatus;
67
70
  if (state.openPr && !state.prUrl) {
68
71
  log.info('Creating pull request...');
69
72
  const prResult = await gitPrService.createPr(cwd, prYamlPath);
70
73
  prUrl = prResult.url;
71
74
  prNumber = prResult.number;
72
75
  messages.push(`[merge] PR created: ${prUrl}`);
73
- // Watch CI if we're going to auto-merge
74
- if (state.approvalGates?.allowMerge) {
75
- log.info('Watching CI...');
76
- const ciResult = await gitPrService.watchCi(cwd, branch);
77
- ciStatus = ciResult.status;
78
- messages.push(`[merge] CI status: ${ciStatus}`);
79
- }
76
+ // CI watching disabled let the user check CI status externally
77
+ log.info('Skipping CI watch (disabled)');
78
+ messages.push('[merge] CI watch skipped');
80
79
  }
81
80
  // --- Step 4: Merge approval gate ---
82
81
  if (shouldInterrupt('merge', state.approvalGates)) {
@@ -128,6 +127,7 @@ export function createMergeNode(deps) {
128
127
  messages.push(`[merge] Feature lifecycle → ${newLifecycle}`);
129
128
  }
130
129
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
130
+ await recordPhaseEnd(mergeTimingId, Date.now() - startTime);
131
131
  messages.push(`[merge] Complete (${elapsed}s)`);
132
132
  log.info(`Merge flow complete (${elapsed}s)`);
133
133
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,wEAAwE,CAAC;AAKhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAelE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuBjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAe7E,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,wEAAwE,CAAC;AAOhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkBjE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuBjF,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAe7E,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
@@ -18,6 +18,8 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
18
  };
19
19
  import { injectable, inject } from 'tsyringe';
20
20
  import { GitPrError, GitPrErrorCode, } from '../../../application/ports/output/services/git-pr-service.interface.js';
21
+ import { readFileSync } from 'node:fs';
22
+ import yaml from 'js-yaml';
21
23
  let GitPrService = class GitPrService {
22
24
  execFile;
23
25
  constructor(execFile) {
@@ -52,7 +54,25 @@ let GitPrService = class GitPrService {
52
54
  }
53
55
  async createPr(cwd, prYamlPath) {
54
56
  try {
55
- const { stdout } = await this.execFile('gh', ['pr', 'create', '--title', prYamlPath, '--body-file', prYamlPath], { cwd });
57
+ // Parse pr.yaml to extract PR metadata
58
+ const prYamlContent = readFileSync(prYamlPath, 'utf-8');
59
+ const prData = yaml.load(prYamlContent);
60
+ const title = prData.title ?? 'Untitled PR';
61
+ const body = prData.body ?? '';
62
+ const args = ['pr', 'create', '--title', title, '--body', body];
63
+ if (prData.baseBranch) {
64
+ args.push('--base', prData.baseBranch);
65
+ }
66
+ if (prData.headBranch) {
67
+ args.push('--head', prData.headBranch);
68
+ }
69
+ if (prData.labels?.length) {
70
+ args.push('--label', prData.labels.join(','));
71
+ }
72
+ if (prData.draft) {
73
+ args.push('--draft');
74
+ }
75
+ const { stdout } = await this.execFile('gh', args, { cwd });
56
76
  const url = stdout.trim();
57
77
  const number = this.parsePrNumberFromUrl(url);
58
78
  return { url, number };