@agentteams/cli 0.1.79 → 0.1.82

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 (54) hide show
  1. package/.eslintcache +1 -1
  2. package/.prettierrc.json +1 -1
  3. package/dist/commands/attachment.d.ts.map +1 -1
  4. package/dist/commands/attachment.js +24 -10
  5. package/dist/commands/attachment.js.map +1 -1
  6. package/dist/commands/doctor.d.ts +14 -0
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/doctor.js +65 -6
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/init.d.ts +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +236 -24
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/worktree.d.ts +10 -0
  15. package/dist/commands/worktree.d.ts.map +1 -1
  16. package/dist/commands/worktree.js +11 -4
  17. package/dist/commands/worktree.js.map +1 -1
  18. package/dist/index.js +4 -2
  19. package/dist/index.js.map +1 -1
  20. package/dist/mcp/tools.d.ts.map +1 -1
  21. package/dist/mcp/tools.js +2 -1
  22. package/dist/mcp/tools.js.map +1 -1
  23. package/dist/mcp-registration/vendorCommand.d.ts +16 -0
  24. package/dist/mcp-registration/vendorCommand.d.ts.map +1 -1
  25. package/dist/mcp-registration/vendorCommand.js +5 -2
  26. package/dist/mcp-registration/vendorCommand.js.map +1 -1
  27. package/dist/utils/authServer.d.ts +1 -1
  28. package/dist/utils/authServer.d.ts.map +1 -1
  29. package/dist/utils/authServer.js +33 -31
  30. package/dist/utils/authServer.js.map +1 -1
  31. package/dist/utils/config.d.ts.map +1 -1
  32. package/dist/utils/config.js +4 -3
  33. package/dist/utils/config.js.map +1 -1
  34. package/dist/utils/conventionLink.d.ts +5 -3
  35. package/dist/utils/conventionLink.d.ts.map +1 -1
  36. package/dist/utils/conventionLink.js +23 -13
  37. package/dist/utils/conventionLink.js.map +1 -1
  38. package/dist/utils/doctorOutput.d.ts.map +1 -1
  39. package/dist/utils/doctorOutput.js +17 -0
  40. package/dist/utils/doctorOutput.js.map +1 -1
  41. package/dist/utils/git.d.ts.map +1 -1
  42. package/dist/utils/git.js +13 -2
  43. package/dist/utils/git.js.map +1 -1
  44. package/dist/utils/initOutput.d.ts.map +1 -1
  45. package/dist/utils/initOutput.js +4 -0
  46. package/dist/utils/initOutput.js.map +1 -1
  47. package/dist/utils/path.d.ts +11 -0
  48. package/dist/utils/path.d.ts.map +1 -0
  49. package/dist/utils/path.js +26 -0
  50. package/dist/utils/path.js.map +1 -0
  51. package/dist/utils/projectLayout.d.ts.map +1 -1
  52. package/dist/utils/projectLayout.js +4 -3
  53. package/dist/utils/projectLayout.js.map +1 -1
  54. package/package.json +3 -3
package/.prettierrc.json CHANGED
@@ -3,5 +3,5 @@
3
3
  "singleQuote": true,
4
4
  "trailingComma": "all",
5
5
  "semi": true,
