@eddacraft/anvil-runtime 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 (170) hide show
  1. package/LICENSE +14 -0
  2. package/dist/cache/cache-key.d.ts +45 -0
  3. package/dist/cache/cache-key.d.ts.map +1 -0
  4. package/dist/cache/cache-key.js +135 -0
  5. package/dist/cache/index.d.ts +27 -0
  6. package/dist/cache/index.d.ts.map +1 -0
  7. package/dist/cache/index.js +38 -0
  8. package/dist/cache/providers/file-cache.d.ts +63 -0
  9. package/dist/cache/providers/file-cache.d.ts.map +1 -0
  10. package/dist/cache/providers/file-cache.js +369 -0
  11. package/dist/cache/providers/memory-cache.d.ts +52 -0
  12. package/dist/cache/providers/memory-cache.d.ts.map +1 -0
  13. package/dist/cache/providers/memory-cache.js +197 -0
  14. package/dist/cache/providers/null-cache.d.ts +26 -0
  15. package/dist/cache/providers/null-cache.d.ts.map +1 -0
  16. package/dist/cache/providers/null-cache.js +50 -0
  17. package/dist/cache/types.d.ts +114 -0
  18. package/dist/cache/types.d.ts.map +1 -0
  19. package/dist/cache/types.js +4 -0
  20. package/dist/concurrency/agent.d.ts +137 -0
  21. package/dist/concurrency/agent.d.ts.map +1 -0
  22. package/dist/concurrency/agent.js +440 -0
  23. package/dist/concurrency/atomic.d.ts +93 -0
  24. package/dist/concurrency/atomic.d.ts.map +1 -0
  25. package/dist/concurrency/atomic.js +281 -0
  26. package/dist/concurrency/git-agent.d.ts +114 -0
  27. package/dist/concurrency/git-agent.d.ts.map +1 -0
  28. package/dist/concurrency/git-agent.js +313 -0
  29. package/dist/concurrency/index.d.ts +95 -0
  30. package/dist/concurrency/index.d.ts.map +1 -0
  31. package/dist/concurrency/index.js +127 -0
  32. package/dist/concurrency/lock-manager.d.ts +170 -0
  33. package/dist/concurrency/lock-manager.d.ts.map +1 -0
  34. package/dist/concurrency/lock-manager.js +525 -0
  35. package/dist/concurrency/queue-manager.d.ts +166 -0
  36. package/dist/concurrency/queue-manager.d.ts.map +1 -0
  37. package/dist/concurrency/queue-manager.js +442 -0
  38. package/dist/concurrency/types.d.ts +382 -0
  39. package/dist/concurrency/types.d.ts.map +1 -0
  40. package/dist/concurrency/types.js +204 -0
  41. package/dist/export/constraint-collector.d.ts +175 -0
  42. package/dist/export/constraint-collector.d.ts.map +1 -0
  43. package/dist/export/constraint-collector.js +203 -0
  44. package/dist/export/formatters/llms-txt-formatter.d.ts +89 -0
  45. package/dist/export/formatters/llms-txt-formatter.d.ts.map +1 -0
  46. package/dist/export/formatters/llms-txt-formatter.js +249 -0
  47. package/dist/export/formatters/mcp-resource-formatter.d.ts +186 -0
  48. package/dist/export/formatters/mcp-resource-formatter.d.ts.map +1 -0
  49. package/dist/export/formatters/mcp-resource-formatter.js +139 -0
  50. package/dist/export/formatters/prompt-formatter.d.ts +83 -0
  51. package/dist/export/formatters/prompt-formatter.d.ts.map +1 -0
  52. package/dist/export/formatters/prompt-formatter.js +256 -0
  53. package/dist/export/index.d.ts +10 -0
  54. package/dist/export/index.d.ts.map +1 -0
  55. package/dist/export/index.js +9 -0
  56. package/dist/gate/check.interface.d.ts +15 -0
  57. package/dist/gate/check.interface.d.ts.map +1 -0
  58. package/dist/gate/check.interface.js +18 -0
  59. package/dist/gate/checks/antipattern.check.d.ts +27 -0
  60. package/dist/gate/checks/antipattern.check.d.ts.map +1 -0
  61. package/dist/gate/checks/antipattern.check.js +140 -0
  62. package/dist/gate/checks/architecture/circular-detector.d.ts +33 -0
  63. package/dist/gate/checks/architecture/circular-detector.d.ts.map +1 -0
  64. package/dist/gate/checks/architecture/circular-detector.js +71 -0
  65. package/dist/gate/checks/architecture/dependency-analyzer.d.ts +81 -0
  66. package/dist/gate/checks/architecture/dependency-analyzer.d.ts.map +1 -0
  67. package/dist/gate/checks/architecture/dependency-analyzer.js +136 -0
  68. package/dist/gate/checks/architecture/layer-validator.d.ts +75 -0
  69. package/dist/gate/checks/architecture/layer-validator.d.ts.map +1 -0
  70. package/dist/gate/checks/architecture/layer-validator.js +193 -0
  71. package/dist/gate/checks/architecture.check.d.ts +56 -0
  72. package/dist/gate/checks/architecture.check.d.ts.map +1 -0
  73. package/dist/gate/checks/architecture.check.js +394 -0
  74. package/dist/gate/checks/command-safety.check.d.ts +12 -0
  75. package/dist/gate/checks/command-safety.check.d.ts.map +1 -0
  76. package/dist/gate/checks/command-safety.check.js +230 -0
  77. package/dist/gate/checks/coverage.check.d.ts +9 -0
  78. package/dist/gate/checks/coverage.check.d.ts.map +1 -0
  79. package/dist/gate/checks/coverage.check.js +81 -0
  80. package/dist/gate/checks/dependency.check.d.ts +17 -0
  81. package/dist/gate/checks/dependency.check.d.ts.map +1 -0
  82. package/dist/gate/checks/dependency.check.js +342 -0
  83. package/dist/gate/checks/eslint.check.d.ts +14 -0
  84. package/dist/gate/checks/eslint.check.d.ts.map +1 -0
  85. package/dist/gate/checks/eslint.check.js +79 -0
  86. package/dist/gate/checks/policy.check.d.ts +78 -0
  87. package/dist/gate/checks/policy.check.d.ts.map +1 -0
  88. package/dist/gate/checks/policy.check.js +457 -0
  89. package/dist/gate/checks/secret/entropy-detector.d.ts +44 -0
  90. package/dist/gate/checks/secret/entropy-detector.d.ts.map +1 -0
  91. package/dist/gate/checks/secret/entropy-detector.js +76 -0
  92. package/dist/gate/checks/secret/git-scanner.d.ts +36 -0
  93. package/dist/gate/checks/secret/git-scanner.d.ts.map +1 -0
  94. package/dist/gate/checks/secret/git-scanner.js +90 -0
  95. package/dist/gate/checks/secret/secret-patterns.d.ts +42 -0
  96. package/dist/gate/checks/secret/secret-patterns.d.ts.map +1 -0
  97. package/dist/gate/checks/secret/secret-patterns.js +137 -0
  98. package/dist/gate/checks/secret.check.d.ts +56 -0
  99. package/dist/gate/checks/secret.check.d.ts.map +1 -0
  100. package/dist/gate/checks/secret.check.js +245 -0
  101. package/dist/gate/config/command-safety-config.d.ts +5 -0
  102. package/dist/gate/config/command-safety-config.d.ts.map +1 -0
  103. package/dist/gate/config/command-safety-config.js +69 -0
  104. package/dist/gate/config/index.d.ts +2 -0
  105. package/dist/gate/config/index.d.ts.map +1 -0
  106. package/dist/gate/config/index.js +1 -0
  107. package/dist/gate/formatters/command-safety-formatter.d.ts +10 -0
  108. package/dist/gate/formatters/command-safety-formatter.d.ts.map +1 -0
  109. package/dist/gate/formatters/command-safety-formatter.js +64 -0
  110. package/dist/gate/formatters/index.d.ts +2 -0
  111. package/dist/gate/formatters/index.d.ts.map +1 -0
  112. package/dist/gate/formatters/index.js +1 -0
  113. package/dist/gate/gate-config.d.ts +44 -0
  114. package/dist/gate/gate-config.d.ts.map +1 -0
  115. package/dist/gate/gate-config.js +334 -0
  116. package/dist/gate/gate-runner.d.ts +160 -0
  117. package/dist/gate/gate-runner.d.ts.map +1 -0
  118. package/dist/gate/gate-runner.js +531 -0
  119. package/dist/gate/index.d.ts +20 -0
  120. package/dist/gate/index.d.ts.map +1 -0
  121. package/dist/gate/index.js +14 -0
  122. package/dist/gate/parsers/command-parser.d.ts +18 -0
  123. package/dist/gate/parsers/command-parser.d.ts.map +1 -0
  124. package/dist/gate/parsers/command-parser.js +363 -0
  125. package/dist/gate/parsers/index.d.ts +2 -0
  126. package/dist/gate/parsers/index.d.ts.map +1 -0
  127. package/dist/gate/parsers/index.js +1 -0
  128. package/dist/gate/policy/index.d.ts +12 -0
  129. package/dist/gate/policy/index.d.ts.map +1 -0
  130. package/dist/gate/policy/index.js +10 -0
  131. package/dist/gate/rules/default-filesystem-rules.d.ts +3 -0
  132. package/dist/gate/rules/default-filesystem-rules.d.ts.map +1 -0
  133. package/dist/gate/rules/default-filesystem-rules.js +201 -0
  134. package/dist/gate/rules/default-git-rules.d.ts +3 -0
  135. package/dist/gate/rules/default-git-rules.d.ts.map +1 -0
  136. package/dist/gate/rules/default-git-rules.js +192 -0
  137. package/dist/gate/rules/index.d.ts +5 -0
  138. package/dist/gate/rules/index.d.ts.map +1 -0
  139. package/dist/gate/rules/index.js +3 -0
  140. package/dist/gate/rules/rule-matcher.d.ts +27 -0
  141. package/dist/gate/rules/rule-matcher.d.ts.map +1 -0
  142. package/dist/gate/rules/rule-matcher.js +228 -0
  143. package/dist/gate/rules/types.d.ts +250 -0
  144. package/dist/gate/rules/types.d.ts.map +1 -0
  145. package/dist/gate/rules/types.js +1 -0
  146. package/dist/index.d.ts +19 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +35 -0
  149. package/dist/types/gate.types.d.ts +42 -0
  150. package/dist/types/gate.types.d.ts.map +1 -0
  151. package/dist/types/gate.types.js +94 -0
  152. package/dist/watch/debouncer.d.ts +90 -0
  153. package/dist/watch/debouncer.d.ts.map +1 -0
  154. package/dist/watch/debouncer.js +135 -0
  155. package/dist/watch/file-watcher.d.ts +73 -0
  156. package/dist/watch/file-watcher.d.ts.map +1 -0
  157. package/dist/watch/file-watcher.js +121 -0
  158. package/dist/watch/git-status.d.ts +98 -0
  159. package/dist/watch/git-status.d.ts.map +1 -0
  160. package/dist/watch/git-status.js +266 -0
  161. package/dist/watch/index.d.ts +16 -0
  162. package/dist/watch/index.d.ts.map +1 -0
  163. package/dist/watch/index.js +15 -0
  164. package/dist/watch/orchestrator.d.ts +113 -0
  165. package/dist/watch/orchestrator.d.ts.map +1 -0
  166. package/dist/watch/orchestrator.js +409 -0
  167. package/dist/watch/types.d.ts +190 -0
  168. package/dist/watch/types.d.ts.map +1 -0
  169. package/dist/watch/types.js +76 -0
  170. package/package.json +60 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Atomic File Operations
