@quaglius/ai-comms 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.
Files changed (48) hide show
  1. package/.claude-plugin/plugin.json +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +481 -0
  4. package/bin/ai-comms.js +2 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +303 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +136 -0
  9. package/dist/config.js +81 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context.d.ts +49 -0
  12. package/dist/context.js +143 -0
  13. package/dist/context.js.map +1 -0
  14. package/dist/daemon.d.ts +3 -0
  15. package/dist/daemon.js +245 -0
  16. package/dist/daemon.js.map +1 -0
  17. package/dist/discord.d.ts +52 -0
  18. package/dist/discord.js +203 -0
  19. package/dist/discord.js.map +1 -0
  20. package/dist/envelope.d.ts +208 -0
  21. package/dist/envelope.js +209 -0
  22. package/dist/envelope.js.map +1 -0
  23. package/dist/mcp.d.ts +4 -0
  24. package/dist/mcp.js +169 -0
  25. package/dist/mcp.js.map +1 -0
  26. package/dist/migrate.d.ts +2 -0
  27. package/dist/migrate.js +99 -0
  28. package/dist/migrate.js.map +1 -0
  29. package/dist/paths.d.ts +16 -0
  30. package/dist/paths.js +47 -0
  31. package/dist/paths.js.map +1 -0
  32. package/dist/prompt.d.ts +2 -0
  33. package/dist/prompt.js +70 -0
  34. package/dist/prompt.js.map +1 -0
  35. package/dist/secrets.d.ts +15 -0
  36. package/dist/secrets.js +72 -0
  37. package/dist/secrets.js.map +1 -0
  38. package/dist/store.d.ts +46 -0
  39. package/dist/store.js +186 -0
  40. package/dist/store.js.map +1 -0
  41. package/docs/INSTALL.md +128 -0
  42. package/docs/OPEN-QUESTIONS.md +53 -0
  43. package/docs/PROTOCOL.md +81 -0
  44. package/docs/SETUP-FOR-AGENTS.md +293 -0
  45. package/docs/SPEC-v0.md +142 -0
  46. package/docs/SPEC-v1.md +190 -0
  47. package/package.json +61 -0
  48. package/skills/ai-comms/SKILL.md +71 -0
