@idea1/cli 1.9.1 → 1.10.0
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/README.md +117 -60
- package/dist/cli/named-lists.d.ts +1 -1
- package/dist/cli/named-lists.d.ts.map +1 -1
- package/dist/cli/named-lists.js +18 -2
- package/dist/cli/named-lists.js.map +1 -1
- package/dist/cli/parser.d.ts +3 -2
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +4 -3
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/resolver.d.ts +3 -0
- package/dist/cli/resolver.d.ts.map +1 -1
- package/dist/cli/resolver.js +41 -36
- package/dist/cli/resolver.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/approve-pr.d.ts.map +1 -1
- package/dist/commands/approve-pr.js +1 -0
- package/dist/commands/approve-pr.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +11 -6
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +5 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/join-project-item.d.ts.map +1 -1
- package/dist/commands/join-project-item.js +31 -12
- package/dist/commands/join-project-item.js.map +1 -1
- package/dist/commands/next-workflow-step.d.ts.map +1 -1
- package/dist/commands/next-workflow-step.js +1 -0
- package/dist/commands/next-workflow-step.js.map +1 -1
- package/dist/commands/ready-for-approval.d.ts.map +1 -1
- package/dist/commands/ready-for-approval.js +24 -6
- package/dist/commands/ready-for-approval.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +2 -1
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/start-agent-implementation.d.ts.map +1 -1
- package/dist/commands/start-agent-implementation.js +4 -1
- package/dist/commands/start-agent-implementation.js.map +1 -1
- package/dist/commands/start-dev-implementation.d.ts.map +1 -1
- package/dist/commands/start-dev-implementation.js +1 -0
- package/dist/commands/start-dev-implementation.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +6 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/url-handler.d.ts +5 -0
- package/dist/commands/url-handler.d.ts.map +1 -0
- package/dist/commands/url-handler.js +38 -0
- package/dist/commands/url-handler.js.map +1 -0
- package/dist/jobs/targets.d.ts +6 -1
- package/dist/jobs/targets.d.ts.map +1 -1
- package/dist/jobs/targets.js +12 -8
- package/dist/jobs/targets.js.map +1 -1
- package/dist/lib/claude-options.d.ts +47 -34
- package/dist/lib/claude-options.d.ts.map +1 -1
- package/dist/lib/claude-options.js +95 -82
- package/dist/lib/claude-options.js.map +1 -1
- package/dist/lib/claude-sessions.generated.d.ts +25 -0
- package/dist/lib/claude-sessions.generated.d.ts.map +1 -0
- package/dist/lib/claude-sessions.generated.js +16 -0
- package/dist/lib/claude-sessions.generated.js.map +1 -0
- package/dist/lib/settings.d.ts +10 -4
- package/dist/lib/settings.d.ts.map +1 -1
- package/dist/lib/settings.js +45 -15
- package/dist/lib/settings.js.map +1 -1
- package/dist/prompts/platform-prompts.d.ts +2 -0
- package/dist/prompts/platform-prompts.d.ts.map +1 -1
- package/dist/prompts/platform-prompts.js +9 -4
- package/dist/prompts/platform-prompts.js.map +1 -1
- package/dist/prompts/project-item-prompts.d.ts +3 -12
- package/dist/prompts/project-item-prompts.d.ts.map +1 -1
- package/dist/prompts/project-item-prompts.js +3 -18
- package/dist/prompts/project-item-prompts.js.map +1 -1
- package/dist/services/claude.d.ts +12 -7
- package/dist/services/claude.d.ts.map +1 -1
- package/dist/services/claude.js +7 -4
- package/dist/services/claude.js.map +1 -1
- package/dist/services/config.d.ts +5 -0
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +9 -0
- package/dist/services/config.js.map +1 -1
- package/dist/services/git.d.ts +5 -0
- package/dist/services/git.d.ts.map +1 -1
- package/dist/services/git.js +15 -3
- package/dist/services/git.js.map +1 -1
- package/dist/services/os-launcher.d.ts +29 -0
- package/dist/services/os-launcher.d.ts.map +1 -0
- package/dist/services/os-launcher.js +104 -0
- package/dist/services/os-launcher.js.map +1 -0
- package/dist/services/platform.d.ts +17 -3
- package/dist/services/platform.d.ts.map +1 -1
- package/dist/services/platform.js +79 -7
- package/dist/services/platform.js.map +1 -1
- package/dist/services/repository-registry.d.ts +11 -0
- package/dist/services/repository-registry.d.ts.map +1 -0
- package/dist/services/repository-registry.js +43 -0
- package/dist/services/repository-registry.js.map +1 -0
- package/dist/services/setup.d.ts.map +1 -1
- package/dist/services/setup.js +21 -1
- package/dist/services/setup.js.map +1 -1
- package/dist/services/url-handler.d.ts +23 -0
- package/dist/services/url-handler.d.ts.map +1 -0
- package/dist/services/url-handler.js +236 -0
- package/dist/services/url-handler.js.map +1 -0
- package/dist/services/worktree.d.ts +1 -19
- package/dist/services/worktree.d.ts.map +1 -1
- package/dist/services/worktree.js +0 -34
- package/dist/services/worktree.js.map +1 -1
- package/dist/types/index.d.ts +27 -25
- package/dist/types/index.d.ts.map +1 -1
- package/dist/workflow/data/project-item.d.ts +4 -0
- package/dist/workflow/data/project-item.d.ts.map +1 -1
- package/dist/workflow/data/team-member.d.ts +14 -0
- package/dist/workflow/data/team-member.d.ts.map +1 -0
- package/dist/workflow/data/team-member.js +2 -0
- package/dist/workflow/data/team-member.js.map +1 -0
- package/dist/workflow/data/workflow-context.d.ts +1 -1
- package/dist/workflow/data/workflow-states.d.ts +11 -2
- package/dist/workflow/data/workflow-states.d.ts.map +1 -1
- package/dist/workflow/data/workflow-states.generated.d.ts +17 -0
- package/dist/workflow/data/workflow-states.generated.d.ts.map +1 -1
- package/dist/workflow/data/workflow-states.generated.js +41 -0
- package/dist/workflow/data/workflow-states.generated.js.map +1 -1
- package/dist/workflow/data/workflow-states.js +21 -1
- package/dist/workflow/data/workflow-states.js.map +1 -1
- package/dist/workflow/engine/agent-session.d.ts +16 -0
- package/dist/workflow/engine/agent-session.d.ts.map +1 -0
- package/dist/workflow/engine/agent-session.js +109 -0
- package/dist/workflow/engine/agent-session.js.map +1 -0
- package/dist/workflow/engine/approval-flow.d.ts +21 -5
- package/dist/workflow/engine/approval-flow.d.ts.map +1 -1
- package/dist/workflow/engine/approval-flow.js +34 -0
- package/dist/workflow/engine/approval-flow.js.map +1 -1
- package/dist/workflow/engine/handlers/agent-implementation.d.ts +5 -4
- package/dist/workflow/engine/handlers/agent-implementation.d.ts.map +1 -1
- package/dist/workflow/engine/handlers/agent-implementation.js +13 -19
- package/dist/workflow/engine/handlers/agent-implementation.js.map +1 -1
- package/dist/workflow/engine/handlers/dev-implementation.js +1 -1
- package/dist/workflow/engine/handlers/dev-implementation.js.map +1 -1
- package/dist/workflow/engine/handlers/ready-for-approval.d.ts +7 -6
- package/dist/workflow/engine/handlers/ready-for-approval.d.ts.map +1 -1
- package/dist/workflow/engine/handlers/ready-for-approval.js +17 -19
- package/dist/workflow/engine/handlers/ready-for-approval.js.map +1 -1
- package/dist/workflow/engine/release-engine.js +1 -1
- package/dist/workflow/engine/release-engine.js.map +1 -1
- package/dist/workflow/engine/ship-flow.d.ts +5 -4
- package/dist/workflow/engine/ship-flow.d.ts.map +1 -1
- package/dist/workflow/engine/ship-flow.js +11 -9
- package/dist/workflow/engine/ship-flow.js.map +1 -1
- package/dist/workflow/engine/workflow-engine.d.ts +52 -16
- package/dist/workflow/engine/workflow-engine.d.ts.map +1 -1
- package/dist/workflow/engine/workflow-engine.js +146 -31
- package/dist/workflow/engine/workflow-engine.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { logger } from '../lib/logger.js';
|
|
2
2
|
import { AgentErrorResponse, validateAgentResponse } from '../lib/agent-core.js';
|
|
3
3
|
import { isProjectItemUrl } from '../lib/project-item-url.js';
|
|
4
|
-
import { createProjectItemPrompt, generateBranchNamePrompt, getProjectItemSummaryForBranchPrompt, getProjectItemSummaryPrompt, listProjectsPrompt, setWorkflowStatusPrompt, upsertProjectItemWorkflowContextPrompt } from '../prompts/platform-prompts.js';
|
|
4
|
+
import { createProjectItemPrompt, generateBranchNamePrompt, getProjectItemSummaryForBranchPrompt, getProjectItemSummaryPrompt, listProjectsPrompt, listTeamMembersPrompt, setWorkflowStatusPrompt, upsertProjectItemWorkflowContextPrompt } from '../prompts/platform-prompts.js';
|
|
5
5
|
import * as claude from './claude.js';
|
|
6
6
|
/**
|
|
7
7
|
* The CLI's access to the Idea1 cloud platform (app.idea1.ai / api.idea1.ai): reading a project
|
|
8
8
|
* item's summary (by item or by branch), recording the item's workflow context, setting its workflow
|
|
9
|
-
* status, creating items, listing the team's Projects
|
|
9
|
+
* status (with the teammate it is assigned to), creating items, listing the team's Projects and
|
|
10
|
+
* members, deriving a branch name from an item. Callers use `platform.someFunction()` and know
|
|
10
11
|
* nothing about the transport.
|
|
11
12
|
*
|
|
12
13
|
* Today the transport is Claude Code driving the Idea1 MCP tools. That is an implementation detail
|
|
@@ -36,21 +37,24 @@ async function callForResult(prompt) {
|
|
|
36
37
|
* Record workflow context updates on an idea1.ai project item directly, with no side effects on the
|
|
37
38
|
* platform: the CLI has already run the transition's work locally. The item must be under workflow
|
|
38
39
|
* management (have a workflow context); the workflow engine is the only caller, as the persist step
|
|
39
|
-
* of a transition.
|
|
40
|
+
* of a transition. `assignedToEmail` names the team member the item is assigned to along with the
|
|
41
|
+
* status; null leaves the assignment as it is.
|
|
40
42
|
*
|
|
41
43
|
* TODO: Direct workflow-context updates move from the update_item MCP tool to an authenticated
|
|
42
44
|
* platform API call; the CLI will authenticate a user and call the API for direct integrations
|
|
43
45
|
* like this, and MCP tools will be only operations that agents should run.
|
|
44
46
|
*/
|
|
45
|
-
export async function setWorkflowStatus(itemUrl, status, pullRequestUrl) {
|
|
47
|
+
export async function setWorkflowStatus(itemUrl, status, pullRequestUrl, assignedToEmail) {
|
|
46
48
|
const hasClaude = await claude.ensureClaudeCli();
|
|
47
49
|
if (!hasClaude) {
|
|
48
50
|
logger.warning('Claude CLI not available, skipping workflow status update');
|
|
49
51
|
return false;
|
|
50
52
|
}
|
|
51
|
-
logger.step(
|
|
53
|
+
logger.step(assignedToEmail === null
|
|
54
|
+
? `Setting workflow status to "${status}"...`
|
|
55
|
+
: `Setting workflow status to "${status}", assigned to ${assignedToEmail}...`);
|
|
52
56
|
try {
|
|
53
|
-
await callForResult(setWorkflowStatusPrompt({ projectItemUrl: itemUrl, workflowStatus: status, pullRequestUrl }));
|
|
57
|
+
await callForResult(setWorkflowStatusPrompt({ projectItemUrl: itemUrl, workflowStatus: status, pullRequestUrl, assignedToEmail }));
|
|
54
58
|
logger.success(`Workflow status updated to "${status}"`);
|
|
55
59
|
return true;
|
|
56
60
|
}
|
|
@@ -145,6 +149,8 @@ const projectItemSummaryOutputSchema = {
|
|
|
145
149
|
epicId: { type: ['string', 'null'] },
|
|
146
150
|
completionDate: { type: ['string', 'null'] },
|
|
147
151
|
legacyWorkflowStatus: { type: 'string' },
|
|
152
|
+
projectId: { type: ['string', 'null'], description: 'The Project the item is planned in; null when it is out of scope' },
|
|
153
|
+
assignedToUserId: { type: ['string', 'null'], description: 'The team member the item is assigned to; null when unassigned' },
|
|
148
154
|
workflowContext: {
|
|
149
155
|
type: ['object', 'null'],
|
|
150
156
|
properties: {
|
|
@@ -163,7 +169,7 @@ const projectItemSummaryOutputSchema = {
|
|
|
163
169
|
additionalProperties: false
|
|
164
170
|
}
|
|
165
171
|
},
|
|
166
|
-
required: ['url', 'externalId', 'title', 'epicId', 'completionDate', 'legacyWorkflowStatus', 'workflowContext'],
|
|
172
|
+
required: ['url', 'externalId', 'title', 'epicId', 'completionDate', 'legacyWorkflowStatus', 'projectId', 'assignedToUserId', 'workflowContext'],
|
|
167
173
|
additionalProperties: false
|
|
168
174
|
},
|
|
169
175
|
error: { type: ['string', 'null'], description: 'The error the tool returned, verbatim, or null on success' }
|
|
@@ -212,6 +218,72 @@ const listProjectsSchema = {
|
|
|
212
218
|
required: ['projects'],
|
|
213
219
|
additionalProperties: false
|
|
214
220
|
};
|
|
221
|
+
let teamMembers = null;
|
|
222
|
+
/**
|
|
223
|
+
* The members of the team, read once per process: the teammates a project item can be assigned
|
|
224
|
+
* to. A team member's linked GitHub account (`gitHubUsername`) is null when none is linked.
|
|
225
|
+
*/
|
|
226
|
+
export function listTeamMembers() {
|
|
227
|
+
if (!teamMembers) {
|
|
228
|
+
teamMembers = readTeamMembers().catch(error => {
|
|
229
|
+
teamMembers = null;
|
|
230
|
+
throw error;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return teamMembers;
|
|
234
|
+
}
|
|
235
|
+
async function readTeamMembers() {
|
|
236
|
+
logger.step('Reading the team\'s members from idea1.ai...');
|
|
237
|
+
const output = await callStructured(listTeamMembersPrompt({}), listTeamMembersSchema);
|
|
238
|
+
if (!Array.isArray(output.members)) {
|
|
239
|
+
throw new Error(`Claude did not return the team's members: ${JSON.stringify(output.members)}`);
|
|
240
|
+
}
|
|
241
|
+
return output.members.map(member => ({
|
|
242
|
+
userId: member.userId,
|
|
243
|
+
email: member.email.trim(),
|
|
244
|
+
role: member.role,
|
|
245
|
+
gitHubUsername: member.gitHubUsername?.trim() ? member.gitHubUsername.trim() : null
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* The teammate an identity names: a team member's email address or their linked GitHub login,
|
|
250
|
+
* compared case-insensitively. Wherever a command names a teammate it accepts either, and the code
|
|
251
|
+
* works with the teammate it resolves to. Throws when no team member matches.
|
|
252
|
+
*/
|
|
253
|
+
export async function resolveTeammate(identity) {
|
|
254
|
+
const wanted = identity.trim().toLowerCase();
|
|
255
|
+
const teammate = (await listTeamMembers())
|
|
256
|
+
.find(member => member.email.toLowerCase() === wanted || member.gitHubUsername?.toLowerCase() === wanted);
|
|
257
|
+
if (!teammate) {
|
|
258
|
+
throw new Error(`No team member has the email address or linked GitHub login '${identity.trim()}'.`);
|
|
259
|
+
}
|
|
260
|
+
return teammate;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* JSON schema for the list-team-members structured output.
|
|
264
|
+
*/
|
|
265
|
+
const listTeamMembersSchema = {
|
|
266
|
+
type: 'object',
|
|
267
|
+
properties: {
|
|
268
|
+
members: {
|
|
269
|
+
type: 'array',
|
|
270
|
+
description: 'The team\'s members, in the order returned',
|
|
271
|
+
items: {
|
|
272
|
+
type: 'object',
|
|
273
|
+
properties: {
|
|
274
|
+
userId: { type: 'string' },
|
|
275
|
+
email: { type: 'string' },
|
|
276
|
+
role: { type: 'string' },
|
|
277
|
+
gitHubUsername: { type: ['string', 'null'], description: 'The member\'s linked GitHub login, or null when none is linked' }
|
|
278
|
+
},
|
|
279
|
+
required: ['userId', 'email', 'role', 'gitHubUsername'],
|
|
280
|
+
additionalProperties: false
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
required: ['members'],
|
|
285
|
+
additionalProperties: false
|
|
286
|
+
};
|
|
215
287
|
/**
|
|
216
288
|
* Create a new idea1 project item with the given title in the named Project.
|
|
217
289
|
* The item is created with description `# <title>`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/services/platform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/services/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record the main clone at `mainRepoRoot` as its GitHub repository's most recently used clone.
|
|
3
|
+
* A clone whose origin is not on GitHub is not recorded.
|
|
4
|
+
*/
|
|
5
|
+
export declare function recordRepositoryClone(mainRepoRoot: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* The most recently used local clone of a GitHub repository that still exists; null when the CLI
|
|
8
|
+
* has run in none.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findRepositoryClone(repositoryFullName: string): string | null;
|
|
11
|
+
//# sourceMappingURL=repository-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-registry.d.ts","sourceRoot":"","sources":["../../src/services/repository-registry.ts"],"names":[],"mappings":"AA4BA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB/E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { userIdea1Path } from './config.js';
|
|
4
|
+
import * as git from './git.js';
|
|
5
|
+
function registryPath() {
|
|
6
|
+
return userIdea1Path('repositories.json');
|
|
7
|
+
}
|
|
8
|
+
/** GitHub repository names compare case-insensitively, so they are keyed in lower case. */
|
|
9
|
+
function registryKey(repositoryFullName) {
|
|
10
|
+
return repositoryFullName.toLowerCase();
|
|
11
|
+
}
|
|
12
|
+
function readRegistry() {
|
|
13
|
+
const path = registryPath();
|
|
14
|
+
return existsSync(path) ? JSON.parse(readFileSync(path, 'utf-8')) : {};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Record the main clone at `mainRepoRoot` as its GitHub repository's most recently used clone.
|
|
18
|
+
* A clone whose origin is not on GitHub is not recorded.
|
|
19
|
+
*/
|
|
20
|
+
export async function recordRepositoryClone(mainRepoRoot) {
|
|
21
|
+
const repositoryFullName = await git.getGitHubRepositoryFullName();
|
|
22
|
+
if (!repositoryFullName) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const registry = readRegistry();
|
|
26
|
+
const key = registryKey(repositoryFullName);
|
|
27
|
+
const clones = registry[key] ?? [];
|
|
28
|
+
if (clones[0] === mainRepoRoot) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
registry[key] = [mainRepoRoot, ...clones.filter(clone => clone !== mainRepoRoot)];
|
|
32
|
+
mkdirSync(dirname(registryPath()), { recursive: true });
|
|
33
|
+
writeFileSync(registryPath(), JSON.stringify(registry, null, 2) + '\n');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The most recently used local clone of a GitHub repository that still exists; null when the CLI
|
|
37
|
+
* has run in none.
|
|
38
|
+
*/
|
|
39
|
+
export function findRepositoryClone(repositoryFullName) {
|
|
40
|
+
const clones = readRegistry()[registryKey(repositoryFullName)] ?? [];
|
|
41
|
+
return clones.find(clone => existsSync(clone)) ?? null;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=repository-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository-registry.js","sourceRoot":"","sources":["../../src/services/repository-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAWhC,SAAS,YAAY;IACnB,OAAO,aAAa,CAAC,mBAAmB,CAAC,CAAC;AAC5C,CAAC;AAED,2FAA2F;AAC3F,SAAS,WAAW,CAAC,kBAA0B;IAC7C,OAAO,kBAAkB,CAAC,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAoB;IAC9D,MAAM,kBAAkB,GAAG,MAAM,GAAG,CAAC,2BAA2B,EAAE,CAAC;IACnE,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC;IAClF,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,kBAA0B;IAC5D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/services/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/services/setup.ts"],"names":[],"mappings":"AAuIA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAmBnD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjE"}
|
package/dist/services/setup.js
CHANGED
|
@@ -64,6 +64,25 @@ Hooks are shell scripts that run at specific points in the workflow. All hooks a
|
|
|
64
64
|
}
|
|
65
65
|
\`\`\`
|
|
66
66
|
|
|
67
|
+
### prompts (optional)
|
|
68
|
+
|
|
69
|
+
The entry point prompts a Claude session on a project item's branch can start with, by workflow
|
|
70
|
+
state (\`idea1 join-project-item --entry-point <name>\`, \`idea1 start-agent-implementation\`).
|
|
71
|
+
A state's entries replace that state's built-in ones. Each entry has a \`name\` and a Handlebars
|
|
72
|
+
\`template\`, or a \`templateFile\` relative to the repository root.
|
|
73
|
+
|
|
74
|
+
\`\`\`json
|
|
75
|
+
{
|
|
76
|
+
"prompts": {
|
|
77
|
+
"entryPoints": {
|
|
78
|
+
"Agent Implementation": [
|
|
79
|
+
{ "name": "Implement", "template": "Implement {{projectItemUrl}} on {{branchName}}." }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
\`\`\`
|
|
85
|
+
|
|
67
86
|
### release (optional)
|
|
68
87
|
|
|
69
88
|
The packages \`idea1 release\` can version. Before the release PR is opened, every versioned
|
|
@@ -91,7 +110,8 @@ bump). Without this section a release has no version bump step.
|
|
|
91
110
|
Optional, git-ignored file with the same shape as \`settings.json\`. Anything it
|
|
92
111
|
defines overrides the committed settings for this clone only, so developer-specific
|
|
93
112
|
preferences don't have to be shared with the team. Each section is merged
|
|
94
|
-
individually, so overriding one hook, default or release setting leaves the rest in place
|
|
113
|
+
individually, so overriding one hook, default or release setting leaves the rest in place;
|
|
114
|
+
entry points are merged state by state.
|
|
95
115
|
|
|
96
116
|
\`\`\`json
|
|
97
117
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/services/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,EACN;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,uBAAuB,CAAC,YAAY;QAClD,UAAU,EAAE,uBAAuB,CAAC,UAAU;QAC9C,mBAAmB,EAAE,uBAAuB,CAAC,mBAAmB;QAChE,uBAAuB,EAAE,uBAAuB,CAAC,uBAAuB;QACxE,yBAAyB,EAAE,uBAAuB,CAAC,yBAAyB;QAC5E,6BAA6B,EAAE,uBAAuB,CAAC,6BAA6B;QACpF,WAAW,EAAE,uBAAuB,CAAC,WAAW;KACjD;CACF,CAAC;AAEF,kGAAkG;AAClG,MAAM,iBAAiB,GAAsB,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;AAE9E,MAAM,iBAAiB,GAAG;;;;;;;CAOzB,CAAC;AAEF,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/services/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,EACN;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,uBAAuB,CAAC,YAAY;QAClD,UAAU,EAAE,uBAAuB,CAAC,UAAU;QAC9C,mBAAmB,EAAE,uBAAuB,CAAC,mBAAmB;QAChE,uBAAuB,EAAE,uBAAuB,CAAC,uBAAuB;QACxE,yBAAyB,EAAE,uBAAuB,CAAC,yBAAyB;QAC5E,6BAA6B,EAAE,uBAAuB,CAAC,6BAA6B;QACpF,WAAW,EAAE,uBAAuB,CAAC,WAAW;KACjD;CACF,CAAC;AAEF,kGAAkG;AAClG,MAAM,iBAAiB,GAAsB,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;AAE9E,MAAM,iBAAiB,GAAG;;;;;;;CAOzB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgGtB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE/C,0BAA0B;IAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,uBAAuB;IACvB,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE9E,oBAAoB;IACpB,aAAa,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAEhD,mBAAmB;IACnB,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE1C,MAAM,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC;AAC5F,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;IAE9E,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,0CAA0C,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,aAAa,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,WAAW,SAAS,IAAI,cAAc,8CAA8C,SAAS,+BAA+B,CAAC,CAAC;QAC1I,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,cAAc,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,+BAA+B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1H,MAAM,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,SAAS,IAAI,cAAc,uBAAuB,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Whether this operating system can register the handler: macOS and Windows. */
|
|
2
|
+
export declare function isUrlHandlerSupported(): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Register the CLI as the operating system's handler of `idea1://` links, for the current user.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerUrlHandler(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Remove the CLI's `idea1://` handler registration, and keep it from being registered again at
|
|
9
|
+
* startup until `registerUrlHandler`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function unregisterUrlHandler(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Register the handler unless it is registered already by this CLI, Node and version, or was
|
|
14
|
+
* unregistered on purpose. Runs on every CLI start.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ensureUrlHandlerRegistered(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Act on an `idea1://` link: open a terminal in the repository's local clone that joins the project
|
|
19
|
+
* item and starts its session in Claude Desktop. A repository the CLI has not run in yet is asked
|
|
20
|
+
* for in the terminal; joining from it records it for the next link.
|
|
21
|
+
*/
|
|
22
|
+
export declare function openIdea1Url(value: string): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=url-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-handler.d.ts","sourceRoot":"","sources":["../../src/services/url-handler.ts"],"names":[],"mappings":"AA+DA,iFAAiF;AACjF,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAQD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQxD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAW1D;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CAUhE;AA8ID;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
|
2
|
+
import { homedir, tmpdir } from 'os';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { exec, execOrThrow } from '../lib/shell.js';
|
|
6
|
+
import { NO_ENTRY_POINT } from '../lib/claude-options.js';
|
|
7
|
+
import { VALID_ISOLATION_MODES } from '../lib/isolation.js';
|
|
8
|
+
import { isProjectItemUrl } from '../lib/project-item-url.js';
|
|
9
|
+
import { CLAUDE_EFFORT_LEVELS, CLAUDE_MODEL_CHOICES } from '../lib/claude-sessions.generated.js';
|
|
10
|
+
import { VERSION } from '../version.js';
|
|
11
|
+
import { userIdea1Path } from './config.js';
|
|
12
|
+
import * as osLauncher from './os-launcher.js';
|
|
13
|
+
import { findRepositoryClone } from './repository-registry.js';
|
|
14
|
+
/**
|
|
15
|
+
* The `idea1://` URL handler: links in the Idea1 web app that start work on this machine. The CLI
|
|
16
|
+
* registers itself with the operating system as the handler of the `idea1` scheme - on macOS an
|
|
17
|
+
* AppleScript applet in `~/Applications`, on Windows a per-user protocol key in the registry - and
|
|
18
|
+
* the operating system hands each link to `idea1 open-url`.
|
|
19
|
+
*
|
|
20
|
+
* A link is input from outside the machine, so only `idea1://join` is accepted and every parameter
|
|
21
|
+
* is checked against what the web app builds: the project item on the Idea1 app's host, the
|
|
22
|
+
* repository as `owner/name`, and fixed choices for everything else. An entry point is passed on
|
|
23
|
+
* by name only, never as prompt text. The link opens a terminal in the repository's local clone
|
|
24
|
+
* (found in the repository registry, else asked for in the terminal) running
|
|
25
|
+
* `idea1 join-project-item` with exactly those values.
|
|
26
|
+
*
|
|
27
|
+
* Registration happens automatically and idempotently whenever the CLI runs, recorded in a stamp
|
|
28
|
+
* file under `~/.idea1/`, and is redone when the CLI's version, Node or install location changes;
|
|
29
|
+
* `unregister-url-handler` removes it and keeps it removed until `register-url-handler`.
|
|
30
|
+
*/
|
|
31
|
+
const URL_SCHEME = 'idea1';
|
|
32
|
+
/** Set to skip the automatic registration at startup, as the CLI's tests do. */
|
|
33
|
+
const SKIP_REGISTRATION_ENV = 'IDEA1_SKIP_URL_HANDLER_REGISTRATION';
|
|
34
|
+
/** The CLI's entry script, which the handler runs with this Node. */
|
|
35
|
+
const CLI_ENTRY_PATH = fileURLToPath(new URL('../index.js', import.meta.url));
|
|
36
|
+
const MAC_APP_PATH = join(homedir(), 'Applications', 'Idea1 URL Handler.app');
|
|
37
|
+
const MAC_BUNDLE_ID = 'ai.idea1.url-handler';
|
|
38
|
+
const LSREGISTER = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister';
|
|
39
|
+
const WINDOWS_KEY = `HKCU\\Software\\Classes\\${URL_SCHEME}`;
|
|
40
|
+
function stampPath() {
|
|
41
|
+
return userIdea1Path('url-handler.json');
|
|
42
|
+
}
|
|
43
|
+
function writeStamp(registered) {
|
|
44
|
+
const stamp = { registered, version: VERSION, node: process.execPath, cli: CLI_ENTRY_PATH };
|
|
45
|
+
mkdirSync(dirname(stampPath()), { recursive: true });
|
|
46
|
+
writeFileSync(stampPath(), JSON.stringify(stamp, null, 2) + '\n');
|
|
47
|
+
}
|
|
48
|
+
/** Whether this operating system can register the handler: macOS and Windows. */
|
|
49
|
+
export function isUrlHandlerSupported() {
|
|
50
|
+
return process.platform === 'darwin' || process.platform === 'win32';
|
|
51
|
+
}
|
|
52
|
+
function requireSupport() {
|
|
53
|
+
if (!isUrlHandlerSupported()) {
|
|
54
|
+
throw new Error(`The ${URL_SCHEME}:// URL handler can be registered on macOS and Windows only.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register the CLI as the operating system's handler of `idea1://` links, for the current user.
|
|
59
|
+
*/
|
|
60
|
+
export async function registerUrlHandler() {
|
|
61
|
+
requireSupport();
|
|
62
|
+
if (process.platform === 'darwin') {
|
|
63
|
+
await registerMacApplet();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await registerWindowsProtocol();
|
|
67
|
+
}
|
|
68
|
+
writeStamp(true);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Remove the CLI's `idea1://` handler registration, and keep it from being registered again at
|
|
72
|
+
* startup until `registerUrlHandler`.
|
|
73
|
+
*/
|
|
74
|
+
export async function unregisterUrlHandler() {
|
|
75
|
+
requireSupport();
|
|
76
|
+
if (process.platform === 'darwin') {
|
|
77
|
+
if (existsSync(MAC_APP_PATH)) {
|
|
78
|
+
await execOrThrow(LSREGISTER, ['-u', MAC_APP_PATH]);
|
|
79
|
+
rmSync(MAC_APP_PATH, { recursive: true, force: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if ((await exec('reg', ['query', WINDOWS_KEY])).exitCode === 0) {
|
|
83
|
+
await execOrThrow('reg', ['delete', WINDOWS_KEY, '/f']);
|
|
84
|
+
}
|
|
85
|
+
writeStamp(false);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Register the handler unless it is registered already by this CLI, Node and version, or was
|
|
89
|
+
* unregistered on purpose. Runs on every CLI start.
|
|
90
|
+
*/
|
|
91
|
+
export async function ensureUrlHandlerRegistered() {
|
|
92
|
+
if (!isUrlHandlerSupported() || process.env[SKIP_REGISTRATION_ENV]) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const stamp = existsSync(stampPath()) ? JSON.parse(readFileSync(stampPath(), 'utf-8')) : null;
|
|
96
|
+
if (stamp && (!stamp.registered || (stamp.version === VERSION && stamp.node === process.execPath && stamp.cli === CLI_ENTRY_PATH))) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
await registerUrlHandler();
|
|
100
|
+
}
|
|
101
|
+
/** A string literal in AppleScript. */
|
|
102
|
+
function appleScriptString(value) {
|
|
103
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* An AppleScript applet whose `open location` handler runs `open-url` with the link, reporting a
|
|
107
|
+
* refused link in a dialog. Its Info.plist claims the scheme and keeps it out of the Dock; it is
|
|
108
|
+
* signed again after the edit and registered with Launch Services.
|
|
109
|
+
*/
|
|
110
|
+
async function registerMacApplet() {
|
|
111
|
+
const command = `quoted form of ${appleScriptString(process.execPath)} & " " & quoted form of ${appleScriptString(CLI_ENTRY_PATH)} & " open-url --url " & quoted form of theUrl`;
|
|
112
|
+
const source = [
|
|
113
|
+
'on open location theUrl',
|
|
114
|
+
'\ttry',
|
|
115
|
+
`\t\tdo shell script ${command}`,
|
|
116
|
+
'\ton error errorMessage',
|
|
117
|
+
'\t\tactivate',
|
|
118
|
+
'\t\tdisplay dialog "Idea1 could not open " & theUrl & return & return & errorMessage buttons {"OK"} default button "OK" with title "Idea1" with icon stop',
|
|
119
|
+
'\tend try',
|
|
120
|
+
'end open location',
|
|
121
|
+
''
|
|
122
|
+
].join('\n');
|
|
123
|
+
const sourcePath = join(tmpdir(), `idea1-url-handler-${process.pid}.applescript`);
|
|
124
|
+
writeFileSync(sourcePath, source);
|
|
125
|
+
rmSync(MAC_APP_PATH, { recursive: true, force: true });
|
|
126
|
+
mkdirSync(dirname(MAC_APP_PATH), { recursive: true });
|
|
127
|
+
await execOrThrow('osacompile', ['-o', MAC_APP_PATH, sourcePath]);
|
|
128
|
+
rmSync(sourcePath, { force: true });
|
|
129
|
+
const plist = join(MAC_APP_PATH, 'Contents', 'Info.plist');
|
|
130
|
+
await execOrThrow('plutil', ['-replace', 'CFBundleIdentifier', '-string', MAC_BUNDLE_ID, plist]);
|
|
131
|
+
await execOrThrow('plutil', ['-replace', 'CFBundleURLTypes', '-json', JSON.stringify([{ CFBundleURLName: 'Idea1 link', CFBundleURLSchemes: [URL_SCHEME] }]), plist]);
|
|
132
|
+
await execOrThrow('plutil', ['-replace', 'LSUIElement', '-bool', 'YES', plist]);
|
|
133
|
+
await execOrThrow('codesign', ['--force', '--sign', '-', MAC_APP_PATH]);
|
|
134
|
+
await execOrThrow(LSREGISTER, ['-f', MAC_APP_PATH]);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* A per-user protocol key whose open command runs `open-url` with the link.
|
|
138
|
+
*/
|
|
139
|
+
async function registerWindowsProtocol() {
|
|
140
|
+
await execOrThrow('reg', ['add', WINDOWS_KEY, '/ve', '/d', `URL:${URL_SCHEME}`, '/f']);
|
|
141
|
+
await execOrThrow('reg', ['add', WINDOWS_KEY, '/v', 'URL Protocol', '/d', '', '/f']);
|
|
142
|
+
await execOrThrow('reg', [
|
|
143
|
+
'add', `${WINDOWS_KEY}\\shell\\open\\command`, '/ve',
|
|
144
|
+
'/d', `"${process.execPath}" "${CLI_ENTRY_PATH}" open-url --url "%1"`,
|
|
145
|
+
'/f'
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
const JOIN_PARAMETERS = ['target', 'repo', 'isolation', 'app', 'entryPoint', 'model', 'effort'];
|
|
149
|
+
const REPOSITORY_PATTERN = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/(?!\.\.?$)[A-Za-z0-9._-]{1,100}$/;
|
|
150
|
+
/** An entry point name: words, never prompt text with quotes, shell or template characters. */
|
|
151
|
+
const ENTRY_POINT_NAME_PATTERN = /^[\p{L}\p{N}][\p{L}\p{N} .,'()_-]{0,79}$/u;
|
|
152
|
+
/**
|
|
153
|
+
* Read an `idea1://join` link, refusing anything that is not exactly what the web app builds.
|
|
154
|
+
*/
|
|
155
|
+
function parseJoinUrl(value) {
|
|
156
|
+
let url;
|
|
157
|
+
try {
|
|
158
|
+
url = new URL(value);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new Error(`Not a URL: ${value}`);
|
|
162
|
+
}
|
|
163
|
+
if (url.protocol !== `${URL_SCHEME}:` || url.host !== 'join' || (url.pathname !== '' && url.pathname !== '/') || url.hash || url.username || url.password) {
|
|
164
|
+
throw new Error(`Only ${URL_SCHEME}://join links are accepted.`);
|
|
165
|
+
}
|
|
166
|
+
const params = new Map();
|
|
167
|
+
for (const [name, paramValue] of url.searchParams) {
|
|
168
|
+
if (!JOIN_PARAMETERS.includes(name)) {
|
|
169
|
+
throw new Error(`Unknown parameter "${name}" in the ${URL_SCHEME}://join link.`);
|
|
170
|
+
}
|
|
171
|
+
if (params.has(name)) {
|
|
172
|
+
throw new Error(`The parameter "${name}" is given more than once in the ${URL_SCHEME}://join link.`);
|
|
173
|
+
}
|
|
174
|
+
params.set(name, paramValue);
|
|
175
|
+
}
|
|
176
|
+
const required = (name) => {
|
|
177
|
+
const paramValue = params.get(name);
|
|
178
|
+
if (!paramValue) {
|
|
179
|
+
throw new Error(`The ${URL_SCHEME}://join link has no "${name}".`);
|
|
180
|
+
}
|
|
181
|
+
return paramValue;
|
|
182
|
+
};
|
|
183
|
+
const oneOf = (name, paramValue, valid) => {
|
|
184
|
+
if (!valid.includes(paramValue)) {
|
|
185
|
+
throw new Error(`"${paramValue}" is not a valid "${name}" (valid: ${valid.join(', ')}).`);
|
|
186
|
+
}
|
|
187
|
+
return paramValue;
|
|
188
|
+
};
|
|
189
|
+
const optionalOneOf = (name, valid) => params.has(name) ? oneOf(name, required(name), valid) : null;
|
|
190
|
+
const target = required('target');
|
|
191
|
+
const notAnItem = new Error(`"${target}" is not a project item URL of the Idea1 app.`);
|
|
192
|
+
if (!isProjectItemUrl(target)) {
|
|
193
|
+
throw notAnItem;
|
|
194
|
+
}
|
|
195
|
+
const targetUrl = new URL(target);
|
|
196
|
+
if (targetUrl.search || targetUrl.hash || targetUrl.username || targetUrl.password) {
|
|
197
|
+
throw notAnItem;
|
|
198
|
+
}
|
|
199
|
+
const repo = required('repo');
|
|
200
|
+
if (!REPOSITORY_PATTERN.test(repo)) {
|
|
201
|
+
throw new Error(`"${repo}" is not a GitHub repository as owner/name.`);
|
|
202
|
+
}
|
|
203
|
+
const entryPoint = required('entryPoint');
|
|
204
|
+
if (entryPoint !== NO_ENTRY_POINT && !ENTRY_POINT_NAME_PATTERN.test(entryPoint)) {
|
|
205
|
+
throw new Error(`"${entryPoint}" is not an entry point name.`);
|
|
206
|
+
}
|
|
207
|
+
oneOf('app', required('app'), ['desktop']);
|
|
208
|
+
return {
|
|
209
|
+
target,
|
|
210
|
+
repo,
|
|
211
|
+
isolation: oneOf('isolation', required('isolation'), VALID_ISOLATION_MODES),
|
|
212
|
+
entryPoint,
|
|
213
|
+
model: optionalOneOf('model', CLAUDE_MODEL_CHOICES.map(choice => choice.value)),
|
|
214
|
+
effort: optionalOneOf('effort', CLAUDE_EFFORT_LEVELS)
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Act on an `idea1://` link: open a terminal in the repository's local clone that joins the project
|
|
219
|
+
* item and starts its session in Claude Desktop. A repository the CLI has not run in yet is asked
|
|
220
|
+
* for in the terminal; joining from it records it for the next link.
|
|
221
|
+
*/
|
|
222
|
+
export async function openIdea1Url(value) {
|
|
223
|
+
const request = parseJoinUrl(value);
|
|
224
|
+
const argv = [
|
|
225
|
+
process.execPath, CLI_ENTRY_PATH, 'join-project-item',
|
|
226
|
+
'--target', request.target,
|
|
227
|
+
'--isolation', request.isolation,
|
|
228
|
+
'--claude-entry-point', 'desktop',
|
|
229
|
+
'--entry-point', request.entryPoint,
|
|
230
|
+
...(request.model ? ['--model', request.model] : []),
|
|
231
|
+
...(request.effort ? ['--effort', request.effort] : [])
|
|
232
|
+
];
|
|
233
|
+
const clone = findRepositoryClone(request.repo);
|
|
234
|
+
await osLauncher.openTerminal(clone ? { kind: 'directory', directory: clone } : { kind: 'ask', question: `Where is your local clone of ${request.repo}?` }, argv);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=url-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-handler.js","sourceRoot":"","sources":["../../src/services/url-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IsolationMode } from '../types/index.js';
|
|
2
2
|
import { type WorkflowState } from '../workflow/data/workflow-states.js';
|
|
3
3
|
/**
|
|
4
4
|
* Run the setup-worktree hook if defined in .idea1/settings.json
|
|
@@ -56,18 +56,6 @@ export declare function extractIntegrationName(fullBranchName: string): Promise<
|
|
|
56
56
|
* Ensure an integration branch exists, creating it from baseBranch if needed
|
|
57
57
|
*/
|
|
58
58
|
export declare function ensureIntegrationBranch(integrationBranchName: string, baseBranchName: string): Promise<void>;
|
|
59
|
-
/**
|
|
60
|
-
* How a project item's implementation session is started on its branch.
|
|
61
|
-
*/
|
|
62
|
-
export interface ImplementationSessionOptions {
|
|
63
|
-
projectItemUrl: string;
|
|
64
|
-
/** The rendered prompt the session starts with. */
|
|
65
|
-
prompt: string;
|
|
66
|
-
permissionMode: ClaudePermissionMode;
|
|
67
|
-
model: ClaudeModel;
|
|
68
|
-
effort: ClaudeEffortLevel;
|
|
69
|
-
claudeEntryPointMode: ClaudeEntryPointMode;
|
|
70
|
-
}
|
|
71
59
|
/**
|
|
72
60
|
* Setup worktree isolation - creates worktree and runs hooks
|
|
73
61
|
*/
|
|
@@ -84,12 +72,6 @@ export declare function ensureBranchEnvironment(isolationMode: IsolationMode, br
|
|
|
84
72
|
workingPath: string;
|
|
85
73
|
created: boolean;
|
|
86
74
|
}>;
|
|
87
|
-
/**
|
|
88
|
-
* Start a project item's implementation session on its branch's working directory per the
|
|
89
|
-
* entry-point mode, then print the directory path and next-step hint. This is the only place the
|
|
90
|
-
* CLI starts a Claude session that writes code.
|
|
91
|
-
*/
|
|
92
|
-
export declare function launchClaudeForBranch(workingPath: string, options: ImplementationSessionOptions): Promise<void>;
|
|
93
75
|
/**
|
|
94
76
|
* Tell the user where the branch is checked out and how to move the workflow on.
|
|
95
77
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/services/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/services/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMvD,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAE3F;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAejF;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE;IAAE,wBAAwB,EAAE,OAAO,CAAA;CAAE,GAC7C,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAyBD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/E;AAED;;;;GAIG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CAEtE;AAgBD;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzF;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAAC,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtH;AAED;;GAEG;AACH,wBAAsB,+BAA+B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAazE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBpF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,qBAAqB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAclH;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAgBpD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMpE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
|