auden 0.1.0-alpha.2

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/auden-paths.d.ts +8 -0
  4. package/dist/auden-paths.d.ts.map +1 -0
  5. package/dist/auden-paths.js +10 -0
  6. package/dist/auden-paths.js.map +1 -0
  7. package/dist/bin.d.ts +11 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +13 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/chunk.d.ts +3 -0
  12. package/dist/chunk.d.ts.map +1 -0
  13. package/dist/chunk.js +13 -0
  14. package/dist/chunk.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +13 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +125 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/eval/index.d.ts +2 -0
  20. package/dist/commands/eval/index.d.ts.map +1 -0
  21. package/dist/commands/eval/index.js +2 -0
  22. package/dist/commands/eval/index.js.map +1 -0
  23. package/dist/commands/eval/run.d.ts +38 -0
  24. package/dist/commands/eval/run.d.ts.map +1 -0
  25. package/dist/commands/eval/run.js +179 -0
  26. package/dist/commands/eval/run.js.map +1 -0
  27. package/dist/commands/guides/active.d.ts +2 -0
  28. package/dist/commands/guides/active.d.ts.map +1 -0
  29. package/dist/commands/guides/active.js +38 -0
  30. package/dist/commands/guides/active.js.map +1 -0
  31. package/dist/commands/guides/index.d.ts +2 -0
  32. package/dist/commands/guides/index.d.ts.map +1 -0
  33. package/dist/commands/guides/index.js +13 -0
  34. package/dist/commands/guides/index.js.map +1 -0
  35. package/dist/commands/guides/project.d.ts +13 -0
  36. package/dist/commands/guides/project.d.ts.map +1 -0
  37. package/dist/commands/guides/project.js +71 -0
  38. package/dist/commands/guides/project.js.map +1 -0
  39. package/dist/commands/guides/search.d.ts +8 -0
  40. package/dist/commands/guides/search.d.ts.map +1 -0
  41. package/dist/commands/guides/search.js +46 -0
  42. package/dist/commands/guides/search.js.map +1 -0
  43. package/dist/commands/init.d.ts +43 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +436 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/mcp.d.ts +23 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +55 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/pull.d.ts +38 -0
  52. package/dist/commands/pull.d.ts.map +1 -0
  53. package/dist/commands/pull.js +127 -0
  54. package/dist/commands/pull.js.map +1 -0
  55. package/dist/commands/rules/export.d.ts +140 -0
  56. package/dist/commands/rules/export.d.ts.map +1 -0
  57. package/dist/commands/rules/export.js +635 -0
  58. package/dist/commands/rules/export.js.map +1 -0
  59. package/dist/commands/rules/import.d.ts +33 -0
  60. package/dist/commands/rules/import.d.ts.map +1 -0
  61. package/dist/commands/rules/import.js +122 -0
  62. package/dist/commands/rules/import.js.map +1 -0
  63. package/dist/commands/rules/index.d.ts +2 -0
  64. package/dist/commands/rules/index.d.ts.map +1 -0
  65. package/dist/commands/rules/index.js +13 -0
  66. package/dist/commands/rules/index.js.map +1 -0
  67. package/dist/commands/rules/watch.d.ts +43 -0
  68. package/dist/commands/rules/watch.d.ts.map +1 -0
  69. package/dist/commands/rules/watch.js +125 -0
  70. package/dist/commands/rules/watch.js.map +1 -0
  71. package/dist/commands/status.d.ts +2 -0
  72. package/dist/commands/status.d.ts.map +1 -0
  73. package/dist/commands/status.js +61 -0
  74. package/dist/commands/status.js.map +1 -0
  75. package/dist/commands/suggest.d.ts +8 -0
  76. package/dist/commands/suggest.d.ts.map +1 -0
  77. package/dist/commands/suggest.js +43 -0
  78. package/dist/commands/suggest.js.map +1 -0
  79. package/dist/commands/sync.d.ts +23 -0
  80. package/dist/commands/sync.d.ts.map +1 -0
  81. package/dist/commands/sync.js +193 -0
  82. package/dist/commands/sync.js.map +1 -0
  83. package/dist/commands/verdict/index.d.ts +2 -0
  84. package/dist/commands/verdict/index.d.ts.map +1 -0
  85. package/dist/commands/verdict/index.js +11 -0
  86. package/dist/commands/verdict/index.js.map +1 -0
  87. package/dist/commands/verdict/record.d.ts +18 -0
  88. package/dist/commands/verdict/record.d.ts.map +1 -0
  89. package/dist/commands/verdict/record.js +60 -0
  90. package/dist/commands/verdict/record.js.map +1 -0
  91. package/dist/config.d.ts +96 -0
  92. package/dist/config.d.ts.map +1 -0
  93. package/dist/config.js +246 -0
  94. package/dist/config.js.map +1 -0
  95. package/dist/context/pull.d.ts +40 -0
  96. package/dist/context/pull.d.ts.map +1 -0
  97. package/dist/context/pull.js +46 -0
  98. package/dist/context/pull.js.map +1 -0
  99. package/dist/dashboard-health.d.ts +20 -0
  100. package/dist/dashboard-health.d.ts.map +1 -0
  101. package/dist/dashboard-health.js +24 -0
  102. package/dist/dashboard-health.js.map +1 -0
  103. package/dist/eval-provider.d.ts +30 -0
  104. package/dist/eval-provider.d.ts.map +1 -0
  105. package/dist/eval-provider.js +359 -0
  106. package/dist/eval-provider.js.map +1 -0
  107. package/dist/eval-summary.d.ts +24 -0
  108. package/dist/eval-summary.d.ts.map +1 -0
  109. package/dist/eval-summary.js +30 -0
  110. package/dist/eval-summary.js.map +1 -0
  111. package/dist/feedback/extract.d.ts +6 -0
  112. package/dist/feedback/extract.d.ts.map +1 -0
  113. package/dist/feedback/extract.js +580 -0
  114. package/dist/feedback/extract.js.map +1 -0
  115. package/dist/http-retry.d.ts +23 -0
  116. package/dist/http-retry.d.ts.map +1 -0
  117. package/dist/http-retry.js +54 -0
  118. package/dist/http-retry.js.map +1 -0
  119. package/dist/index.d.ts +6 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +33 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/mcp/client.d.ts +70 -0
  124. package/dist/mcp/client.d.ts.map +1 -0
  125. package/dist/mcp/client.js +121 -0
  126. package/dist/mcp/client.js.map +1 -0
  127. package/dist/mcp/scope.d.ts +30 -0
  128. package/dist/mcp/scope.d.ts.map +1 -0
  129. package/dist/mcp/scope.js +64 -0
  130. package/dist/mcp/scope.js.map +1 -0
  131. package/dist/mcp/server.d.ts +57 -0
  132. package/dist/mcp/server.d.ts.map +1 -0
  133. package/dist/mcp/server.js +427 -0
  134. package/dist/mcp/server.js.map +1 -0
  135. package/dist/mcp/write-items.d.ts +34 -0
  136. package/dist/mcp/write-items.d.ts.map +1 -0
  137. package/dist/mcp/write-items.js +59 -0
  138. package/dist/mcp/write-items.js.map +1 -0
  139. package/dist/rules/deletions-client.d.ts +16 -0
  140. package/dist/rules/deletions-client.d.ts.map +1 -0
  141. package/dist/rules/deletions-client.js +40 -0
  142. package/dist/rules/deletions-client.js.map +1 -0
  143. package/dist/rules/diff.d.ts +19 -0
  144. package/dist/rules/diff.d.ts.map +1 -0
  145. package/dist/rules/diff.js +36 -0
  146. package/dist/rules/diff.js.map +1 -0
  147. package/dist/rules/discover.d.ts +81 -0
  148. package/dist/rules/discover.d.ts.map +1 -0
  149. package/dist/rules/discover.js +307 -0
  150. package/dist/rules/discover.js.map +1 -0
  151. package/dist/rules/file-origin.d.ts +16 -0
  152. package/dist/rules/file-origin.d.ts.map +1 -0
  153. package/dist/rules/file-origin.js +31 -0
  154. package/dist/rules/file-origin.js.map +1 -0
  155. package/dist/rules/global-flag.d.ts +12 -0
  156. package/dist/rules/global-flag.d.ts.map +1 -0
  157. package/dist/rules/global-flag.js +15 -0
  158. package/dist/rules/global-flag.js.map +1 -0
  159. package/dist/rules/import-client.d.ts +37 -0
  160. package/dist/rules/import-client.d.ts.map +1 -0
  161. package/dist/rules/import-client.js +98 -0
  162. package/dist/rules/import-client.js.map +1 -0
  163. package/dist/rules/init-pull.d.ts +34 -0
  164. package/dist/rules/init-pull.d.ts.map +1 -0
  165. package/dist/rules/init-pull.js +43 -0
  166. package/dist/rules/init-pull.js.map +1 -0
  167. package/dist/rules/member-files-client.d.ts +17 -0
  168. package/dist/rules/member-files-client.d.ts.map +1 -0
  169. package/dist/rules/member-files-client.js +29 -0
  170. package/dist/rules/member-files-client.js.map +1 -0
  171. package/dist/rules/path-contains.d.ts +9 -0
  172. package/dist/rules/path-contains.d.ts.map +1 -0
  173. package/dist/rules/path-contains.js +17 -0
  174. package/dist/rules/path-contains.js.map +1 -0
  175. package/dist/rules/payload.d.ts +13 -0
  176. package/dist/rules/payload.d.ts.map +1 -0
  177. package/dist/rules/payload.js +35 -0
  178. package/dist/rules/payload.js.map +1 -0
  179. package/dist/rules/pull-bundle.d.ts +13 -0
  180. package/dist/rules/pull-bundle.d.ts.map +1 -0
  181. package/dist/rules/pull-bundle.js +32 -0
  182. package/dist/rules/pull-bundle.js.map +1 -0
  183. package/dist/rules/watch.d.ts +121 -0
  184. package/dist/rules/watch.d.ts.map +1 -0
  185. package/dist/rules/watch.js +457 -0
  186. package/dist/rules/watch.js.map +1 -0
  187. package/dist/skill-template.d.ts +19 -0
  188. package/dist/skill-template.d.ts.map +1 -0
  189. package/dist/skill-template.js +174 -0
  190. package/dist/skill-template.js.map +1 -0
  191. package/dist/sync-batches.d.ts +37 -0
  192. package/dist/sync-batches.d.ts.map +1 -0
  193. package/dist/sync-batches.js +67 -0
  194. package/dist/sync-batches.js.map +1 -0
  195. package/dist/sync-client.d.ts +22 -0
  196. package/dist/sync-client.d.ts.map +1 -0
  197. package/dist/sync-client.js +38 -0
  198. package/dist/sync-client.js.map +1 -0
  199. package/dist/sync-response.d.ts +23 -0
  200. package/dist/sync-response.d.ts.map +1 -0
  201. package/dist/sync-response.js +22 -0
  202. package/dist/sync-response.js.map +1 -0
  203. package/dist/token-verify.d.ts +14 -0
  204. package/dist/token-verify.d.ts.map +1 -0
  205. package/dist/token-verify.js +30 -0
  206. package/dist/token-verify.js.map +1 -0
  207. package/dist/usage/extract.d.ts +31 -0
  208. package/dist/usage/extract.d.ts.map +1 -0
  209. package/dist/usage/extract.js +200 -0
  210. package/dist/usage/extract.js.map +1 -0
  211. package/dist/usage/providers.d.ts +8 -0
  212. package/dist/usage/providers.d.ts.map +1 -0
  213. package/dist/usage/providers.js +23 -0
  214. package/dist/usage/providers.js.map +1 -0
  215. package/dist/verdict-queue.d.ts +50 -0
  216. package/dist/verdict-queue.d.ts.map +1 -0
  217. package/dist/verdict-queue.js +131 -0
  218. package/dist/verdict-queue.js.map +1 -0
  219. package/package.json +72 -0