package/dist/cli.js ADDED
@@ -0,0 +1,303 @@
1
+ #!/usr/bin/env node
2
+ import { writeFileSync, existsSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { Command } from 'commander';
5
+ import { ConfigError, loadConfig, saveConfig, redactedContext, ConfigV2Schema, } from './config.js';
6
+ import { contextResolutionError, loadRepoComms, resolveContext, RepoCommsSchema, } from './context.js';
7
+ import { runDaemon } from './daemon.js';
8
+ import { runMcpServer } from './mcp.js';
9
+ import { checkBotPermissions, getBotUser, getChannel, REQUIRED_PERMISSION_BITS, } from './discord.js';
10
+ import { REPO_COMMS_FILENAME } from './paths.js';
11
+ import { prompt, promptSecret } from './prompt.js';
12
+ import { getEffectiveToken, SecretsError, setProjectToken, tokenSourceLabel, } from './secrets.js';
13
+ import { loadLog, loadReadState, materializeActiveClaims, materializeInbox, markRead, } from './store.js';
14
+ async function runInit() {
15
+ console.log('ai-comms initial setup\n');
16
+ const dev = await prompt('dev (stable slug, e.g. ana)');
17
+ const agent = await prompt('agent (e.g. claude-code, cursor)');
18
+ const project = await prompt('project (team/project name, e.g. acme)');
19
+ const channelId = await prompt('Discord channel ID for the project');
20
+ const config = ConfigV2Schema.parse({
21
+ version: 2,
22
+ identity: { dev, agent },
23
+ defaultProject: project,
24
+ projects: {
25
+ [project]: {
26
+ discord: { channelId },
27
+ repos: [],
28
+ },
29
+ },
30
+ });
31
+ saveConfig(config);
32
+ console.log(`\nConfig saved to ~/.ai-comms/config.json`);
33
+ console.log(`Run "ai-comms secret set ${project}" to store the bot token.`);
34
+ console.log('Then run "ai-comms link" in each repo and "ai-comms doctor" to verify.');
35
+ }
36
+ async function runLink() {
37
+ const config = loadConfig();
38
+ const cwd = process.cwd();
39
+ const target = path.join(cwd, REPO_COMMS_FILENAME);
40
+ if (existsSync(target)) {
41
+ console.error(`${target} already exists. Edit the file manually if you need to change it.`);
42
+ process.exit(1);
43
+ }
44
+ const defaultProject = config.defaultProject;
45
+ const project = await prompt('project', defaultProject);
46
+ const defaultRepo = path.basename(cwd);
47
+ const repo = await prompt('repo', defaultRepo);
48
+ const projectConfig = config.projects[project];
49
+ if (!projectConfig) {
50
+ console.error(`Project "${project}" is not in config. Run "ai-comms init" or add it manually.`);
51
+ process.exit(1);
52
+ }
53
+ const repoComms = RepoCommsSchema.parse({
54
+ project,
55
+ repo,
56
+ discord: { channelId: projectConfig.discord.channelId },
57
+ team: [],
58
+ });
59
+ writeFileSync(target, JSON.stringify(repoComms, null, 2) + '\n', 'utf8');
60
+ console.log(`Created ${target}`);
61
+ console.log('Commit this file so your team can use it with "ai-comms join".');
62
+ }
63
+ async function runJoin(repoPath) {
64
+ const absPath = path.resolve(repoPath);
65
+ const repoCommsFile = path.join(absPath, REPO_COMMS_FILENAME);
66
+ if (!existsSync(repoCommsFile)) {
67
+ console.error(`Could not find ${repoCommsFile}. Did you clone the correct repo?`);
68
+ process.exit(1);
69
+ }
70
+ const repoComms = loadRepoComms(repoCommsFile);
71
+ let config;
72
+ try {
73
+ config = loadConfig();
74
+ }
75
+ catch (err) {
76
+ if (err instanceof ConfigError) {
77
+ console.error(`${err.message}\nRun "ai-comms init" first to configure your identity.`);
78
+ process.exit(1);
79
+ }
80
+ throw err;
81
+ }
82
+ const { project } = repoComms;
83
+ config.projects[project] = {
84
+ discord: { channelId: repoComms.discord.channelId },
85
+ repos: [
86
+ ...(config.projects[project]?.repos ?? []).filter((r) => r.path !== absPath),
87
+ { name: repoComms.repo, path: absPath },
88
+ ],
89
+ };
90
+ if (!config.defaultProject) {
91
+ config.defaultProject = project;
92
+ }
93
+ saveConfig(config);
94
+ console.log(`Project "${project}" registered (repo: ${repoComms.repo}).`);
95
+ console.log(`Run "ai-comms secret set ${project}" then "ai-comms doctor".`);
96
+ }
97
+ async function runSecretSet(project) {
98
+ if (!project) {
99
+ console.error('Usage: ai-comms secret set <project>');
100
+ process.exit(1);
101
+ }
102
+ const token = await promptSecret('Discord bot token');
103
+ if (!token) {
104
+ console.error('Empty token, cancelled.');
105
+ process.exit(1);
106
+ }
107
+ setProjectToken(project, token);
108
+ console.log(`Token saved for "${project}" in ~/.ai-comms/secrets.json`);
109
+ }
110
+ async function runDoctor(projectOverride) {
111
+ try {
112
+ let config;
113
+ try {
114
+ config = loadConfig();
115
+ }
116
+ catch (err) {
117
+ if (err instanceof ConfigError) {
118
+ console.error(err.message);
119
+ return 1;
120
+ }
121
+ throw err;
122
+ }
123
+ let ctx;
124
+ try {
125
+ ctx = resolveContext(process.cwd(), config, { projectOverride });
126
+ }
127
+ catch (err) {
128
+ console.error(err instanceof Error ? err.message : contextResolutionError());
129
+ return 1;
130
+ }
131
+ console.log('ai-comms doctor\n');
132
+ console.log('Identity:');
133
+ console.log(` dev: ${ctx.dev}`);
134
+ console.log(` agent: ${ctx.agent}`);
135
+ console.log(` project: ${ctx.project}`);
136
+ console.log(` repo: ${ctx.repo}`);
137
+ if (ctx.repoCommsPath) {
138
+ console.log(` .ai-comms.json: ${ctx.repoCommsPath}`);
139
+ }
140
+ let tokenInfo;
141
+ try {
142
+ tokenInfo = getEffectiveToken(ctx.project);
143
+ }
144
+ catch (err) {
145
+ if (err instanceof SecretsError) {
146
+ console.error(`\n${err.message}`);
147
+ return 1;
148
+ }
149
+ throw err;
150
+ }
151
+ console.log(` token: ${tokenSourceLabel(tokenInfo.source, ctx.project)}`);
152
+ console.log(` channel: ${ctx.channelId}\n`);
153
+ try {
154
+ const bot = await getBotUser(tokenInfo.token);
155
+ console.log(`Bot: ${bot.username} (${bot.id}) ✓`);
156
+ }
157
+ catch {
158
+ console.error('Bot: could not authenticate. Check the token.');
159
+ return 1;
160
+ }
161
+ try {
162
+ const channel = await getChannel(ctx.channelId, tokenInfo.token);
163
+ const name = channel.name ?? channel.id;
164
+ console.log(`Channel: #${name} ✓`);
165
+ }
166
+ catch {
167
+ console.error('Channel: inaccessible. Check channelId and bot permissions.');
168
+ return 1;
169
+ }
170
+ const perms = await checkBotPermissions(ctx.channelId, tokenInfo.token);
171
+ if (!perms.ok) {
172
+ console.error(`Missing permissions: ${perms.missing.join(', ')}`);
173
+ console.error(`The bot needs VIEW_CHANNEL + SEND_MESSAGES + READ_MESSAGE_HISTORY (${REQUIRED_PERMISSION_BITS}).`);
174
+ console.error('Re-invite the bot with permissions=68608 or adjust channel overwrites.');
175
+ return 1;
176
+ }
177
+ console.log('Permissions: VIEW_CHANNEL, SEND_MESSAGES, READ_MESSAGE_HISTORY ✓');
178
+ console.log('\nDiagnostics OK.');
179
+ console.log(JSON.stringify(redactedContext(ctx), null, 2));
180
+ return 0;
181
+ }
182
+ catch (err) {
183
+ if (err instanceof ConfigError || err instanceof SecretsError) {
184
+ console.error(err.message);
185
+ return 1;
186
+ }
187
+ console.error(`Unexpected error: ${String(err)}`);
188
+ return 1;
189
+ }
190
+ }
191
+ async function runInbox(all, projectOverride) {
192
+ const config = loadConfig();
193
+ const ctx = resolveContext(process.cwd(), config, { projectOverride });
194
+ const log = loadLog(ctx.project);
195
+ const readState = loadReadState(ctx.project);
196
+ const inbox = materializeInbox(log, ctx.dev, {
197
+ unreadOnly: !all,
198
+ readState,
199
+ });
200
+ if (inbox.length === 0) {
201
+ console.log('Inbox empty.');
202
+ return;
203
+ }
204
+ for (const env of inbox) {
205
+ console.log('---');
206
+ console.log(`${env.type} · ${env.from.dev}/${env.from.agent} · ${env.subject}`);
207
+ console.log(JSON.stringify(env, null, 2));
208
+ }
209
+ markRead(ctx.project, inbox.map((e) => e.id));
210
+ console.log(`\n${inbox.length} message(s) marked as read.`);
211
+ }
212
+ async function runClaims(projectOverride) {
213
+ const config = loadConfig();
214
+ const ctx = resolveContext(process.cwd(), config, { projectOverride });
215
+ const log = loadLog(ctx.project);
216
+ const claims = materializeActiveClaims(log);
217
+ if (claims.length === 0) {
218
+ console.log('(no active claims)');
219
+ return;
220
+ }
221
+ for (const c of claims) {
222
+ console.log(`${c.id} · ${c.dev}/${c.agent} · ${c.repo} · until=${c.until} · paths=${c.paths.join(', ')} · ${c.subject}`);
223
+ }
224
+ }
225
+ const program = new Command();
226
+ program
227
+ .name('ai-comms')
228
+ .description('Coordination channel for AI agents')
229
+ .version('1.0.0');
230
+ program.command('init').description('Create identity and first project').action(async () => {
231
+ await runInit();
232
+ });
233
+ program
234
+ .command('link')
235
+ .description('Create .ai-comms.json in the current repo')
236
+ .action(async () => {
237
+ await runLink();
238
+ });
239
+ program
240
+ .command('join')
241
+ .description('Register a repo with an existing .ai-comms.json')
242
+ .argument('<path>', 'path to repo')
243
+ .action(async (repoPath) => {
244
+ await runJoin(repoPath);
245
+ });
246
+ const secretCmd = program.command('secret').description('Secret management');
247
+ secretCmd
248
+ .command('set <project>')
249
+ .description('Save the bot token (hidden prompt)')
250
+ .action(async (project) => {
251
+ await runSecretSet(project);
252
+ });
253
+ program
254
+ .command('doctor')
255
+ .description('Config and connectivity diagnostics')
256
+ .option('--project <p>', 'project to diagnose')
257
+ .action(async (opts) => {
258
+ const code = await runDoctor(opts.project);
259
+ process.exitCode = code;
260
+ });
261
+ program
262
+ .command('daemon')
263
+ .description('Listen on Discord channels for all projects')
264
+ .option('--verbose', 'Verbose log to stderr')
265
+ .action(async (opts) => {
266
+ try {
267
+ await runDaemon({ verbose: opts.verbose });
268
+ }
269
+ catch (err) {
270
+ if (err instanceof ConfigError || err instanceof SecretsError) {
271
+ console.error(err.message);
272
+ process.exit(1);
273
+ }
274
+ throw err;
275
+ }
276
+ });
277
+ program.command('mcp').description('MCP stdio server').action(async () => {
278
+ await runMcpServer();
279
+ });
280
+ program
281
+ .command('inbox')
282
+ .description('Print the inbox and mark it read')
283
+ .option('--all', 'Include already-read messages')
284
+ .option('--project <p>', 'project')
285
+ .action(async (opts) => {
286
+ await runInbox(opts.all ?? false, opts.project);
287
+ });
288
+ program
289
+ .command('claims')
290
+ .description('List active team claims')
291
+ .option('--project <p>', 'project')
292
+ .action(async (opts) => {
293
+ await runClaims(opts.project);
294
+ });
295
+ program.parseAsync(process.argv).catch((err) => {
296
+ if (err instanceof ConfigError || err instanceof SecretsError) {
297
+ console.error(err.message);
298
+ process.exit(1);
299
+ }
300
+ console.error(String(err));
301
+ process.exit(1);
302
+ });
303
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ import { z } from 'zod';
2
+ declare const ProjectConfigSchema: z.ZodObject<{
3
+ discord: z.ZodObject<{
4
+ channelId: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ channelId: string;
7
+ }, {
8
+ channelId: string;
9
+ }>;
10
+ repos: z.ZodOptional<z.ZodArray<z.ZodObject<{
11
+ name: z.ZodString;
12
+ path: z.ZodString;
13
+ }, "strip", z.ZodTypeAny, {
14
+ path: string;
15
+ name: string;
16
+ }, {
17
+ path: string;
18
+ name: string;
19
+ }>, "many">>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ discord: {
22
+ channelId: string;
23
+ };
24
+ repos?: {
25
+ path: string;
26
+ name: string;
27
+ }[] | undefined;
28
+ }, {
29
+ discord: {
30
+ channelId: string;
31
+ };
32
+ repos?: {
33
+ path: string;
34
+ name: string;
35
+ }[] | undefined;
36
+ }>;
37
+ export declare const ConfigV2Schema: z.ZodObject<{
38
+ version: z.ZodLiteral<2>;
39
+ identity: z.ZodObject<{
40
+ dev: z.ZodString;
41
+ agent: z.ZodString;
42
+ }, "strip", z.ZodTypeAny, {
43
+ dev: string;
44
+ agent: string;
45
+ }, {
46
+ dev: string;
47
+ agent: string;
48
+ }>;
49
+ defaultProject: z.ZodString;
50
+ projects: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
51
+ discord: z.ZodObject<{
52
+ channelId: z.ZodString;
53
+ }, "strip", z.ZodTypeAny, {
54
+ channelId: string;
55
+ }, {
56
+ channelId: string;
57
+ }>;
58
+ repos: z.ZodOptional<z.ZodArray<z.ZodObject<{
59
+ name: z.ZodString;
60
+ path: z.ZodString;
61
+ }, "strip", z.ZodTypeAny, {
62
+ path: string;
63
+ name: string;
64
+ }, {
65
+ path: string;
66
+ name: string;
67
+ }>, "many">>;
68
+ }, "strip", z.ZodTypeAny, {
69
+ discord: {
70
+ channelId: string;
71
+ };
72
+ repos?: {
73
+ path: string;
74
+ name: string;
75
+ }[] | undefined;
76
+ }, {
77
+ discord: {
78
+ channelId: string;
79
+ };
80
+ repos?: {
81
+ path: string;
82
+ name: string;
83
+ }[] | undefined;
84
+ }>>>;
85
+ }, "strip", z.ZodTypeAny, {
86
+ projects: Record<string, {
87
+ discord: {
88
+ channelId: string;
89
+ };
90
+ repos?: {
91
+ path: string;
92
+ name: string;
93
+ }[] | undefined;
94
+ }>;
95
+ version: 2;
96
+ identity: {
97
+ dev: string;
98
+ agent: string;
99
+ };
100
+ defaultProject: string;
101
+ }, {
102
+ version: 2;
103
+ identity: {
104
+ dev: string;
105
+ agent: string;
106
+ };
107
+ defaultProject: string;
108
+ projects?: Record<string, {
109
+ discord: {
110
+ channelId: string;
111
+ };
112
+ repos?: {
113
+ path: string;
114
+ name: string;
115
+ }[] | undefined;
116
+ }> | undefined;
117
+ }>;
118
+ export type ConfigV2 = z.infer<typeof ConfigV2Schema>;
119
+ export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
120
+ /** @deprecated internal compatibility alias */
121
+ export type Config = ConfigV2;
122
+ export declare class ConfigError extends Error {
123
+ constructor(message: string);
124
+ }
125
+ export declare function loadConfig(configPath?: string): ConfigV2;
126
+ export declare function saveConfig(config: ConfigV2, configPath?: string): void;
127
+ export declare function redactedContext(context: {
128
+ project: string;
129
+ repo: string;
130
+ dev: string;
131
+ agent: string;
132
+ channelId: string;
133
+ repoCommsPath: string | null;
134
+ source: string;
135
+ }): Record<string, unknown>;
136
+ export { getConfigDir, getConfigPath } from './paths.js';
package/dist/config.js ADDED
@@ -0,0 +1,81 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { z } from 'zod';
3
+ import { maybeMigrateV0 } from './migrate.js';
4
+ import { getConfigDir, getConfigPath } from './paths.js';
5
+ const IdentitySchema = z.object({
6
+ dev: z.string().min(1),
7
+ agent: z.string().min(1),
8
+ });
9
+ const ProjectDiscordSchema = z.object({
10
+ channelId: z.string().min(1),
11
+ });
12
+ const RepoEntrySchema = z.object({
13
+ name: z.string().min(1),
14
+ path: z.string().min(1),
15
+ });
16
+ const ProjectConfigSchema = z.object({
17
+ discord: ProjectDiscordSchema,
18
+ repos: z.array(RepoEntrySchema).optional(),
19
+ });
20
+ export const ConfigV2Schema = z.object({
21
+ version: z.literal(2),
22
+ identity: IdentitySchema,
23
+ defaultProject: z.string().min(1),
24
+ projects: z.record(z.string(), ProjectConfigSchema).default({}),
25
+ });
26
+ export class ConfigError extends Error {
27
+ constructor(message) {
28
+ super(message);
29
+ this.name = 'ConfigError';
30
+ }
31
+ }
32
+ export function loadConfig(configPath = getConfigPath()) {
33
+ const migrationMessages = maybeMigrateV0();
34
+ for (const msg of migrationMessages) {
35
+ console.log(msg);
36
+ }
37
+ if (!existsSync(configPath)) {
38
+ throw new ConfigError(`No config found at ${configPath}. Run "ai-comms init" to create one.`);
39
+ }
40
+ let raw;
41
+ try {
42
+ raw = JSON.parse(readFileSync(configPath, 'utf8'));
43
+ }
44
+ catch {
45
+ throw new ConfigError(`Invalid config at ${configPath}: malformed JSON.`);
46
+ }
47
+ const parsed = ConfigV2Schema.safeParse(raw);
48
+ if (!parsed.success) {
49
+ const issues = parsed.error.issues
50
+ .map((i) => `${i.path.join('.')}: ${i.message}`)
51
+ .join('; ');
52
+ throw new ConfigError(`Invalid config at ${configPath}: ${issues}`);
53
+ }
54
+ assertNoTokenInConfig(parsed.data, configPath);
55
+ return parsed.data;
56
+ }
57
+ function assertNoTokenInConfig(config, configPath) {
58
+ const serialized = JSON.stringify(config);
59
+ if (serialized.includes('"token"')) {
60
+ throw new ConfigError(`Config at ${configPath} contains a token. Move the token to ~/.ai-comms/secrets.json ` +
61
+ `with "ai-comms secret set <project>".`);
62
+ }
63
+ }
64
+ export function saveConfig(config, configPath = getConfigPath()) {
65
+ assertNoTokenInConfig(config, configPath);
66
+ mkdirSync(getConfigDir(), { recursive: true });
67
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
68
+ }
69
+ export function redactedContext(context) {
70
+ return {
71
+ project: context.project,
72
+ repo: context.repo,
73
+ dev: context.dev,
74
+ agent: context.agent,
75
+ discord: { channelId: context.channelId },
76
+ repoCommsPath: context.repoCommsPath,
77
+ source: context.source,
78
+ };
79
+ }
80
+ export { getConfigDir, getConfigPath } from './paths.js';
81
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { type ConfigV2 } from './config.js';
3
+ export declare const RepoCommsSchema: z.ZodObject<{
4
+ project: z.ZodString;
5
+ repo: z.ZodString;
6
+ discord: z.ZodObject<{
7
+ channelId: z.ZodString;
8
+ }, "strict", z.ZodTypeAny, {
9
+ channelId: string;
10
+ }, {
11
+ channelId: string;
12
+ }>;
13
+ team: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ repo: string;
16
+ discord: {
17
+ channelId: string;
18
+ };
19
+ project: string;
20
+ team?: string[] | undefined;
21
+ }, {
22
+ repo: string;
23
+ discord: {
24
+ channelId: string;
25
+ };
26
+ project: string;
27
+ team?: string[] | undefined;
28
+ }>;
29
+ export type RepoComms = z.infer<typeof RepoCommsSchema>;
30
+ export interface ResolvedContext {
31
+ project: string;
32
+ repo: string;
33
+ dev: string;
34
+ agent: string;
35
+ channelId: string;
36
+ team: string[];
37
+ repoCommsPath: string | null;
38
+ source: 'repo' | 'user-config';
39
+ }
40
+ export declare class ContextError extends Error {
41
+ constructor(message: string);
42
+ }
43
+ export declare function findRepoCommsFile(startDir: string): string | null;
44
+ export declare function loadRepoComms(filePath: string): RepoComms;
45
+ export declare function resolveContext(cwd: string, config?: ConfigV2, options?: {
46
+ projectOverride?: string;
47
+ }): ResolvedContext;
48
+ export declare function contextResolutionError(): string;
49
+ export declare function validateRecipient(to: string[], team: string[], dev: string): string | null;