@eddacraft/anvil-core 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 (215) hide show
  1. package/LICENSE +14 -0
  2. package/dist/antipattern/index.d.ts +11 -0
  3. package/dist/antipattern/index.d.ts.map +1 -0
  4. package/dist/antipattern/index.js +31 -0
  5. package/dist/antipattern/patterns-css.d.ts +17 -0
  6. package/dist/antipattern/patterns-css.d.ts.map +1 -0
  7. package/dist/antipattern/patterns-css.js +72 -0
  8. package/dist/antipattern/patterns-html.d.ts +21 -0
  9. package/dist/antipattern/patterns-html.d.ts.map +1 -0
  10. package/dist/antipattern/patterns-html.js +139 -0
  11. package/dist/antipattern/patterns.d.ts +72 -0
  12. package/dist/antipattern/patterns.d.ts.map +1 -0
  13. package/dist/antipattern/patterns.js +301 -0
  14. package/dist/antipattern/scanner.d.ts +32 -0
  15. package/dist/antipattern/scanner.d.ts.map +1 -0
  16. package/dist/antipattern/scanner.js +89 -0
  17. package/dist/antipattern/types.d.ts +318 -0
  18. package/dist/antipattern/types.d.ts.map +1 -0
  19. package/dist/antipattern/types.js +278 -0
  20. package/dist/architecture/analyzer.d.ts +123 -0
  21. package/dist/architecture/analyzer.d.ts.map +1 -0
  22. package/dist/architecture/analyzer.js +321 -0
  23. package/dist/architecture/baseline.d.ts +112 -0
  24. package/dist/architecture/baseline.d.ts.map +1 -0
  25. package/dist/architecture/baseline.js +245 -0
  26. package/dist/architecture/compiler.d.ts +24 -0
  27. package/dist/architecture/compiler.d.ts.map +1 -0
  28. package/dist/architecture/compiler.js +57 -0
  29. package/dist/architecture/context.d.ts +129 -0
  30. package/dist/architecture/context.d.ts.map +1 -0
  31. package/dist/architecture/context.js +116 -0
  32. package/dist/architecture/dc-generator.d.ts +9 -0
  33. package/dist/architecture/dc-generator.d.ts.map +1 -0
  34. package/dist/architecture/dc-generator.js +220 -0
  35. package/dist/architecture/definition-schema.d.ts +128 -0
  36. package/dist/architecture/definition-schema.d.ts.map +1 -0
  37. package/dist/architecture/definition-schema.js +94 -0
  38. package/dist/architecture/edge-detector-html.d.ts +6 -0
  39. package/dist/architecture/edge-detector-html.d.ts.map +1 -0
  40. package/dist/architecture/edge-detector-html.js +5 -0
  41. package/dist/architecture/edge-detector-web.d.ts +32 -0
  42. package/dist/architecture/edge-detector-web.d.ts.map +1 -0
  43. package/dist/architecture/edge-detector-web.js +133 -0
  44. package/dist/architecture/edge-detector.d.ts +116 -0
  45. package/dist/architecture/edge-detector.d.ts.map +1 -0
  46. package/dist/architecture/edge-detector.js +229 -0
  47. package/dist/architecture/entry-detector.d.ts +44 -0
  48. package/dist/architecture/entry-detector.d.ts.map +1 -0
  49. package/dist/architecture/entry-detector.js +263 -0
  50. package/dist/architecture/index.d.ts +21 -0
  51. package/dist/architecture/index.d.ts.map +1 -0
  52. package/dist/architecture/index.js +48 -0
  53. package/dist/architecture/layer-detector.d.ts +60 -0
  54. package/dist/architecture/layer-detector.d.ts.map +1 -0
  55. package/dist/architecture/layer-detector.js +331 -0
  56. package/dist/architecture/rego-generator.d.ts +25 -0
  57. package/dist/architecture/rego-generator.d.ts.map +1 -0
  58. package/dist/architecture/rego-generator.js +229 -0
  59. package/dist/architecture/templates/index.d.ts +39 -0
  60. package/dist/architecture/templates/index.d.ts.map +1 -0
  61. package/dist/architecture/templates/index.js +124 -0
  62. package/dist/architecture/types.d.ts +280 -0
  63. package/dist/architecture/types.d.ts.map +1 -0
  64. package/dist/architecture/types.js +269 -0
  65. package/dist/architecture/yaml-parser.d.ts +13 -0
  66. package/dist/architecture/yaml-parser.d.ts.map +1 -0
  67. package/dist/architecture/yaml-parser.js +234 -0
  68. package/dist/config/constants.d.ts +9 -0
  69. package/dist/config/constants.d.ts.map +1 -0
  70. package/dist/config/constants.js +20 -0
  71. package/dist/config/index.d.ts +9 -0
  72. package/dist/config/index.d.ts.map +1 -0
  73. package/dist/config/index.js +8 -0
  74. package/dist/config/loader.d.ts +41 -0
  75. package/dist/config/loader.d.ts.map +1 -0
  76. package/dist/config/loader.js +76 -0
  77. package/dist/config/nudge-config.d.ts +35 -0
  78. package/dist/config/nudge-config.d.ts.map +1 -0
  79. package/dist/config/nudge-config.js +34 -0
  80. package/dist/config/types.d.ts +30 -0
  81. package/dist/config/types.d.ts.map +1 -0
  82. package/dist/config/types.js +4 -0
  83. package/dist/contracts/index.d.ts +14 -0
  84. package/dist/contracts/index.d.ts.map +1 -0
  85. package/dist/contracts/index.js +13 -0
  86. package/dist/contracts/schemas/aps.schema.d.ts +269 -0
  87. package/dist/contracts/schemas/aps.schema.d.ts.map +1 -0
  88. package/dist/contracts/schemas/aps.schema.js +183 -0
  89. package/dist/contracts/schemas/index.d.ts +12 -0
  90. package/dist/contracts/schemas/index.d.ts.map +1 -0
  91. package/dist/contracts/schemas/index.js +14 -0
  92. package/dist/contracts/schemas/json-schema.d.ts +14 -0
  93. package/dist/contracts/schemas/json-schema.d.ts.map +1 -0
  94. package/dist/contracts/schemas/json-schema.js +31 -0
  95. package/dist/contracts/schemas/warning.schema.d.ts +171 -0
  96. package/dist/contracts/schemas/warning.schema.d.ts.map +1 -0
  97. package/dist/contracts/schemas/warning.schema.js +123 -0
  98. package/dist/contracts/types/gate.types.d.ts +194 -0
  99. package/dist/contracts/types/gate.types.d.ts.map +1 -0
  100. package/dist/contracts/types/gate.types.js +19 -0
  101. package/dist/contracts/types/index.d.ts +9 -0
  102. package/dist/contracts/types/index.d.ts.map +1 -0
  103. package/dist/contracts/types/index.js +8 -0
  104. package/dist/crypto/hash.d.ts +47 -0
  105. package/dist/crypto/hash.d.ts.map +1 -0
  106. package/dist/crypto/hash.js +110 -0
  107. package/dist/crypto/index.d.ts +7 -0
  108. package/dist/crypto/index.d.ts.map +1 -0
  109. package/dist/crypto/index.js +6 -0
  110. package/dist/drift/index.d.ts +6 -0
  111. package/dist/drift/index.d.ts.map +1 -0
  112. package/dist/drift/index.js +5 -0
  113. package/dist/drift/report-generator.d.ts +21 -0
  114. package/dist/drift/report-generator.d.ts.map +1 -0
  115. package/dist/drift/report-generator.js +240 -0
  116. package/dist/drift/snapshot-capture.d.ts +26 -0
  117. package/dist/drift/snapshot-capture.d.ts.map +1 -0
  118. package/dist/drift/snapshot-capture.js +195 -0
  119. package/dist/drift/snapshot-compare.d.ts +50 -0
  120. package/dist/drift/snapshot-compare.d.ts.map +1 -0
  121. package/dist/drift/snapshot-compare.js +142 -0
  122. package/dist/drift/snapshot-schema.d.ts +197 -0
  123. package/dist/drift/snapshot-schema.d.ts.map +1 -0
  124. package/dist/drift/snapshot-schema.js +193 -0
  125. package/dist/drift/snapshot-storage.d.ts +25 -0
  126. package/dist/drift/snapshot-storage.d.ts.map +1 -0
  127. package/dist/drift/snapshot-storage.js +179 -0
  128. package/dist/explain/antipattern-explainer.d.ts +4 -0
  129. package/dist/explain/antipattern-explainer.d.ts.map +1 -0
  130. package/dist/explain/antipattern-explainer.js +196 -0
  131. package/dist/explain/boundary-explainer.d.ts +5 -0
  132. package/dist/explain/boundary-explainer.d.ts.map +1 -0
  133. package/dist/explain/boundary-explainer.js +261 -0
  134. package/dist/explain/explain-service.d.ts +19 -0
  135. package/dist/explain/explain-service.d.ts.map +1 -0
  136. package/dist/explain/explain-service.js +106 -0
  137. package/dist/explain/index.d.ts +7 -0
  138. package/dist/explain/index.d.ts.map +1 -0
  139. package/dist/explain/index.js +5 -0
  140. package/dist/explain/template-loader.d.ts +9 -0
  141. package/dist/explain/template-loader.d.ts.map +1 -0
  142. package/dist/explain/template-loader.js +51 -0
  143. package/dist/explain/types.d.ts +46 -0
  144. package/dist/explain/types.d.ts.map +1 -0
  145. package/dist/explain/types.js +31 -0
  146. package/dist/index.d.ts +26 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +37 -0
  149. package/dist/provenance/collector.d.ts +86 -0
  150. package/dist/provenance/collector.d.ts.map +1 -0
  151. package/dist/provenance/collector.js +425 -0
  152. package/dist/provenance/git-ai-standard/git-notes.d.ts +85 -0
  153. package/dist/provenance/git-ai-standard/git-notes.d.ts.map +1 -0
  154. package/dist/provenance/git-ai-standard/git-notes.js +292 -0
  155. package/dist/provenance/git-ai-standard/index.d.ts +44 -0
  156. package/dist/provenance/git-ai-standard/index.d.ts.map +1 -0
  157. package/dist/provenance/git-ai-standard/index.js +47 -0
  158. package/dist/provenance/git-ai-standard/serializer.d.ts +54 -0
  159. package/dist/provenance/git-ai-standard/serializer.d.ts.map +1 -0
  160. package/dist/provenance/git-ai-standard/serializer.js +224 -0
  161. package/dist/provenance/git-ai-standard/session.d.ts +51 -0
  162. package/dist/provenance/git-ai-standard/session.d.ts.map +1 -0
  163. package/dist/provenance/git-ai-standard/session.js +118 -0
  164. package/dist/provenance/git-ai-standard/types.d.ts +173 -0
  165. package/dist/provenance/git-ai-standard/types.d.ts.map +1 -0
  166. package/dist/provenance/git-ai-standard/types.js +109 -0
  167. package/dist/provenance/index.d.ts +5 -0
  168. package/dist/provenance/index.d.ts.map +1 -0
  169. package/dist/provenance/index.js +6 -0
  170. package/dist/provenance/store.d.ts +83 -0
  171. package/dist/provenance/store.d.ts.map +1 -0
  172. package/dist/provenance/store.js +248 -0
  173. package/dist/provenance/types.d.ts +160 -0
  174. package/dist/provenance/types.d.ts.map +1 -0
  175. package/dist/provenance/types.js +112 -0
  176. package/dist/suppression/index.d.ts +4 -0
  177. package/dist/suppression/index.d.ts.map +1 -0
  178. package/dist/suppression/index.js +3 -0
  179. package/dist/suppression/parser.d.ts +31 -0
  180. package/dist/suppression/parser.d.ts.map +1 -0
  181. package/dist/suppression/parser.js +219 -0
  182. package/dist/suppression/service.d.ts +29 -0
  183. package/dist/suppression/service.d.ts.map +1 -0
  184. package/dist/suppression/service.js +132 -0
  185. package/dist/suppression/store.d.ts +61 -0
  186. package/dist/suppression/store.d.ts.map +1 -0
  187. package/dist/suppression/store.js +169 -0
  188. package/dist/utils/debug.d.ts +48 -0
  189. package/dist/utils/debug.d.ts.map +1 -0
  190. package/dist/utils/debug.js +100 -0
  191. package/dist/utils/index.d.ts +4 -0
  192. package/dist/utils/index.d.ts.map +1 -0
  193. package/dist/utils/index.js +3 -0
  194. package/dist/utils/path-safety.d.ts +21 -0
  195. package/dist/utils/path-safety.d.ts.map +1 -0
  196. package/dist/utils/path-safety.js +49 -0
  197. package/dist/utils/severity.d.ts +37 -0
  198. package/dist/utils/severity.d.ts.map +1 -0
  199. package/dist/utils/severity.js +22 -0
  200. package/dist/validation/aps-validator.d.ts +66 -0
  201. package/dist/validation/aps-validator.d.ts.map +1 -0
  202. package/dist/validation/aps-validator.js +173 -0
  203. package/dist/validation/errors.d.ts +52 -0
  204. package/dist/validation/errors.d.ts.map +1 -0
  205. package/dist/validation/errors.js +115 -0
  206. package/dist/validation/index.d.ts +8 -0
  207. package/dist/validation/index.d.ts.map +1 -0
  208. package/dist/validation/index.js +13 -0
  209. package/dist/warnings/index.d.ts +2 -0
  210. package/dist/warnings/index.d.ts.map +1 -0
  211. package/dist/warnings/index.js +1 -0
  212. package/dist/warnings/warning-id.d.ts +180 -0
  213. package/dist/warnings/warning-id.d.ts.map +1 -0
  214. package/dist/warnings/warning-id.js +257 -0
  215. package/package.json +79 -0