6
- "endOfLine": "auto"
6
+ "endOfLine": "lf"
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/commands/attachment.ts"],"names":[],"mappings":"AA+DA,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CAoDlB"}
1
+ {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/commands/attachment.ts"],"names":[],"mappings":"AAmEA,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,OAAO,CAAC,CA8DlB"}
@@ -39,21 +39,35 @@ const resolveContentType = (fileName) => {
39
39
  const resolveTarget = (options) => {
40
40
  const codeReviewId = optionalString(options.codeReviewId);
41
41
  const completionReportId = optionalString(options.completionReportId);
42
- if (codeReviewId && completionReportId) {
43
- throw new Error('Use only one of --code-review-id or --completion-report-id.');
42
+ const documentId = optionalString(options.documentId);
43
+ const targets = [
44
+ codeReviewId ? { targetType: 'codeReview', targetId: codeReviewId } : null,
45
+ completionReportId ? { targetType: 'completionReport', targetId: completionReportId } : null,
46
+ documentId ? { targetType: 'document', targetId: documentId } : null,
47
+ ].filter((target) => target !== null);
48
+ if (targets.length > 1) {
49
+ throw new Error('Use only one of --code-review-id, --completion-report-id, or --document-id.');
44
50
  }
45
- if (codeReviewId) {
46
- return { targetType: 'codeReview', targetId: codeReviewId };
51
+ const target = targets[0];
52
+ if (target) {
53
+ return target;
47
54
  }
48
- if (completionReportId) {
49
- return { targetType: 'completionReport', targetId: completionReportId };
50
- }
51
- throw new Error('Exactly one of --code-review-id or --completion-report-id is required.');
55
+ throw new Error('Exactly one of --code-review-id, --completion-report-id, or --document-id is required.');
52
56
  };
53
57
  export async function executeAttachmentCommand(apiUrl, headers, action, options) {
54
58
  if (action === 'list') {
55
- const triggerId = requireString(options.triggerId, '--trigger-id');
56
- const response = await axios.get(`${apiUrl}/api/daemon-triggers/${triggerId}/attachments`, { headers });
59
+ const triggerId = optionalString(options.triggerId);
60
+ const documentId = optionalString(options.documentId);
61
+ if (triggerId && documentId) {
62
+ throw new Error('Use only one of --trigger-id or --document-id.');
63
+ }
64
+ if (!triggerId && !documentId) {
65
+ throw new Error('Exactly one of --trigger-id or --document-id is required.');
66
+ }
67
+ const path = documentId
68
+ ? `/api/documents/${documentId}/attachments`
69
+ : `/api/daemon-triggers/${triggerId}/attachments`;
70
+ const response = await axios.get(`${apiUrl}${path}`, { headers });
57
71
  return response.data;
58
72
  }
59
73
  if (action === 'create') {
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/commands/attachment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/commands/attachment.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { type ConventionIssue, type ConventionLinkState } from '../utils/conventionLink.js';
2
2
  export type DoctorStatus = 'READY' | 'DEGRADED' | 'NOT_APPLICABLE';
3
+ /**
4
+ * Which project layout the diagnosis ran against. Output and readiness rules
5
+ * differ per layout, so this — not a derived field such as `rootHook` — is what
6
+ * consumers branch on.
7
+ */
8
+ export type DoctorLayout = 'git-root' | 'non-git-root' | 'unknown';
3
9
  export interface DoctorIssue {
4
10
  code: string;
5
11
  path: string | null;
@@ -22,12 +28,20 @@ export interface DoctorRepositoryResult {
22
28
  }
23
29
  export interface DoctorResult {
24
30
  status: DoctorStatus;
31
+ layout: DoctorLayout;
25
32
  applicable: boolean;
26
33
  changedCount: number;
27
34
  rootDir: string | null;
28
35
  rootEntryPoints: string[];
29
36
  missingRecommendedEntryPoints: string[];
30
37
  repositories: DoctorRepositoryResult[];
38
+ /**
39
+ * State of the worktree bootstrap hook on the convention root itself. Only a
40
+ * git root project has one — a non-git root has no git-common dir and its
41
+ * hooks live per member repo (`DoctorRepositoryResult.hook`), so it reports
42
+ * `skipped`.
43
+ */
44
+ rootHook: 'ready' | 'blocked' | 'skipped';
31
45
  issues: DoctorIssue[];
32
46
  }
33
47
  type DoctorOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,EAQL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAYpC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,mBAAmB,EAAE,wBAAwB,EAAE,CAAC;IAChD,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B,EAAE,MAAM,EAAE,CAAC;IACxC,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAqJF,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAEzF"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,EAQL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AAgBpC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,mBAAmB,EAAE,wBAAwB,EAAE,CAAC;IAChD,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B,EAAE,MAAM,EAAE,CAAC;IACxC,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAiNF,wBAAsB,oBAAoB,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAEzF"}
@@ -11,6 +11,9 @@ const CONVENTION_FILE = 'convention.md';
11
11
  // which of these exist at the convention root; it never creates root files.
12
12
  const ENTRY_POINT_ALLOWLIST = ['CLAUDE.md', 'AGENTS.md', 'GEMINI.md', '.cursor/rules/agentteams.mdc'];
13
13
  const RECOMMENDED_ENTRY_POINTS = ['CLAUDE.md', 'AGENTS.md'];
14
+ // Hook installation blocked by the user's own hook setup, not by a defect the
15
+ // doctor can or should repair.
16
+ const USER_HOOK_CONFIG_CODES = new Set(['hook-hookspath', 'hook-custom']);
14
17
  function pathEntryExists(path) {
15
18
  try {
16
19
  lstatSync(path);
@@ -23,15 +26,71 @@ function pathEntryExists(path) {
23
26
  function notApplicableResult(rootDir, issue) {
24
27
  return {
25
28
  status: 'NOT_APPLICABLE',
29
+ layout: 'unknown',
26
30
  applicable: false,
27
31
  changedCount: 0,
28
32
  rootDir,
29
33
  rootEntryPoints: [],
30
34
  missingRecommendedEntryPoints: [],
31
35
  repositories: [],
36
+ rootHook: 'skipped',
32
37
  issues: [issue],
33
38
  };
34
39
  }
40
+ /**
41
+ * A git root project has no member repos to manage, but it does own the
42
+ * worktree bootstrap hook that makes `git worktree add` materialize
43
+ * conventions. That hook was previously reachable only from the interactive
44
+ * OAuth `init`, so any project configured before it existed had no way to get
45
+ * one. Installing it here is the doctor's whole job for this layout — member
46
+ * repo management (exclude, link, entry points) stays out of it.
47
+ *
48
+ * A project whose hook infrastructure the CLI must not touch is not a broken
49
+ * project: it keeps exit 0 (the code a git root project has always returned)
50
+ * and is told to use the manual per-worktree `agentteams init` fallback.
51
+ */
52
+ function runGitRootDoctor(rootDir) {
53
+ const preflightIssues = validateRootPreflight(rootDir);
54
+ if (preflightIssues.length > 0) {
55
+ return {
56
+ status: 'DEGRADED',
57
+ layout: 'git-root',
58
+ applicable: true,
59
+ changedCount: 0,
60
+ rootDir,
61
+ rootEntryPoints: [],
62
+ missingRecommendedEntryPoints: [],
63
+ repositories: [],
64
+ rootHook: 'skipped',
65
+ issues: preflightIssues,
66
+ };
67
+ }
68
+ const hookResult = ensurePostCheckoutHook(rootDir);
69
+ const blockedByUserHookConfig = hookResult.status === 'blocked' && USER_HOOK_CONFIG_CODES.has(hookResult.issue?.code ?? '');
70
+ const issues = hookResult.issue
71
+ ? [
72
+ blockedByUserHookConfig
73
+ ? {
74
+ ...hookResult.issue,
75
+ message: `${hookResult.issue.message} Run 'agentteams init' from the root of each new worktree instead.`,
76
+ severity: 'info',
77
+ }
78
+ : { ...hookResult.issue, severity: 'error' },
79
+ ]
80
+ : [];
81
+ return {
82
+ status: hookResult.status === 'ready' || blockedByUserHookConfig ? 'READY' : 'DEGRADED',
83
+ layout: 'git-root',
84
+ applicable: true,
85
+ changedCount: hookResult.changed ? 1 : 0,
86
+ rootDir,
87
+ rootEntryPoints: [],
88
+ missingRecommendedEntryPoints: [],
89
+ repositories: [],
90
+ rootHook: hookResult.status,
91
+ issues,
92
+ };
93
+ }
35
94
  /**
36
95
  * Validate the root before any member mutation. The check never echoes the
37
96
  * config body or API key — only paths appear in issues.
@@ -176,24 +235,21 @@ function runDoctor(options) {
176
235
  });
177
236
  }
178
237
  if (!isNonGitRootProject(rootDir)) {
179
- return notApplicableResult(rootDir, {
180
- code: 'git-root-project',
181
- path: rootDir,
182
- message: `${rootDir} is a git repository root project; the doctor only manages non-git root projects.`,
183
- severity: 'info',
184
- });
238
+ return runGitRootDoctor(rootDir);
185
239
  }
186
240
  const issues = [];
187
241
  const preflightIssues = validateRootPreflight(rootDir);
188
242
  if (preflightIssues.length > 0) {
189
243
  return {
190
244
  status: 'DEGRADED',
245
+ layout: 'non-git-root',
191
246
  applicable: true,
192
247
  changedCount: 0,
193
248
  rootDir,
194
249
  rootEntryPoints: [],
195
250
  missingRecommendedEntryPoints: [],
196
251
  repositories: [],
252
+ rootHook: 'skipped',
197
253
  issues: preflightIssues,
198
254
  };
199
255
  }
@@ -234,12 +290,15 @@ function runDoctor(options) {
234
290
  const degraded = issues.some((issue) => issue.severity === 'error') || repositories.some((repo) => repo.status === 'DEGRADED');
235
291
  return {
236
292
  status: degraded ? 'DEGRADED' : 'READY',
293
+ layout: 'non-git-root',
237
294
  applicable: true,
238
295
  changedCount: repositories.reduce((sum, repo) => sum + repo.changedCount, 0),
239
296
  rootDir,
240
297
  rootEntryPoints: [...rootEntryPoints],
241
298
  missingRecommendedEntryPoints: [...missingRecommendedEntryPoints],
242
299
  repositories,
300
+ // Hooks for this layout are installed per member repo, not on the root.
301
+ rootHook: 'skipped',
243
302
  issues,
244
303
  };
245
304
  }
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ export type WorktreeInitResult = {
30
30
  worktreePath: string;
31
31
  sourcePath: string;
32
32
  targetPath: string;
33
- materialization: 'symlink' | 'copy' | 'existing' | 'blocked';
33
+ materialization: 'symlink' | 'copy' | 'relinked' | 'existing' | 'blocked';
34
34
  entryPoints: WorktreeEntryPointEntry[];
35
35
  issues: ConventionIssue[];
36
36
  warning?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAyBA,OAAO,EAOL,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AAwBpC,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7D,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,UAAU,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAoCvD,wBAAgB,YAAY,IAAI,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAcxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAYlH;AAuMD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAiG9E;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAEnF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8BA,OAAO,EAQL,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACpB,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AAyBpC,KAAK,WAAW,GAAG;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAEhE,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,uBAAuB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1E,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,UAAU,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAoCvD,wBAAgB,YAAY,IAAI,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAcxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAYlH;AAgbD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA6F9E;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAEnF"}
@@ -1,4 +1,4 @@
1
- import { appendFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs';
1
+ import { appendFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs';
2
2
  import { basename, dirname, join, resolve } from 'node:path';
3
3
  import { constants, createCipheriv, publicEncrypt, randomBytes } from 'node:crypto';
4
4
  import { multiselect, isCancel, cancel } from '@clack/prompts';
@@ -10,8 +10,9 @@ import { createSpinner, withSpinner } from '../utils/spinner.js';
10
10
  import { withCommandContext } from '../utils/commandContext.js';
11
11
  import { conventionDownload } from './convention.js';
12
12
  import { resolveGitTopLevel, resolveMainCheckoutRoot } from '../utils/git.js';
13
+ import { canonicalizePath } from '../utils/path.js';
13
14
  import { buildAuthHeaders } from '../utils/apiContext.js';
14
- import { DEFAULT_CONVENTION_REFERENCE, ensureConventionEntryPoints, ensureLocalExclude, ensurePostCheckoutHook, isReadableRegularFile, toAnchoredExcludePattern, } from '../utils/conventionLink.js';
15
+ import { DEFAULT_CONVENTION_REFERENCE, ensureConventionEntryPoints, ensureLocalExclude, ensurePostCheckoutHook, isReadableRegularFile, resolveGitCommonDir, toAnchoredExcludePattern, } from '../utils/conventionLink.js';
15
16
  const AUTH_BASE_URL = process.env.AGENTTEAMS_WEB_URL || 'https://agentteams.run';
16
17
  const AGENT_ENTRY_POINT_FILES = [
17
18
  { value: 'CLAUDE.md', label: 'CLAUDE.md', hint: 'Claude Code' },
@@ -22,6 +23,7 @@ const AGENT_ENTRY_POINT_FILES = [
22
23
  const CONFIG_DIR = '.agentteams';
23
24
  const CONFIG_FILE = 'config.json';
24
25
  const CONVENTION_FILE = 'convention.md';
26
+ const RELINK_BACKUP_NAME = 'agentteams-relink';
25
27
  const AUTH_PATH_PUBLIC_KEY_PEM = `-----BEGIN PUBLIC KEY-----
26
28
  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs9s9+n0C8Z099LrOTlKB
27
29
  83c2WluO/TxZFxJQ07XgfKJ2RG/8K2kvCwVKeSgzzBP/hmY2qWAgAOrXIoSHNYGt
@@ -232,6 +234,221 @@ function isConfiguredMainCheckout(sourcePath) {
232
234
  return false;
233
235
  }
234
236
  }
237
+ /**
238
+ * Materialize the worktree's `.agentteams` entry as a real link.
239
+ *
240
+ * Windows directory symlinks require SeCreateSymbolicLinkPrivilege (Developer
241
+ * Mode or elevation), so an unprivileged win32 run fails with EPERM and used to
242
+ * fall through to a copy — silently breaking the guarantee that a worktree
243
+ * tracks the main checkout's conventions. Junctions need no privilege, which is
244
+ * why `utils/conventionLink.ts` and the daemon's worktree helper already use
245
+ * them; this is the same documented platform exception.
246
+ *
247
+ * The copy fallback stays for environments neither link type supports (UNC
248
+ * paths, filesystems without reparse points). It dereferences because in a
249
+ * non-git-root layout the source is itself a link, and copying a link
250
+ * recursively re-creates it — which fails for exactly the same reason.
251
+ */
252
+ function linkConventionDir(sourcePath, targetPath) {
253
+ try {
254
+ if (process.platform === 'win32') {
255
+ // Junctions only accept absolute targets, so resolve the chain first.
256
+ symlinkSync(realpathSync(sourcePath), targetPath, 'junction');
257
+ }
258
+ else {
259
+ symlinkSync(sourcePath, targetPath, 'dir');
260
+ }
261
+ return { materialization: 'symlink' };
262
+ }
263
+ catch (error) {
264
+ cpSync(sourcePath, targetPath, { recursive: true, dereference: true });
265
+ return {
266
+ materialization: 'copy',
267
+ warning: `Could not create the .agentteams symlink (${error instanceof Error ? error.message : String(error)}). Copied the directory instead.`,
268
+ };
269
+ }
270
+ }
271
+ /**
272
+ * Decide whether a plain directory sitting at the worktree's `.agentteams` may
273
+ * be the copy an earlier failed link attempt left behind, rather than something
274
+ * the user created. Identity is judged by the config file, the one artifact a
275
+ * copy reproduces byte for byte — anything else is treated as the user's and is
276
+ * never touched. This only authorizes moving the directory aside; whether the
277
+ * moved copy may be deleted is decided separately by `findCopyOnlyFiles`.
278
+ */
279
+ function isCopyOfMainCheckout(sourcePath, targetPath) {
280
+ try {
281
+ return (readFileSync(join(targetPath, CONFIG_FILE), 'utf-8') === readFileSync(join(sourcePath, CONFIG_FILE), 'utf-8'));
282
+ }
283
+ catch {
284
+ return false;
285
+ }
286
+ }
287
+ function toErrorMessage(error) {
288
+ return error instanceof Error ? error.message : String(error);
289
+ }
290
+ function hasIdenticalFile(sourceFile, backupFile) {
291
+ try {
292
+ const sourceStats = statSync(sourceFile);
293
+ if (!sourceStats.isFile() || sourceStats.size !== statSync(backupFile).size)
294
+ return false;
295
+ return readFileSync(sourceFile).equals(readFileSync(backupFile));
296
+ }
297
+ catch {
298
+ return false;
299
+ }
300
+ }
301
+ /**
302
+ * List every file in the moved-aside copy that the main checkout does not
303
+ * already hold byte for byte. A worktree that ran as a copy accumulates its own
304
+ * artifacts inside `.agentteams` — runner history, evidence, downloaded plans,
305
+ * review findings — and none of them can be regenerated, so the copy is only
306
+ * safe to delete when it is a strict subset of the source. Anything that is not
307
+ * a plain matching file (a symlink, a special file, an unreadable directory)
308
+ * counts as copy-only: it cannot be proven redundant.
309
+ */
310
+ function findCopyOnlyFiles(backupPath, sourcePath) {
311
+ const copyOnlyFiles = [];
312
+ const walk = (relativeDir) => {
313
+ let entries;
314
+ try {
315
+ entries = readdirSync(join(backupPath, relativeDir), { withFileTypes: true });
316
+ }
317
+ catch {
318
+ copyOnlyFiles.push(relativeDir || '.');
319
+ return;
320
+ }
321
+ for (const entry of entries) {
322
+ const relativePath = relativeDir ? join(relativeDir, entry.name) : entry.name;
323
+ if (entry.isDirectory()) {
324
+ walk(relativePath);
325
+ }
326
+ else if (!entry.isFile() || !hasIdenticalFile(join(sourcePath, relativePath), join(backupPath, relativePath))) {
327
+ copyOnlyFiles.push(relativePath);
328
+ }
329
+ }
330
+ };
331
+ walk('');
332
+ return copyOnlyFiles;
333
+ }
334
+ /**
335
+ * Park the copy outside every tracked surface while the link is created. A
336
+ * backup next to `.agentteams` would show up in `git status` — the anchored
337
+ * `/.agentteams` exclude is an exact match and does not cover a sibling name —
338
+ * and the copied `config.json` carries the project apiKey. `git-common-dir` is
339
+ * part of no working tree, so nothing can surface from there. A worktree on a
340
+ * different volume cannot be renamed into it, and only then does the
341
+ * in-worktree fallback apply — after registering its own exclude pattern.
342
+ */
343
+ function moveConventionCopyAside(worktreePath, targetPath) {
344
+ const failures = [];
345
+ const commonDir = resolveGitCommonDir(worktreePath);
346
+ if (commonDir) {
347
+ const backupPath = join(commonDir, `${RELINK_BACKUP_NAME}-${process.pid}`);
348
+ try {
349
+ renameSync(targetPath, backupPath);
350
+ return { backupPath };
351
+ }
352
+ catch (error) {
353
+ failures.push(toErrorMessage(error));
354
+ }
355
+ }
356
+ const excludeResult = ensureLocalExclude(worktreePath, [toAnchoredExcludePattern(`.${RELINK_BACKUP_NAME}`)]);
357
+ if (excludeResult.status !== 'ready') {
358
+ failures.push(`the in-worktree backup cannot be kept out of git status (${excludeResult.issue?.message ?? 'local exclude is blocked'})`);
359
+ return { error: failures.join('; ') };
360
+ }
361
+ try {
362
+ const backupPath = join(worktreePath, `.${RELINK_BACKUP_NAME}`);
363
+ renameSync(targetPath, backupPath);
364
+ return { backupPath };
365
+ }
366
+ catch (error) {
367
+ failures.push(toErrorMessage(error));
368
+ return { error: failures.join('; ') };
369
+ }
370
+ }
371
+ /** Undo the move-aside. The target may hold a fresh link or a partial copy, and
372
+ * `renameSync` onto a non-empty directory fails with ENOTEMPTY, so clear it
373
+ * first and never let the restore itself escape as an exception. */
374
+ function restoreConventionCopy(backupPath, targetPath) {
375
+ try {
376
+ rmSync(targetPath, { recursive: true, force: true });
377
+ renameSync(backupPath, targetPath);
378
+ return true;
379
+ }
380
+ catch {
381
+ return false;
382
+ }
383
+ }
384
+ /**
385
+ * Replace a copied `.agentteams` directory with a real link so a worktree that
386
+ * predates the link fix starts tracking the main checkout again. Without this
387
+ * the `existing` branch treats the copy as settled and the worktree keeps
388
+ * serving stale conventions forever.
389
+ *
390
+ * The copy is moved aside first and is deleted only once the link is in place
391
+ * *and* the copy proves to be a strict subset of the main checkout; otherwise
392
+ * the backup is kept and its path reported. Any failure restores the original
393
+ * directory, and a failed restore reports where the original is.
394
+ */
395
+ function promoteCopiedConventionDir(worktreePath, sourcePath, targetPath) {
396
+ if (!isCopyOfMainCheckout(sourcePath, targetPath)) {
397
+ return {
398
+ materialization: 'existing',
399
+ issue: {
400
+ code: 'link-occupied',
401
+ path: targetPath,
402
+ message: `The directory at ${targetPath} does not match the main checkout's ${CONFIG_DIR}; leaving it untouched. Remove it manually to restore the convention link.`,
403
+ },
404
+ };
405
+ }
406
+ const moved = moveConventionCopyAside(worktreePath, targetPath);
407
+ if ('error' in moved) {
408
+ return {
409
+ materialization: 'existing',
410
+ issue: {
411
+ code: 'link-create-failed',
412
+ path: targetPath,
413
+ message: `Could not move the copied ${CONFIG_DIR} aside at ${targetPath}: ${moved.error}`,
414
+ },
415
+ };
416
+ }
417
+ const { backupPath } = moved;
418
+ try {
419
+ const { materialization } = linkConventionDir(sourcePath, targetPath);
420
+ // A copy fallback here would only rebuild the state being replaced.
421
+ if (materialization !== 'symlink') {
422
+ throw new Error('the link could not be created and a copy would not restore the convention chain');
423
+ }
424
+ }
425
+ catch (error) {
426
+ const restored = restoreConventionCopy(backupPath, targetPath);
427
+ return {
428
+ materialization: 'existing',
429
+ issue: {
430
+ code: 'link-create-failed',
431
+ path: targetPath,
432
+ message: restored
433
+ ? `Could not relink ${targetPath} to the main checkout: ${toErrorMessage(error)}`
434
+ : `Could not relink ${targetPath} to the main checkout: ${toErrorMessage(error)}. The original ${CONFIG_DIR} was left at ${backupPath}; move it back manually.`,
435
+ },
436
+ };
437
+ }
438
+ const copyOnlyFiles = findCopyOnlyFiles(backupPath, sourcePath);
439
+ if (copyOnlyFiles.length > 0) {
440
+ return {
441
+ materialization: 'relinked',
442
+ issue: {
443
+ code: 'link-backup-retained',
444
+ path: backupPath,
445
+ message: `Kept ${copyOnlyFiles.length} file(s) that exist only in the replaced ${CONFIG_DIR} copy (${copyOnlyFiles.slice(0, 3).join(', ')}${copyOnlyFiles.length > 3 ? ', …' : ''}) at ${backupPath}; move what you still need out of it and delete it.`,
446
+ },
447
+ };
448
+ }
449
+ rmSync(backupPath, { recursive: true, force: true });
450
+ return { materialization: 'relinked' };
451
+ }
235
452
  function isBrokenSymbolicLink(path) {
236
453
  try {
237
454
  return lstatSync(path).isSymbolicLink() && !existsSync(path);
@@ -243,7 +460,7 @@ function isBrokenSymbolicLink(path) {
243
460
  export function bootstrapLinkedWorktree(cwd) {
244
461
  let worktreePath;
245
462
  try {
246
- worktreePath = realpathSync(resolve(cwd));
463
+ worktreePath = canonicalizePath(resolve(cwd));
247
464
  }
248
465
  catch {
249
466
  return null;
@@ -262,7 +479,7 @@ export function bootstrapLinkedWorktree(cwd) {
262
479
  // so the entry point set is read from the actual root — not the member repo.
263
480
  let conventionRoot = null;
264
481
  try {
265
- conventionRoot = dirname(realpathSync(sourcePath));
482
+ conventionRoot = dirname(canonicalizePath(sourcePath));
266
483
  }
267
484
  catch {
268
485
  conventionRoot = null;
@@ -289,30 +506,25 @@ export function bootstrapLinkedWorktree(cwd) {
289
506
  }
290
507
  else if (isBrokenSymbolicLink(targetPath)) {
291
508
  unlinkSync(targetPath);
292
- try {
293
- symlinkSync(sourcePath, targetPath, 'dir');
294
- materialization = 'symlink';
295
- }
296
- catch (error) {
297
- warning = `Could not create the .agentteams symlink (${error instanceof Error ? error.message : String(error)}). Copied the directory instead.`;
298
- cpSync(sourcePath, targetPath, { recursive: true });
299
- materialization = 'copy';
300
- }
509
+ ({ materialization, warning } = linkConventionDir(sourcePath, targetPath));
301
510
  }
302
511
  else if (existsSync(targetPath)) {
303
- materialization = 'existing';
304
- }
305
- else {
306
- try {
307
- symlinkSync(sourcePath, targetPath, 'dir');
308
- materialization = 'symlink';
512
+ // An entry that is already a link is settled; a plain directory is either a
513
+ // copy left by a failed link attempt or something the user put there.
514
+ if (lstatSync(targetPath).isSymbolicLink()) {
515
+ materialization = 'existing';
309
516
  }
310
- catch (error) {
311
- warning = `Could not create the .agentteams symlink (${error instanceof Error ? error.message : String(error)}). Copied the directory instead.`;
312
- cpSync(sourcePath, targetPath, { recursive: true });
313
- materialization = 'copy';
517
+ else {
518
+ const promotion = promoteCopiedConventionDir(worktreePath, sourcePath, targetPath);
519
+ materialization = promotion.materialization;
520
+ if (promotion.issue) {
521
+ issues.push(promotion.issue);
522
+ }
314
523
  }
315
524
  }
525
+ else {
526
+ ({ materialization, warning } = linkConventionDir(sourcePath, targetPath));
527
+ }
316
528
  const entryPointResult = ensureConventionEntryPoints(worktreePath, selectedEntryPoints, {
317
529
  allowCreate: excludeReady,
318
530
  validateExistingReference: false,
@@ -347,7 +559,7 @@ async function executeInitCommandWithContext(options) {
347
559
  const projectName = basename(cwd);
348
560
  let authContext;
349
561
  try {
350
- authContext = startLocalAuthServer();
562
+ authContext = await startLocalAuthServer();
351
563
  }
352
564
  catch (error) {
353
565
  throw new Error(`Failed to start local OAuth server: ${error instanceof Error ? error.message : String(error)}`);