@bradygaster/squad-cli 0.7.0 → 0.8.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.
Files changed (200) hide show
  1. package/README.md +77 -77
  2. package/dist/cli/commands/copilot.d.ts +13 -0
  3. package/dist/cli/commands/copilot.d.ts.map +1 -0
  4. package/dist/cli/commands/copilot.js +86 -0
  5. package/dist/cli/commands/copilot.js.map +1 -0
  6. package/dist/cli/commands/export.d.ts +9 -0
  7. package/dist/cli/commands/export.d.ts.map +1 -0
  8. package/dist/cli/commands/export.js +89 -0
  9. package/dist/cli/commands/export.js.map +1 -0
  10. package/dist/cli/commands/import.d.ts +9 -0
  11. package/dist/cli/commands/import.d.ts.map +1 -0
  12. package/dist/cli/commands/import.js +116 -0
  13. package/dist/cli/commands/import.js.map +1 -0
  14. package/dist/cli/commands/plugin.d.ts +14 -0
  15. package/dist/cli/commands/plugin.d.ts.map +1 -0
  16. package/dist/cli/commands/plugin.js +134 -0
  17. package/dist/cli/commands/plugin.js.map +1 -0
  18. package/dist/cli/commands/watch.d.ts +8 -0
  19. package/dist/cli/commands/watch.d.ts.map +1 -0
  20. package/dist/cli/commands/watch.js +178 -0
  21. package/dist/cli/commands/watch.js.map +1 -0
  22. package/dist/cli/copilot-install.d.ts +73 -0
  23. package/dist/cli/copilot-install.d.ts.map +1 -0
  24. package/dist/cli/copilot-install.js +117 -0
  25. package/dist/cli/copilot-install.js.map +1 -0
  26. package/dist/cli/core/detect-squad-dir.d.ts +13 -0
  27. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -0
  28. package/dist/cli/core/detect-squad-dir.js +21 -0
  29. package/dist/cli/core/detect-squad-dir.js.map +1 -0
  30. package/dist/cli/core/email-scrub.d.ts +10 -0
  31. package/dist/cli/core/email-scrub.d.ts.map +1 -0
  32. package/dist/cli/core/email-scrub.js +103 -0
  33. package/dist/cli/core/email-scrub.js.map +1 -0
  34. package/dist/cli/core/errors.d.ts +17 -0
  35. package/dist/cli/core/errors.d.ts.map +1 -0
  36. package/dist/cli/core/errors.js +22 -0
  37. package/dist/cli/core/errors.js.map +1 -0
  38. package/dist/cli/core/gh-cli.d.ts +41 -0
  39. package/dist/cli/core/gh-cli.d.ts.map +1 -0
  40. package/dist/cli/core/gh-cli.js +67 -0
  41. package/dist/cli/core/gh-cli.js.map +1 -0
  42. package/dist/cli/core/history-split.d.ts +9 -0
  43. package/dist/cli/core/history-split.d.ts.map +1 -0
  44. package/dist/cli/core/history-split.js +65 -0
  45. package/dist/cli/core/history-split.js.map +1 -0
  46. package/dist/cli/core/init.d.ts +9 -0
  47. package/dist/cli/core/init.d.ts.map +1 -0
  48. package/dist/cli/core/init.js +296 -0
  49. package/dist/cli/core/init.js.map +1 -0
  50. package/dist/cli/core/migrate-directory.d.ts +11 -0
  51. package/dist/cli/core/migrate-directory.d.ts.map +1 -0
  52. package/dist/cli/core/migrate-directory.js +71 -0
  53. package/dist/cli/core/migrate-directory.js.map +1 -0
  54. package/dist/cli/core/migrations.d.ts +11 -0
  55. package/dist/cli/core/migrations.d.ts.map +1 -0
  56. package/dist/cli/core/migrations.js +78 -0
  57. package/dist/cli/core/migrations.js.map +1 -0
  58. package/dist/cli/core/output.d.ts +34 -0
  59. package/dist/cli/core/output.d.ts.map +1 -0
  60. package/dist/cli/core/output.js +47 -0
  61. package/dist/cli/core/output.js.map +1 -0
  62. package/dist/cli/core/project-type.d.ts +9 -0
  63. package/dist/cli/core/project-type.d.ts.map +1 -0
  64. package/dist/cli/core/project-type.js +29 -0
  65. package/dist/cli/core/project-type.js.map +1 -0
  66. package/dist/cli/core/team-md.d.ts +28 -0
  67. package/dist/cli/core/team-md.d.ts.map +1 -0
  68. package/dist/cli/core/team-md.js +91 -0
  69. package/dist/cli/core/team-md.js.map +1 -0
  70. package/dist/cli/core/templates.d.ts +30 -0
  71. package/dist/cli/core/templates.d.ts.map +1 -0
  72. package/dist/cli/core/templates.js +247 -0
  73. package/dist/cli/core/templates.js.map +1 -0
  74. package/dist/cli/core/upgrade.d.ts +20 -0
  75. package/dist/cli/core/upgrade.d.ts.map +1 -0
  76. package/dist/cli/core/upgrade.js +399 -0
  77. package/dist/cli/core/upgrade.js.map +1 -0
  78. package/dist/cli/core/version.d.ts +18 -0
  79. package/dist/cli/core/version.d.ts.map +1 -0
  80. package/dist/cli/core/version.js +61 -0
  81. package/dist/cli/core/version.js.map +1 -0
  82. package/dist/cli/core/workflows.d.ts +10 -0
  83. package/dist/cli/core/workflows.d.ts.map +1 -0
  84. package/dist/cli/core/workflows.js +155 -0
  85. package/dist/cli/core/workflows.js.map +1 -0
  86. package/dist/cli/index.d.ts +26 -0
  87. package/dist/cli/index.d.ts.map +1 -0
  88. package/dist/cli/index.js +26 -0
  89. package/dist/cli/index.js.map +1 -0
  90. package/dist/cli/shell/autocomplete.d.ts +12 -0
  91. package/dist/cli/shell/autocomplete.d.ts.map +1 -0
  92. package/dist/cli/shell/autocomplete.js +39 -0
  93. package/dist/cli/shell/autocomplete.js.map +1 -0
  94. package/dist/cli/shell/commands.d.ts +19 -0
  95. package/dist/cli/shell/commands.d.ts.map +1 -0
  96. package/dist/cli/shell/commands.js +87 -0
  97. package/dist/cli/shell/commands.js.map +1 -0
  98. package/dist/cli/shell/components/AgentPanel.d.ts +8 -0
  99. package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -0
  100. package/dist/cli/shell/components/AgentPanel.js +17 -0
  101. package/dist/cli/shell/components/AgentPanel.js.map +1 -0
  102. package/dist/cli/shell/components/InputPrompt.d.ts +9 -0
  103. package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -0
  104. package/dist/cli/shell/components/InputPrompt.js +50 -0
  105. package/dist/cli/shell/components/InputPrompt.js.map +1 -0
  106. package/dist/cli/shell/components/MessageStream.d.ts +13 -0
  107. package/dist/cli/shell/components/MessageStream.d.ts.map +1 -0
  108. package/dist/cli/shell/components/MessageStream.js +7 -0
  109. package/dist/cli/shell/components/MessageStream.js.map +1 -0
  110. package/dist/cli/shell/components/index.d.ts +4 -0
  111. package/dist/cli/shell/components/index.d.ts.map +1 -0
  112. package/dist/cli/shell/components/index.js +4 -0
  113. package/dist/cli/shell/components/index.js.map +1 -0
  114. package/dist/cli/shell/coordinator.d.ts +32 -0
  115. package/dist/cli/shell/coordinator.d.ts.map +1 -0
  116. package/dist/cli/shell/coordinator.js +113 -0
  117. package/dist/cli/shell/coordinator.js.map +1 -0
  118. package/dist/cli/shell/index.d.ts +28 -0
  119. package/dist/cli/shell/index.d.ts.map +1 -0
  120. package/dist/cli/shell/index.js +66 -0
  121. package/dist/cli/shell/index.js.map +1 -0
  122. package/dist/cli/shell/lifecycle.d.ts +52 -0
  123. package/dist/cli/shell/lifecycle.d.ts.map +1 -0
  124. package/dist/cli/shell/lifecycle.js +168 -0
  125. package/dist/cli/shell/lifecycle.js.map +1 -0
  126. package/dist/cli/shell/memory.d.ts +36 -0
  127. package/dist/cli/shell/memory.d.ts.map +1 -0
  128. package/dist/cli/shell/memory.js +53 -0
  129. package/dist/cli/shell/memory.js.map +1 -0
  130. package/dist/cli/shell/render.d.ts +22 -0
  131. package/dist/cli/shell/render.d.ts.map +1 -0
  132. package/dist/cli/shell/render.js +44 -0
  133. package/dist/cli/shell/render.js.map +1 -0
  134. package/dist/cli/shell/router.d.ts +17 -0
  135. package/dist/cli/shell/router.d.ts.map +1 -0
  136. package/dist/cli/shell/router.js +55 -0
  137. package/dist/cli/shell/router.js.map +1 -0
  138. package/dist/cli/shell/sessions.d.ts +15 -0
  139. package/dist/cli/shell/sessions.d.ts.map +1 -0
  140. package/dist/cli/shell/sessions.js +37 -0
  141. package/dist/cli/shell/sessions.js.map +1 -0
  142. package/dist/cli/shell/spawn.d.ts +47 -0
  143. package/dist/cli/shell/spawn.d.ts.map +1 -0
  144. package/dist/cli/shell/spawn.js +77 -0
  145. package/dist/cli/shell/spawn.js.map +1 -0
  146. package/dist/cli/shell/stream-bridge.d.ts +60 -0
  147. package/dist/cli/shell/stream-bridge.d.ts.map +1 -0
  148. package/dist/cli/shell/stream-bridge.js +98 -0
  149. package/dist/cli/shell/stream-bridge.js.map +1 -0
  150. package/dist/cli/shell/terminal.d.ts +30 -0
  151. package/dist/cli/shell/terminal.d.ts.map +1 -0
  152. package/dist/cli/shell/terminal.js +34 -0
  153. package/dist/cli/shell/terminal.js.map +1 -0
  154. package/dist/cli/shell/types.d.ts +21 -0
  155. package/dist/cli/shell/types.d.ts.map +1 -0
  156. package/dist/cli/shell/types.js +5 -0
  157. package/dist/cli/shell/types.js.map +1 -0
  158. package/dist/cli/upgrade.d.ts +141 -0
  159. package/dist/cli/upgrade.d.ts.map +1 -0
  160. package/dist/cli/upgrade.js +226 -0
  161. package/dist/cli/upgrade.js.map +1 -0
  162. package/dist/cli-entry.d.ts +10 -0
  163. package/dist/cli-entry.d.ts.map +1 -0
  164. package/dist/cli-entry.js +213 -0
  165. package/dist/cli-entry.js.map +1 -0
  166. package/package.json +44 -34
  167. package/templates/casting-history.json +4 -0
  168. package/templates/casting-policy.json +35 -0
  169. package/templates/casting-registry.json +3 -0
  170. package/templates/ceremonies.md +41 -0
  171. package/templates/charter.md +53 -0
  172. package/templates/constraint-tracking.md +38 -0
  173. package/templates/copilot-instructions.md +46 -0
  174. package/templates/history.md +10 -0
  175. package/templates/identity/now.md +9 -0
  176. package/templates/identity/wisdom.md +15 -0
  177. package/templates/mcp-config.md +90 -0
  178. package/templates/multi-agent-format.md +28 -0
  179. package/templates/orchestration-log.md +27 -0
  180. package/templates/plugin-marketplace.md +49 -0
  181. package/templates/raw-agent-output.md +37 -0
  182. package/templates/roster.md +60 -0
  183. package/templates/routing.md +54 -0
  184. package/templates/run-output.md +50 -0
  185. package/templates/scribe-charter.md +119 -0
  186. package/templates/skill.md +24 -0
  187. package/templates/skills/squad-conventions/SKILL.md +69 -0
  188. package/templates/squad.agent.md +1146 -0
  189. package/templates/workflows/squad-ci.yml +24 -0
  190. package/templates/workflows/squad-docs.yml +50 -0
  191. package/templates/workflows/squad-heartbeat.yml +315 -0
  192. package/templates/workflows/squad-insider-release.yml +61 -0
  193. package/templates/workflows/squad-issue-assign.yml +161 -0
  194. package/templates/workflows/squad-label-enforce.yml +181 -0
  195. package/templates/workflows/squad-main-guard.yml +129 -0
  196. package/templates/workflows/squad-preview.yml +55 -0
  197. package/templates/workflows/squad-promote.yml +121 -0
  198. package/templates/workflows/squad-release.yml +77 -0
  199. package/templates/workflows/squad-triage.yml +260 -0
  200. package/templates/workflows/sync-squad-labels.yml +169 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/cli/shell/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYnC;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO;QACL,aAAa,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;QAC5D,eAAe,EAAE,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,oCAAoC;QAC7G,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI,KAAK,OAAO;QAC3B,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAa,EAAE,IAA0B;IACjF,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA0B;IACjD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shell-specific type definitions for the Squad interactive shell.