@@ -0,0 +1,51 @@
1
+ import type { SessionHash, AgentId } from './types.js';
2
+ /**
3
+ * Generate a session hash from tool and conversation ID
4
+ *
5
+ * Per Git AI Standard v3.0.0: 16-character SHA-256 prefix of {tool}:{conversation_id}
6
+ *
7
+ * @param tool - AI tool name (e.g., "claude-code", "cursor")
8
+ * @param conversationId - Unique session/conversation identifier
9
+ * @returns 16-character hex session hash
10
+ */
11
+ export declare function generateSessionHash(tool: string, conversationId: string): SessionHash;
12
+ /**
13
+ * Generate a session hash from an AgentId
14
+ */
15
+ export declare function sessionHashFromAgentId(agentId: AgentId): SessionHash;
16
+ /**
17
+ * Create an AgentId from parameters
18
+ *
19
+ * @param options - Agent identification options
20
+ * @returns AgentId object
21
+ */
22
+ export declare function createAgentId(options: {
23
+ tool: string;
24
+ conversationId?: string;
25
+ model?: string;
26
+ }): AgentId;
27
+ /**
28
+ * Detect current AI tool and create AgentId from environment
29
+ *
30
+ * Checks environment variables for known AI tool session identifiers.
31
+ * Returns null if no AI tool is detected.
32
+ *
33
+ * @returns AgentId if an AI tool is detected, null otherwise
34
+ */
35
+ export declare function detectCurrentAgent(): AgentId | null;
36
+ /**
37
+ * Create an AgentId for manual/explicit use
38
+ *
39
+ * Use this when you know the exact tool and session ID.
40
+ *
41
+ * @param tool - AI tool name
42
+ * @param sessionId - Session/conversation ID
43
+ * @param model - Optional model identifier
44
+ * @returns AgentId object
45
+ */
46
+ export declare function createExplicitAgent(tool: string, sessionId: string, model?: string): AgentId;
47
+ /**
48
+ * Format an AgentId for display
49
+ */
50
+ export declare function formatAgentId(agent: AgentId): string;
51
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/provenance/git-ai-standard/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,CAIrF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAWV;AAiCD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,GAAG,IAAI,CAenD;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAM5F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOpD"}
@@ -0,0 +1,118 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ /**
3
+ * Generate a session hash from tool and conversation ID
4
+ *
5
+ * Per Git AI Standard v3.0.0: 16-character SHA-256 prefix of {tool}:{conversation_id}
6
+ *
7
+ * @param tool - AI tool name (e.g., "claude-code", "cursor")
8
+ * @param conversationId - Unique session/conversation identifier
9
+ * @returns 16-character hex session hash
10
+ */
11
+ export function generateSessionHash(tool, conversationId) {
12
+ const input = `${tool}:${conversationId}`;
13
+ const fullHash = createHash('sha256').update(input).digest('hex');
14
+ return fullHash.slice(0, 16);
15
+ }
16
+ /**
17
+ * Generate a session hash from an AgentId
18
+ */
19
+ export function sessionHashFromAgentId(agentId) {
20
+ return generateSessionHash(agentId.tool, agentId.id);
21
+ }
22
+ /**
23
+ * Create an AgentId from parameters
24
+ *
25
+ * @param options - Agent identification options
26
+ * @returns AgentId object
27
+ */
28
+ export function createAgentId(options) {
29
+ const { tool, model } = options;
30
+ // Generate conversation ID if not provided (using crypto for robust randomness)
31
+ const conversationId = options.conversationId ?? `${Date.now()}-${randomUUID().slice(0, 8)}`;
32
+ return {
33
+ tool,
34
+ id: conversationId,
35
+ model,
36
+ };
37
+ }
38
+ /**
39
+ * Known AI tool environment detection patterns
40
+ */
41
+ const AI_TOOL_PATTERNS = [
42
+ {
43
+ tool: 'claude-code',
44
+ envVars: ['CLAUDE_SESSION_ID', 'CLAUDE_CODE_SESSION'],
45
+ modelVar: 'CLAUDE_MODEL',
46
+ },
47
+ {
48
+ tool: 'cursor',
49
+ envVars: ['CURSOR_SESSION', 'CURSOR_SESSION_ID'],
50
+ modelVar: 'CURSOR_MODEL',
51
+ },
52
+ {
53
+ tool: 'copilot',
54
+ envVars: ['GITHUB_COPILOT_TOKEN', 'COPILOT_SESSION'],
55
+ modelVar: undefined,
56
+ },
57
+ {
58
+ tool: 'codewhisperer',
59
+ envVars: ['AWS_CODEWHISPERER_SESSION'],
60
+ modelVar: undefined,
61
+ },
62
+ {
63
+ tool: 'tabnine',
64
+ envVars: ['TABNINE_SESSION'],
65
+ modelVar: undefined,
66
+ },
67
+ ];
68
+ /**
69
+ * Detect current AI tool and create AgentId from environment
70
+ *
71
+ * Checks environment variables for known AI tool session identifiers.
72
+ * Returns null if no AI tool is detected.
73
+ *
74
+ * @returns AgentId if an AI tool is detected, null otherwise
75
+ */
76
+ export function detectCurrentAgent() {
77
+ for (const pattern of AI_TOOL_PATTERNS) {
78
+ for (const envVar of pattern.envVars) {
79
+ const sessionId = process.env[envVar];
80
+ if (sessionId) {
81
+ return createAgentId({
82
+ tool: pattern.tool,
83
+ conversationId: sessionId,
84
+ model: pattern.modelVar ? process.env[pattern.modelVar] : undefined,
85
+ });
86
+ }
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+ /**
92
+ * Create an AgentId for manual/explicit use
93
+ *
94
+ * Use this when you know the exact tool and session ID.
95
+ *
96
+ * @param tool - AI tool name
97
+ * @param sessionId - Session/conversation ID
98
+ * @param model - Optional model identifier
99
+ * @returns AgentId object
100
+ */
101
+ export function createExplicitAgent(tool, sessionId, model) {
102
+ return {
103
+ tool,
104
+ id: sessionId,
105
+ model,
106
+ };
107
+ }
108
+ /**
109
+ * Format an AgentId for display
110
+ */
111
+ export function formatAgentId(agent) {
112
+ const parts = [agent.tool];
113
+ if (agent.model) {
114
+ parts.push(`(${agent.model})`);
115
+ }
116
+ parts.push(`session:${agent.id.slice(0, 8)}...`);
117
+ return parts.join(' ');
118
+ }
@@ -0,0 +1,173 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Git AI Standard v3.0.0 Type Definitions
4
+ *
5
+ * This module implements the schema definitions for tracking AI-generated code
6
+ * contributions using Git Notes under the refs/notes/ai namespace.
7
+ *
8
+ * @see https://github.com/git-ai-project/git-ai/blob/main/specs/git_ai_standard_v3.0.0.md
9
+ */
10
+ export declare const SCHEMA_VERSION: "authorship/3.0.0";
11
+ /**
12
+ * Session hash - 16-character hex prefix of SHA-256({tool}:{conversation_id})
13
+ *
14
+ * Session hashes must:
15
+ * - Remain stable across commits for the same session
16
+ * - Correspond to keys in the prompts object
17
+ * - Use only hexadecimal characters
18
+ *
19
+ * Backward compatibility allows 7-character hashes.
20
+ */
21
+ export declare const SessionHashSchema: z.ZodString;
22
+ /**
23
+ * Line range specification (1-indexed)
24
+ *
25
+ * Formats:
26
+ * - Single lines: "42"
27
+ * - Ranges: "19-222"
28
+ * - Multiple: "1,2,19-222,300"
29
+ */
30
+ export declare const LineRangeSchema: z.ZodString;
31
+ /**
32
+ * File attestation entry - maps session hash to line ranges
33
+ */
34
+ export declare const FileAttestationSchema: z.ZodObject<{
35
+ sessionHash: z.ZodString;
36
+ lineRanges: z.ZodString;
37
+ }, z.core.$strip>;
38
+ /**
39
+ * Agent identifier - identifies the AI tool and session
40
+ */
41
+ export declare const AgentIdSchema: z.ZodObject<{
42
+ tool: z.ZodString;
43
+ id: z.ZodString;
44
+ model: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>;
46
+ /**
47
+ * Message types in a prompt conversation
48
+ *
49
+ * Note: Tool responses are explicitly excluded per the spec to avoid bloat.
50
+ */
51
+ export declare const MessageTypeSchema: z.ZodEnum<{
52
+ user: "user";
53
+ assistant: "assistant";
54
+ tool_use: "tool_use";
55
+ }>;
56
+ /**
57
+ * Message in a prompt conversation
58
+ */
59
+ export declare const MessageSchema: z.ZodObject<{
60
+ type: z.ZodEnum<{
61
+ user: "user";
62
+ assistant: "assistant";
63
+ tool_use: "tool_use";
64
+ }>;
65
+ text: z.ZodString;
66
+ timestamp: z.ZodOptional<z.ZodString>;
67
+ }, z.core.$strip>;
68
+ /**
69
+ * Prompt record for a session
70
+ *
71
+ * Contains the full conversation and metrics for a single AI session
72
+ * that contributed to the commit.
73
+ */
74
+ export declare const PromptRecordSchema: z.ZodObject<{
75
+ agent_id: z.ZodObject<{
76
+ tool: z.ZodString;
77
+ id: z.ZodString;
78
+ model: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strip>;
80
+ messages: z.ZodArray<z.ZodObject<{
81
+ type: z.ZodEnum<{
82
+ user: "user";
83
+ assistant: "assistant";
84
+ tool_use: "tool_use";
85
+ }>;
86
+ text: z.ZodString;
87
+ timestamp: z.ZodOptional<z.ZodString>;
88
+ }, z.core.$strip>>;
89
+ total_additions: z.ZodNumber;
90
+ total_deletions: z.ZodNumber;
91
+ accepted_lines: z.ZodNumber;
92
+ overridden_lines: z.ZodNumber;
93
+ human_author: z.ZodOptional<z.ZodString>;
94
+ }, z.core.$strip>;
95
+ /**
96
+ * Metadata section of authorship log
97
+ *
98
+ * The JSON object containing prompt records and versioning information.
99
+ */
100
+ export declare const AuthorshipMetadataSchema: z.ZodObject<{
101
+ schema_version: z.ZodLiteral<"authorship/3.0.0">;
102
+ base_commit_sha: z.ZodString;
103
+ prompts: z.ZodRecord<z.ZodString, z.ZodObject<{
104
+ agent_id: z.ZodObject<{
105
+ tool: z.ZodString;
106
+ id: z.ZodString;
107
+ model: z.ZodOptional<z.ZodString>;
108
+ }, z.core.$strip>;
109
+ messages: z.ZodArray<z.ZodObject<{
110
+ type: z.ZodEnum<{
111
+ user: "user";
112
+ assistant: "assistant";
113
+ tool_use: "tool_use";
114
+ }>;
115
+ text: z.ZodString;
116
+ timestamp: z.ZodOptional<z.ZodString>;
117
+ }, z.core.$strip>>;
118
+ total_additions: z.ZodNumber;
119
+ total_deletions: z.ZodNumber;
120
+ accepted_lines: z.ZodNumber;
121
+ overridden_lines: z.ZodNumber;
122
+ human_author: z.ZodOptional<z.ZodString>;
123
+ }, z.core.$strip>>;
124
+ }, z.core.$strip>;
125
+ /**
126
+ * Complete authorship log (attestation + metadata)
127
+ *
128
+ * The full structure stored in Git Notes under refs/notes/ai.
129
+ * Consists of two sections separated by "---":
130
+ * 1. Attestation section - maps files to AI sessions and line numbers
131
+ * 2. Metadata section - JSON object with prompt records and versioning
132
+ */
133
+ export declare const AuthorshipLogSchema: z.ZodObject<{
134
+ attestations: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodObject<{
135
+ sessionHash: z.ZodString;
136
+ lineRanges: z.ZodString;
137
+ }, z.core.$strip>>>;
138
+ metadata: z.ZodObject<{
139
+ schema_version: z.ZodLiteral<"authorship/3.0.0">;
140
+ base_commit_sha: z.ZodString;
141
+ prompts: z.ZodRecord<z.ZodString, z.ZodObject<{
142
+ agent_id: z.ZodObject<{
143
+ tool: z.ZodString;
144
+ id: z.ZodString;
145
+ model: z.ZodOptional<z.ZodString>;
146
+ }, z.core.$strip>;
147
+ messages: z.ZodArray<z.ZodObject<{
148
+ type: z.ZodEnum<{
149
+ user: "user";
150
+ assistant: "assistant";
151
+ tool_use: "tool_use";
152
+ }>;
153
+ text: z.ZodString;
154
+ timestamp: z.ZodOptional<z.ZodString>;
155
+ }, z.core.$strip>>;
156
+ total_additions: z.ZodNumber;
157
+ total_deletions: z.ZodNumber;
158
+ accepted_lines: z.ZodNumber;
159
+ overridden_lines: z.ZodNumber;
160
+ human_author: z.ZodOptional<z.ZodString>;
161
+ }, z.core.$strip>>;
162
+ }, z.core.$strip>;
163
+ }, z.core.$strip>;
164
+ export type SessionHash = z.infer<typeof SessionHashSchema>;
165
+ export type LineRange = z.infer<typeof LineRangeSchema>;
166
+ export type FileAttestation = z.infer<typeof FileAttestationSchema>;
167
+ export type AgentId = z.infer<typeof AgentIdSchema>;
168
+ export type MessageType = z.infer<typeof MessageTypeSchema>;
169
+ export type Message = z.infer<typeof MessageSchema>;
170
+ export type PromptRecord = z.infer<typeof PromptRecordSchema>;
171
+ export type AuthorshipMetadata = z.infer<typeof AuthorshipMetadataSchema>;
172
+ export type AuthorshipLog = z.infer<typeof AuthorshipLogSchema>;
173
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/provenance/git-ai-standard/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,EAAG,kBAA2B,CAAC;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,aAG4B,CAAC;AAE3D;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,aAGgC,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;iBAIxB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;EAA4C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;iBAIxB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;iBAQ7B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;iBASnC,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK9B,CAAC;AAGH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Git AI Standard v3.0.0 Type Definitions
4
+ *
5
+ * This module implements the schema definitions for tracking AI-generated code
6
+ * contributions using Git Notes under the refs/notes/ai namespace.
7
+ *
8
+ * @see https://github.com/git-ai-project/git-ai/blob/main/specs/git_ai_standard_v3.0.0.md
9
+ */
10
+ export const SCHEMA_VERSION = 'authorship/3.0.0';
11
+ /**
12
+ * Session hash - 16-character hex prefix of SHA-256({tool}:{conversation_id})
13
+ *
14
+ * Session hashes must:
15
+ * - Remain stable across commits for the same session
16
+ * - Correspond to keys in the prompts object
17
+ * - Use only hexadecimal characters
18
+ *
19
+ * Backward compatibility allows 7-character hashes.
20
+ */
21
+ export const SessionHashSchema = z
22
+ .string()
23
+ .regex(/^[a-f0-9]{7,16}$/, 'Session hash must be 7-16 hex characters')
24
+ .describe('Session identifier (16-char SHA-256 prefix)');
25
+ /**
26
+ * Line range specification (1-indexed)
27
+ *
28
+ * Formats:
29
+ * - Single lines: "42"
30
+ * - Ranges: "19-222"
31
+ * - Multiple: "1,2,19-222,300"
32
+ */
33
+ export const LineRangeSchema = z
34
+ .string()
35
+ .regex(/^(\d+(-\d+)?)(,\d+(-\d+)?)*$/, 'Invalid line range format')
36
+ .describe('Line range specification (e.g., "1-10,15-20")');
37
+ /**
38
+ * File attestation entry - maps session hash to line ranges
39
+ */
40
+ export const FileAttestationSchema = z.object({
41
+ sessionHash: SessionHashSchema,
42
+ lineRanges: LineRangeSchema,
43
+ });
44
+ /**
45
+ * Agent identifier - identifies the AI tool and session
46
+ */
47
+ export const AgentIdSchema = z.object({
48
+ tool: z.string().describe('AI tool name (e.g., "claude-code", "cursor", "copilot")'),
49
+ id: z.string().describe('Unique conversation/session ID'),
50
+ model: z.string().optional().describe('Model used (e.g., "claude-3-opus", "gpt-4")'),
51
+ });
52
+ /**
53
+ * Message types in a prompt conversation
54
+ *
55
+ * Note: Tool responses are explicitly excluded per the spec to avoid bloat.
56
+ */
57
+ export const MessageTypeSchema = z.enum(['user', 'assistant', 'tool_use']);
58
+ /**
59
+ * Message in a prompt conversation
60
+ */
61
+ export const MessageSchema = z.object({
62
+ type: MessageTypeSchema.describe('Message type'),
63
+ text: z.string().describe('Message content'),
64
+ timestamp: z.string().datetime().optional().describe('ISO 8601 timestamp'),
65
+ });
66
+ /**
67
+ * Prompt record for a session
68
+ *
69
+ * Contains the full conversation and metrics for a single AI session
70
+ * that contributed to the commit.
71
+ */
72
+ export const PromptRecordSchema = z.object({
73
+ agent_id: AgentIdSchema.describe('AI tool identifier'),
74
+ messages: z.array(MessageSchema).describe('Conversation turns'),
75
+ total_additions: z.number().int().min(0).describe('Total lines added by AI'),
76
+ total_deletions: z.number().int().min(0).describe('Total lines deleted by AI'),
77
+ accepted_lines: z.number().int().min(0).describe('Lines accepted as-is from AI'),
78
+ overridden_lines: z.number().int().min(0).describe('Lines human-modified after AI generation'),
79
+ human_author: z.string().optional().describe('Human author in "Name <email>" format'),
80
+ });
81
+ /**
82
+ * Metadata section of authorship log
83
+ *
84
+ * The JSON object containing prompt records and versioning information.
85
+ */
86
+ export const AuthorshipMetadataSchema = z.object({
87
+ schema_version: z.literal(SCHEMA_VERSION).describe('Must be "authorship/3.0.0"'),
88
+ base_commit_sha: z
89
+ .string()
90
+ .regex(/^[a-f0-9]{40}$/, 'Must be full 40-char SHA')
91
+ .describe('The commit SHA this log is attached to'),
92
+ prompts: z
93
+ .record(SessionHashSchema, PromptRecordSchema)
94
+ .describe('Map of session hashes to prompt records'),
95
+ });
96
+ /**
97
+ * Complete authorship log (attestation + metadata)
98
+ *
99
+ * The full structure stored in Git Notes under refs/notes/ai.
100
+ * Consists of two sections separated by "---":
101
+ * 1. Attestation section - maps files to AI sessions and line numbers
102
+ * 2. Metadata section - JSON object with prompt records and versioning
103
+ */
104
+ export const AuthorshipLogSchema = z.object({
105
+ attestations: z
106
+ .record(z.string(), z.array(FileAttestationSchema))
107
+ .describe('Map of file paths to attestation entries'),
108
+ metadata: AuthorshipMetadataSchema.describe('Metadata with prompts and versioning'),
109
+ });
@@ -0,0 +1,5 @@
1
+ export * from './types.js';
2
+ export * from './collector.js';
3
+ export * from './store.js';
4
+ export * from './git-ai-standard/index.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provenance/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAG3B,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ // Provenance system for tracking check history and audit trails
2
+ export * from './types.js';
3
+ export * from './collector.js';
4
+ export * from './store.js';
5
+ // Git AI Standard v3.0.0 - AI authorship tracking via Git Notes
6
+ export * from './git-ai-standard/index.js';
@@ -0,0 +1,83 @@
1
+ import type { ProvenanceRecord, ProvenanceIndex } from './types.js';
2
+ /**
3
+ * ProvenanceStore - manages provenance records on disk
4
+ */
5
+ export declare class ProvenanceStore {
6
+ private readonly baseDir;
7
+ private readonly historyDir;
8
+ private readonly indexPath;
9
+ constructor(workspaceRoot: string);
10
+ /**
11
+ * Ensures the provenance directories exist
12
+ */
13
+ private ensureDirectories;
14
+ /**
15
+ * Loads the provenance index
16
+ */
17
+ private createEmptyIndex;
18
+ private loadIndex;
19
+ /**
20
+ * Saves the provenance index
21
+ */
22
+ private saveIndex;
23
+ /**
24
+ * Saves a provenance record
25
+ */
26
+ save(record: ProvenanceRecord): void;
27
+ /**
28
+ * Gets a specific provenance record by ID
29
+ */
30
+ get(id: string): ProvenanceRecord | null;
31
+ /**
32
+ * Gets the most recent provenance record
33
+ */
34
+ getLatest(): ProvenanceRecord | null;
35
+ /**
36
+ * Gets the provenance index with statistics
37
+ */
38
+ getIndex(): ProvenanceIndex;
39
+ /**
40
+ * Lists recent provenance records
41
+ */
42
+ list(options?: {
43
+ limit?: number;
44
+ passed?: boolean;
45
+ since?: Date;
46
+ }): ProvenanceRecord[];
47
+ /**
48
+ * Finds records by git commit
49
+ */
50
+ findByCommit(commitPrefix: string): ProvenanceRecord[];
51
+ /**
52
+ * Gets statistics about provenance history
53
+ */
54
+ getStatistics(): {
55
+ total: number;
56
+ passed: number;
57
+ failed: number;
58
+ passRate: number;
59
+ lastCheck: string | null;
60
+ lastPass: string | null;
61
+ lastFail: string | null;
62
+ };
63
+ /**
64
+ * Exports provenance history as JSON
65
+ */
66
+ export(options?: {
67
+ since?: Date;
68
+ limit?: number;
69
+ }): string;
70
+ /**
71
+ * Clears all provenance history
72
+ */
73
+ clear(): void;
74
+ /**
75
+ * Checks if provenance tracking is initialised
76
+ */
77
+ isInitialised(): boolean;
78
+ }
79
+ /**
80
+ * Creates a provenance store for the given workspace
81
+ */
82
+ export declare function createProvenanceStore(workspaceRoot: string): ProvenanceStore;
83
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/provenance/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWpE;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,aAAa,EAAE,MAAM;IAMjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,SAAS;IAsBjB;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAsCpC;;OAEG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAwBxC;;OAEG;IACH,SAAS,IAAI,gBAAgB,GAAG,IAAI;IAQpC;;OAEG;IACH,QAAQ,IAAI,eAAe;IAI3B;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,gBAAgB,EAAE;IAuBtF;;OAEG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAMtD;;OAEG;IACH,aAAa,IAAI;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB;IAgBD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAe1D;;OAEG;IACH,KAAK,IAAI,IAAI;IAkBb;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,CAE5E"}