@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.
- package/README.md +77 -77
- package/dist/cli/commands/copilot.d.ts +13 -0
- package/dist/cli/commands/copilot.d.ts.map +1 -0
- package/dist/cli/commands/copilot.js +86 -0
- package/dist/cli/commands/copilot.js.map +1 -0
- package/dist/cli/commands/export.d.ts +9 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +89 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/import.d.ts +9 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +116 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/plugin.d.ts +14 -0
- package/dist/cli/commands/plugin.d.ts.map +1 -0
- package/dist/cli/commands/plugin.js +134 -0
- package/dist/cli/commands/plugin.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +8 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +178 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/copilot-install.d.ts +73 -0
- package/dist/cli/copilot-install.d.ts.map +1 -0
- package/dist/cli/copilot-install.js +117 -0
- package/dist/cli/copilot-install.js.map +1 -0
- package/dist/cli/core/detect-squad-dir.d.ts +13 -0
- package/dist/cli/core/detect-squad-dir.d.ts.map +1 -0
- package/dist/cli/core/detect-squad-dir.js +21 -0
- package/dist/cli/core/detect-squad-dir.js.map +1 -0
- package/dist/cli/core/email-scrub.d.ts +10 -0
- package/dist/cli/core/email-scrub.d.ts.map +1 -0
- package/dist/cli/core/email-scrub.js +103 -0
- package/dist/cli/core/email-scrub.js.map +1 -0
- package/dist/cli/core/errors.d.ts +17 -0
- package/dist/cli/core/errors.d.ts.map +1 -0
- package/dist/cli/core/errors.js +22 -0
- package/dist/cli/core/errors.js.map +1 -0
- package/dist/cli/core/gh-cli.d.ts +41 -0
- package/dist/cli/core/gh-cli.d.ts.map +1 -0
- package/dist/cli/core/gh-cli.js +67 -0
- package/dist/cli/core/gh-cli.js.map +1 -0
- package/dist/cli/core/history-split.d.ts +9 -0
- package/dist/cli/core/history-split.d.ts.map +1 -0
- package/dist/cli/core/history-split.js +65 -0
- package/dist/cli/core/history-split.js.map +1 -0
- package/dist/cli/core/init.d.ts +9 -0
- package/dist/cli/core/init.d.ts.map +1 -0
- package/dist/cli/core/init.js +296 -0
- package/dist/cli/core/init.js.map +1 -0
- package/dist/cli/core/migrate-directory.d.ts +11 -0
- package/dist/cli/core/migrate-directory.d.ts.map +1 -0
- package/dist/cli/core/migrate-directory.js +71 -0
- package/dist/cli/core/migrate-directory.js.map +1 -0
- package/dist/cli/core/migrations.d.ts +11 -0
- package/dist/cli/core/migrations.d.ts.map +1 -0
- package/dist/cli/core/migrations.js +78 -0
- package/dist/cli/core/migrations.js.map +1 -0
- package/dist/cli/core/output.d.ts +34 -0
- package/dist/cli/core/output.d.ts.map +1 -0
- package/dist/cli/core/output.js +47 -0
- package/dist/cli/core/output.js.map +1 -0
- package/dist/cli/core/project-type.d.ts +9 -0
- package/dist/cli/core/project-type.d.ts.map +1 -0
- package/dist/cli/core/project-type.js +29 -0
- package/dist/cli/core/project-type.js.map +1 -0
- package/dist/cli/core/team-md.d.ts +28 -0
- package/dist/cli/core/team-md.d.ts.map +1 -0
- package/dist/cli/core/team-md.js +91 -0
- package/dist/cli/core/team-md.js.map +1 -0
- package/dist/cli/core/templates.d.ts +30 -0
- package/dist/cli/core/templates.d.ts.map +1 -0
- package/dist/cli/core/templates.js +247 -0
- package/dist/cli/core/templates.js.map +1 -0
- package/dist/cli/core/upgrade.d.ts +20 -0
- package/dist/cli/core/upgrade.d.ts.map +1 -0
- package/dist/cli/core/upgrade.js +399 -0
- package/dist/cli/core/upgrade.js.map +1 -0
- package/dist/cli/core/version.d.ts +18 -0
- package/dist/cli/core/version.d.ts.map +1 -0
- package/dist/cli/core/version.js +61 -0
- package/dist/cli/core/version.js.map +1 -0
- package/dist/cli/core/workflows.d.ts +10 -0
- package/dist/cli/core/workflows.d.ts.map +1 -0
- package/dist/cli/core/workflows.js +155 -0
- package/dist/cli/core/workflows.js.map +1 -0
- package/dist/cli/index.d.ts +26 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/shell/autocomplete.d.ts +12 -0
- package/dist/cli/shell/autocomplete.d.ts.map +1 -0
- package/dist/cli/shell/autocomplete.js +39 -0
- package/dist/cli/shell/autocomplete.js.map +1 -0
- package/dist/cli/shell/commands.d.ts +19 -0
- package/dist/cli/shell/commands.d.ts.map +1 -0
- package/dist/cli/shell/commands.js +87 -0
- package/dist/cli/shell/commands.js.map +1 -0
- package/dist/cli/shell/components/AgentPanel.d.ts +8 -0
- package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -0
- package/dist/cli/shell/components/AgentPanel.js +17 -0
- package/dist/cli/shell/components/AgentPanel.js.map +1 -0
- package/dist/cli/shell/components/InputPrompt.d.ts +9 -0
- package/dist/cli/shell/components/InputPrompt.d.ts.map +1 -0
- package/dist/cli/shell/components/InputPrompt.js +50 -0
- package/dist/cli/shell/components/InputPrompt.js.map +1 -0
- package/dist/cli/shell/components/MessageStream.d.ts +13 -0
- package/dist/cli/shell/components/MessageStream.d.ts.map +1 -0
- package/dist/cli/shell/components/MessageStream.js +7 -0
- package/dist/cli/shell/components/MessageStream.js.map +1 -0
- package/dist/cli/shell/components/index.d.ts +4 -0
- package/dist/cli/shell/components/index.d.ts.map +1 -0
- package/dist/cli/shell/components/index.js +4 -0
- package/dist/cli/shell/components/index.js.map +1 -0
- package/dist/cli/shell/coordinator.d.ts +32 -0
- package/dist/cli/shell/coordinator.d.ts.map +1 -0
- package/dist/cli/shell/coordinator.js +113 -0
- package/dist/cli/shell/coordinator.js.map +1 -0
- package/dist/cli/shell/index.d.ts +28 -0
- package/dist/cli/shell/index.d.ts.map +1 -0
- package/dist/cli/shell/index.js +66 -0
- package/dist/cli/shell/index.js.map +1 -0
- package/dist/cli/shell/lifecycle.d.ts +52 -0
- package/dist/cli/shell/lifecycle.d.ts.map +1 -0
- package/dist/cli/shell/lifecycle.js +168 -0
- package/dist/cli/shell/lifecycle.js.map +1 -0
- package/dist/cli/shell/memory.d.ts +36 -0
- package/dist/cli/shell/memory.d.ts.map +1 -0
- package/dist/cli/shell/memory.js +53 -0
- package/dist/cli/shell/memory.js.map +1 -0
- package/dist/cli/shell/render.d.ts +22 -0
- package/dist/cli/shell/render.d.ts.map +1 -0
- package/dist/cli/shell/render.js +44 -0
- package/dist/cli/shell/render.js.map +1 -0
- package/dist/cli/shell/router.d.ts +17 -0
- package/dist/cli/shell/router.d.ts.map +1 -0
- package/dist/cli/shell/router.js +55 -0
- package/dist/cli/shell/router.js.map +1 -0
- package/dist/cli/shell/sessions.d.ts +15 -0
- package/dist/cli/shell/sessions.d.ts.map +1 -0
- package/dist/cli/shell/sessions.js +37 -0
- package/dist/cli/shell/sessions.js.map +1 -0
- package/dist/cli/shell/spawn.d.ts +47 -0
- package/dist/cli/shell/spawn.d.ts.map +1 -0
- package/dist/cli/shell/spawn.js +77 -0
- package/dist/cli/shell/spawn.js.map +1 -0
- package/dist/cli/shell/stream-bridge.d.ts +60 -0
- package/dist/cli/shell/stream-bridge.d.ts.map +1 -0
- package/dist/cli/shell/stream-bridge.js +98 -0
- package/dist/cli/shell/stream-bridge.js.map +1 -0
- package/dist/cli/shell/terminal.d.ts +30 -0
- package/dist/cli/shell/terminal.d.ts.map +1 -0
- package/dist/cli/shell/terminal.js +34 -0
- package/dist/cli/shell/terminal.js.map +1 -0
- package/dist/cli/shell/types.d.ts +21 -0
- package/dist/cli/shell/types.d.ts.map +1 -0
- package/dist/cli/shell/types.js +5 -0
- package/dist/cli/shell/types.js.map +1 -0
- package/dist/cli/upgrade.d.ts +141 -0
- package/dist/cli/upgrade.d.ts.map +1 -0
- package/dist/cli/upgrade.js +226 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/cli-entry.d.ts +10 -0
- package/dist/cli-entry.d.ts.map +1 -0
- package/dist/cli-entry.js +213 -0
- package/dist/cli-entry.js.map +1 -0
- package/package.json +44 -34
- package/templates/casting-history.json +4 -0
- package/templates/casting-policy.json +35 -0
- package/templates/casting-registry.json +3 -0
- package/templates/ceremonies.md +41 -0
- package/templates/charter.md +53 -0
- package/templates/constraint-tracking.md +38 -0
- package/templates/copilot-instructions.md +46 -0
- package/templates/history.md +10 -0
- package/templates/identity/now.md +9 -0
- package/templates/identity/wisdom.md +15 -0
- package/templates/mcp-config.md +90 -0
- package/templates/multi-agent-format.md +28 -0
- package/templates/orchestration-log.md +27 -0
- package/templates/plugin-marketplace.md +49 -0
- package/templates/raw-agent-output.md +37 -0
- package/templates/roster.md +60 -0
- package/templates/routing.md +54 -0
- package/templates/run-output.md +50 -0
- package/templates/scribe-charter.md +119 -0
- package/templates/skill.md +24 -0
- package/templates/skills/squad-conventions/SKILL.md +69 -0
- package/templates/squad.agent.md +1146 -0
- package/templates/workflows/squad-ci.yml +24 -0
- package/templates/workflows/squad-docs.yml +50 -0
- package/templates/workflows/squad-heartbeat.yml +315 -0
- package/templates/workflows/squad-insider-release.yml +61 -0
- package/templates/workflows/squad-issue-assign.yml +161 -0
- package/templates/workflows/squad-label-enforce.yml +181 -0
- package/templates/workflows/squad-main-guard.yml +129 -0
- package/templates/workflows/squad-preview.yml +55 -0
- package/templates/workflows/squad-promote.yml +121 -0
- package/templates/workflows/squad-release.yml +77 -0
- package/templates/workflows/squad-triage.yml +260 -0
- 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 @@
|
|
|
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"}
|