3
+ */
4
+ export interface ShellState {
5
+ status: 'initializing' | 'ready' | 'processing' | 'error';
6
+ activeAgents: Map<string, AgentSession>;
7
+ messageHistory: ShellMessage[];
8
+ }
9
+ export interface ShellMessage {
10
+ role: 'user' | 'agent' | 'system';
11
+ agentName?: string;
12
+ content: string;
13
+ timestamp: Date;
14
+ }
15
+ export interface AgentSession {
16
+ name: string;
17
+ role: string;
18
+ status: 'idle' | 'working' | 'streaming' | 'error';
19
+ startedAt: Date;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/shell/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IAC1D,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IACnD,SAAS,EAAE,IAAI,CAAC;CACjB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shell-specific type definitions for the Squad interactive shell.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/shell/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Squad Upgrade Command (M4-4 & M4-5, Issues #103 & #104)
3
+ *
4
+ * Self-update support for the Squad CLI and SDK dependency.
5
+ * Version comparison via semver, pluggable version fetcher,
6
+ * and SDK upgrade with migration support.
7
+ *
8
+ * @module cli/upgrade
9
+ */
10
+ import { MigrationRegistry } from '@bradygaster/squad-sdk/config';
11
+ /** Release channel for updates. */
12
+ export type ReleaseChannel = 'stable' | 'preview' | 'insider';
13
+ /** Information about an available update. */
14
+ export interface UpdateInfo {
15
+ /** New version available */
16
+ newVersion: string;
17
+ /** URL to the release page */
18
+ releaseUrl: string;
19
+ /** Changelog / release notes */
20
+ changelog: string;
21
+ }
22
+ /** Options for performing an upgrade. */
23
+ export interface UpgradeOptions {
24
+ /** Force upgrade even if already on latest */
25
+ force?: boolean;
26
+ /** Simulate without applying changes */
27
+ dryRun?: boolean;
28
+ /** Release channel to pull from */
29
+ channel?: ReleaseChannel;
30
+ }
31
+ /** Result of an upgrade operation. */
32
+ export interface UpgradeResult {
33
+ /** Whether the upgrade succeeded */
34
+ success: boolean;
35
+ /** Version we upgraded from */
36
+ fromVersion: string;
37
+ /** Version we upgraded to */
38
+ toVersion: string;
39
+ /** Summary of changes applied */
40
+ changes: string[];
41
+ }
42
+ /** Options specific to SDK upgrades (--sdk flag). */
43
+ export interface SDKUpgradeOptions {
44
+ /** Force upgrade even if already on latest */
45
+ force?: boolean;
46
+ /** Simulate without applying changes */
47
+ dryRun?: boolean;
48
+ /** Release channel */
49
+ channel?: ReleaseChannel;
50
+ /** MigrationRegistry for config migrations between SDK versions */
51
+ migrationRegistry?: MigrationRegistry;
52
+ }
53
+ /** Result of an SDK upgrade operation. */
54
+ export interface SDKUpgradeResult {
55
+ /** Whether the upgrade succeeded */
56
+ success: boolean;
57
+ /** Previous SDK version */
58
+ fromVersion: string;
59
+ /** New SDK version */
60
+ toVersion: string;
61
+ /** Changes applied */
62
+ changes: string[];
63
+ /** Migration steps applied (if config schema changed) */
64
+ migrationSteps: string[];
65
+ }
66
+ /**
67
+ * Pluggable version fetcher.
68
+ * Consumers replace this to wire in their own registry/network logic.
69
+ */
70
+ export type VersionFetcher = (channel: ReleaseChannel) => Promise<string>;
71
+ /**
72
+ * Pluggable package.json reader for SDK upgrades.
73
+ */
74
+ export type PackageJsonReader = (projectDir: string) => Promise<{
75
+ version: string;
76
+ dependencies?: Record<string, string>;
77
+ }>;
78
+ /**
79
+ * Pluggable package.json writer for SDK upgrades.
80
+ */
81
+ export type PackageJsonWriter = (projectDir: string, version: string) => Promise<void>;
82
+ /** Register a custom version fetcher. */
83
+ export declare function setVersionFetcher(fn: VersionFetcher): void;
84
+ /** Register a custom package.json reader. */
85
+ export declare function setPackageJsonReader(fn: PackageJsonReader): void;
86
+ /** Register a custom package.json writer. */
87
+ export declare function setPackageJsonWriter(fn: PackageJsonWriter): void;
88
+ interface ParsedVersion {
89
+ major: number;
90
+ minor: number;
91
+ patch: number;
92
+ prerelease: string;
93
+ raw: string;
94
+ }
95
+ /**
96
+ * Parse a version string into components.
97
+ * Supports optional pre-release suffix (e.g. "1.2.3-alpha.0").
98
+ */
99
+ export declare function parseVersion(version: string): ParsedVersion;
100
+ /**
101
+ * Compare two version strings.
102
+ * @returns negative if a < b, 0 if equal, positive if a > b
103
+ */
104
+ export declare function compareVersions(a: string, b: string): number;
105
+ /** Returns true when `candidate` is newer than `current`. */
106
+ export declare function isNewer(current: string, candidate: string): boolean;
107
+ /**
108
+ * Fetch the latest version string for the given channel.
109
+ * Delegates to the pluggable VersionFetcher.
110
+ */
111
+ export declare function getLatestVersion(channel?: ReleaseChannel): Promise<string>;
112
+ /**
113
+ * Check whether an update is available for the CLI.
114
+ *
115
+ * @param currentVersion - Currently installed version
116
+ * @param channel - Release channel (default: stable)
117
+ * @returns UpdateInfo if a newer version exists, otherwise null
118
+ */
119
+ export declare function checkForUpdate(currentVersion: string, channel?: ReleaseChannel): Promise<UpdateInfo | null>;
120
+ /**
121
+ * Perform a CLI self-upgrade.
122
+ *
123
+ * @param info - UpdateInfo from checkForUpdate
124
+ * @param currentVersion - Currently running version
125
+ * @param options - Upgrade options
126
+ * @returns UpgradeResult describing the outcome
127
+ */
128
+ export declare function performUpgrade(info: UpdateInfo, currentVersion: string, options?: UpgradeOptions): Promise<UpgradeResult>;
129
+ /**
130
+ * Upgrade the @bradygaster/squad SDK dependency in a project.
131
+ *
132
+ * Reads the project's package.json, compares the installed SDK version
133
+ * to the latest available, and optionally runs config migrations.
134
+ *
135
+ * @param projectDir - Path to the project root (containing package.json)
136
+ * @param options - SDK upgrade options
137
+ * @returns SDKUpgradeResult
138
+ */
139
+ export declare function upgradeSDK(projectDir: string, options?: SDKUpgradeOptions): Promise<SDKUpgradeResult>;
140
+ export {};
141
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAMlE,mCAAmC;AACnC,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9D,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE1E;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC,CAAC;AAE5H;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAkBvF,yCAAyC;AACzC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAE1D;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAEhE;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAEhE;AAMD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAY3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAc5D;AAED,6DAA6D;AAC7D,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnE;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,cAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,cAAyB,GACjC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAY5B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA6BxB;AAQD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAuE3B"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Squad Upgrade Command (M4-4 & M4-5, Issues #103 & #104)
3
+ *
4
+ * Self-update support for the Squad CLI and SDK dependency.
5
+ * Version comparison via semver, pluggable version fetcher,
6
+ * and SDK upgrade with migration support.
7
+ *
8
+ * @module cli/upgrade
9
+ */
10
+ // ============================================================================
11
+ // Default (stub) implementations — replaced in production
12
+ // ============================================================================
13
+ let _versionFetcher = async (_channel) => {
14
+ throw new Error('No version fetcher configured. Call setVersionFetcher() first.');
15
+ };
16
+ let _packageJsonReader = async (_dir) => {
17
+ throw new Error('No package.json reader configured. Call setPackageJsonReader() first.');
18
+ };
19
+ let _packageJsonWriter = async (_dir, _v) => {
20
+ throw new Error('No package.json writer configured. Call setPackageJsonWriter() first.');
21
+ };
22
+ /** Register a custom version fetcher. */
23
+ export function setVersionFetcher(fn) {
24
+ _versionFetcher = fn;
25
+ }
26
+ /** Register a custom package.json reader. */
27
+ export function setPackageJsonReader(fn) {
28
+ _packageJsonReader = fn;
29
+ }
30
+ /** Register a custom package.json writer. */
31
+ export function setPackageJsonWriter(fn) {
32
+ _packageJsonWriter = fn;
33
+ }
34
+ const VERSION_RE = /^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/;
35
+ /**
36
+ * Parse a version string into components.
37
+ * Supports optional pre-release suffix (e.g. "1.2.3-alpha.0").
38
+ */
39
+ export function parseVersion(version) {
40
+ const m = version.match(VERSION_RE);
41
+ if (!m) {
42
+ throw new Error(`Invalid version: "${version}"`);
43
+ }
44
+ return {
45
+ major: Number(m[1]),
46
+ minor: Number(m[2]),
47
+ patch: Number(m[3]),
48
+ prerelease: m[4] ?? '',
49
+ raw: version,
50
+ };
51
+ }
52
+ /**
53
+ * Compare two version strings.
54
+ * @returns negative if a < b, 0 if equal, positive if a > b
55
+ */
56
+ export function compareVersions(a, b) {
57
+ const va = parseVersion(a);
58
+ const vb = parseVersion(b);
59
+ if (va.major !== vb.major)
60
+ return va.major - vb.major;
61
+ if (va.minor !== vb.minor)
62
+ return va.minor - vb.minor;
63
+ if (va.patch !== vb.patch)
64
+ return va.patch - vb.patch;
65
+ // No prerelease > has prerelease (1.0.0 > 1.0.0-alpha)
66
+ if (!va.prerelease && vb.prerelease)
67
+ return 1;
68
+ if (va.prerelease && !vb.prerelease)
69
+ return -1;
70
+ // Lexicographic prerelease comparison
71
+ return va.prerelease.localeCompare(vb.prerelease);
72
+ }
73
+ /** Returns true when `candidate` is newer than `current`. */
74
+ export function isNewer(current, candidate) {
75
+ return compareVersions(candidate, current) > 0;
76
+ }
77
+ // ============================================================================
78
+ // Core upgrade API
79
+ // ============================================================================
80
+ /**
81
+ * Fetch the latest version string for the given channel.
82
+ * Delegates to the pluggable VersionFetcher.
83
+ */
84
+ export async function getLatestVersion(channel = 'stable') {
85
+ return _versionFetcher(channel);
86
+ }
87
+ /**
88
+ * Check whether an update is available for the CLI.
89
+ *
90
+ * @param currentVersion - Currently installed version
91
+ * @param channel - Release channel (default: stable)
92
+ * @returns UpdateInfo if a newer version exists, otherwise null
93
+ */
94
+ export async function checkForUpdate(currentVersion, channel = 'stable') {
95
+ const latest = await getLatestVersion(channel);
96
+ if (!isNewer(currentVersion, latest)) {
97
+ return null;
98
+ }
99
+ return {
100
+ newVersion: latest,
101
+ releaseUrl: `https://github.com/bradygaster/squad/releases/tag/v${latest}`,
102
+ changelog: `Update from ${currentVersion} to ${latest}`,
103
+ };
104
+ }
105
+ /**
106
+ * Perform a CLI self-upgrade.
107
+ *
108
+ * @param info - UpdateInfo from checkForUpdate
109
+ * @param currentVersion - Currently running version
110
+ * @param options - Upgrade options
111
+ * @returns UpgradeResult describing the outcome
112
+ */
113
+ export async function performUpgrade(info, currentVersion, options = {}) {
114
+ const { force = false, dryRun = false } = options;
115
+ if (!force && !isNewer(currentVersion, info.newVersion)) {
116
+ return {
117
+ success: false,
118
+ fromVersion: currentVersion,
119
+ toVersion: info.newVersion,
120
+ changes: ['Already on latest version'],
121
+ };
122
+ }
123
+ if (dryRun) {
124
+ return {
125
+ success: true,
126
+ fromVersion: currentVersion,
127
+ toVersion: info.newVersion,
128
+ changes: [`[dry-run] Would upgrade from ${currentVersion} to ${info.newVersion}`],
129
+ };
130
+ }
131
+ // In a real implementation this would shell out to npm/npx.
132
+ // The abstraction allows consumers to supply their own installer.
133
+ return {
134
+ success: true,
135
+ fromVersion: currentVersion,
136
+ toVersion: info.newVersion,
137
+ changes: [`Upgraded from ${currentVersion} to ${info.newVersion}`],
138
+ };
139
+ }
140
+ // ============================================================================
141
+ // SDK upgrade (--sdk flag, M4-5)
142
+ // ============================================================================
143
+ const SDK_PACKAGE_NAME = '@bradygaster/squad';
144
+ /**
145
+ * Upgrade the @bradygaster/squad SDK dependency in a project.
146
+ *
147
+ * Reads the project's package.json, compares the installed SDK version
148
+ * to the latest available, and optionally runs config migrations.
149
+ *
150
+ * @param projectDir - Path to the project root (containing package.json)
151
+ * @param options - SDK upgrade options
152
+ * @returns SDKUpgradeResult
153
+ */
154
+ export async function upgradeSDK(projectDir, options = {}) {
155
+ const { force = false, dryRun = false, channel = 'stable', migrationRegistry } = options;
156
+ // Read current SDK version from package.json
157
+ const pkg = await _packageJsonReader(projectDir);
158
+ const deps = pkg.dependencies ?? {};
159
+ const currentRaw = deps[SDK_PACKAGE_NAME];
160
+ if (!currentRaw) {
161
+ return {
162
+ success: false,
163
+ fromVersion: 'none',
164
+ toVersion: 'none',
165
+ changes: [`${SDK_PACKAGE_NAME} not found in dependencies`],
166
+ migrationSteps: [],
167
+ };
168
+ }
169
+ // Strip leading ^ or ~ for comparison
170
+ const currentVersion = currentRaw.replace(/^[\^~]/, '');
171
+ const latest = await getLatestVersion(channel);
172
+ if (!force && !isNewer(currentVersion, latest)) {
173
+ return {
174
+ success: true,
175
+ fromVersion: currentVersion,
176
+ toVersion: currentVersion,
177
+ changes: ['SDK already on latest version'],
178
+ migrationSteps: [],
179
+ };
180
+ }
181
+ const migrationSteps = [];
182
+ // Run config migrations if a MigrationRegistry was provided
183
+ if (migrationRegistry) {
184
+ try {
185
+ // Normalise versions to strict semver (strip prerelease for registry lookup)
186
+ const fromStrict = toStrictSemver(currentVersion);
187
+ const toStrict = toStrictSemver(latest);
188
+ if (migrationRegistry.hasPath(fromStrict, toStrict)) {
189
+ const result = migrationRegistry.runMigrations({}, fromStrict, toStrict);
190
+ for (const m of result.applied) {
191
+ migrationSteps.push(m.description ?? `${m.fromVersion} → ${m.toVersion}`);
192
+ }
193
+ }
194
+ }
195
+ catch {
196
+ migrationSteps.push('Migration check skipped — no migration path found');
197
+ }
198
+ }
199
+ if (dryRun) {
200
+ return {
201
+ success: true,
202
+ fromVersion: currentVersion,
203
+ toVersion: latest,
204
+ changes: [`[dry-run] Would upgrade SDK from ${currentVersion} to ${latest}`],
205
+ migrationSteps,
206
+ };
207
+ }
208
+ // Write updated version to package.json
209
+ await _packageJsonWriter(projectDir, latest);
210
+ return {
211
+ success: true,
212
+ fromVersion: currentVersion,
213
+ toVersion: latest,
214
+ changes: [`Upgraded SDK from ${currentVersion} to ${latest}`],
215
+ migrationSteps,
216
+ };
217
+ }
218
+ // ============================================================================
219
+ // Helpers
220
+ // ============================================================================
221
+ /** Strip prerelease suffix to get strict major.minor.patch. */
222
+ function toStrictSemver(version) {
223
+ const parsed = parseVersion(version);
224
+ return `${parsed.major}.${parsed.minor}.${parsed.patch}`;
225
+ }
226
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Squad CLI — entry point for command-line invocation.
4
+ * Separated from src/index.ts so library consumers can import
5
+ * the SDK without triggering CLI argument parsing or process.exit().
6
+ *
7
+ * SDK library exports live in src/index.ts (dist/index.js).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cli-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-entry.d.ts","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
@@ -0,0 +1,213 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Squad CLI — entry point for command-line invocation.
4
+ * Separated from src/index.ts so library consumers can import
5
+ * the SDK without triggering CLI argument parsing or process.exit().
6
+ *
7
+ * SDK library exports live in src/index.ts (dist/index.js).
8
+ */
9
+ import fs from 'node:fs';
10
+ import path from 'node:path';
11
+ import { fatal, SquadError } from './cli/core/errors.js';
12
+ import { BOLD, RESET, DIM, RED } from './cli/core/output.js';
13
+ import { runInit } from './cli/core/init.js';
14
+ import { resolveSquad, resolveGlobalSquadPath } from '@bradygaster/squad-sdk';
15
+ import { runShell } from './cli/shell/index.js';
16
+ // Keep VERSION in index.ts (public API); import it here via re-export
17
+ import { VERSION } from '@bradygaster/squad-sdk';
18
+ async function main() {
19
+ const args = process.argv.slice(2);
20
+ const hasGlobal = args.includes('--global');
21
+ const cmd = args[0];
22
+ // --version / -v
23
+ if (cmd === '--version' || cmd === '-v') {
24
+ console.log(`squad ${VERSION}`);
25
+ return;
26
+ }
27
+ // --help / -h / help
28
+ if (cmd === '--help' || cmd === '-h' || cmd === 'help') {
29
+ console.log(`\n${BOLD}squad${RESET} v${VERSION} — Add an AI agent team to any project\n`);
30
+ console.log(`Usage: squad [command] [options]\n`);
31
+ console.log(`Commands:`);
32
+ console.log(` ${BOLD}(default)${RESET} Launch interactive shell (no args)`);
33
+ console.log(` Flags: --global (init in personal squad directory)`);
34
+ console.log(` ${BOLD}init${RESET} Initialize Squad (skip files that already exist)`);
35
+ console.log(` Flags: --global (init in personal squad directory)`);
36
+ console.log(` ${BOLD}upgrade${RESET} Update Squad-owned files to latest version`);
37
+ console.log(` Overwrites: squad.agent.md, templates dir (.squad-templates/ or .ai-team-templates/)`);
38
+ console.log(` Never touches: .squad/ or .ai-team/ (your team state)`);
39
+ console.log(` Flags: --global (upgrade personal squad), --migrate-directory (rename .ai-team/ → .squad/)`);
40
+ console.log(` ${BOLD}status${RESET} Show which squad is active and why`);
41
+ console.log(` ${BOLD}triage${RESET} Scan for work and categorize issues`);
42
+ console.log(` Usage: triage [--interval <minutes>]`);
43
+ console.log(` Default: checks every 10 minutes (Ctrl+C to stop)`);
44
+ console.log(` ${BOLD}loop${RESET} Continuous work loop (Ralph mode)`);
45
+ console.log(` Usage: loop [--filter <label>] [--interval <minutes>]`);
46
+ console.log(` Default: checks every 10 minutes (Ctrl+C to stop)`);
47
+ console.log(` ${BOLD}hire${RESET} Team creation wizard`);
48
+ console.log(` Usage: hire [--name <name>] [--role <role>]`);
49
+ console.log(` ${BOLD}copilot${RESET} Add/remove the Copilot coding agent (@copilot)`);
50
+ console.log(` Usage: copilot [--off] [--auto-assign]`);
51
+ console.log(` ${BOLD}plugin${RESET} Manage plugin marketplaces`);
52
+ console.log(` Usage: plugin marketplace add|remove|list|browse`);
53
+ console.log(` ${BOLD}export${RESET} Export squad to a portable JSON snapshot`);
54
+ console.log(` Default: squad-export.json (use --out <path> to override)`);
55
+ console.log(` ${BOLD}import${RESET} Import squad from an export file`);
56
+ console.log(` Usage: import <file> [--force]`);
57
+ console.log(` ${BOLD}scrub-emails${RESET} Remove email addresses from Squad state files`);
58
+ console.log(` Usage: scrub-emails [directory] (default: .ai-team/)`);
59
+ console.log(` ${BOLD}help${RESET} Show this help message`);
60
+ console.log(`\nFlags:`);
61
+ console.log(` ${BOLD}--version, -v${RESET} Print version`);
62
+ console.log(` ${BOLD}--help, -h${RESET} Show help`);
63
+ console.log(` ${BOLD}--global${RESET} Use personal (global) squad path (for init, upgrade)`);
64
+ console.log(`\nInstallation:`);
65
+ console.log(` npm install --save-dev @bradygaster/squad-cli`);
66
+ console.log(`\nInsider channel:`);
67
+ console.log(` npm install --save-dev @bradygaster/squad-cli@insider\n`);
68
+ return;
69
+ }
70
+ // No args → launch interactive shell
71
+ if (!cmd) {
72
+ await runShell();
73
+ return;
74
+ }
75
+ // Route subcommands
76
+ if (cmd === 'init') {
77
+ const dest = hasGlobal ? resolveGlobalSquadPath() : process.cwd();
78
+ runInit(dest).catch(err => {
79
+ fatal(err.message);
80
+ });
81
+ return;
82
+ }
83
+ if (cmd === 'upgrade') {
84
+ const { runUpgrade } = await import('./cli/core/upgrade.js');
85
+ const { migrateDirectory } = await import('./cli/core/migrate-directory.js');
86
+ const migrateDir = args.includes('--migrate-directory');
87
+ const selfUpgrade = args.includes('--self');
88
+ const dest = hasGlobal ? resolveGlobalSquadPath() : process.cwd();
89
+ // Handle --migrate-directory flag
90
+ if (migrateDir) {
91
+ await migrateDirectory(dest);
92
+ // Continue with regular upgrade after migration
93
+ }
94
+ // Run upgrade
95
+ await runUpgrade(dest, {
96
+ migrateDirectory: migrateDir,
97
+ self: selfUpgrade
98
+ });
99
+ return;
100
+ }
101
+ if (cmd === 'triage' || cmd === 'watch') {
102
+ console.log('🕵️ Squad triage — scanning for work... (full implementation pending)');
103
+ return;
104
+ }
105
+ if (cmd === 'loop') {
106
+ const filterIdx = args.indexOf('--filter');
107
+ const filter = (filterIdx !== -1 && args[filterIdx + 1]) ? args[filterIdx + 1] : undefined;
108
+ const intervalIdx = args.indexOf('--interval');
109
+ const intervalMinutes = (intervalIdx !== -1 && args[intervalIdx + 1])
110
+ ? parseInt(args[intervalIdx + 1], 10)
111
+ : 10;
112
+ console.log(`🔄 Squad loop starting... (full implementation pending)`);
113
+ if (filter) {
114
+ console.log(` Filter: ${filter}`);
115
+ }
116
+ console.log(` Interval: ${intervalMinutes} minutes`);
117
+ return;
118
+ }
119
+ if (cmd === 'hire') {
120
+ const nameIdx = args.indexOf('--name');
121
+ const name = (nameIdx !== -1 && args[nameIdx + 1]) ? args[nameIdx + 1] : undefined;
122
+ const roleIdx = args.indexOf('--role');
123
+ const role = (roleIdx !== -1 && args[roleIdx + 1]) ? args[roleIdx + 1] : undefined;
124
+ console.log('👋 Squad hire — team creation wizard starting... (full implementation pending)');
125
+ if (name) {
126
+ console.log(` Name: ${name}`);
127
+ }
128
+ if (role) {
129
+ console.log(` Role: ${role}`);
130
+ }
131
+ return;
132
+ }
133
+ if (cmd === 'export') {
134
+ const { runExport } = await import('./cli/commands/export.js');
135
+ const outIdx = args.indexOf('--out');
136
+ const outPath = (outIdx !== -1 && args[outIdx + 1]) ? args[outIdx + 1] : undefined;
137
+ await runExport(process.cwd(), outPath);
138
+ return;
139
+ }
140
+ if (cmd === 'import') {
141
+ const { runImport } = await import('./cli/commands/import.js');
142
+ const importFile = args[1];
143
+ if (!importFile) {
144
+ fatal('Usage: squad import <file> [--force]');
145
+ }
146
+ const hasForce = args.includes('--force');
147
+ await runImport(process.cwd(), importFile, hasForce);
148
+ return;
149
+ }
150
+ if (cmd === 'plugin') {
151
+ const { runPlugin } = await import('./cli/commands/plugin.js');
152
+ await runPlugin(process.cwd(), args.slice(1));
153
+ return;
154
+ }
155
+ if (cmd === 'copilot') {
156
+ const { runCopilot } = await import('./cli/commands/copilot.js');
157
+ const isOff = args.includes('--off');
158
+ const autoAssign = args.includes('--auto-assign');
159
+ await runCopilot(process.cwd(), { off: isOff, autoAssign });
160
+ return;
161
+ }
162
+ if (cmd === 'scrub-emails') {
163
+ const { scrubEmails } = await import('./cli/core/email-scrub.js');
164
+ const targetDir = args[1] || '.ai-team';
165
+ const count = await scrubEmails(targetDir);
166
+ if (count > 0) {
167
+ console.log(`Scrubbed ${count} email address(es).`);
168
+ }
169
+ else {
170
+ console.log('No email addresses found.');
171
+ }
172
+ return;
173
+ }
174
+ if (cmd === 'status') {
175
+ const repoSquad = resolveSquad(process.cwd());
176
+ const globalPath = resolveGlobalSquadPath();
177
+ const globalSquadDir = path.join(globalPath, '.squad');
178
+ const globalExists = fs.existsSync(globalSquadDir);
179
+ console.log(`\n${BOLD}Squad Status${RESET}\n`);
180
+ if (repoSquad) {
181
+ console.log(` Active squad: ${BOLD}repo${RESET}`);
182
+ console.log(` Path: ${repoSquad}`);
183
+ console.log(` Reason: Found .squad/ in repository tree`);
184
+ }
185
+ else if (globalExists) {
186
+ console.log(` Active squad: ${BOLD}personal (global)${RESET}`);
187
+ console.log(` Path: ${globalSquadDir}`);
188
+ console.log(` Reason: No repo .squad/ found; personal squad exists at global path`);
189
+ }
190
+ else {
191
+ console.log(` Active squad: ${DIM}none${RESET}`);
192
+ console.log(` Reason: No .squad/ found in repo tree or at global path`);
193
+ }
194
+ console.log();
195
+ console.log(` ${DIM}Repo resolution: ${repoSquad ?? 'not found'}${RESET}`);
196
+ console.log(` ${DIM}Global path: ${globalPath}${RESET}`);
197
+ console.log(` ${DIM}Global squad: ${globalExists ? globalSquadDir : 'not initialized'}${RESET}`);
198
+ console.log();
199
+ return;
200
+ }
201
+ // Unknown command
202
+ fatal(`Unknown command: ${cmd}\n Run 'squad help' for usage information.`);
203
+ }
204
+ main().catch(err => {
205
+ if (err instanceof SquadError) {
206
+ console.error(`${RED}✗${RESET} ${err.message}`);
207
+ }
208
+ else {
209
+ console.error(err);
210
+ }
211
+ process.exit(1);
212
+ });
213
+ //# sourceMappingURL=cli-entry.js.map