@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.
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +4 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js +8 -8
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +21 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- /package/web/.next/static/{_6QZh55r5rZlPal4MMGV8 → w8bsNzpMxMlLoIYnVl65t}/_buildManifest.js +0 -0
- /package/web/.next/static/{_6QZh55r5rZlPal4MMGV8 → w8bsNzpMxMlLoIYnVl65t}/_clientMiddlewareManifest.json +0 -0
- /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,
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
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;
|
|
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
|
-
|
|
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 };
|