@bradygaster/squad-cli 0.6.2 → 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,134 @@
1
+ /**
2
+ * Plugin marketplace commands — add/remove/list/browse
3
+ * Port from beta index.js lines 716-833
4
+ */
5
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
6
+ import { existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { execFile } from 'node:child_process';
9
+ import { promisify } from 'node:util';
10
+ import { success, info, DIM, BOLD, RESET } from '../core/output.js';
11
+ import { fatal } from '../core/errors.js';
12
+ import { detectSquadDir } from '../core/detect-squad-dir.js';
13
+ import { ghAvailable, ghAuthenticated } from '../core/gh-cli.js';
14
+ const execFileAsync = promisify(execFile);
15
+ // --- Main command handler ---
16
+ export async function runPlugin(dest, args) {
17
+ const subCmd = args[0];
18
+ const action = args[1];
19
+ if (subCmd !== 'marketplace' || !action) {
20
+ fatal('Usage: squad plugin marketplace add|remove|list|browse');
21
+ }
22
+ const squadDirInfo = detectSquadDir(dest);
23
+ const pluginsDir = join(squadDirInfo.path, 'plugins');
24
+ const marketplacesFile = join(pluginsDir, 'marketplaces.json');
25
+ async function readMarketplaces() {
26
+ if (!existsSync(marketplacesFile)) {
27
+ return { marketplaces: [] };
28
+ }
29
+ try {
30
+ const content = await readFile(marketplacesFile, 'utf8');
31
+ return JSON.parse(content);
32
+ }
33
+ catch {
34
+ return { marketplaces: [] };
35
+ }
36
+ }
37
+ async function writeMarketplaces(data) {
38
+ await mkdir(pluginsDir, { recursive: true });
39
+ await writeFile(marketplacesFile, JSON.stringify(data, null, 2) + '\n', 'utf8');
40
+ }
41
+ // --- Add marketplace ---
42
+ if (action === 'add') {
43
+ const source = args[2];
44
+ if (!source || !source.includes('/')) {
45
+ fatal('Usage: squad plugin marketplace add <owner/repo>');
46
+ }
47
+ const data = await readMarketplaces();
48
+ const name = source.split('/').pop();
49
+ if (data.marketplaces.some(m => m.source === source)) {
50
+ info(`${DIM}${source} is already registered${RESET}`);
51
+ return;
52
+ }
53
+ data.marketplaces.push({
54
+ name,
55
+ source,
56
+ added_at: new Date().toISOString()
57
+ });
58
+ await writeMarketplaces(data);
59
+ success(`Registered marketplace: ${BOLD}${name}${RESET} (${source})`);
60
+ return;
61
+ }
62
+ // --- Remove marketplace ---
63
+ if (action === 'remove') {
64
+ const name = args[2];
65
+ if (!name) {
66
+ fatal('Usage: squad plugin marketplace remove <name>');
67
+ }
68
+ const data = await readMarketplaces();
69
+ const before = data.marketplaces.length;
70
+ data.marketplaces = data.marketplaces.filter(m => m.name !== name);
71
+ if (data.marketplaces.length === before) {
72
+ fatal(`Marketplace "${name}" not found`);
73
+ }
74
+ await writeMarketplaces(data);
75
+ success(`Removed marketplace: ${BOLD}${name}${RESET}`);
76
+ return;
77
+ }
78
+ // --- List marketplaces ---
79
+ if (action === 'list') {
80
+ const data = await readMarketplaces();
81
+ if (data.marketplaces.length === 0) {
82
+ info(`${DIM}No marketplaces registered${RESET}`);
83
+ console.log(`\nAdd one with: ${BOLD}squad plugin marketplace add <owner/repo>${RESET}`);
84
+ return;
85
+ }
86
+ console.log(`\n${BOLD}Registered marketplaces:${RESET}\n`);
87
+ for (const m of data.marketplaces) {
88
+ const date = m.added_at ? ` ${DIM}(added ${m.added_at.split('T')[0]})${RESET}` : '';
89
+ console.log(` ${BOLD}${m.name}${RESET} → ${m.source}${date}`);
90
+ }
91
+ console.log();
92
+ return;
93
+ }
94
+ // --- Browse marketplace ---
95
+ if (action === 'browse') {
96
+ const name = args[2];
97
+ if (!name) {
98
+ fatal('Usage: squad plugin marketplace browse <name>');
99
+ }
100
+ const data = await readMarketplaces();
101
+ const marketplace = data.marketplaces.find(m => m.name === name);
102
+ if (!marketplace) {
103
+ fatal(`Marketplace "${name}" not found. Run "squad plugin marketplace list" to see registered marketplaces.`);
104
+ }
105
+ // Check gh CLI availability
106
+ if (!(await ghAvailable())) {
107
+ fatal('GitHub CLI (gh) is required but not found. Install from https://cli.github.com/');
108
+ }
109
+ if (!(await ghAuthenticated())) {
110
+ fatal('GitHub CLI is not authenticated. Run "gh auth login" first.');
111
+ }
112
+ // Browse the marketplace repo for plugins using gh CLI
113
+ let entries;
114
+ try {
115
+ const { stdout } = await execFileAsync('gh', ['api', `repos/${marketplace.source}/contents`, '--jq', '[.[] | select(.type == "dir") | .name]'], { timeout: 15000 });
116
+ entries = JSON.parse(stdout.trim());
117
+ }
118
+ catch (err) {
119
+ fatal(`Could not browse ${marketplace.source} — ${err.message}`);
120
+ }
121
+ if (!entries || entries.length === 0) {
122
+ info(`${DIM}No plugins found in ${marketplace.source}${RESET}`);
123
+ return;
124
+ }
125
+ console.log(`\n${BOLD}Plugins in ${marketplace.name}${RESET} (${marketplace.source}):\n`);
126
+ for (const entry of entries) {
127
+ console.log(` 📦 ${entry}`);
128
+ }
129
+ console.log(`\n${DIM}${entries.length} plugin(s) available${RESET}\n`);
130
+ return;
131
+ }
132
+ fatal(`Unknown action: ${action}. Usage: squad plugin marketplace add|remove|list|browse`);
133
+ }
134
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/cli/commands/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Watch command — Ralph's standalone polling process
3
+ */
4
+ /**
5
+ * Run watch command — Ralph's local polling process
6
+ */
7
+ export declare function runWatch(dest: string, intervalMinutes: number): Promise<void>;
8
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2JH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DnF"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Watch command — Ralph's standalone polling process
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { detectSquadDir } from '../core/detect-squad-dir.js';
7
+ import { fatal } from '../core/errors.js';
8
+ import { GREEN, RED, DIM, BOLD, RESET, YELLOW } from '../core/output.js';
9
+ import { ghAvailable, ghAuthenticated, ghIssueList, ghIssueEdit } from '../core/gh-cli.js';
10
+ /**
11
+ * Parse team members from team.md roster
12
+ */
13
+ function parseMembers(text) {
14
+ const lines = text.split('\n');
15
+ const members = [];
16
+ let inMembersTable = false;
17
+ for (const line of lines) {
18
+ if (line.startsWith('## Members')) {
19
+ inMembersTable = true;
20
+ continue;
21
+ }
22
+ if (inMembersTable && line.startsWith('## '))
23
+ break;
24
+ if (inMembersTable && line.startsWith('|') && !line.includes('---') && !line.includes('Name')) {
25
+ const cells = line.split('|').map(c => c.trim()).filter(Boolean);
26
+ if (cells.length >= 2 && !['Scribe', 'Ralph'].includes(cells[0])) {
27
+ members.push({
28
+ name: cells[0],
29
+ role: cells[1],
30
+ label: `squad:${cells[0].toLowerCase()}`
31
+ });
32
+ }
33
+ }
34
+ }
35
+ return members;
36
+ }
37
+ /**
38
+ * Auto-triage an issue based on content and team roster
39
+ */
40
+ function triageIssue(issue, members) {
41
+ const issueText = issue.title.toLowerCase();
42
+ // Domain-based routing
43
+ for (const member of members) {
44
+ const role = member.role.toLowerCase();
45
+ // Frontend/UI
46
+ if ((role.includes('frontend') || role.includes('ui')) &&
47
+ (issueText.includes('ui') || issueText.includes('frontend') || issueText.includes('css'))) {
48
+ return { member, reason: 'frontend/UI domain' };
49
+ }
50
+ // Backend/API
51
+ if ((role.includes('backend') || role.includes('api') || role.includes('server')) &&
52
+ (issueText.includes('api') || issueText.includes('backend') || issueText.includes('database'))) {
53
+ return { member, reason: 'backend/API domain' };
54
+ }
55
+ // Test/QA
56
+ if ((role.includes('test') || role.includes('qa')) &&
57
+ (issueText.includes('test') || issueText.includes('bug') || issueText.includes('fix'))) {
58
+ return { member, reason: 'testing/QA domain' };
59
+ }
60
+ }
61
+ // Fall back to Lead if no match
62
+ const lead = members.find(m => m.role.toLowerCase().includes('lead') || m.role.toLowerCase().includes('architect'));
63
+ if (lead) {
64
+ return { member: lead, reason: 'no domain match — routed to Lead' };
65
+ }
66
+ return null;
67
+ }
68
+ /**
69
+ * Run a single check cycle
70
+ */
71
+ async function runCheck(members, hasCopilot, autoAssign) {
72
+ const timestamp = new Date().toLocaleTimeString();
73
+ try {
74
+ // Fetch open issues with squad label
75
+ const issues = await ghIssueList({ label: 'squad', state: 'open', limit: 20 });
76
+ // Find untriaged issues (no squad:{member} label)
77
+ const memberLabels = members.map(m => m.label);
78
+ const untriaged = issues.filter(issue => {
79
+ const issueLabels = issue.labels.map(l => l.name);
80
+ return !memberLabels.some(ml => issueLabels.includes(ml));
81
+ });
82
+ // Find unassigned squad:copilot issues
83
+ let unassignedCopilot = [];
84
+ if (hasCopilot && autoAssign) {
85
+ try {
86
+ const copilotIssues = await ghIssueList({ label: 'squad:copilot', state: 'open', limit: 10 });
87
+ unassignedCopilot = copilotIssues.filter(i => !i.assignees || i.assignees.length === 0);
88
+ }
89
+ catch {
90
+ // Label may not exist yet
91
+ }
92
+ }
93
+ if (untriaged.length === 0 && unassignedCopilot.length === 0) {
94
+ console.log(`${DIM}[${timestamp}]${RESET} 📋 Board is clear — no pending work`);
95
+ return;
96
+ }
97
+ // Triage untriaged issues
98
+ for (const issue of untriaged) {
99
+ const triage = triageIssue(issue, members);
100
+ if (triage) {
101
+ try {
102
+ await ghIssueEdit(issue.number, { addLabel: triage.member.label });
103
+ console.log(`${GREEN}✓${RESET} [${timestamp}] Triaged #${issue.number} "${issue.title}" → ${triage.member.name} (${triage.reason})`);
104
+ }
105
+ catch (e) {
106
+ const err = e;
107
+ console.error(`${RED}✗${RESET} [${timestamp}] Failed to label #${issue.number}: ${err.message}`);
108
+ }
109
+ }
110
+ }
111
+ // Assign @copilot to unassigned copilot issues
112
+ for (const issue of unassignedCopilot) {
113
+ try {
114
+ await ghIssueEdit(issue.number, { addAssignee: 'copilot-swe-agent' });
115
+ console.log(`${GREEN}✓${RESET} [${timestamp}] Assigned @copilot to #${issue.number} "${issue.title}"`);
116
+ }
117
+ catch (e) {
118
+ const err = e;
119
+ console.error(`${RED}✗${RESET} [${timestamp}] Failed to assign @copilot to #${issue.number}: ${err.message}`);
120
+ }
121
+ }
122
+ }
123
+ catch (e) {
124
+ const err = e;
125
+ console.error(`${RED}✗${RESET} [${timestamp}] Check failed: ${err.message}`);
126
+ }
127
+ }
128
+ /**
129
+ * Run watch command — Ralph's local polling process
130
+ */
131
+ export async function runWatch(dest, intervalMinutes) {
132
+ // Validate interval
133
+ if (isNaN(intervalMinutes) || intervalMinutes < 1) {
134
+ fatal('--interval must be a positive number of minutes');
135
+ }
136
+ // Detect squad directory
137
+ const squadDirInfo = detectSquadDir(dest);
138
+ const teamMd = path.join(squadDirInfo.path, 'team.md');
139
+ if (!fs.existsSync(teamMd)) {
140
+ fatal('No squad found — run init first.');
141
+ }
142
+ // Verify gh CLI
143
+ if (!(await ghAvailable())) {
144
+ fatal('gh CLI not found — install from https://cli.github.com');
145
+ }
146
+ if (!(await ghAuthenticated())) {
147
+ console.error(`${YELLOW}⚠️${RESET} gh CLI not authenticated`);
148
+ console.error(` Run: ${BOLD}gh auth login${RESET}\n`);
149
+ fatal('gh authentication required');
150
+ }
151
+ // Parse team.md
152
+ const content = fs.readFileSync(teamMd, 'utf8');
153
+ const members = parseMembers(content);
154
+ if (members.length === 0) {
155
+ fatal('No squad members found in team.md');
156
+ }
157
+ const hasCopilot = content.includes('🤖 Coding Agent') || content.includes('@copilot');
158
+ const autoAssign = content.includes('<!-- copilot-auto-assign: true -->');
159
+ // Print startup banner
160
+ console.log(`\n${BOLD}🔄 Ralph — Watch Mode${RESET}`);
161
+ console.log(`${DIM}Polling every ${intervalMinutes} minute(s) for squad work. Ctrl+C to stop.${RESET}\n`);
162
+ // Run immediately, then on interval
163
+ await runCheck(members, hasCopilot, autoAssign);
164
+ return new Promise((resolve) => {
165
+ const intervalId = setInterval(async () => {
166
+ await runCheck(members, hasCopilot, autoAssign);
167
+ }, intervalMinutes * 60 * 1000);
168
+ // Graceful shutdown
169
+ const shutdown = () => {
170
+ clearInterval(intervalId);
171
+ console.log(`\n${DIM}🔄 Ralph — Watch stopped${RESET}`);
172
+ resolve();
173
+ };
174
+ process.on('SIGINT', shutdown);
175
+ process.on('SIGTERM', shutdown);
176
+ });
177
+ }
178
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * In-Copilot Installation Path (M4-6, Issue #106)
3
+ *
4
+ * Detects the Copilot runtime environment and provides
5
+ * platform-specific installation + scaffolding instructions.
6
+ * Wires into initSquad() from M2-6 for project creation.
7
+ *
8
+ * @module cli/copilot-install
9
+ */
10
+ /** Recognised Copilot environments. */
11
+ export type CopilotEnvironment = 'cli' | 'vscode' | 'web' | 'unknown';
12
+ /** Configuration for in-Copilot installation. */
13
+ export interface InstallConfig {
14
+ /** Project name */
15
+ projectName?: string;
16
+ /** Project description */
17
+ projectDescription?: string;
18
+ /** Agent names to scaffold */
19
+ agents?: string[];
20
+ /** Config format */
21
+ configFormat?: 'typescript' | 'json';
22
+ }
23
+ /** Result of an in-Copilot installation. */
24
+ export interface CopilotInstallResult {
25
+ /** Whether the installation succeeded */
26
+ success: boolean;
27
+ /** Detected environment */
28
+ environment: CopilotEnvironment;
29
+ /** Files created during installation */
30
+ createdFiles: string[];
31
+ /** Human-readable installation instructions that were applied */
32
+ instructions: string[];
33
+ }
34
+ /** Single install instruction step. */
35
+ export interface InstallStep {
36
+ /** Step description */
37
+ description: string;
38
+ /** Shell command to run (if applicable) */
39
+ command?: string;
40
+ }
41
+ /** Indicators used for environment detection. */
42
+ export interface EnvironmentIndicators {
43
+ env: Record<string, string | undefined>;
44
+ argv: string[];
45
+ }
46
+ /**
47
+ * Detect which Copilot environment is active.
48
+ *
49
+ * Heuristics (checked in order):
50
+ * 1. `VSCODE_PID` or `VSCODE_IPC_HOOK` → vscode
51
+ * 2. `CODESPACES` or `GITHUB_CODESPACE_TOKEN` → web
52
+ * 3. `COPILOT_CLI` env var → cli
53
+ * 4. `--copilot-cli` argv flag → cli
54
+ * 5. Otherwise → unknown
55
+ */
56
+ export declare function detectCopilotEnvironment(indicators?: EnvironmentIndicators): CopilotEnvironment;
57
+ /**
58
+ * Return platform-specific install steps for a detected environment.
59
+ */
60
+ export declare function getInstallInstructions(env: CopilotEnvironment): InstallStep[];
61
+ /**
62
+ * Run a full "install Squad from inside Copilot" flow.
63
+ *
64
+ * Generates `.squad/` scaffolding via initSquad() from M2-6
65
+ * and returns environment-aware instructions.
66
+ *
67
+ * @param env - Detected Copilot environment
68
+ * @param projectDir - Root directory of the project
69
+ * @param config - Optional install configuration
70
+ * @returns CopilotInstallResult
71
+ */
72
+ export declare function installFromCopilot(env: CopilotEnvironment, projectDir: string, config?: InstallConfig): Promise<CopilotInstallResult>;
73
+ //# sourceMappingURL=copilot-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-install.d.ts","sourceRoot":"","sources":["../../src/cli/copilot-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,uCAAuC;AACvC,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEtE,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;CACtC;AAED,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,WAAW,EAAE,kBAAkB,CAAC;IAChC,wCAAwC;IACxC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iEAAiE;IACjE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,CAAC,EAAE,qBAAqB,GACjC,kBAAkB,CAcpB;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,GAAG,WAAW,EAAE,CA4B7E;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAmC/B"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * In-Copilot Installation Path (M4-6, Issue #106)
3
+ *
4
+ * Detects the Copilot runtime environment and provides
5
+ * platform-specific installation + scaffolding instructions.
6
+ * Wires into initSquad() from M2-6 for project creation.
7
+ *
8
+ * @module cli/copilot-install
9
+ */
10
+ import { initSquad } from '@bradygaster/squad-sdk/config';
11
+ /**
12
+ * Detect which Copilot environment is active.
13
+ *
14
+ * Heuristics (checked in order):
15
+ * 1. `VSCODE_PID` or `VSCODE_IPC_HOOK` → vscode
16
+ * 2. `CODESPACES` or `GITHUB_CODESPACE_TOKEN` → web
17
+ * 3. `COPILOT_CLI` env var → cli
18
+ * 4. `--copilot-cli` argv flag → cli
19
+ * 5. Otherwise → unknown
20
+ */
21
+ export function detectCopilotEnvironment(indicators) {
22
+ const env = indicators?.env ?? process.env;
23
+ const argv = indicators?.argv ?? process.argv;
24
+ if (env['VSCODE_PID'] || env['VSCODE_IPC_HOOK']) {
25
+ return 'vscode';
26
+ }
27
+ if (env['CODESPACES'] === 'true' || env['GITHUB_CODESPACE_TOKEN']) {
28
+ return 'web';
29
+ }
30
+ if (env['COPILOT_CLI'] || argv.includes('--copilot-cli')) {
31
+ return 'cli';
32
+ }
33
+ return 'unknown';
34
+ }
35
+ // ============================================================================
36
+ // Install Instructions
37
+ // ============================================================================
38
+ /**
39
+ * Return platform-specific install steps for a detected environment.
40
+ */
41
+ export function getInstallInstructions(env) {
42
+ switch (env) {
43
+ case 'cli':
44
+ return [
45
+ { description: 'Install the Squad SDK globally', command: 'npm install -g @bradygaster/squad' },
46
+ { description: 'Initialise a new Squad project', command: 'npx create-squad' },
47
+ { description: 'Start the Squad orchestrator', command: 'squad start' },
48
+ ];
49
+ case 'vscode':
50
+ return [
51
+ { description: 'Install Squad SDK as a project dependency', command: 'npm install @bradygaster/squad' },
52
+ { description: 'Run Squad init via the VS Code terminal', command: 'npx create-squad' },
53
+ { description: 'Reload the VS Code window to activate Squad agents' },
54
+ ];
55
+ case 'web':
56
+ return [
57
+ { description: 'Install Squad SDK in the Codespace', command: 'npm install @bradygaster/squad' },
58
+ { description: 'Initialise Squad scaffolding', command: 'npx create-squad' },
59
+ { description: 'Squad agents are available in the Codespace Copilot Chat' },
60
+ ];
61
+ case 'unknown':
62
+ default:
63
+ return [
64
+ { description: 'Install Node.js 20+ if not already installed' },
65
+ { description: 'Install the Squad SDK', command: 'npm install @bradygaster/squad' },
66
+ { description: 'Initialise a new Squad project', command: 'npx create-squad' },
67
+ ];
68
+ }
69
+ }
70
+ // ============================================================================
71
+ // In-Copilot Install
72
+ // ============================================================================
73
+ /**
74
+ * Run a full "install Squad from inside Copilot" flow.
75
+ *
76
+ * Generates `.squad/` scaffolding via initSquad() from M2-6
77
+ * and returns environment-aware instructions.
78
+ *
79
+ * @param env - Detected Copilot environment
80
+ * @param projectDir - Root directory of the project
81
+ * @param config - Optional install configuration
82
+ * @returns CopilotInstallResult
83
+ */
84
+ export async function installFromCopilot(env, projectDir, config) {
85
+ const projectName = config?.projectName ?? 'my-squad-project';
86
+ const agents = (config?.agents ?? ['lead', 'developer']).map((name) => ({
87
+ name,
88
+ role: name,
89
+ }));
90
+ const initOptions = {
91
+ teamRoot: projectDir,
92
+ projectName,
93
+ projectDescription: config?.projectDescription,
94
+ agents,
95
+ configFormat: config?.configFormat ?? (env === 'web' ? 'json' : 'typescript'),
96
+ };
97
+ let initResult;
98
+ try {
99
+ initResult = await initSquad(initOptions);
100
+ }
101
+ catch (err) {
102
+ return {
103
+ success: false,
104
+ environment: env,
105
+ createdFiles: [],
106
+ instructions: [`Installation failed: ${err.message}`],
107
+ };
108
+ }
109
+ const instructions = getInstallInstructions(env).map((s) => s.description);
110
+ return {
111
+ success: true,
112
+ environment: env,
113
+ createdFiles: initResult.createdFiles,
114
+ instructions,
115
+ };
116
+ }
117
+ //# sourceMappingURL=copilot-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-install.js","sourceRoot":"","sources":["../../src/cli/copilot-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Squad directory detection — zero dependencies
3
+ */
4
+ export interface SquadDirInfo {
5
+ path: string;
6
+ name: '.squad' | '.ai-team';
7
+ isLegacy: boolean;
8
+ }
9
+ /**
10
+ * Detect squad directory — .squad/ first, fall back to .ai-team/
11
+ */
12
+ export declare function detectSquadDir(dest: string): SquadDirInfo;
13
+ //# sourceMappingURL=detect-squad-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-squad-dir.d.ts","sourceRoot":"","sources":["../../../src/cli/core/detect-squad-dir.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAYzD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Squad directory detection — zero dependencies
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ /**
7
+ * Detect squad directory — .squad/ first, fall back to .ai-team/
8
+ */
9
+ export function detectSquadDir(dest) {
10
+ const squadDir = path.join(dest, '.squad');
11
+ const aiTeamDir = path.join(dest, '.ai-team');
12
+ if (fs.existsSync(squadDir)) {
13
+ return { path: squadDir, name: '.squad', isLegacy: false };
14
+ }
15
+ if (fs.existsSync(aiTeamDir)) {
16
+ return { path: aiTeamDir, name: '.ai-team', isLegacy: true };
17
+ }
18
+ // Default for new installations
19
+ return { path: squadDir, name: '.squad', isLegacy: false };
20
+ }
21
+ //# sourceMappingURL=detect-squad-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-squad-dir.js","sourceRoot":"","sources":["../../../src/cli/core/detect-squad-dir.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,gCAAgC;IAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Email scrubbing utility — removes PII from Squad state files
3
+ * @module cli/core/email-scrub
4
+ */
5
+ /**
6
+ * Scrub email addresses from all files in a directory
7
+ * Returns count of files scrubbed
8
+ */
9
+ export declare function scrubEmails(dir: string): Promise<number>;
10
+ //# sourceMappingURL=email-scrub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-scrub.d.ts","sourceRoot":"","sources":["../../../src/cli/core/email-scrub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwD9D"}