claude-mococo 0.1.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/LICENSE +21 -0
- package/README.ko.md +171 -0
- package/README.md +180 -0
- package/defaults/shared-rules.md +70 -0
- package/dist/bot/client.d.ts +10 -0
- package/dist/bot/client.d.ts.map +1 -0
- package/dist/bot/client.js +886 -0
- package/dist/bot/client.js.map +1 -0
- package/dist/bot/discord-commands.d.ts +36 -0
- package/dist/bot/discord-commands.d.ts.map +1 -0
- package/dist/bot/discord-commands.js +811 -0
- package/dist/bot/discord-commands.js.map +1 -0
- package/dist/bot/embeds.d.ts +5 -0
- package/dist/bot/embeds.d.ts.map +1 -0
- package/dist/bot/embeds.js +20 -0
- package/dist/bot/embeds.js.map +1 -0
- package/dist/bot/episode-writer.d.ts +5 -0
- package/dist/bot/episode-writer.d.ts.map +1 -0
- package/dist/bot/episode-writer.js +131 -0
- package/dist/bot/episode-writer.js.map +1 -0
- package/dist/bot/improvement-scanner.d.ts +5 -0
- package/dist/bot/improvement-scanner.d.ts.map +1 -0
- package/dist/bot/improvement-scanner.js +563 -0
- package/dist/bot/improvement-scanner.js.map +1 -0
- package/dist/bot/inbox-compactor.d.ts +6 -0
- package/dist/bot/inbox-compactor.d.ts.map +1 -0
- package/dist/bot/inbox-compactor.js +550 -0
- package/dist/bot/inbox-compactor.js.map +1 -0
- package/dist/bot/memory-consolidator.d.ts +4 -0
- package/dist/bot/memory-consolidator.d.ts.map +1 -0
- package/dist/bot/memory-consolidator.js +258 -0
- package/dist/bot/memory-consolidator.js.map +1 -0
- package/dist/bot/router.d.ts +4 -0
- package/dist/bot/router.d.ts.map +1 -0
- package/dist/bot/router.js +24 -0
- package/dist/bot/router.js.map +1 -0
- package/dist/cli/commands/add.d.ts +2 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +203 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +2 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +44 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +2 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +213 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +126 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +21 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +2 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +38 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +2 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +12 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +33 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +78 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompt-template.d.ts +18 -0
- package/dist/cli/prompt-template.d.ts.map +1 -0
- package/dist/cli/prompt-template.js +55 -0
- package/dist/cli/prompt-template.js.map +1 -0
- package/dist/cli/readline-utils.d.ts +5 -0
- package/dist/cli/readline-utils.d.ts.map +1 -0
- package/dist/cli/readline-utils.js +39 -0
- package/dist/cli/readline-utils.js.map +1 -0
- package/dist/cli/workspace.d.ts +7 -0
- package/dist/cli/workspace.d.ts.map +1 -0
- package/dist/cli/workspace.js +39 -0
- package/dist/cli/workspace.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +96 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/claude-engine.d.ts +8 -0
- package/dist/orchestrator/claude-engine.d.ts.map +1 -0
- package/dist/orchestrator/claude-engine.js +94 -0
- package/dist/orchestrator/claude-engine.js.map +1 -0
- package/dist/orchestrator/codex-engine.d.ts +10 -0
- package/dist/orchestrator/codex-engine.d.ts.map +1 -0
- package/dist/orchestrator/codex-engine.js +82 -0
- package/dist/orchestrator/codex-engine.js.map +1 -0
- package/dist/orchestrator/engine-base.d.ts +21 -0
- package/dist/orchestrator/engine-base.d.ts.map +1 -0
- package/dist/orchestrator/engine-base.js +20 -0
- package/dist/orchestrator/engine-base.js.map +1 -0
- package/dist/orchestrator/engines.d.ts +5 -0
- package/dist/orchestrator/engines.d.ts.map +1 -0
- package/dist/orchestrator/engines.js +16 -0
- package/dist/orchestrator/engines.js.map +1 -0
- package/dist/orchestrator/gemini-engine.d.ts +10 -0
- package/dist/orchestrator/gemini-engine.d.ts.map +1 -0
- package/dist/orchestrator/gemini-engine.js +79 -0
- package/dist/orchestrator/gemini-engine.js.map +1 -0
- package/dist/orchestrator/mcp-config.d.ts +4 -0
- package/dist/orchestrator/mcp-config.d.ts.map +1 -0
- package/dist/orchestrator/mcp-config.js +23 -0
- package/dist/orchestrator/mcp-config.js.map +1 -0
- package/dist/orchestrator/prompt-builder.d.ts +3 -0
- package/dist/orchestrator/prompt-builder.d.ts.map +1 -0
- package/dist/orchestrator/prompt-builder.js +445 -0
- package/dist/orchestrator/prompt-builder.js.map +1 -0
- package/dist/server/hook-receiver.d.ts +5 -0
- package/dist/server/hook-receiver.d.ts.map +1 -0
- package/dist/server/hook-receiver.js +52 -0
- package/dist/server/hook-receiver.js.map +1 -0
- package/dist/teams/concurrency.d.ts +12 -0
- package/dist/teams/concurrency.d.ts.map +1 -0
- package/dist/teams/concurrency.js +43 -0
- package/dist/teams/concurrency.js.map +1 -0
- package/dist/teams/context.d.ts +5 -0
- package/dist/teams/context.d.ts.map +1 -0
- package/dist/teams/context.js +33 -0
- package/dist/teams/context.js.map +1 -0
- package/dist/teams/dispatch-ledger.d.ts +27 -0
- package/dist/teams/dispatch-ledger.d.ts.map +1 -0
- package/dist/teams/dispatch-ledger.js +90 -0
- package/dist/teams/dispatch-ledger.js.map +1 -0
- package/dist/teams/invoker.d.ts +9 -0
- package/dist/teams/invoker.d.ts.map +1 -0
- package/dist/teams/invoker.js +54 -0
- package/dist/teams/invoker.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +3 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +17 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/github-status.d.ts +25 -0
- package/dist/utils/github-status.d.ts.map +1 -0
- package/dist/utils/github-status.js +158 -0
- package/dist/utils/github-status.js.map +1 -0
- package/dist/utils/haiku.d.ts +6 -0
- package/dist/utils/haiku.d.ts.map +1 -0
- package/dist/utils/haiku.js +43 -0
- package/dist/utils/haiku.js.map +1 -0
- package/hooks/event-bridge.sh +21 -0
- package/hooks/permission-gate.sh +67 -0
- package/package.json +52 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { ask, confirm, choose, closeRL } from '../readline-utils.js';
|
|
4
|
+
import { generatePrompt } from '../prompt-template.js';
|
|
5
|
+
import { requireWorkspace } from '../workspace.js';
|
|
6
|
+
const ENGINE_DEFAULTS = {
|
|
7
|
+
claude: 'sonnet',
|
|
8
|
+
codex: 'o3',
|
|
9
|
+
gemini: 'gemini-2.5-pro',
|
|
10
|
+
};
|
|
11
|
+
const PERMISSION_PRESETS = {
|
|
12
|
+
'Full — can push, create PRs': {
|
|
13
|
+
allow: ['git push', 'gh pr create'],
|
|
14
|
+
deny: ['gh pr merge'],
|
|
15
|
+
},
|
|
16
|
+
'Developer — can edit files, no push': {
|
|
17
|
+
deny: ['git push', 'gh pr'],
|
|
18
|
+
},
|
|
19
|
+
'Read-only — no edits, no push': {
|
|
20
|
+
deny: ['git push', 'gh pr', 'Edit', 'Write'],
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
const MBTI_PRESETS = {
|
|
24
|
+
'ENTJ — Strategist, decisive, big-picture leader': 'ENTJ — Strategist, decisive, big-picture leader',
|
|
25
|
+
'ISTJ — Rule-follower, systematic, accuracy-focused': 'ISTJ — Rule-follower, systematic, accuracy-focused',
|
|
26
|
+
'ENFJ — People-oriented, empathetic, team harmony': 'ENFJ — People-oriented, empathetic, team harmony',
|
|
27
|
+
'INTP — Analytical, logical, deep explorer': 'INTP — Analytical, logical, deep explorer',
|
|
28
|
+
'Custom': '',
|
|
29
|
+
};
|
|
30
|
+
const SPEECH_PRESETS = {
|
|
31
|
+
'Formal to everyone': [
|
|
32
|
+
' - To the human: formal and respectful',
|
|
33
|
+
' - To the leader: formal and respectful',
|
|
34
|
+
' - To other agents: polite and professional',
|
|
35
|
+
].join('\n'),
|
|
36
|
+
'Formal to human + casual to peers': [
|
|
37
|
+
' - To the human: strictly formal and respectful',
|
|
38
|
+
' - To other agents: casual and direct',
|
|
39
|
+
].join('\n'),
|
|
40
|
+
'Custom': '',
|
|
41
|
+
};
|
|
42
|
+
const EDIT_FIELDS = [
|
|
43
|
+
'name — Display name',
|
|
44
|
+
'character — MBTI, speech style, personality, habits',
|
|
45
|
+
'role — Scope, authority, expertise',
|
|
46
|
+
'engine — Engine and model',
|
|
47
|
+
'budget — Max budget',
|
|
48
|
+
'channels — Channel restrictions',
|
|
49
|
+
'permissions — Permission preset',
|
|
50
|
+
'git — Git author identity',
|
|
51
|
+
'all — Edit everything',
|
|
52
|
+
];
|
|
53
|
+
export async function runEdit(id) {
|
|
54
|
+
if (!id) {
|
|
55
|
+
console.error('Usage: mococo edit <assistant-id>');
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
const ws = requireWorkspace();
|
|
59
|
+
const teamsJsonPath = path.join(ws, 'teams.json');
|
|
60
|
+
const raw = JSON.parse(fs.readFileSync(teamsJsonPath, 'utf-8'));
|
|
61
|
+
const team = raw.teams[id];
|
|
62
|
+
// Load humanTitle from config for prompt generation
|
|
63
|
+
const humanTitle = raw.humanTitle ?? 'Boss';
|
|
64
|
+
if (!team) {
|
|
65
|
+
console.error(`Assistant "${id}" not found.`);
|
|
66
|
+
const ids = Object.keys(raw.teams);
|
|
67
|
+
if (ids.length > 0) {
|
|
68
|
+
console.error(`Available: ${ids.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
console.log(`Editing assistant "${team.name}" (${id})\n`);
|
|
73
|
+
const fieldChoice = await choose('What to edit:', EDIT_FIELDS, 7);
|
|
74
|
+
const field = fieldChoice.split(' ')[0];
|
|
75
|
+
const editAll = field === 'all';
|
|
76
|
+
// Name
|
|
77
|
+
if (editAll || field === 'name') {
|
|
78
|
+
team.name = await ask('Display name', team.name);
|
|
79
|
+
}
|
|
80
|
+
// Character & Role → regenerate prompt
|
|
81
|
+
let regeneratePrompt = false;
|
|
82
|
+
let mbti = '';
|
|
83
|
+
let speechStyle = '';
|
|
84
|
+
let traits = [];
|
|
85
|
+
let habits = [];
|
|
86
|
+
let role = '';
|
|
87
|
+
let scope = [];
|
|
88
|
+
let notScope = [];
|
|
89
|
+
let authorityIndependent = '';
|
|
90
|
+
let authorityNeedsApproval = '';
|
|
91
|
+
let expertise = [];
|
|
92
|
+
let rules = [];
|
|
93
|
+
let isLeader = team.isLeader ?? false;
|
|
94
|
+
if (editAll || field === 'character' || field === 'role') {
|
|
95
|
+
if (editAll || field === 'character') {
|
|
96
|
+
console.log('\n── Character ──');
|
|
97
|
+
const mbtiNames = Object.keys(MBTI_PRESETS);
|
|
98
|
+
const mbtiChoice = await choose('MBTI:', mbtiNames, 0);
|
|
99
|
+
mbti = MBTI_PRESETS[mbtiChoice];
|
|
100
|
+
if (!mbti) {
|
|
101
|
+
mbti = await ask('MBTI (e.g. ISFJ — Diligent, caring, executor)');
|
|
102
|
+
}
|
|
103
|
+
const speechNames = Object.keys(SPEECH_PRESETS);
|
|
104
|
+
const speechChoice = await choose('Speech style:', speechNames, 0);
|
|
105
|
+
speechStyle = SPEECH_PRESETS[speechChoice];
|
|
106
|
+
if (!speechStyle) {
|
|
107
|
+
console.log('Enter speech style line by line (empty line to finish):');
|
|
108
|
+
const lines = [];
|
|
109
|
+
let line = await ask(' ');
|
|
110
|
+
while (line) {
|
|
111
|
+
lines.push(` - ${line}`);
|
|
112
|
+
line = await ask(' ');
|
|
113
|
+
}
|
|
114
|
+
speechStyle = lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
console.log('Personality traits (with behavior examples, comma-separated):');
|
|
117
|
+
const traitsStr = await ask(' Traits', '');
|
|
118
|
+
traits = traitsStr ? traitsStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
119
|
+
console.log('Habits (comma-separated):');
|
|
120
|
+
const habitsStr = await ask(' Habits', '');
|
|
121
|
+
habits = habitsStr ? habitsStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
122
|
+
}
|
|
123
|
+
if (editAll || field === 'role') {
|
|
124
|
+
console.log('\n── Role ──');
|
|
125
|
+
role = await ask('Core role (1-2 sentences)', '');
|
|
126
|
+
console.log('Scope (comma-separated):');
|
|
127
|
+
const scopeStr = await ask(' Scope', '');
|
|
128
|
+
scope = scopeStr ? scopeStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
129
|
+
console.log('Not in scope (comma-separated):');
|
|
130
|
+
const notScopeStr = await ask(' Not in scope', '');
|
|
131
|
+
notScope = notScopeStr ? notScopeStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
132
|
+
authorityIndependent = await ask('Independent decisions', '');
|
|
133
|
+
authorityNeedsApproval = await ask('Needs approval for', '');
|
|
134
|
+
console.log('Expertise (comma-separated):');
|
|
135
|
+
const expertiseStr = await ask(' Expertise', '');
|
|
136
|
+
expertise = expertiseStr ? expertiseStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
137
|
+
console.log('Additional rules (comma-separated):');
|
|
138
|
+
const rulesStr = await ask(' Rules', '');
|
|
139
|
+
rules = rulesStr ? rulesStr.split(',').map(s => s.trim()).filter(Boolean) : [];
|
|
140
|
+
isLeader = await confirm('Is this the leader?', team.isLeader ?? false);
|
|
141
|
+
if (isLeader) {
|
|
142
|
+
team.isLeader = true;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
delete team.isLeader;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
regeneratePrompt = await confirm('Regenerate persona file? (overwrites existing)', true);
|
|
149
|
+
}
|
|
150
|
+
// Engine
|
|
151
|
+
if (editAll || field === 'engine') {
|
|
152
|
+
const engine = await choose('Engine:', ['claude', 'codex', 'gemini'], ['claude', 'codex', 'gemini'].indexOf(team.engine));
|
|
153
|
+
team.engine = engine;
|
|
154
|
+
team.model = await ask('Model', team.model ?? ENGINE_DEFAULTS[engine]);
|
|
155
|
+
}
|
|
156
|
+
// Budget
|
|
157
|
+
if (editAll || field === 'budget') {
|
|
158
|
+
const budgetStr = await ask('Max budget per invocation ($)', String(team.maxBudget ?? 10));
|
|
159
|
+
team.maxBudget = parseFloat(budgetStr) || 10;
|
|
160
|
+
}
|
|
161
|
+
// Channels
|
|
162
|
+
if (editAll || field === 'channels') {
|
|
163
|
+
const current = (team.channels ?? []).join(', ');
|
|
164
|
+
console.log(`Current channels: ${current || '(all channels)'}`);
|
|
165
|
+
console.log('Channel IDs (comma-separated, empty = all channels):');
|
|
166
|
+
const channelsStr = await ask(' Channels', current);
|
|
167
|
+
const channels = channelsStr
|
|
168
|
+
? channelsStr.split(',').map((s) => s.trim()).filter(Boolean)
|
|
169
|
+
: [];
|
|
170
|
+
if (channels.length > 0) {
|
|
171
|
+
team.channels = channels;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
delete team.channels;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Permissions
|
|
178
|
+
if (editAll || field === 'permissions') {
|
|
179
|
+
const presetNames = Object.keys(PERMISSION_PRESETS);
|
|
180
|
+
const presetChoice = await choose('Permission preset:', presetNames, 1);
|
|
181
|
+
team.permissions = PERMISSION_PRESETS[presetChoice] ?? {};
|
|
182
|
+
}
|
|
183
|
+
// Git identity
|
|
184
|
+
if (editAll || field === 'git') {
|
|
185
|
+
const git = team.git ?? {};
|
|
186
|
+
git.name = await ask('Git author name', git.name ?? `${team.name} (mococo)`);
|
|
187
|
+
git.email = await ask('Git author email', git.email ?? `${id}@users.noreply.github.com`);
|
|
188
|
+
team.git = git;
|
|
189
|
+
}
|
|
190
|
+
closeRL();
|
|
191
|
+
// Save teams.json
|
|
192
|
+
raw.teams[id] = team;
|
|
193
|
+
fs.writeFileSync(teamsJsonPath, JSON.stringify(raw, null, 2) + '\n');
|
|
194
|
+
// Regenerate prompt if requested
|
|
195
|
+
if (regeneratePrompt && (role || mbti)) {
|
|
196
|
+
const promptPath = path.join(ws, 'prompts', `${id}.md`);
|
|
197
|
+
fs.writeFileSync(promptPath, generatePrompt({
|
|
198
|
+
name: team.name,
|
|
199
|
+
mbti: mbti || 'MBTI — (edit manually)',
|
|
200
|
+
speechStyle: speechStyle || ' - (edit manually)',
|
|
201
|
+
traits, habits,
|
|
202
|
+
role: role || '(edit manually)',
|
|
203
|
+
scope, notScope,
|
|
204
|
+
authorityIndependent, authorityNeedsApproval,
|
|
205
|
+
expertise, rules,
|
|
206
|
+
isLeader,
|
|
207
|
+
humanTitle,
|
|
208
|
+
}));
|
|
209
|
+
console.log(` Persona regenerated: prompts/${id}.md`);
|
|
210
|
+
}
|
|
211
|
+
console.log(`\nAgent "${team.name}" (${id}) updated successfully.`);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/cli/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,kBAAkB,GAA0D;IAChF,6BAA6B,EAAE;QAC7B,KAAK,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC;QACnC,IAAI,EAAE,CAAC,aAAa,CAAC;KACtB;IACD,qCAAqC,EAAE;QACrC,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;KAC5B;IACD,+BAA+B,EAAE;QAC/B,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;KAC7C;CACF,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,iDAAiD,EAAE,iDAAiD;IACpG,oDAAoD,EAAE,oDAAoD;IAC1G,kDAAkD,EAAE,kDAAkD;IACtG,2CAA2C,EAAE,2CAA2C;IACxF,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,oBAAoB,EAAE;QACpB,yCAAyC;QACzC,0CAA0C;QAC1C,8CAA8C;KAC/C,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,mCAAmC,EAAE;QACnC,kDAAkD;QAClD,wCAAwC;KACzC,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,4BAA4B;IAC5B,uDAAuD;IACvD,2CAA2C;IAC3C,gCAAgC;IAChC,0BAA0B;IAC1B,oCAAoC;IACpC,iCAAiC;IACjC,mCAAmC;IACnC,+BAA+B;CAChC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACtC,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3B,oDAAoD;IACpD,MAAM,UAAU,GAAW,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;IAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,MAAM,EAAE,KAAK,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,KAAK,KAAK,KAAK,CAAC;IAEhC,OAAO;IACP,IAAI,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,uCAAuC;IACvC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAa,EAAE,CAAC;IAC5B,IAAI,oBAAoB,GAAG,EAAE,CAAC;IAC9B,IAAI,sBAAsB,GAAG,EAAE,CAAC;IAChC,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;IAEtC,IAAI,OAAO,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACzD,IAAI,OAAO,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACvD,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,IAAI,GAAG,MAAM,GAAG,CAAC,+CAA+C,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACnE,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,IAAI,EAAE,CAAC;oBACZ,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC1B,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;gBACD,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;YAC7E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElF,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,IAAI,GAAG,MAAM,GAAG,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;YAElD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE/E,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YACpD,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAExF,oBAAoB,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAC9D,sBAAsB,GAAG,MAAM,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;YAE7D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE3F,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC1C,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE/E,QAAQ,GAAG,MAAM,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;YACxE,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC,QAAQ,CAAC;YACvB,CAAC;QACH,CAAC;QAED,gBAAgB,GAAG,MAAM,OAAO,CAAC,gDAAgD,EAAE,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,SAAS;IACT,IAAI,OAAO,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAClE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,SAAS;IACT,IAAI,OAAO,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IAED,WAAW;IACX,IAAI,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACrE,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,OAAO,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,eAAe;IACf,IAAI,OAAO,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,WAAW,CAAC,CAAC;QAC7E,GAAG,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,EAAE,2BAA2B,CAAC,CAAC;QACzF,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,CAAC;IAEV,kBAAkB;IAClB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErE,iCAAiC;IACjC,IAAI,gBAAgB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACxD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,IAAI,wBAAwB;YACtC,WAAW,EAAE,WAAW,IAAI,qBAAqB;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,IAAI,iBAAiB;YAC/B,KAAK,EAAE,QAAQ;YACf,oBAAoB,EAAE,sBAAsB;YAC5C,SAAS,EAAE,KAAK;YAChB,QAAQ;YACR,UAAU;SACX,CAAC,CAAC,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,MAAM,EAAE,yBAAyB,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAwBA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA6G7C"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { ask, closeRL } from '../readline-utils.js';
|
|
5
|
+
function getPackageRoot() {
|
|
6
|
+
// Resolve from dist/cli/commands/init.js → package root
|
|
7
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
8
|
+
return path.resolve(path.dirname(thisFile), '..', '..', '..');
|
|
9
|
+
}
|
|
10
|
+
function copyDir(src, dest) {
|
|
11
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
12
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
13
|
+
const srcPath = path.join(src, entry.name);
|
|
14
|
+
const destPath = path.join(dest, entry.name);
|
|
15
|
+
if (entry.isDirectory()) {
|
|
16
|
+
copyDir(srcPath, destPath);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
fs.copyFileSync(srcPath, destPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function runInit() {
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
const teamsJsonPath = path.join(cwd, 'teams.json');
|
|
26
|
+
const isReinit = fs.existsSync(teamsJsonPath);
|
|
27
|
+
if (isReinit) {
|
|
28
|
+
console.log('Existing workspace detected. Updating settings...\n');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log('Initializing workspace...\n');
|
|
32
|
+
}
|
|
33
|
+
const channelId = await ask('Discord work channel ID (leave empty for all channels)');
|
|
34
|
+
const humanId = await ask('Your Discord user ID (right-click your name → Copy User ID)');
|
|
35
|
+
if (isReinit) {
|
|
36
|
+
// Update existing teams.json — preserve teams, update global settings
|
|
37
|
+
const existing = JSON.parse(fs.readFileSync(teamsJsonPath, 'utf-8'));
|
|
38
|
+
if (humanId)
|
|
39
|
+
existing.humanDiscordId = humanId;
|
|
40
|
+
fs.writeFileSync(teamsJsonPath, JSON.stringify(existing, null, 2) + '\n');
|
|
41
|
+
// Update .env — replace WORK_CHANNEL_ID and HOOK_PORT lines, keep token lines
|
|
42
|
+
const envPath = path.join(cwd, '.env');
|
|
43
|
+
let envLines = [];
|
|
44
|
+
if (fs.existsSync(envPath)) {
|
|
45
|
+
envLines = fs.readFileSync(envPath, 'utf-8').split('\n')
|
|
46
|
+
.filter(l => !l.startsWith('WORK_CHANNEL_ID=') && !l.startsWith('HOOK_PORT='));
|
|
47
|
+
}
|
|
48
|
+
envLines.unshift(`WORK_CHANNEL_ID=${channelId}`, 'HOOK_PORT=9876');
|
|
49
|
+
fs.writeFileSync(envPath, envLines.join('\n') + '\n');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Fresh init
|
|
53
|
+
const teamsJson = {
|
|
54
|
+
teams: {},
|
|
55
|
+
globalDeny: ['gh pr merge', 'git push --force main', 'git push --force master'],
|
|
56
|
+
conversationWindow: 30,
|
|
57
|
+
};
|
|
58
|
+
if (humanId) {
|
|
59
|
+
teamsJson.humanDiscordId = humanId;
|
|
60
|
+
}
|
|
61
|
+
fs.writeFileSync(teamsJsonPath, JSON.stringify(teamsJson, null, 2) + '\n');
|
|
62
|
+
// .env
|
|
63
|
+
const envContent = [
|
|
64
|
+
`WORK_CHANNEL_ID=${channelId}`,
|
|
65
|
+
'HOOK_PORT=9876',
|
|
66
|
+
'',
|
|
67
|
+
].join('\n');
|
|
68
|
+
fs.writeFileSync(path.join(cwd, '.env'), envContent);
|
|
69
|
+
// .gitignore
|
|
70
|
+
const gitignore = [
|
|
71
|
+
'.env',
|
|
72
|
+
'.mococo/',
|
|
73
|
+
'repos/*',
|
|
74
|
+
'!repos/.gitkeep',
|
|
75
|
+
].join('\n') + '\n';
|
|
76
|
+
fs.writeFileSync(path.join(cwd, '.gitignore'), gitignore);
|
|
77
|
+
}
|
|
78
|
+
// Ensure directories exist (both fresh and reinit)
|
|
79
|
+
fs.mkdirSync(path.join(cwd, 'prompts'), { recursive: true });
|
|
80
|
+
// Copy default shared-rules.md if not present
|
|
81
|
+
const sharedRulesPath = path.join(cwd, 'prompts', 'shared-rules.md');
|
|
82
|
+
if (!fs.existsSync(sharedRulesPath)) {
|
|
83
|
+
const defaultRules = path.join(getPackageRoot(), 'defaults', 'shared-rules.md');
|
|
84
|
+
if (fs.existsSync(defaultRules)) {
|
|
85
|
+
fs.copyFileSync(defaultRules, sharedRulesPath);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
fs.mkdirSync(path.join(cwd, 'repos'), { recursive: true });
|
|
89
|
+
if (!fs.existsSync(path.join(cwd, 'repos', '.gitkeep'))) {
|
|
90
|
+
fs.writeFileSync(path.join(cwd, 'repos', '.gitkeep'), '');
|
|
91
|
+
}
|
|
92
|
+
fs.mkdirSync(path.join(cwd, '.mococo'), { recursive: true });
|
|
93
|
+
// Copy/update hooks from package
|
|
94
|
+
const packageRoot = getPackageRoot();
|
|
95
|
+
const srcHooks = path.join(packageRoot, 'hooks');
|
|
96
|
+
const destHooks = path.join(cwd, 'hooks');
|
|
97
|
+
if (fs.existsSync(srcHooks)) {
|
|
98
|
+
copyDir(srcHooks, destHooks);
|
|
99
|
+
for (const f of fs.readdirSync(destHooks)) {
|
|
100
|
+
if (f.endsWith('.sh')) {
|
|
101
|
+
fs.chmodSync(path.join(destHooks, f), 0o755);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (!fs.existsSync(destHooks)) {
|
|
106
|
+
fs.mkdirSync(destHooks, { recursive: true });
|
|
107
|
+
console.warn('Warning: hooks/ not found in package. You may need to copy them manually.');
|
|
108
|
+
}
|
|
109
|
+
closeRL();
|
|
110
|
+
if (isReinit) {
|
|
111
|
+
console.log('\nWorkspace updated.');
|
|
112
|
+
console.log(' teams.json — settings updated (assistants preserved)');
|
|
113
|
+
console.log(' .env — channel/port updated (tokens preserved)');
|
|
114
|
+
console.log(' hooks/ — refreshed from package');
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.log('\nWorkspace created:');
|
|
118
|
+
console.log(' teams.json — assistant configuration');
|
|
119
|
+
console.log(' .env — tokens and settings');
|
|
120
|
+
console.log(' prompts/ — personality files');
|
|
121
|
+
console.log(' repos/ — linked repositories');
|
|
122
|
+
console.log(' hooks/ — Claude Code hooks');
|
|
123
|
+
console.log('\nNext: run `mococo add` to add your first assistant.');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB7C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { requireWorkspace } from '../workspace.js';
|
|
4
|
+
export async function runList() {
|
|
5
|
+
const ws = requireWorkspace();
|
|
6
|
+
const raw = JSON.parse(fs.readFileSync(path.join(ws, 'teams.json'), 'utf-8'));
|
|
7
|
+
const teams = raw.teams;
|
|
8
|
+
const ids = Object.keys(teams);
|
|
9
|
+
if (ids.length === 0) {
|
|
10
|
+
console.log('No assistants configured. Run `mococo add` to add one.');
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
console.log(`\n ${'ID'.padEnd(16)} ${'Name'.padEnd(16)} ${'Engine'.padEnd(10)} ${'Model'.padEnd(18)} Leader`);
|
|
14
|
+
console.log(` ${'─'.repeat(16)} ${'─'.repeat(16)} ${'─'.repeat(10)} ${'─'.repeat(18)} ──────`);
|
|
15
|
+
for (const [id, cfg] of Object.entries(teams)) {
|
|
16
|
+
const leader = cfg.isLeader ? 'yes' : '';
|
|
17
|
+
console.log(` ${id.padEnd(16)} ${(cfg.name ?? id).padEnd(16)} ${(cfg.engine ?? 'claude').padEnd(10)} ${(cfg.model ?? 'sonnet').padEnd(18)} ${leader}`);
|
|
18
|
+
}
|
|
19
|
+
console.log();
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,GAAG,CAAC,KAA4B,CAAC;IAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/G,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAEhG,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAoB,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;IAC1J,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC3D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { requireWorkspace } from '../workspace.js';
|
|
4
|
+
export async function runRemove(name) {
|
|
5
|
+
if (!name) {
|
|
6
|
+
console.error('Usage: mococo remove <assistant-id>');
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
const ws = requireWorkspace();
|
|
10
|
+
const teamsJsonPath = path.join(ws, 'teams.json');
|
|
11
|
+
const raw = JSON.parse(fs.readFileSync(teamsJsonPath, 'utf-8'));
|
|
12
|
+
if (!raw.teams[name]) {
|
|
13
|
+
console.error(`Assistant "${name}" not found.`);
|
|
14
|
+
const ids = Object.keys(raw.teams);
|
|
15
|
+
if (ids.length > 0) {
|
|
16
|
+
console.error(`Available: ${ids.join(', ')}`);
|
|
17
|
+
}
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Remove from teams.json
|
|
21
|
+
delete raw.teams[name];
|
|
22
|
+
fs.writeFileSync(teamsJsonPath, JSON.stringify(raw, null, 2) + '\n');
|
|
23
|
+
// Remove prompt file
|
|
24
|
+
const promptPath = path.join(ws, 'prompts', `${name}.md`);
|
|
25
|
+
if (fs.existsSync(promptPath)) {
|
|
26
|
+
fs.unlinkSync(promptPath);
|
|
27
|
+
}
|
|
28
|
+
// Remove token lines from .env
|
|
29
|
+
const envPath = path.join(ws, '.env');
|
|
30
|
+
if (fs.existsSync(envPath)) {
|
|
31
|
+
const prefix = `${name.toUpperCase()}_`;
|
|
32
|
+
const lines = fs.readFileSync(envPath, 'utf-8').split('\n');
|
|
33
|
+
const filtered = lines.filter(line => !line.startsWith(prefix));
|
|
34
|
+
fs.writeFileSync(envPath, filtered.join('\n'));
|
|
35
|
+
}
|
|
36
|
+
console.log(`Removed assistant "${name}".`);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,cAAc,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAErE,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
export async function runRestart() {
|
|
5
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
6
|
+
const projectRoot = path.resolve(path.dirname(thisFile), '..', '..', '..');
|
|
7
|
+
const triggerFile = path.join(projectRoot, '.restart-trigger');
|
|
8
|
+
// Update the trigger file timestamp (creates if missing)
|
|
9
|
+
fs.writeFileSync(triggerFile, new Date().toISOString());
|
|
10
|
+
console.log('Restart triggered — mococo dev will rebuild and restart.');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/cli/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAE/D,yDAAyD;IACzD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAExD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAQA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC9C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { config as loadDotenv } from 'dotenv';
|
|
3
|
+
import { loadTeamsConfig } from '../../config.js';
|
|
4
|
+
import { createBots } from '../../bot/client.js';
|
|
5
|
+
import { startHookServer } from '../../server/hook-receiver.js';
|
|
6
|
+
import { requireWorkspace } from '../workspace.js';
|
|
7
|
+
export async function runStart() {
|
|
8
|
+
const ws = requireWorkspace();
|
|
9
|
+
// Load .env from workspace
|
|
10
|
+
loadDotenv({ path: path.join(ws, '.env') });
|
|
11
|
+
const config = loadTeamsConfig(ws);
|
|
12
|
+
const env = {
|
|
13
|
+
workChannelId: process.env.WORK_CHANNEL_ID || undefined,
|
|
14
|
+
hookPort: parseInt(process.env.HOOK_PORT ?? '9876'),
|
|
15
|
+
memberTrackingChannelId: process.env.MEMBER_TRACKING_CHANNEL_ID || undefined,
|
|
16
|
+
};
|
|
17
|
+
if (!env.workChannelId) {
|
|
18
|
+
console.log('WORK_CHANNEL_ID not set — bot will respond in all channels.');
|
|
19
|
+
}
|
|
20
|
+
const teamsWithTokens = Object.values(config.teams).filter(t => t.discordToken);
|
|
21
|
+
if (teamsWithTokens.length === 0) {
|
|
22
|
+
console.error('No assistant has a Discord token configured.');
|
|
23
|
+
console.error('Run `mococo add` to add an assistant, or set tokens in .env');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
startHookServer(env.hookPort);
|
|
27
|
+
console.log(`Starting ${teamsWithTokens.length} assistant(s)...`);
|
|
28
|
+
await createBots(config, env);
|
|
29
|
+
const teamCount = Object.keys(config.teams).length;
|
|
30
|
+
const engines = [...new Set(Object.values(config.teams).map(t => t.engine))];
|
|
31
|
+
console.log(`mococo running — ${teamsWithTokens.length}/${teamCount} assistants online (engines: ${engines.join(', ')})`);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAE9B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAEnC,MAAM,GAAG,GAAc;QACrB,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS;QACvD,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;QACnD,uBAAuB,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,SAAS;KAC7E,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAChF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAClE,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACnD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oBAAoB,eAAe,CAAC,MAAM,IAAI,SAAS,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5H,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const command = process.argv[2];
|
|
3
|
+
const arg = process.argv[3];
|
|
4
|
+
async function main() {
|
|
5
|
+
switch (command) {
|
|
6
|
+
case 'init': {
|
|
7
|
+
const { runInit } = await import('./commands/init.js');
|
|
8
|
+
await runInit();
|
|
9
|
+
break;
|
|
10
|
+
}
|
|
11
|
+
case 'add': {
|
|
12
|
+
const { runAdd } = await import('./commands/add.js');
|
|
13
|
+
await runAdd();
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
case 'start': {
|
|
17
|
+
const { runStart } = await import('./commands/start.js');
|
|
18
|
+
await runStart();
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
case 'dev': {
|
|
22
|
+
const { runDev } = await import('./commands/dev.js');
|
|
23
|
+
await runDev();
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case 'restart': {
|
|
27
|
+
const { runRestart } = await import('./commands/restart.js');
|
|
28
|
+
await runRestart();
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case 'list':
|
|
32
|
+
case 'ls': {
|
|
33
|
+
const { runList } = await import('./commands/list.js');
|
|
34
|
+
await runList();
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'edit': {
|
|
38
|
+
const { runEdit } = await import('./commands/edit.js');
|
|
39
|
+
await runEdit(arg ?? '');
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
case 'remove':
|
|
43
|
+
case 'rm': {
|
|
44
|
+
const { runRemove } = await import('./commands/remove.js');
|
|
45
|
+
await runRemove(arg ?? '');
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
default:
|
|
49
|
+
console.log(`mococo — AI assistants on Discord
|
|
50
|
+
|
|
51
|
+
Usage:
|
|
52
|
+
mococo init Create a new workspace
|
|
53
|
+
mococo add Add an assistant (interactive)
|
|
54
|
+
mococo edit <id> Edit an assistant's settings
|
|
55
|
+
mococo start Start all assistants
|
|
56
|
+
mococo dev Start in dev mode (rebuild on trigger)
|
|
57
|
+
mococo restart Trigger rebuild + restart (use with dev)
|
|
58
|
+
mococo list List configured assistants
|
|
59
|
+
mococo remove <id> Remove an assistant
|
|
60
|
+
|
|
61
|
+
Getting started:
|
|
62
|
+
mkdir my-team && cd my-team
|
|
63
|
+
mococo init
|
|
64
|
+
mococo add
|
|
65
|
+
mococo start`);
|
|
66
|
+
if (command && command !== 'help' && command !== '--help' && command !== '-h') {
|
|
67
|
+
console.error(`\nUnknown command: ${command}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
main().catch((err) => {
|
|
74
|
+
console.error(err instanceof Error ? err.message : err);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
});
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5B,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACvD,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACrD,MAAM,MAAM,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACzD,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACrD,MAAM,MAAM,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAC7D,MAAM,UAAU,EAAE,CAAC;YACnB,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACvD,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACzB,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;eAgBH,CAAC,CAAC;YACX,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9E,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;IACV,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|