Merge pull request #2563 from kky/pr/setup-register-scope

fix(setup-register): scope --assistant-name to the registered group only
This commit is contained in:
gavrielc
2026-05-22 22:50:22 +03:00
committed by GitHub
+34 -31
View File
@@ -194,7 +194,12 @@ export async function run(args: string[]): Promise<void> {
// 4. Send onboarding message — only on first wiring, not re-registration // 4. Send onboarding message — only on first wiring, not re-registration
if (newlyWired) { if (newlyWired) {
const { session } = resolveSession(agentGroup.id, messagingGroup.id, null, parsed.sessionMode as 'shared' | 'per-thread' | 'agent-shared'); const { session } = resolveSession(
agentGroup.id,
messagingGroup.id,
null,
parsed.sessionMode as 'shared' | 'per-thread' | 'agent-shared',
);
writeSessionMessage(agentGroup.id, session.id, { writeSessionMessage(agentGroup.id, session.id, {
id: generateId('onboard'), id: generateId('onboard'),
kind: 'task', kind: 'task',
@@ -208,40 +213,38 @@ export async function run(args: string[]): Promise<void> {
log.info('Onboarding message written', { sessionId: session.id, channel: parsed.channel }); log.info('Onboarding message written', { sessionId: session.id, channel: parsed.channel });
} }
// 5. Update assistant name in CLAUDE.md files if different from default // 5. Apply assistant name to JUST the group being registered.
//
// Earlier behavior did a project-wide find-replace of "Andy" across every
// `groups/*/CLAUDE.md` and overwrote `.env`'s `ASSISTANT_NAME`, which
// caused two real-world problems:
// - registering a second agent (e.g. "Homie") clobbered the unrelated
// primary agent's CLAUDE.md (replacing "Andy" with "Homie" in
// groups/diddyclaw/CLAUDE.md when Diddyclaw was already in place);
// - the global `.env` ASSISTANT_NAME flipped to the most recently-
// registered agent, which then became the install-wide default
// trigger for any *new* group registered without an explicit
// `--assistant-name`.
// Both were unintentional global side-effects of a per-agent operation.
// Scope is now strictly: only the freshly-registered agent's own
// `groups/<folder>/CLAUDE.md`.
let nameUpdated = false; let nameUpdated = false;
if (parsed.assistantName !== 'Andy') { if (parsed.assistantName !== 'Andy') {
log.info('Updating assistant name', { from: 'Andy', to: parsed.assistantName }); const mdFile = path.join(projectRoot, 'groups', parsed.folder, 'CLAUDE.md');
if (fs.existsSync(mdFile)) {
const groupsDir = path.join(projectRoot, 'groups'); const before = fs.readFileSync(mdFile, 'utf-8');
const mdFiles = fs const after = before
.readdirSync(groupsDir) .replace(/^# Andy$/m, `# ${parsed.assistantName}`)
.map((d) => path.join(groupsDir, d, 'CLAUDE.md')) .replace(/You are Andy/g, `You are ${parsed.assistantName}`);
.filter((f) => fs.existsSync(f)); if (after !== before) {
fs.writeFileSync(mdFile, after);
for (const mdFile of mdFiles) { log.info('Updated assistant name in registered group only', {
let content = fs.readFileSync(mdFile, 'utf-8'); file: mdFile,
content = content.replace(/^# Andy$/m, `# ${parsed.assistantName}`); to: parsed.assistantName,
content = content.replace(/You are Andy/g, `You are ${parsed.assistantName}`); });
fs.writeFileSync(mdFile, content); nameUpdated = true;
log.info('Updated CLAUDE.md', { file: mdFile });
}
// Update .env
const envFile = path.join(projectRoot, '.env');
if (fs.existsSync(envFile)) {
let envContent = fs.readFileSync(envFile, 'utf-8');
if (envContent.includes('ASSISTANT_NAME=')) {
envContent = envContent.replace(/^ASSISTANT_NAME=.*$/m, `ASSISTANT_NAME="${parsed.assistantName}"`);
} else {
envContent += `\nASSISTANT_NAME="${parsed.assistantName}"`;
} }
fs.writeFileSync(envFile, envContent);
} else {
fs.writeFileSync(envFile, `ASSISTANT_NAME="${parsed.assistantName}"\n`);
} }
log.info('Set ASSISTANT_NAME in .env');
nameUpdated = true;
} }
emitStatus('REGISTER_CHANNEL', { emitStatus('REGISTER_CHANNEL', {