3
+ *
4
+ * Provides atomic read/write operations for JSON files to prevent
5
+ * corruption in multi-agent/multi-process scenarios.
6
+ *
7
+ * Uses the atomic write pattern: write to temp file, then rename.
8
+ * This ensures that either the old or new content is visible, never partial.
9
+ */
10
+ import { promises as fs } from 'node:fs';
11
+ import { dirname, join, basename } from 'node:path';
12
+ import { randomUUID } from 'node:crypto';
13
+ import { createDebugger } from '@eddacraft/anvil-core';
14
+ const debug = createDebugger('atomic');
15
+ /**
16
+ * Write JSON atomically
17
+ *
18
+ * 1. Write content to a temp file in the same directory
19
+ * 2. Rename temp file to target (atomic on most filesystems)
20
+ * 3. Clean up temp file on error
21
+ */
22
+ export async function atomicWriteJson(filePath, data, options = {}) {
23
+ const { mode = 0o644, retries = 3, createDirs = true } = options;
24
+ const dir = dirname(filePath);
25
+ const tempPath = join(dir, `.${basename(filePath)}.${randomUUID().slice(0, 8)}.tmp`);
26
+ // Ensure directory exists
27
+ if (createDirs) {
28
+ await fs.mkdir(dir, { recursive: true });
29
+ }
30
+ const content = JSON.stringify(data, null, 2);
31
+ let lastError = null;
32
+ for (let attempt = 0; attempt < retries; attempt++) {
33
+ try {
34
+ // Write to temp file
35
+ await fs.writeFile(tempPath, content, { encoding: 'utf-8', mode });
36
+ // Atomic rename
37
+ await fs.rename(tempPath, filePath);
38
+ debug(`Atomic write successful: ${filePath}`);
39
+ return;
40
+ }
41
+ catch (error) {
42
+ lastError = error instanceof Error ? error : new Error(String(error));
43
+ debug(`Atomic write attempt ${attempt + 1} failed:`, error);
44
+ // Clean up temp file if it exists
45
+ try {
46
+ await fs.unlink(tempPath);
47
+ }
48
+ catch {
49
+ // Ignore cleanup errors
50
+ }
51
+ // Small delay before retry
52
+ if (attempt < retries - 1) {
53
+ await sleep(10 * (attempt + 1));
54
+ }
55
+ }
56
+ }
57
+ throw new Error(`Atomic write failed after ${retries} attempts: ${lastError?.message}`);
58
+ }
59
+ /**
60
+ * Write text atomically
61
+ */
62
+ export async function atomicWriteText(filePath, content, options = {}) {
63
+ const { mode = 0o644, retries = 3, createDirs = true } = options;
64
+ const dir = dirname(filePath);
65
+ const tempPath = join(dir, `.${basename(filePath)}.${randomUUID().slice(0, 8)}.tmp`);
66
+ if (createDirs) {
67
+ await fs.mkdir(dir, { recursive: true });
68
+ }
69
+ let lastError = null;
70
+ for (let attempt = 0; attempt < retries; attempt++) {
71
+ try {
72
+ await fs.writeFile(tempPath, content, { encoding: 'utf-8', mode });
73
+ await fs.rename(tempPath, filePath);
74
+ debug(`Atomic write successful: ${filePath}`);
75
+ return;
76
+ }
77
+ catch (error) {
78
+ lastError = error instanceof Error ? error : new Error(String(error));
79
+ debug(`Atomic write attempt ${attempt + 1} failed:`, error);
80
+ try {
81
+ await fs.unlink(tempPath);
82
+ }
83
+ catch {
84
+ // Ignore
85
+ }
86
+ if (attempt < retries - 1) {
87
+ await sleep(10 * (attempt + 1));
88
+ }
89
+ }
90
+ }
91
+ throw new Error(`Atomic write failed after ${retries} attempts: ${lastError?.message}`);
92
+ }
93
+ /**
94
+ * Read JSON safely (returns null if file doesn't exist or is invalid)
95
+ */
96
+ export async function readJsonSafe(filePath) {
97
+ try {
98
+ const content = await fs.readFile(filePath, 'utf-8');
99
+ return JSON.parse(content);
100
+ }
101
+ catch (error) {
102
+ if (error.code === 'ENOENT') {
103
+ return null;
104
+ }
105
+ debug(`Failed to read JSON from ${filePath}:`, error);
106
+ return null;
107
+ }
108
+ }
109
+ /**
110
+ * Read JSON with retries (for handling transient lock conflicts)
111
+ */
112
+ export async function readJsonWithRetry(filePath, retries = 3, delayMs = 10) {
113
+ let lastError = null;
114
+ for (let attempt = 0; attempt < retries; attempt++) {
115
+ try {
116
+ const content = await fs.readFile(filePath, 'utf-8');
117
+ return JSON.parse(content);
118
+ }
119
+ catch (error) {
120
+ lastError = error instanceof Error ? error : new Error(String(error));
121
+ if (error.code === 'ENOENT') {
122
+ return null;
123
+ }
124
+ debug(`Read attempt ${attempt + 1} failed for ${filePath}:`, error);
125
+ if (attempt < retries - 1) {
126
+ await sleep(delayMs * (attempt + 1));
127
+ }
128
+ }
129
+ }
130
+ debug(`Read failed after ${retries} attempts: ${lastError?.message}`);
131
+ return null;
132
+ }
133
+ /**
134
+ * Acquire a file lock (blocks until acquired or timeout)
135
+ */
136
+ export async function acquireFileLock(lockPath, options = {}) {
137
+ const { timeout = 5000, retryInterval = 50, content = '' } = options;
138
+ const startTime = Date.now();
139
+ while (Date.now() - startTime < timeout) {
140
+ try {
141
+ // O_EXCL: fail if file exists
142
+ const fd = await fs.open(lockPath, 'wx');
143
+ await fd.writeFile(content);
144
+ await fd.close();
145
+ debug(`Lock acquired: ${lockPath}`);
146
+ return {
147
+ path: lockPath,
148
+ release: async () => {
149
+ try {
150
+ await fs.unlink(lockPath);
151
+ debug(`Lock released: ${lockPath}`);
152
+ }
153
+ catch (error) {
154
+ debug(`Lock release failed: ${lockPath}`, error);
155
+ }
156
+ },
157
+ };
158
+ }
159
+ catch (error) {
160
+ if (error.code !== 'EEXIST') {
161
+ // Unexpected error
162
+ throw error;
163
+ }
164
+ // Lock exists, wait and retry
165
+ await sleep(retryInterval);
166
+ }
167
+ }
168
+ debug(`Lock acquisition timed out: ${lockPath}`);
169
+ return null;
170
+ }
171
+ /**
172
+ * Try to acquire a file lock (non-blocking)
173
+ */
174
+ export async function tryAcquireFileLock(lockPath, content = '') {
175
+ try {
176
+ const dir = dirname(lockPath);
177
+ await fs.mkdir(dir, { recursive: true });
178
+ const fd = await fs.open(lockPath, 'wx');
179
+ await fd.writeFile(content);
180
+ await fd.close();
181
+ debug(`Lock acquired: ${lockPath}`);
182
+ return {
183
+ path: lockPath,
184
+ release: async () => {
185
+ try {
186
+ await fs.unlink(lockPath);
187
+ debug(`Lock released: ${lockPath}`);
188
+ }
189
+ catch (error) {
190
+ debug(`Lock release failed: ${lockPath}`, error);
191
+ }
192
+ },
193
+ };
194
+ }
195
+ catch (error) {
196
+ if (error.code === 'EEXIST') {
197
+ return null;
198
+ }
199
+ throw error;
200
+ }
201
+ }
202
+ /**
203
+ * Check if a lock file exists
204
+ */
205
+ export async function isLocked(lockPath) {
206
+ try {
207
+ await fs.access(lockPath);
208
+ return true;
209
+ }
210
+ catch {
211
+ return false;
212
+ }
213
+ }
214
+ /**
215
+ * Force release a lock (use with caution)
216
+ */
217
+ export async function forceReleaseLock(lockPath) {
218
+ try {
219
+ await fs.unlink(lockPath);
220
+ debug(`Lock force-released: ${lockPath}`);
221
+ return true;
222
+ }
223
+ catch (error) {
224
+ if (error.code === 'ENOENT') {
225
+ return false;
226
+ }
227
+ throw error;
228
+ }
229
+ }
230
+ /**
231
+ * Delete file if it exists (no error if missing)
232
+ */
233
+ export async function unlinkSafe(filePath) {
234
+ try {
235
+ await fs.unlink(filePath);
236
+ return true;
237
+ }
238
+ catch (error) {
239
+ if (error.code === 'ENOENT') {
240
+ return false;
241
+ }
242
+ throw error;
243
+ }
244
+ }
245
+ /**
246
+ * Check if file exists
247
+ */
248
+ export async function fileExists(filePath) {
249
+ try {
250
+ await fs.access(filePath);
251
+ return true;
252
+ }
253
+ catch {
254
+ return false;
255
+ }
256
+ }
257
+ /**
258
+ * Get file modification time
259
+ */
260
+ export async function getFileMtime(filePath) {
261
+ try {
262
+ const stats = await fs.stat(filePath);
263
+ return stats.mtime;
264
+ }
265
+ catch {
266
+ return null;
267
+ }
268
+ }
269
+ /**
270
+ * Simple sleep utility
271
+ */
272
+ function sleep(ms) {
273
+ return new Promise((resolve) => setTimeout(resolve, ms));
274
+ }
275
+ /**
276
+ * Sleep with jitter (to prevent thundering herd)
277
+ */
278
+ export function sleepWithJitter(baseMs, jitterPercent = 0.2) {
279
+ const jitter = baseMs * jitterPercent * (Math.random() * 2 - 1);
280
+ return sleep(Math.max(0, baseMs + jitter));
281
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Git Agent Identification
3
+ *
4
+ * Utilities for identifying agents via git commit metadata.
5
+ * Supports reading and writing agent identification through commit trailers.
6
+ */
7
+ import type { AgentType, AgentInfo } from './types.js';
8
+ /**
9
+ * Git trailer keys used for agent identification
10
+ */
11
+ export declare const GIT_TRAILERS: {
12
+ /** Agent ID trailer */
13
+ readonly AGENT_ID: "Anvil-Agent-ID";
14
+ /** Agent type trailer */
15
+ readonly AGENT_TYPE: "Anvil-Agent-Type";
16
+ /** Session ID trailer */
17
+ readonly SESSION_ID: "Anvil-Session-ID";
18
+ /** Agent name trailer */
19
+ readonly AGENT_NAME: "Anvil-Agent-Name";
20
+ /** Co-authored-by for agent attribution */
21
+ readonly CO_AUTHORED_BY: "Co-authored-by";
22
+ };
23
+ /**
24
+ * Agent info extracted from a commit
25
+ */
26
+ export interface CommitAgentInfo {
27
+ /** Agent ID from trailer */
28
+ agentId?: string;
29
+ /** Agent type from trailer */
30
+ agentType?: AgentType;
31
+ /** Session ID from trailer */
32
+ sessionId?: string;
33
+ /** Agent name from trailer */
34
+ agentName?: string;
35
+ /** Whether commit was made by an AI agent */
36
+ isAiGenerated: boolean;
37
+ /** Co-authors (may include AI attribution) */
38
+ coAuthors: string[];
39
+ /** Raw trailers from commit */
40
+ trailers: Record<string, string>;
41
+ }
42
+ /**
43
+ * Parse trailers from commit message
44
+ */
45
+ export declare function parseCommitTrailers(commitMessage: string): Record<string, string>;
46
+ /**
47
+ * Extract agent info from commit trailers
48
+ */
49
+ export declare function extractAgentInfo(trailers: Record<string, string>): CommitAgentInfo;
50
+ /**
51
+ * Get agent info from a specific commit
52
+ */
53
+ export declare function getCommitAgentInfo(commitRef: string, cwd?: string): CommitAgentInfo | null;
54
+ /**
55
+ * Get agent info from recent commits
56
+ */
57
+ export declare function getRecentCommitsAgentInfo(count?: number, cwd?: string): Array<{
58
+ hash: string;
59
+ info: CommitAgentInfo;
60
+ }>;
61
+ /**
62
+ * Options for formatting a commit message with agent info
63
+ */
64
+ export interface FormatCommitOptions {
65
+ /** Original commit message */
66
+ message: string;
67
+ /** Agent info (auto-detected if not provided) */
68
+ agent?: AgentInfo;
69
+ /** Include co-authored-by trailer */
70
+ includeCoAuthor?: boolean;
71
+ /** Additional trailers to include */
72
+ additionalTrailers?: Record<string, string>;
73
+ }
74
+ /**
75
+ * Format a commit message with agent identification trailers
76
+ */
77
+ export declare function formatCommitWithAgent(options: FormatCommitOptions): string;
78
+ /**
79
+ * Prepare commit message hook helper
80
+ *
81
+ * Automatically adds agent trailers to commit messages.
82
+ * Can be used in a prepare-commit-msg hook.
83
+ */
84
+ export declare function prepareCommitMsgHook(commitMsgFile: string, commitSource?: string, _sha1?: string): void;
85
+ /**
86
+ * Generate a git config command to set up the prepare-commit-msg hook
87
+ */
88
+ export declare function getHookSetupCommand(): string;
89
+ /**
90
+ * Summary of agent contributions
91
+ */
92
+ export interface AgentContributionSummary {
93
+ /** Agent ID */
94
+ agentId: string;
95
+ /** Agent type */
96
+ agentType: AgentType;
97
+ /** Number of commits */
98
+ commitCount: number;
99
+ /** First commit timestamp */
100
+ firstCommit: string;
101
+ /** Last commit timestamp */
102
+ lastCommit: string;
103
+ /** Files touched (if available) */
104
+ filesTouched?: number;
105
+ }
106
+ /**
107
+ * Get contribution summary by agent
108
+ */
109
+ export declare function getAgentContributions(sinceRef?: string, cwd?: string): Map<string, AgentContributionSummary>;
110
+ /**
111
+ * Get percentage of AI-generated commits in a range
112
+ */
113
+ export declare function getAiCommitPercentage(sinceRef?: string, cwd?: string): number;
114
+ //# sourceMappingURL=git-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-agent.d.ts","sourceRoot":"","sources":["../../src/concurrency/git-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AASvD;;GAEG;AACH,eAAO,MAAM,YAAY;IACvB,uBAAuB;;IAGvB,yBAAyB;;IAGzB,yBAAyB;;IAGzB,yBAAyB;;IAGzB,2CAA2C;;CAEnC,CAAC;AAMX;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,aAAa,EAAE,OAAO,CAAC;IAEvB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAmClF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAc1F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,GAAE,MAAW,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC,CAuBhD;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAEhB,iDAAiD;IACjD,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,qCAAqC;IACrC,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,qCAAqC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAgD1E;AA4BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CA6BN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAiB5C;AAMD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IAEpB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IAEnB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,GACX,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAiDvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAwB7E"}