@shepai/cli 1.122.2-pr360.dfb75fe → 1.122.2-pr381.078d7df
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/common/agent-executor-factory.service.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts +28 -8
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +211 -29
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +9 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +82 -54
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +3 -10
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +4 -9
- package/dist/src/presentation/cli/commands/install.command.js +1 -8
- package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +0 -2
- package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/check-agent-auth.js +1 -8
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +1 -1
- package/dist/src/presentation/web/components/features/tools/tool-card.stories.js +1 -1
- package/dist/src/presentation/web/components/features/tools/tools-page-client.stories.js +1 -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/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/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +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/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +1 -1
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1c4cecde._.js → _17418e9d._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1c4cecde._.js.map → _17418e9d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_004b791b._.js → _4f330b28._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_004b791b._.js.map → _4f330b28._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0ee2702f._.js → _e87cf55c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0ee2702f._.js.map → _e87cf55c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +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 +34 -34
- package/web/.next/static/chunks/{0dd2d4fcafd8772b.js → 3f8b6dfefdcdb086.js} +1 -1
- package/web/.next/static/chunks/{1e6bfbd7936bba25.js → 66f3b3e9ffbdd2e0.js} +1 -1
- package/web/.next/static/chunks/{eb165ab35b356164.js → 6e519f34ef50afc7.js} +1 -1
- package/web/.next/static/chunks/{1b5419c02d253fae.js → 7189532beb0a69ea.js} +1 -1
- package/web/.next/static/chunks/{8e816c7f48f7653d.js → 8ace7cc9cdcc4faa.js} +2 -2
- package/web/.next/static/chunks/{6c4aa963056c0bc2.js → d193bfaaff210e81.js} +1 -1
- package/web/.next/static/chunks/{d05a044cbbedbd56.js → d6b6d7807302979b.js} +1 -1
- package/web/.next/static/chunks/{37634985311cc4c6.js → e359a6c4b3a3b222.js} +2 -2
- package/web/.next/static/chunks/{349c47b3b993ae54.js → eef9532b80f3408a.js} +1 -1
- package/web/.next/static/chunks/{9eb4f613f1e35899.js → f2e7c03fc48a915d.js} +1 -1
- /package/web/.next/static/{CMhbAJyvRj6ct2bZgc0Yp → 6DN4JYeWRmWsCZEUT6dAY}/_buildManifest.js +0 -0
- /package/web/.next/static/{CMhbAJyvRj6ct2bZgc0Yp → 6DN4JYeWRmWsCZEUT6dAY}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{CMhbAJyvRj6ct2bZgc0Yp → 6DN4JYeWRmWsCZEUT6dAY}/_ssgManifest.js +0 -0
|
@@ -98,66 +98,94 @@ export function createMergeNode(deps) {
|
|
|
98
98
|
: undefined;
|
|
99
99
|
// --- Agent Call 1: Commit + Push + PR (skip on approval resume) ---
|
|
100
100
|
if (!isResumeAfterInterrupt) {
|
|
101
|
-
if (!remoteAvailable) {
|
|
102
|
-
log.info('No git remote configured — skipping push and PR, will merge locally');
|
|
103
|
-
}
|
|
104
101
|
const effectiveState = remoteAvailable ? state : { ...state, push: false, openPr: false };
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (prResult) {
|
|
120
|
-
prUrl = prResult.url;
|
|
121
|
-
prNumber = prResult.number;
|
|
122
|
-
// Cross-validate agent-parsed PR URL against authoritative source.
|
|
123
|
-
// The agent may hallucinate the repo URL or PR number, so we look up
|
|
124
|
-
// the real PR for this branch via the GitHub API.
|
|
125
|
-
try {
|
|
126
|
-
const prStatuses = await deps.gitPrService.listPrStatuses(cwd);
|
|
127
|
-
const matchingPr = prStatuses.find((pr) => pr.headRefName === branch);
|
|
128
|
-
if (matchingPr) {
|
|
129
|
-
prUrl = matchingPr.url;
|
|
130
|
-
prNumber = matchingPr.number;
|
|
131
|
-
}
|
|
102
|
+
const needsAgentCall = effectiveState.push || effectiveState.openPr;
|
|
103
|
+
if (!needsAgentCall) {
|
|
104
|
+
// Local-only: commit programmatically in worktree, no agent needed.
|
|
105
|
+
// This avoids calling the agent executor just to run git commit,
|
|
106
|
+
// which is slow/unreliable on some platforms (e.g. cursor on Windows hangs).
|
|
107
|
+
log.info('Local-only mode — committing in worktree programmatically (no agent)');
|
|
108
|
+
const worktreeCwd = state.worktreePath ?? cwd;
|
|
109
|
+
try {
|
|
110
|
+
const msg = `feat: ${branch}`;
|
|
111
|
+
const hash = await deps.commitAll(worktreeCwd, msg);
|
|
112
|
+
if (hash) {
|
|
113
|
+
commitHash = hash;
|
|
114
|
+
log.info(`Committed changes in worktree: ${commitHash}`);
|
|
115
|
+
messages.push(`[merge] Programmatic commit: ${commitHash}`);
|
|
132
116
|
}
|
|
133
|
-
|
|
134
|
-
|
|
117
|
+
else {
|
|
118
|
+
log.info('No changes to commit in worktree');
|
|
119
|
+
messages.push(`[merge] No changes to commit`);
|
|
135
120
|
}
|
|
136
|
-
|
|
121
|
+
}
|
|
122
|
+
catch (commitErr) {
|
|
123
|
+
const errMsg = commitErr instanceof Error ? commitErr.message : String(commitErr);
|
|
124
|
+
log.info(`Programmatic commit failed: ${errMsg} — falling back to agent`);
|
|
125
|
+
messages.push(`[merge] Programmatic commit failed, falling back to agent`);
|
|
126
|
+
// Fall through — needsAgentCall stays false so agent won't run either.
|
|
127
|
+
// The localMergeSquash will handle uncommitted changes via --squash.
|
|
137
128
|
}
|
|
138
129
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
cwd,
|
|
148
|
-
branch,
|
|
149
|
-
options,
|
|
150
|
-
feature,
|
|
151
|
-
prUrl,
|
|
152
|
-
prNumber,
|
|
153
|
-
existingAttempts: ciFixAttempts,
|
|
154
|
-
messages,
|
|
155
|
-
log,
|
|
130
|
+
if (needsAgentCall) {
|
|
131
|
+
if (!remoteAvailable) {
|
|
132
|
+
log.info('No git remote configured — skipping push and PR, will merge locally');
|
|
133
|
+
}
|
|
134
|
+
log.info('Agent call 1: commit + push + PR');
|
|
135
|
+
const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch, repoUrl);
|
|
136
|
+
const commitResult = await retryExecute(executor, commitPushPrPrompt, options, {
|
|
137
|
+
logger: log,
|
|
156
138
|
});
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
139
|
+
totalInputTokens += commitResult.usage?.inputTokens ?? 0;
|
|
140
|
+
totalOutputTokens += commitResult.usage?.outputTokens ?? 0;
|
|
141
|
+
totalCostUsd += commitResult.usage?.costUsd ?? 0;
|
|
142
|
+
totalNumTurns += commitResult.usage?.numTurns ?? 0;
|
|
143
|
+
totalDurationApiMs += commitResult.usage?.durationApiMs ?? 0;
|
|
144
|
+
commitHash = parseCommitHash(commitResult.result) ?? state.commitHash;
|
|
145
|
+
messages.push(`[merge] Agent completed commit/push/PR operations`);
|
|
146
|
+
if (effectiveState.openPr) {
|
|
147
|
+
const prResult = parsePrUrl(commitResult.result);
|
|
148
|
+
if (prResult) {
|
|
149
|
+
prUrl = prResult.url;
|
|
150
|
+
prNumber = prResult.number;
|
|
151
|
+
// Cross-validate agent-parsed PR URL against authoritative source.
|
|
152
|
+
try {
|
|
153
|
+
const prStatuses = await deps.gitPrService.listPrStatuses(cwd);
|
|
154
|
+
const matchingPr = prStatuses.find((pr) => pr.headRefName === branch);
|
|
155
|
+
if (matchingPr) {
|
|
156
|
+
prUrl = matchingPr.url;
|
|
157
|
+
prNumber = matchingPr.number;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// gh CLI unavailable or API failure — fall back to agent-parsed URL
|
|
162
|
+
}
|
|
163
|
+
messages.push(`[merge] PR created: ${prUrl}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// --- CI watch/fix loop (when push or openPr is enabled and CI watch is not disabled) ---
|
|
167
|
+
const ciWatchEnabled = getSettings().workflow?.ciWatchEnabled !== false;
|
|
168
|
+
if (ciWatchEnabled && (effectiveState.push || effectiveState.openPr)) {
|
|
169
|
+
const ciResult = await runCiWatchFixLoop({
|
|
170
|
+
executor,
|
|
171
|
+
gitPrService: deps.gitPrService,
|
|
172
|
+
featureRepository: deps.featureRepository,
|
|
173
|
+
}, {
|
|
174
|
+
cwd,
|
|
175
|
+
branch,
|
|
176
|
+
options,
|
|
177
|
+
feature,
|
|
178
|
+
prUrl,
|
|
179
|
+
prNumber,
|
|
180
|
+
existingAttempts: ciFixAttempts,
|
|
181
|
+
messages,
|
|
182
|
+
log,
|
|
183
|
+
});
|
|
184
|
+
ciStatus = ciResult.ciStatus;
|
|
185
|
+
ciFixAttempts = ciResult.ciFixAttempts;
|
|
186
|
+
ciFixHistory = ciResult.ciFixHistory;
|
|
187
|
+
ciFixStatus = ciResult.ciFixStatus;
|
|
188
|
+
}
|
|
161
189
|
}
|
|
162
190
|
// --- Persist lifecycle + PR data before approval gate ---
|
|
163
191
|
// Setting lifecycle to Review serves as the resume detection marker
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js
CHANGED
|
@@ -107,14 +107,9 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
|
107
107
|
}
|
|
108
108
|
return new Promise((resolve) => {
|
|
109
109
|
let output = '';
|
|
110
|
-
// Inherit stdin when running in an interactive terminal so that commands
|
|
111
|
-
// requiring sudo can prompt the user for a password. In non-interactive
|
|
112
|
-
// contexts (web UI, CI) stdin is piped and closed immediately to prevent
|
|
113
|
-
// the process from hanging waiting for input.
|
|
114
|
-
const isInteractive = process.stdin.isTTY === true;
|
|
115
110
|
const child = spawn(installCommand.command, [], {
|
|
116
111
|
shell: true,
|
|
117
|
-
stdio: [
|
|
112
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
118
113
|
env: {
|
|
119
114
|
...process.env,
|
|
120
115
|
DEBIAN_FRONTEND: 'noninteractive',
|
|
@@ -122,10 +117,8 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
|
122
117
|
GPG_TTY: '',
|
|
123
118
|
},
|
|
124
119
|
});
|
|
125
|
-
// Close stdin
|
|
126
|
-
|
|
127
|
-
child.stdin?.end();
|
|
128
|
-
}
|
|
120
|
+
// Close stdin immediately to prevent interactive prompts
|
|
121
|
+
child.stdin?.end();
|
|
129
122
|
// Stream output from stdout and stderr
|
|
130
123
|
const pipeOutput = (stream) => {
|
|
131
124
|
if (!stream)
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json
CHANGED
|
@@ -12,17 +12,13 @@
|
|
|
12
12
|
"commands": {
|
|
13
13
|
"linux": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
14
14
|
"darwin": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
15
|
-
"win32": "
|
|
15
|
+
"win32": "npm install -g @anthropic-ai/claude-code"
|
|
16
16
|
},
|
|
17
17
|
"timeout": 300000,
|
|
18
|
-
"documentationUrl": "https://
|
|
18
|
+
"documentationUrl": "https://code.claude.com/docs/en/overview",
|
|
19
19
|
"verifyCommand": "claude --version",
|
|
20
20
|
"autoInstall": true,
|
|
21
|
-
"openDirectory": {
|
|
22
|
-
"linux": "cd {dir} && exec claude",
|
|
23
|
-
"darwin": "cd {dir} && exec claude",
|
|
24
|
-
"win32": "cd /d {dir} && claude"
|
|
25
|
-
},
|
|
21
|
+
"openDirectory": "cd {dir} && exec claude",
|
|
26
22
|
"spawnOptions": {
|
|
27
23
|
"shell": true,
|
|
28
24
|
"stdio": "inherit",
|
|
@@ -30,7 +26,6 @@
|
|
|
30
26
|
},
|
|
31
27
|
"terminalCommand": {
|
|
32
28
|
"linux": "x-terminal-emulator -e bash -c 'cd {dir} && exec claude'",
|
|
33
|
-
"darwin": "
|
|
34
|
-
"win32": "start cmd /k \"cd /d {dir} && claude\""
|
|
29
|
+
"darwin": "open -a Terminal.app bash -c 'cd {dir} && exec claude'"
|
|
35
30
|
}
|
|
36
31
|
}
|
|
@@ -117,14 +117,7 @@ function printInstallInstructions(metadata) {
|
|
|
117
117
|
// Print open directory command if available
|
|
118
118
|
if (metadata.openDirectory) {
|
|
119
119
|
console.log(fmt.heading('Open Directory'));
|
|
120
|
-
|
|
121
|
-
console.log(`${colors.muted('$')} ${metadata.openDirectory}`);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
for (const [platform, cmd] of Object.entries(metadata.openDirectory)) {
|
|
125
|
-
console.log(`${colors.muted(`[${platform}]`)} ${cmd}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
120
|
+
console.log(`${colors.muted('$')} ${metadata.openDirectory}`);
|
|
128
121
|
console.log();
|
|
129
122
|
}
|
|
130
123
|
// Print documentation link
|
|
@@ -10,8 +10,6 @@ export interface AgentAuthStatus {
|
|
|
10
10
|
binaryName: string | null;
|
|
11
11
|
/** Instructions to authenticate if not authenticated */
|
|
12
12
|
authCommand: string | null;
|
|
13
|
-
/** Platform-resolved install command (e.g. "npm install -g @google/gemini-cli") */
|
|
14
|
-
installCommand: string | null;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
15
|
* Check agent tool installation + auth status.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA4FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiF/D"}
|
|
@@ -20,7 +20,7 @@ const AGENT_TOOL_MAP = {
|
|
|
20
20
|
};
|
|
21
21
|
const AGENT_BINARY_MAP = {
|
|
22
22
|
'claude-code': 'claude',
|
|
23
|
-
cursor: '
|
|
23
|
+
cursor: 'agent',
|
|
24
24
|
'gemini-cli': 'gemini',
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
@@ -113,7 +113,6 @@ export async function checkAgentAuth() {
|
|
|
113
113
|
label: 'Unknown',
|
|
114
114
|
binaryName: null,
|
|
115
115
|
authCommand: null,
|
|
116
|
-
installCommand: null,
|
|
117
116
|
};
|
|
118
117
|
}
|
|
119
118
|
const label = AGENT_LABELS[agentType] ?? agentType;
|
|
@@ -128,18 +127,15 @@ export async function checkAgentAuth() {
|
|
|
128
127
|
label,
|
|
129
128
|
binaryName: null,
|
|
130
129
|
authCommand: null,
|
|
131
|
-
installCommand: null,
|
|
132
130
|
};
|
|
133
131
|
}
|
|
134
132
|
// Check if tool is installed
|
|
135
133
|
let installed = false;
|
|
136
|
-
let installCommand = null;
|
|
137
134
|
try {
|
|
138
135
|
const useCase = resolve('ListToolsUseCase');
|
|
139
136
|
const tools = await useCase.execute();
|
|
140
137
|
const tool = tools.find((t) => t.id === toolId);
|
|
141
138
|
installed = tool?.status.status === 'available';
|
|
142
|
-
installCommand = tool?.installCommand ?? null;
|
|
143
139
|
}
|
|
144
140
|
catch {
|
|
145
141
|
installed = false;
|
|
@@ -152,7 +148,6 @@ export async function checkAgentAuth() {
|
|
|
152
148
|
label,
|
|
153
149
|
binaryName,
|
|
154
150
|
authCommand: binaryName ? `Install ${label} first` : null,
|
|
155
|
-
installCommand,
|
|
156
151
|
};
|
|
157
152
|
}
|
|
158
153
|
// Tier 1: instant file/env check
|
|
@@ -165,7 +160,6 @@ export async function checkAgentAuth() {
|
|
|
165
160
|
label,
|
|
166
161
|
binaryName,
|
|
167
162
|
authCommand: binaryName,
|
|
168
|
-
installCommand,
|
|
169
163
|
};
|
|
170
164
|
}
|
|
171
165
|
// Tier 2: subprocess verify (best effort, ~200ms)
|
|
@@ -180,6 +174,5 @@ export async function checkAgentAuth() {
|
|
|
180
174
|
label,
|
|
181
175
|
binaryName,
|
|
182
176
|
authCommand: authenticated ? null : binaryName,
|
|
183
|
-
installCommand,
|
|
184
177
|
};
|
|
185
178
|
}
|
package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js
CHANGED
|
@@ -70,7 +70,7 @@ function AgentAuthBanner({ status, onRetry, }) {
|
|
|
70
70
|
}
|
|
71
71
|
// Not installed
|
|
72
72
|
if (!status.installed) {
|
|
73
|
-
return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " not installed"] })] }), status.
|
|
73
|
+
return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " not installed"] })] }), status.binaryName ? (_jsxs("div", { className: "rounded bg-zinc-900 px-2 py-1 font-mono text-[10px] text-zinc-300", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), "npm install -g ", status.binaryName] })) : null, _jsx("button", { type: "button", onClick: onRetry, className: "self-start text-[10px] font-medium text-amber-700 underline underline-offset-2 hover:text-amber-900 dark:text-amber-300 dark:hover:text-amber-100", children: "Re-check" })] }));
|
|
74
74
|
}
|
|
75
75
|
// Installed but not authenticated
|
|
76
76
|
return (_jsxs("div", { className: "flex w-full flex-col gap-2 rounded-md bg-amber-500/10 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(AlertCircle, { className: "h-3 w-3 text-amber-600 dark:text-amber-400" }), _jsxs("span", { className: "text-[10px] font-medium text-amber-700 dark:text-amber-300", children: [status.label, " needs authentication"] })] }), status.authCommand ? (_jsxs("div", { className: "rounded bg-zinc-900 px-2 py-1 font-mono text-[10px] text-zinc-300", children: [_jsx("span", { className: "text-zinc-500 select-none", children: "$ " }), status.authCommand] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [status.binaryName ? (_jsxs("button", { type: "button", "data-testid": "auth-banner-open-terminal", onClick: async () => {
|
|
@@ -28,7 +28,7 @@ const installedNoLaunchTool = {
|
|
|
28
28
|
required: false,
|
|
29
29
|
openDirectory: undefined,
|
|
30
30
|
documentationUrl: 'https://claude.ai',
|
|
31
|
-
installCommand: '
|
|
31
|
+
installCommand: 'npm install -g @anthropic-ai/claude-code',
|
|
32
32
|
status: { status: 'available', toolName: 'claude-code' },
|
|
33
33
|
author: 'Anthropic',
|
|
34
34
|
website: 'https://claude.ai/code',
|
|
@@ -45,7 +45,7 @@ const mockTools = [
|
|
|
45
45
|
required: false,
|
|
46
46
|
openDirectory: undefined,
|
|
47
47
|
documentationUrl: 'https://claude.ai/code',
|
|
48
|
-
installCommand: '
|
|
48
|
+
installCommand: 'npm install -g @anthropic-ai/claude-code',
|
|
49
49
|
status: { status: 'available', toolName: 'claude-code' },
|
|
50
50
|
author: 'Anthropic',
|
|
51
51
|
website: 'https://claude.ai/code',
|