@t0u9h/agent-git-mail 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 (98) hide show
  1. package/README.md +20 -0
  2. package/dist/app/archive-message.d.ts +7 -0
  3. package/dist/app/archive-message.d.ts.map +1 -0
  4. package/dist/app/archive-message.js +14 -0
  5. package/dist/app/archive-message.js.map +1 -0
  6. package/dist/app/list-messages.d.ts +17 -0
  7. package/dist/app/list-messages.d.ts.map +1 -0
  8. package/dist/app/list-messages.js +37 -0
  9. package/dist/app/list-messages.js.map +1 -0
  10. package/dist/app/read-message.d.ts +12 -0
  11. package/dist/app/read-message.d.ts.map +1 -0
  12. package/dist/app/read-message.js +18 -0
  13. package/dist/app/read-message.js.map +1 -0
  14. package/dist/app/reply-message.d.ts +11 -0
  15. package/dist/app/reply-message.d.ts.map +1 -0
  16. package/dist/app/reply-message.js +83 -0
  17. package/dist/app/reply-message.js.map +1 -0
  18. package/dist/app/run-daemon.d.ts +12 -0
  19. package/dist/app/run-daemon.d.ts.map +1 -0
  20. package/dist/app/run-daemon.js +98 -0
  21. package/dist/app/run-daemon.js.map +1 -0
  22. package/dist/app/send-message.d.ts +13 -0
  23. package/dist/app/send-message.d.ts.map +1 -0
  24. package/dist/app/send-message.js +59 -0
  25. package/dist/app/send-message.js.map +1 -0
  26. package/dist/cli/commands/archive.d.ts +5 -0
  27. package/dist/cli/commands/archive.d.ts.map +1 -0
  28. package/dist/cli/commands/archive.js +10 -0
  29. package/dist/cli/commands/archive.js.map +1 -0
  30. package/dist/cli/commands/config.d.ts +4 -0
  31. package/dist/cli/commands/config.d.ts.map +1 -0
  32. package/dist/cli/commands/config.js +48 -0
  33. package/dist/cli/commands/config.js.map +1 -0
  34. package/dist/cli/commands/list.d.ts +6 -0
  35. package/dist/cli/commands/list.d.ts.map +1 -0
  36. package/dist/cli/commands/list.js +23 -0
  37. package/dist/cli/commands/list.js.map +1 -0
  38. package/dist/cli/commands/read.d.ts +6 -0
  39. package/dist/cli/commands/read.d.ts.map +1 -0
  40. package/dist/cli/commands/read.js +14 -0
  41. package/dist/cli/commands/read.js.map +1 -0
  42. package/dist/cli/commands/reply.d.ts +5 -0
  43. package/dist/cli/commands/reply.d.ts.map +1 -0
  44. package/dist/cli/commands/reply.js +12 -0
  45. package/dist/cli/commands/reply.js.map +1 -0
  46. package/dist/cli/commands/send.d.ts +3 -0
  47. package/dist/cli/commands/send.d.ts.map +1 -0
  48. package/dist/cli/commands/send.js +14 -0
  49. package/dist/cli/commands/send.js.map +1 -0
  50. package/dist/config/index.d.ts +4 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +4 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/config/load.d.ts +10 -0
  55. package/dist/config/load.d.ts.map +1 -0
  56. package/dist/config/load.js +19 -0
  57. package/dist/config/load.js.map +1 -0
  58. package/dist/config/paths.d.ts +3 -0
  59. package/dist/config/paths.d.ts.map +1 -0
  60. package/dist/config/paths.js +10 -0
  61. package/dist/config/paths.js.map +1 -0
  62. package/dist/config/schema.d.ts +41 -0
  63. package/dist/config/schema.d.ts.map +1 -0
  64. package/dist/config/schema.js +11 -0
  65. package/dist/config/schema.js.map +1 -0
  66. package/dist/domain/filename.d.ts +26 -0
  67. package/dist/domain/filename.d.ts.map +1 -0
  68. package/dist/domain/filename.js +27 -0
  69. package/dist/domain/filename.js.map +1 -0
  70. package/dist/domain/frontmatter.d.ts +38 -0
  71. package/dist/domain/frontmatter.d.ts.map +1 -0
  72. package/dist/domain/frontmatter.js +55 -0
  73. package/dist/domain/frontmatter.js.map +1 -0
  74. package/dist/domain/index.d.ts +4 -0
  75. package/dist/domain/index.d.ts.map +1 -0
  76. package/dist/domain/index.js +4 -0
  77. package/dist/domain/index.js.map +1 -0
  78. package/dist/domain/message.d.ts +7 -0
  79. package/dist/domain/message.d.ts.map +1 -0
  80. package/dist/domain/message.js +4 -0
  81. package/dist/domain/message.js.map +1 -0
  82. package/dist/git/exec.d.ts +12 -0
  83. package/dist/git/exec.d.ts.map +1 -0
  84. package/dist/git/exec.js +45 -0
  85. package/dist/git/exec.js.map +1 -0
  86. package/dist/git/repo.d.ts +19 -0
  87. package/dist/git/repo.d.ts.map +1 -0
  88. package/dist/git/repo.js +76 -0
  89. package/dist/git/repo.js.map +1 -0
  90. package/dist/git/waterline.d.ts +8 -0
  91. package/dist/git/waterline.d.ts.map +1 -0
  92. package/dist/git/waterline.js +14 -0
  93. package/dist/git/waterline.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +114 -0
  97. package/dist/index.js.map +1 -0
  98. package/package.json +54 -0