@@ -0,0 +1,193 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { unlink } from 'node:fs/promises';
3
+ import { defineCommand } from 'citty';
4
+ import { AUDEN_GUIDES_FILE, AUDEN_QUEUE_DIR } from '../auden-paths.js';
5
+ import { readConfigToken, resolveDashboardUrl, writeConfigToken } from '../config.js';
6
+ import { extractConversationalFeedback } from '../feedback/extract.js';
7
+ import { pullGuideBundle } from '../rules/pull-bundle.js';
8
+ import { buildSyncBatches } from '../sync-batches.js';
9
+ import { postSyncBatch } from '../sync-client.js';
10
+ import { extractRunUsage } from '../usage/extract.js';
11
+ import { readVerdictQueue } from '../verdict-queue.js';
12
+ function hashId(prefix, value) {
13
+ return `${prefix}-${createHash('sha1').update(value).digest('hex').slice(0, 12)}`;
14
+ }
15
+ export const syncCommand = defineCommand({
16
+ meta: {
17
+ name: 'sync',
18
+ description: 'Push guide/skill suggestions to the dashboard and pull the latest guide bundle',
19
+ },
20
+ args: {
21
+ token: {
22
+ type: 'string',
23
+ description: 'Auden API token — overrides the stored token and is remembered in ~/.auden/config.json after a successful sync',
24
+ default: '',
25
+ },
26
+ 'dashboard-url': {
27
+ type: 'string',
28
+ description: 'Override the dashboard base URL for this call (default: ~/.auden/config.json then the baked-in default)',
29
+ default: '',
30
+ },
31
+ 'transcripts-dir': {
32
+ type: 'string',
33
+ description: 'Optional Claude Code transcript directory (JSONL files)',
34
+ default: '',
35
+ },
36
+ 'dry-run': {
37
+ type: 'boolean',
38
+ description: 'Extract conversational feedback without sending it to the dashboard',
39
+ default: false,
40
+ },
41
+ },
42
+ async run({ args }) {
43
+ const queue = await readVerdictQueue(AUDEN_QUEUE_DIR);
44
+ // Permanently-invalid queue files (bad JSON or failing schema) would
45
+ // otherwise be re-warned about on every sync and inflate the pending count
46
+ // forever. Remove them now that they've been identified. Skipped on
47
+ // --dry-run so the flag stays side-effect-free.
48
+ if (!args['dry-run'] && queue.invalidFilePaths.length > 0) {
49
+ const removals = await Promise.allSettled(queue.invalidFilePaths.map((p) => unlink(p)));
50
+ let removed = 0;
51
+ removals.forEach((result, i) => {
52
+ if (result.status === 'fulfilled') {
53
+ removed += 1;
54
+ return;
55
+ }
56
+ const err = result.reason;
57
+ if (err?.code === 'ENOENT') {
58
+ removed += 1;
59
+ return;
60
+ }
61
+ // Left in place (e.g. a no-longer-writable queue dir) — surface it
62
+ // rather than retrying silently on every future sync.
63
+ console.warn(` warning: failed to delete invalid queue file ${queue.invalidFilePaths[i]}: ${err?.message}`);
64
+ });
65
+ if (removed > 0) {
66
+ console.warn(` warning: removed ${removed} invalid queue file(s).`);
67
+ }
68
+ }
69
+ if (queue.actions.length === 0) {
70
+ console.log(' No pending verdicts to sync.');
71
+ }
72
+ else {
73
+ console.log(` ${queue.actions.length} verdict(s) queued.`);
74
+ }
75
+ const transcriptsDir = args['transcripts-dir'] || '';
76
+ const extracted = await extractConversationalFeedback(transcriptsDir ? { transcriptsDir } : undefined);
77
+ const usageExtracted = await extractRunUsage(transcriptsDir ? { transcriptsDir } : undefined);
78
+ console.log(` extracted ${extracted.guideSuggestions.length} guide draft(s) and ${extracted.skillSuggestions.length} skill suggestion(s).`);
79
+ if (usageExtracted.runUsage.length > 0) {
80
+ console.log(` extracted token usage for ${usageExtracted.runUsage.length} session(s).`);
81
+ }
82
+ if (usageExtracted.skillUsage.length > 0) {
83
+ console.log(` extracted skill-load usage for ${usageExtracted.skillUsage.length} session(s).`);
84
+ }
85
+ if (args['dry-run']) {
86
+ for (const suggestion of extracted.guideSuggestions) {
87
+ console.log(` guide: ${suggestion.content}`);
88
+ }
89
+ for (const suggestion of extracted.skillSuggestions) {
90
+ console.log(` skill: ${suggestion.signal}`);
91
+ }
92
+ return;
93
+ }
94
+ const storedToken = await readConfigToken();
95
+ const token = args.token.trim() || storedToken;
96
+ if (!token) {
97
+ console.log(' No dashboard token configured — get one from the dashboard (Settings → Developer → CLI Token), then run `auden sync --token <token>`. It is remembered after the first successful sync.');
98
+ return;
99
+ }
100
+ const dashboardUrl = await resolveDashboardUrl(args['dashboard-url']);
101
+ const hasItemsToPush = queue.actions.length > 0 ||
102
+ extracted.guideSuggestions.length > 0 ||
103
+ extracted.skillSuggestions.length > 0 ||
104
+ usageExtracted.runUsage.length > 0 ||
105
+ usageExtracted.skillUsage.length > 0;
106
+ // Set once the server has accepted the token (push or pull) — gates
107
+ // persisting a --token flag so a typo'd token is never stored.
108
+ let serverAccepted = false;
109
+ if (!hasItemsToPush) {
110
+ console.log(' Nothing new to push.');
111
+ }
112
+ else {
113
+ // Chunked to stay under the server's per-request caps
114
+ // (MAX_SYNC_ACTIONS_BATCH / MAX_SYNC_AUX_BATCH) — a batch's queue files
115
+ // are deleted only once its own request succeeds, so a later batch's
116
+ // failure never loses an already-synced action on the next run.
117
+ const batches = buildSyncBatches({
118
+ actions: queue.actions,
119
+ filePaths: queue.filePaths,
120
+ guideSuggestions: extracted.guideSuggestions.map((suggestion) => ({
121
+ id: suggestion.id,
122
+ content: suggestion.content,
123
+ reasoning: `${suggestion.reasoning} Confidence ${Math.round(suggestion.confidence * 100)}%.`,
124
+ triggerType: suggestion.triggerType,
125
+ sourceActionIds: suggestion.citations,
126
+ status: 'pending',
127
+ })),
128
+ feedbackCandidates: extracted.skillSuggestions.map((suggestion) => ({
129
+ id: hashId('candidate', suggestion.id),
130
+ signal: suggestion.signal,
131
+ signalType: 'skill_suggestion',
132
+ confidence: suggestion.confidence,
133
+ occurrences: suggestion.occurrences,
134
+ status: 'inferred',
135
+ })),
136
+ runUsage: usageExtracted.runUsage,
137
+ skillUsage: usageExtracted.skillUsage,
138
+ });
139
+ let totalSynced = 0;
140
+ for (const batch of batches) {
141
+ const { synced } = await postSyncBatch({
142
+ dashboardUrl,
143
+ token,
144
+ payload: batch.payload,
145
+ retryOptions: {
146
+ onRetry: (attempt, delayMs, reason) => console.warn(` warning: sync attempt ${attempt} failed (${reason}) — retrying in ${Math.round(delayMs / 1000)}s…`),
147
+ },
148
+ });
149
+ serverAccepted = true;
150
+ totalSynced += synced;
151
+ // Remove this batch's processed queue files so they are not re-sent
152
+ // on the next sync.
153
+ const unlinkResults = await Promise.allSettled(batch.filePaths.map((p) => unlink(p)));
154
+ unlinkResults.forEach((result, j) => {
155
+ if (result.status === 'rejected') {
156
+ const err = result.reason;
157
+ if (err?.code !== 'ENOENT') {
158
+ console.warn(` warning: failed to delete queue file ${batch.filePaths[j]}: ${err?.message}`);
159
+ }
160
+ }
161
+ });
162
+ }
163
+ console.log(` synced ${totalSynced} item(s) to the dashboard.`);
164
+ }
165
+ // Pull updated guide bundle and cache locally for offline eval — even when
166
+ // nothing was pushed, so a fresh `auden sync --token` connects and seeds
167
+ // ~/.auden/guides.json.
168
+ try {
169
+ const { bundle } = await pullGuideBundle({
170
+ dashboardUrl,
171
+ token,
172
+ bundlePath: AUDEN_GUIDES_FILE,
173
+ });
174
+ serverAccepted = true;
175
+ console.log(` pulled ${bundle.guides.length} active guide(s) → ~/.auden/guides.json`);
176
+ }
177
+ catch (err) {
178
+ const message = err instanceof Error ? err.message : String(err);
179
+ console.warn(` warning: ${message} — skipping.`);
180
+ }
181
+ if (serverAccepted && args.token.trim() && args.token.trim() !== storedToken) {
182
+ try {
183
+ await writeConfigToken(args.token);
184
+ console.log(' token stored in ~/.auden/config.json — future syncs need no --token');
185
+ }
186
+ catch (err) {
187
+ const message = err instanceof Error ? err.message : String(err);
188
+ console.warn(` warning: could not store token — ${message}`);
189
+ }
190
+ }
191
+ },
192
+ });
193
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const verdictCommand: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/verdict/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,qDAQzB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { defineCommand } from 'citty';
2
+ export const verdictCommand = defineCommand({
3
+ meta: {
4
+ name: 'verdict',
5
+ description: 'Record and manage agent action verdicts',
6
+ },
7
+ subCommands: {
8
+ record: () => import('./record.js').then((m) => m.verdictRecordCommand),
9
+ },
10
+ });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/verdict/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,yCAAyC;KACvD;IACD,WAAW,EAAE;QACX,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;KACxE;CACF,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ export declare const verdictRecordCommand: import("citty").CommandDef<{
2
+ verdict: {
3
+ type: "string";
4
+ description: string;
5
+ required: true;
6
+ };
7
+ summary: {
8
+ type: "string";
9
+ description: string;
10
+ default: string;
11
+ };
12
+ 'session-id': {
13
+ type: "string";
14
+ description: string;
15
+ default: string;
16
+ };
17
+ }>;
18
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/commands/verdict/record.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;EAyD/B,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, rename, writeFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { defineCommand } from 'citty';
5
+ import { AUDEN_QUEUE_DIR } from '../../auden-paths.js';
6
+ import { MAX_QUEUED_VERDICTS, enforceVerdictQueueCap } from '../../verdict-queue.js';
7
+ const VALID_VERDICTS = ['aligned', 'misaligned', 'unguided'];
8
+ export const verdictRecordCommand = defineCommand({
9
+ meta: {
10
+ name: 'record',
11
+ description: 'Record a verdict for a completed agent action',
12
+ },
13
+ args: {
14
+ verdict: {
15
+ type: 'string',
16
+ description: 'Verdict outcome: aligned | misaligned | unguided',
17
+ required: true,
18
+ },
19
+ summary: {
20
+ type: 'string',
21
+ description: 'Short description of the action that was evaluated',
22
+ default: '',
23
+ },
24
+ 'session-id': {
25
+ type: 'string',
26
+ description: 'Session ID (optional, defaults to "unknown")',
27
+ default: '',
28
+ },
29
+ },
30
+ async run({ args }) {
31
+ if (!VALID_VERDICTS.includes(args.verdict)) {
32
+ console.error(` Error: --verdict must be one of: ${VALID_VERDICTS.join(', ')}`);
33
+ process.exit(1);
34
+ }
35
+ const entry = {
36
+ id: randomUUID(),
37
+ sessionId: args['session-id'] || 'unknown',
38
+ actionType: 'tool_use',
39
+ summary: args.summary || '(no summary)',
40
+ verdict: args.verdict,
41
+ timestamp: new Date().toISOString(),
42
+ };
43
+ await mkdir(AUDEN_QUEUE_DIR, { recursive: true });
44
+ // Write to a temp file and rename into place so a reader (auden sync) never
45
+ // observes a half-written file. readVerdictQueue only reads `.json`, so a
46
+ // stray `.tmp` left by a crash mid-write is ignored rather than mistaken
47
+ // for a corrupt queue entry.
48
+ const finalPath = join(AUDEN_QUEUE_DIR, `${entry.id}.json`);
49
+ const tmpPath = `${finalPath}.tmp`;
50
+ await writeFile(tmpPath, JSON.stringify(entry, null, 2) + '\n');
51
+ await rename(tmpPath, finalPath);
52
+ const { evicted } = await enforceVerdictQueueCap(AUDEN_QUEUE_DIR);
53
+ if (evicted > 0) {
54
+ console.warn(` warning: verdict queue exceeded ${MAX_QUEUED_VERDICTS} pending entries — evicted ${evicted} oldest verdict(s). Run \`auden sync\` more often, or check your dashboard connection with \`auden doctor\`.`);
55
+ }
56
+ console.log(` Verdict queued: ${entry.verdict} — "${entry.summary}"`);
57
+ console.log(` Saved to ~/.auden/queue/${entry.id}.json`);
58
+ },
59
+ });
60
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/commands/verdict/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEpF,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAU,CAAA;AAGrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;IAChD,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,+CAA+C;KAC7D;IACD,IAAI,EAAE;QACJ,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE,IAAI;SACf;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,oDAAoD;YACjE,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8CAA8C;YAC3D,OAAO,EAAE,EAAE;SACZ;KACF;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAuB,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,sCAAsC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,SAAS;YAC1C,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,cAAc;YACvC,OAAO,EAAE,IAAI,CAAC,OAAuB;YACrC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAA;QAED,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACjD,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,6BAA6B;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,GAAG,SAAS,MAAM,CAAA;QAClC,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAC/D,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAEhC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,sBAAsB,CAAC,eAAe,CAAC,CAAA;QACjE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CACV,qCAAqC,mBAAmB,8BAA8B,OAAO,8GAA8G,CAC5M,CAAA;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,OAAO,GAAG,CAAC,CAAA;QACtE,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;IAC3D,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,96 @@
1
+ /** Permission bits for `~/.auden/` and other auden-owned directories. */
2
+ export declare const AUDEN_DIR_MODE = 448;
3
+ /** Permission bits for `~/.auden/config.json` — it holds a bearer token. */
4
+ export declare const AUDEN_CONFIG_MODE = 384;
5
+ /**
6
+ * Create `dir` (and parents) with owner-only permissions, tightening an
7
+ * existing directory's mode too — `mkdir`'s `mode` option only applies to
8
+ * newly-created directories, so a pre-existing `~/.auden` from an older
9
+ * version (or a permissive umask) would otherwise stay world-readable.
10
+ */
11
+ export declare function ensureAudenDir(dir: string): Promise<void>;
12
+ /**
13
+ * Baked-in fallback when the config file has no `dashboardUrl`. Build-time
14
+ * constant so a stripped-down `auden` binary (no config, no flags) still
15
+ * talks to prod.
16
+ */
17
+ export declare const DEFAULT_DASHBOARD_URL = "https://app.auden.to";
18
+ /**
19
+ * Normalize a candidate dashboard URL to its origin (scheme + host + port).
20
+ * Returns '' when the input is empty, whitespace-only, unparseable, or has a
21
+ * non-http(s) protocol. Centralized here so reads, writes, the resolve
22
+ * helper, and the `auden init` flag-validation path all agree on what counts
23
+ * as a valid URL and what gets stripped (paths, queries, fragments, trailing
24
+ * whitespace).
25
+ */
26
+ export declare function normalizeDashboardUrl(value: string): string;
27
+ /**
28
+ * Read the stored API token (persisted by `auden init --token` or the first
29
+ * successful `auden sync --token`). Returns '' if absent or unreadable.
30
+ */
31
+ export declare function readConfigToken(configPath?: string): Promise<string>;
32
+ /**
33
+ * Persist the API token while preserving any other fields already in the
34
+ * config file. Same malformed-config guard as the other writers — refuses to
35
+ * overwrite a broken file. Throws on an empty/whitespace token so callers
36
+ * can't silently wipe a working credential.
37
+ */
38
+ export declare function writeConfigToken(value: string, configPath?: string): Promise<void>;
39
+ /**
40
+ * Read the `discoverGlobal` flag. When true, `auden rules import` extends its
41
+ * default scan to `~/.claude/CLAUDE.md`. Defaults to false on missing or
42
+ * malformed config.
43
+ */
44
+ export declare function readConfigDiscoverGlobal(configPath?: string): Promise<boolean>;
45
+ /**
46
+ * Persist `discoverGlobal` while preserving any other fields already in the
47
+ * config file. Creates the parent directory if needed.
48
+ *
49
+ * Throws when the existing config file is present but malformed, rather than
50
+ * silently overwriting it — callers must surface the error so the user can
51
+ * fix or remove the file before retrying.
52
+ */
53
+ export declare function writeConfigDiscoverGlobal(value: boolean, configPath?: string): Promise<void>;
54
+ /**
55
+ * Read the MCP bundle allowlist. When set to a non-empty array of slugs,
56
+ * `auden mcp` only exposes those bundles; when absent, empty, or malformed it
57
+ * returns `null`, meaning "no restriction" (all of the caller's bundles are
58
+ * reachable). A `--bundles` flag overrides this per invocation.
59
+ */
60
+ export declare function readConfigMcpBundles(configPath?: string): Promise<string[] | null>;
61
+ /**
62
+ * Read whether `auden mcp` may perform writes (push/update/archive). Defaults
63
+ * to `true` — writes are enabled unless the config explicitly sets
64
+ * `mcp.write: false` or the caller passes `--read-only`. Returns `true` on a
65
+ * missing or malformed config so a fresh install is fully functional.
66
+ */
67
+ export declare function readConfigMcpWrite(configPath?: string): Promise<boolean>;
68
+ /**
69
+ * Read the configured dashboard base URL. Returns '' when absent, malformed,
70
+ * not a string, or not a valid http(s) URL. Always normalized to origin so
71
+ * callers can concatenate `${url}/api/...` without thinking about paths,
72
+ * trailing slashes, or stray whitespace from hand-edited configs.
73
+ */
74
+ export declare function readConfigDashboardUrl(configPath?: string): Promise<string>;
75
+ /**
76
+ * Persist the dashboard URL. Same malformed-config guard as
77
+ * writeConfigDiscoverGlobal — refuses to overwrite a broken file. Throws
78
+ * when the value isn't a valid http(s) URL so callers can't silently store
79
+ * garbage that fails later at fetch time.
80
+ */
81
+ export declare function writeConfigDashboardUrl(value: string, configPath?: string): Promise<void>;
82
+ /**
83
+ * Resolve which dashboard URL a command should hit. Precedence:
84
+ * 1. Explicit `--dashboard-url` flag (`flag` arg, when non-empty and valid)
85
+ * 2. `dashboardUrl` field in ~/.auden/config.json
86
+ * 3. DEFAULT_DASHBOARD_URL baked into the build
87
+ *
88
+ * Throws when the flag was supplied but isn't a valid http(s) URL — silent
89
+ * fallback would let `auden sync --dashboard-url htps://typo` hit prod
90
+ * instead of the intended override. Matches `auden init`'s strictness.
91
+ *
92
+ * The result is always a bare origin (no path, no trailing slash) so
93
+ * `${resolved}/api/sync` works.
94
+ */
95
+ export declare function resolveDashboardUrl(flag?: string, configPath?: string): Promise<string>;
96
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,yEAAyE;AACzE,eAAO,MAAM,cAAc,MAAQ,CAAA;AACnC,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,MAAQ,CAAA;AAEtC;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AA0BD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,yBAAyB,CAAA;AAE3D;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D;AA2CD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,UAAU,SAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,UAAU,SAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,SAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,OAAO,EACd,UAAU,SAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,SAAe,GACxB,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAa1B;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,SAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAKpF;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,UAAU,SAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAKvF;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,UAAU,SAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,SAAK,EACT,UAAU,SAAe,GACxB,OAAO,CAAC,MAAM,CAAC,CAWjB"}