@@ -0,0 +1,14 @@
1
+ import { readMessage } from '../../app/read-message.js';
2
+ import { serializeFrontmatter } from '../../domain/frontmatter.js';
3
+ export async function cmdRead(argv) {
4
+ const result = await readMessage({
5
+ filename: argv.filename,
6
+ agent: argv.agent,
7
+ dir: argv.dir,
8
+ configPath: undefined,
9
+ });
10
+ console.log(serializeFrontmatter(result.frontmatter));
11
+ console.log('\n---\n');
12
+ console.log(result.body);
13
+ }
14
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/cli/commands/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAuD;IACnF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAiD;QAC3D,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type ReplyOptions } from '../../app/reply-message.js';
2
+ export declare function cmdReply(argv: ReplyOptions & {
3
+ bodyFile: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=reply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE7E,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASvF"}
@@ -0,0 +1,12 @@
1
+ import { replyMessage } from '../../app/reply-message.js';
2
+ export async function cmdReply(argv) {
3
+ const result = await replyMessage({
4
+ originalFilename: argv.originalFilename,
5
+ from: argv.from,
6
+ bodyFile: argv.bodyFile,
7
+ dir: argv.dir,
8
+ configPath: undefined,
9
+ });
10
+ console.log(`Sent reply: ${result.filename}`);
11
+ }
12
+ //# sourceMappingURL=reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.js","sourceRoot":"","sources":["../../../src/cli/commands/reply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,4BAA4B,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAyC;IACtE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type SendOptions } from '../../app/send-message.js';
2
+ export declare function cmdSend(argv: SendOptions): Promise<void>;
3
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE1E,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9D"}
@@ -0,0 +1,14 @@
1
+ import { sendMessage } from '../../app/send-message.js';
2
+ export async function cmdSend(argv) {
3
+ const result = await sendMessage({
4
+ from: argv.from,
5
+ to: argv.to,
6
+ subject: argv.subject,
7
+ bodyFile: argv.bodyFile,
8
+ replyTo: argv.replyTo,
9
+ expectsReply: argv.expectsReply,
10
+ configPath: undefined,
11
+ });
12
+ console.log(`Sent: ${result.filename}`);
13
+ }
14
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,2BAA2B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { loadConfig, loadConfigSafe } from './load.js';
2
+ export { getConfigPath, getConfigDir } from './paths.js';
3
+ export { ConfigSchema, type Config, type AgentConfig } from './schema.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { loadConfig, loadConfigSafe } from './load.js';
2
+ export { getConfigPath, getConfigDir } from './paths.js';
3
+ export { ConfigSchema } from './schema.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Config } from './schema.js';
2
+ export declare function loadConfig(configPath?: string): Config;
3
+ export declare function loadConfigSafe(configPath?: string): {
4
+ ok: true;
5
+ data: Config;
6
+ } | {
7
+ ok: false;
8
+ error: unknown;
9
+ };
10
+ //# sourceMappingURL=load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAM9G"}
@@ -0,0 +1,19 @@
1
+ import { readFileSync } from 'fs';
2
+ import { parse as parseYaml } from 'yaml';
3
+ import { ConfigSchema } from './schema.js';
4
+ import { getConfigPath } from './paths.js';
5
+ export function loadConfig(configPath) {
6
+ const path = configPath ?? getConfigPath();
7
+ const raw = readFileSync(path, 'utf-8');
8
+ const parsed = parseYaml(raw);
9
+ return ConfigSchema.parse(parsed);
10
+ }
11
+ export function loadConfigSafe(configPath) {
12
+ try {
13
+ return { ok: true, data: loadConfig(configPath) };
14
+ }
15
+ catch (e) {
16
+ return { ok: false, error: e };
17
+ }
18
+ }
19
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,aAAa,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAmB;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getConfigPath(): string;
2
+ export declare function getConfigDir(): string;
3
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,10 @@
1
+ import { homedir } from 'os';
2
+ import { resolve } from 'path';
3
+ export function getConfigPath() {
4
+ const base = process.env['AGM_CONFIG_DIR'] ?? resolve(homedir(), '.config', 'agm');
5
+ return resolve(base, 'config.yaml');
6
+ }
7
+ export function getConfigDir() {
8
+ return process.env['AGM_CONFIG_DIR'] ?? resolve(homedir(), '.config', 'agm');
9
+ }
10
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACnF,OAAO,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ export declare const AgentConfigSchema: z.ZodObject<{
3
+ repo_path: z.ZodString;
4
+ }, "strip", z.ZodTypeAny, {
5
+ repo_path: string;
6
+ }, {
7
+ repo_path: string;
8
+ }>;
9
+ export declare const ConfigSchema: z.ZodObject<{
10
+ agents: z.ZodRecord<z.ZodString, z.ZodObject<{
11
+ repo_path: z.ZodString;
12
+ }, "strip", z.ZodTypeAny, {
13
+ repo_path: string;
14
+ }, {
15
+ repo_path: string;
16
+ }>>;
17
+ runtime: z.ZodDefault<z.ZodOptional<z.ZodObject<{
18
+ poll_interval_seconds: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ poll_interval_seconds: number;
21
+ }, {
22
+ poll_interval_seconds?: number | undefined;
23
+ }>>>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ agents: Record<string, {
26
+ repo_path: string;
27
+ }>;
28
+ runtime: {
29
+ poll_interval_seconds: number;
30
+ };
31
+ }, {
32
+ agents: Record<string, {
33
+ repo_path: string;
34
+ }>;
35
+ runtime?: {
36
+ poll_interval_seconds?: number | undefined;
37
+ } | undefined;
38
+ }>;
39
+ export type Config = z.infer<typeof ConfigSchema>;
40
+ export type AgentConfig = z.infer<typeof AgentConfigSchema>;
41
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB;;;;;;EAE5B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ export const AgentConfigSchema = z.object({
3
+ repo_path: z.string(),
4
+ });
5
+ export const ConfigSchema = z.object({
6
+ agents: z.record(z.string(), AgentConfigSchema),
7
+ runtime: z.object({
8
+ poll_interval_seconds: z.number().optional().default(30),
9
+ }).optional().default({}),
10
+ });
11
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1B,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface FilenameComponents {
2
+ from: string;
3
+ to: string;
4
+ createdAt: string;
5
+ suffix?: string;
6
+ }
7
+ export declare function generateFilename(opts: {
8
+ from: string;
9
+ to: string;
10
+ createdAt: string;
11
+ suffix?: string;
12
+ }): string;
13
+ export declare function generateUniqueSuffix(): string;
14
+ export interface ParseFilenameResult {
15
+ from: string;
16
+ to: string;
17
+ createdAt: string;
18
+ suffix?: string;
19
+ }
20
+ export declare function parseFilename(filename: string): {
21
+ ok: true;
22
+ data: ParseFilenameResult;
23
+ } | {
24
+ ok: false;
25
+ };
26
+ //# sourceMappingURL=filename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filename.d.ts","sourceRoot":"","sources":["../../src/domain/filename.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK/G;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAcvG"}
@@ -0,0 +1,27 @@
1
+ import { randomBytes } from 'crypto';
2
+ export function generateFilename(opts) {
3
+ const ts = opts.createdAt.replace(/:/g, '-');
4
+ const base = `${ts}-${opts.from}-to-${opts.to}`;
5
+ const withSuffix = opts.suffix ? `${base}-${opts.suffix}` : base;
6
+ return `${withSuffix}.md`;
7
+ }
8
+ export function generateUniqueSuffix() {
9
+ return randomBytes(2).toString('hex').slice(0, 4);
10
+ }
11
+ export function parseFilename(filename) {
12
+ // filename format: {ts}-{from}-to-{to}[-{suffix}].md
13
+ // ts format: YYYY-MM-DDTHH-mm-ss+ZZ:zz or similar
14
+ const m = filename.match(/^(.+)-([^-]+)-to-([^-]+)(?:-([a-z0-9]+))?\.md$/);
15
+ if (!m)
16
+ return { ok: false };
17
+ return {
18
+ ok: true,
19
+ data: {
20
+ createdAt: m[1].replace(/-/g, ':').replace('+', '+'), // restore original
21
+ from: m[2],
22
+ to: m[3],
23
+ suffix: m[4],
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=filename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filename.js","sourceRoot":"","sources":["../../src/domain/filename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AASrC,MAAM,UAAU,gBAAgB,CAAC,IAAsE;IACrG,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,UAAU,KAAK,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,qDAAqD;IACrD,kDAAkD;IAClD,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAC7B,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACJ,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,mBAAmB;YACzE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACV,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACR,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;SACb;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ export declare const MessageFrontmatterSchema: z.ZodObject<{
3
+ from: z.ZodString;
4
+ to: z.ZodString;
5
+ subject: z.ZodString;
6
+ created_at: z.ZodString;
7
+ reply_to: z.ZodOptional<z.ZodString>;
8
+ expects_reply: z.ZodBoolean;
9
+ }, "strip", z.ZodTypeAny, {
10
+ from: string;
11
+ to: string;
12
+ subject: string;
13
+ created_at: string;
14
+ expects_reply: boolean;
15
+ reply_to?: string | undefined;
16
+ }, {
17
+ from: string;
18
+ to: string;
19
+ subject: string;
20
+ created_at: string;
21
+ expects_reply: boolean;
22
+ reply_to?: string | undefined;
23
+ }>;
24
+ export type MessageFrontmatter = z.infer<typeof MessageFrontmatterSchema>;
25
+ export interface ParsedMessage {
26
+ data: MessageFrontmatter;
27
+ body: string;
28
+ }
29
+ export declare function parseFrontmatter(raw: string): {
30
+ ok: true;
31
+ data: MessageFrontmatter;
32
+ body: string;
33
+ } | {
34
+ ok: false;
35
+ error: unknown;
36
+ };
37
+ export declare function serializeFrontmatter(data: MessageFrontmatter): string;
38
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/domain/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAyBlI;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAYrE"}
@@ -0,0 +1,55 @@
1
+ import { z } from 'zod';
2
+ export const MessageFrontmatterSchema = z.object({
3
+ from: z.string().min(1),
4
+ to: z.string().min(1),
5
+ subject: z.string().min(1),
6
+ created_at: z.string(),
7
+ reply_to: z.string().optional(),
8
+ expects_reply: z.boolean(),
9
+ });
10
+ export function parseFrontmatter(raw) {
11
+ const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
12
+ if (!match) {
13
+ return { ok: false, error: new Error('Invalid frontmatter format') };
14
+ }
15
+ try {
16
+ const [, yamlBlock, body] = match;
17
+ const yamlLines = yamlBlock.split('\n');
18
+ const obj = {};
19
+ for (const line of yamlLines) {
20
+ const idx = line.indexOf(':');
21
+ if (idx < 0)
22
+ continue;
23
+ const key = line.slice(0, idx).trim();
24
+ const value = line.slice(idx + 1).trim();
25
+ // Parse booleans and numbers
26
+ if (value === 'true')
27
+ obj[key] = true;
28
+ else if (value === 'false')
29
+ obj[key] = false;
30
+ else if (!isNaN(Number(value)) && value !== '')
31
+ obj[key] = Number(value);
32
+ else
33
+ obj[key] = value;
34
+ }
35
+ const data = MessageFrontmatterSchema.parse(obj);
36
+ return { ok: true, data, body: body.trim() };
37
+ }
38
+ catch (e) {
39
+ return { ok: false, error: e };
40
+ }
41
+ }
42
+ export function serializeFrontmatter(data) {
43
+ const lines = ['---'];
44
+ lines.push(`from: ${data.from}`);
45
+ lines.push(`to: ${data.to}`);
46
+ lines.push(`subject: ${data.subject}`);
47
+ lines.push(`created_at: ${data.created_at}`);
48
+ if (data.reply_to) {
49
+ lines.push(`reply_to: ${data.reply_to}`);
50
+ }
51
+ lines.push(`expects_reply: ${data.expects_reply}`);
52
+ lines.push('---');
53
+ return lines.join('\n');
54
+ }
55
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/domain/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { parseFrontmatter, serializeFrontmatter, type MessageFrontmatter, type ParsedMessage } from './frontmatter.js';
2
+ export { generateFilename, generateUniqueSuffix, parseFilename, type FilenameComponents, type ParseFilenameResult } from './filename.js';
3
+ export { type Message, makeMessage } from './message.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzI,OAAO,EAAE,KAAK,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { parseFrontmatter, serializeFrontmatter } from './frontmatter.js';
2
+ export { generateFilename, generateUniqueSuffix, parseFilename } from './filename.js';
3
+ export { makeMessage } from './message.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAA+C,MAAM,kBAAkB,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAqD,MAAM,eAAe,CAAC;AACzI,OAAO,EAAgB,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MessageFrontmatter } from './frontmatter.js';
2
+ export interface Message extends MessageFrontmatter {
3
+ filename: string;
4
+ body: string;
5
+ }
6
+ export declare function makeMessage(fm: MessageFrontmatter, filename: string, body: string): Message;
7
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/domain/message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,WAAW,OAAQ,SAAQ,kBAAkB;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,kBAAkB,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ export function makeMessage(fm, filename, body) {
2
+ return { ...fm, filename, body };
3
+ }
4
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/domain/message.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,WAAW,CACzB,EAAsB,EACtB,QAAgB,EAChB,IAAY;IAEZ,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare class GitExecError extends Error {
2
+ readonly exitCode: number;
3
+ readonly stderr: string;
4
+ constructor(message: string, exitCode: number, stderr: string);
5
+ }
6
+ export interface GitResult {
7
+ stdout: string;
8
+ stderr: string;
9
+ }
10
+ export declare function git(cwd: string, args: string[]): GitResult;
11
+ export declare function gitAsync(cwd: string, args: string[]): Promise<GitResult>;
12
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/git/exec.ts"],"names":[],"mappings":"AAIA,qBAAa,YAAa,SAAQ,KAAK;aAGnB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;gBAF9B,OAAO,EAAE,MAAM,EACC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAKjC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAiB1D;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAW9E"}
@@ -0,0 +1,45 @@
1
+ import { execFileSync, execFile } from 'child_process';
2
+ import { existsSync } from 'fs';
3
+ export class GitExecError extends Error {
4
+ exitCode;
5
+ stderr;
6
+ constructor(message, exitCode, stderr) {
7
+ super(message);
8
+ this.exitCode = exitCode;
9
+ this.stderr = stderr;
10
+ this.name = 'GitExecError';
11
+ }
12
+ }
13
+ export function git(cwd, args) {
14
+ if (!existsSync(cwd)) {
15
+ throw new GitExecError(`Directory does not exist: ${cwd}`, 1, '');
16
+ }
17
+ try {
18
+ const stdout = execFileSync('git', args, {
19
+ cwd,
20
+ encoding: 'utf-8',
21
+ stdio: ['pipe', 'pipe', 'pipe'],
22
+ });
23
+ return { stdout: stdout, stderr: '' };
24
+ }
25
+ catch (err) {
26
+ const e = err;
27
+ const exitCode = e.status ?? 1;
28
+ const stderr = e.stderr ?? '';
29
+ throw new GitExecError(e.message ?? `git ${args.join(' ')} failed`, exitCode, stderr);
30
+ }
31
+ }
32
+ export async function gitAsync(cwd, args) {
33
+ return new Promise((resolve, reject) => {
34
+ execFile('git', args, { cwd, encoding: 'utf-8' }, (err, stdout, stderr) => {
35
+ if (err) {
36
+ const e = err;
37
+ reject(new GitExecError(err.message, e.code ?? 1, stderr));
38
+ }
39
+ else {
40
+ resolve({ stdout, stderr });
41
+ }
42
+ });
43
+ });
44
+ }
45
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/git/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,QAAgB,EAChB,MAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAOD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,IAAc;IAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,YAAY,CAAC,6BAA6B,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACvC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,MAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAA6D,CAAC;QACxE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAc;IACxD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxE,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,GAAG,GAAwB,CAAC;gBACnC,MAAM,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare class GitRepo {
2
+ private repoPath;
3
+ constructor(repoPath: string);
4
+ private run;
5
+ verify(): Promise<boolean>;
6
+ getHeadSha(): Promise<string>;
7
+ getCurrentBranch(): Promise<string>;
8
+ add(file: string): Promise<void>;
9
+ commit(message: string, file: string): Promise<string>;
10
+ push(): Promise<void>;
11
+ pull(): Promise<void>;
12
+ moveFile(from: string, to: string): Promise<void>;
13
+ diffNames(commitA: string, commitB: string): Promise<string>;
14
+ getRef(ref: string): Promise<string | null>;
15
+ updateRef(ref: string, sha: string): Promise<void>;
16
+ getMergedBase(from: string, to: string): Promise<string>;
17
+ hasRemote(): Promise<boolean>;
18
+ }
19
+ //# sourceMappingURL=repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/git/repo.ts"],"names":[],"mappings":"AAEA,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEpC,OAAO,CAAC,GAAG;IAIL,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ3C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAQpC"}
@@ -0,0 +1,76 @@
1
+ import { git, GitExecError } from './exec.js';
2
+ export class GitRepo {
3
+ repoPath;
4
+ constructor(repoPath) {
5
+ this.repoPath = repoPath;
6
+ }
7
+ run(args) {
8
+ return git(this.repoPath, args).stdout.trim();
9
+ }
10
+ async verify() {
11
+ try {
12
+ this.run(['rev-parse', '--git-dir']);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async getHeadSha() {
20
+ return this.run(['rev-parse', 'HEAD']);
21
+ }
22
+ async getCurrentBranch() {
23
+ return this.run(['rev-parse', '--abbrev-ref', 'HEAD']);
24
+ }
25
+ async add(file) {
26
+ this.run(['add', '--', file]);
27
+ }
28
+ async commit(message, file) {
29
+ // Commit only the specific file, preserving other changes
30
+ const stdout = this.run(['commit', '-m', message, '--', file]);
31
+ return stdout;
32
+ }
33
+ async push() {
34
+ try {
35
+ this.run(['push']);
36
+ }
37
+ catch (e) {
38
+ if (e instanceof GitExecError && e.exitCode === 0)
39
+ return;
40
+ throw e;
41
+ }
42
+ }
43
+ async pull() {
44
+ this.run(['pull', '--rebase']);
45
+ }
46
+ async moveFile(from, to) {
47
+ this.run(['mv', from, to]);
48
+ }
49
+ async diffNames(commitA, commitB) {
50
+ return this.run(['diff', '--name-status', commitA, commitB]);
51
+ }
52
+ async getRef(ref) {
53
+ try {
54
+ return this.run(['rev-parse', '--verify', ref]);
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ async updateRef(ref, sha) {
61
+ this.run(['update-ref', ref, sha]);
62
+ }
63
+ async getMergedBase(from, to) {
64
+ return this.run(['merge-base', from, to]);
65
+ }
66
+ async hasRemote() {
67
+ try {
68
+ this.run(['rev-parse', '--verify', 'origin/main']);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/git/repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { GitRepo } from './repo.js';
2
+ export declare class GitWaterline {
3
+ private repo;
4
+ constructor(repo: GitRepo);
5
+ read(): Promise<string | null>;
6
+ write(sha: string): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=waterline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waterline.d.ts","sourceRoot":"","sources":["../../src/git/waterline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,qBAAa,YAAY;IACX,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,OAAO;IAE3B,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}