@knpkv/jira-clockify 1.3.0 → 1.4.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 (242) hide show
  1. package/README.md +245 -1
  2. package/dist/package.json +36 -12
  3. package/dist/src/agent/agentSettings.d.ts +18 -0
  4. package/dist/src/agent/agentSettings.d.ts.map +1 -0
  5. package/dist/src/agent/agentSettings.js +23 -0
  6. package/dist/src/agent/agentSettings.js.map +1 -0
  7. package/dist/src/agent/schedule.d.ts +20 -0
  8. package/dist/src/agent/schedule.d.ts.map +1 -0
  9. package/dist/src/agent/schedule.js +189 -0
  10. package/dist/src/agent/schedule.js.map +1 -0
  11. package/dist/src/agent/sessions.d.ts +427 -0
  12. package/dist/src/agent/sessions.d.ts.map +1 -0
  13. package/dist/src/agent/sessions.js +868 -0
  14. package/dist/src/agent/sessions.js.map +1 -0
  15. package/dist/src/agent/sourceConsumption.d.ts +79 -0
  16. package/dist/src/agent/sourceConsumption.d.ts.map +1 -0
  17. package/dist/src/agent/sourceConsumption.js +191 -0
  18. package/dist/src/agent/sourceConsumption.js.map +1 -0
  19. package/dist/src/agent/watch.d.ts +76 -0
  20. package/dist/src/agent/watch.d.ts.map +1 -0
  21. package/dist/src/agent/watch.js +45 -0
  22. package/dist/src/agent/watch.js.map +1 -0
  23. package/dist/src/agent/writePlanning.d.ts +154 -0
  24. package/dist/src/agent/writePlanning.d.ts.map +1 -0
  25. package/dist/src/agent/writePlanning.js +210 -0
  26. package/dist/src/agent/writePlanning.js.map +1 -0
  27. package/dist/src/bin.d.ts +3 -0
  28. package/dist/src/bin.d.ts.map +1 -0
  29. package/dist/src/bin.js +9 -3
  30. package/dist/src/bin.js.map +1 -1
  31. package/dist/src/cli/agentWrite.d.ts +164 -0
  32. package/dist/src/cli/agentWrite.d.ts.map +1 -0
  33. package/dist/src/cli/agentWrite.js +362 -0
  34. package/dist/src/cli/agentWrite.js.map +1 -0
  35. package/dist/src/cli/auth.d.ts +8 -0
  36. package/dist/src/cli/auth.d.ts.map +1 -0
  37. package/dist/src/cli/auth.js +10 -10
  38. package/dist/src/cli/auth.js.map +1 -1
  39. package/dist/src/cli/calendar.d.ts +42 -0
  40. package/dist/src/cli/calendar.d.ts.map +1 -0
  41. package/dist/src/cli/calendar.js +189 -0
  42. package/dist/src/cli/calendar.js.map +1 -0
  43. package/dist/src/cli/config.d.ts +12 -0
  44. package/dist/src/cli/config.d.ts.map +1 -0
  45. package/dist/src/cli/config.js +163 -21
  46. package/dist/src/cli/config.js.map +1 -1
  47. package/dist/src/cli/fetchTicket.d.ts +51 -0
  48. package/dist/src/cli/fetchTicket.d.ts.map +1 -0
  49. package/dist/src/cli/fetchTicket.js +18 -2
  50. package/dist/src/cli/fetchTicket.js.map +1 -1
  51. package/dist/src/cli/fuzzySelect.d.ts +24 -0
  52. package/dist/src/cli/fuzzySelect.d.ts.map +1 -0
  53. package/dist/src/cli/layers.d.ts +40 -0
  54. package/dist/src/cli/layers.d.ts.map +1 -0
  55. package/dist/src/cli/layers.js +56 -12
  56. package/dist/src/cli/layers.js.map +1 -1
  57. package/dist/src/cli/list.d.ts +8 -0
  58. package/dist/src/cli/list.d.ts.map +1 -0
  59. package/dist/src/cli/list.js +2 -2
  60. package/dist/src/cli/list.js.map +1 -1
  61. package/dist/src/cli/reconcile.d.ts +129 -0
  62. package/dist/src/cli/reconcile.d.ts.map +1 -0
  63. package/dist/src/cli/reconcile.js +635 -46
  64. package/dist/src/cli/reconcile.js.map +1 -1
  65. package/dist/src/cli/root.d.ts +15 -0
  66. package/dist/src/cli/root.d.ts.map +1 -0
  67. package/dist/src/cli/root.js +4 -3
  68. package/dist/src/cli/root.js.map +1 -1
  69. package/dist/src/cli/runtimeFailure.d.ts +10 -0
  70. package/dist/src/cli/runtimeFailure.d.ts.map +1 -0
  71. package/dist/src/cli/runtimeFailure.js +17 -0
  72. package/dist/src/cli/runtimeFailure.js.map +1 -0
  73. package/dist/src/cli/setup.d.ts +10 -0
  74. package/dist/src/cli/setup.d.ts.map +1 -0
  75. package/dist/src/cli/setup.js +7 -7
  76. package/dist/src/cli/setup.js.map +1 -1
  77. package/dist/src/cli/timer/discard.d.ts +4 -0
  78. package/dist/src/cli/timer/discard.d.ts.map +1 -0
  79. package/dist/src/cli/timer/discard.js +2 -2
  80. package/dist/src/cli/timer/discard.js.map +1 -1
  81. package/dist/src/cli/timer/edit.d.ts +22 -0
  82. package/dist/src/cli/timer/edit.d.ts.map +1 -0
  83. package/dist/src/cli/timer/edit.js +62 -42
  84. package/dist/src/cli/timer/edit.js.map +1 -1
  85. package/dist/src/cli/timer/index.d.ts +12 -0
  86. package/dist/src/cli/timer/index.d.ts.map +1 -0
  87. package/dist/src/cli/timer/log.d.ts +16 -0
  88. package/dist/src/cli/timer/log.d.ts.map +1 -0
  89. package/dist/src/cli/timer/log.js +6 -6
  90. package/dist/src/cli/timer/log.js.map +1 -1
  91. package/dist/src/cli/timer/start.d.ts +21 -0
  92. package/dist/src/cli/timer/start.d.ts.map +1 -0
  93. package/dist/src/cli/timer/start.js +9 -9
  94. package/dist/src/cli/timer/start.js.map +1 -1
  95. package/dist/src/cli/timer/status.d.ts +22 -0
  96. package/dist/src/cli/timer/status.d.ts.map +1 -0
  97. package/dist/src/cli/timer/status.js +3 -3
  98. package/dist/src/cli/timer/status.js.map +1 -1
  99. package/dist/src/cli/timer/stop.d.ts +48 -0
  100. package/dist/src/cli/timer/stop.d.ts.map +1 -0
  101. package/dist/src/cli/timer/stop.js +19 -19
  102. package/dist/src/cli/timer/stop.js.map +1 -1
  103. package/dist/src/cli/timer.d.ts +11 -0
  104. package/dist/src/cli/timer.d.ts.map +1 -0
  105. package/dist/src/cli/timer.js +1 -1
  106. package/dist/src/cli/timer.js.map +1 -1
  107. package/dist/src/cli/watch.d.ts +54 -0
  108. package/dist/src/cli/watch.d.ts.map +1 -0
  109. package/dist/src/cli/watch.js +412 -0
  110. package/dist/src/cli/watch.js.map +1 -0
  111. package/dist/src/cli/watchLease.d.ts +99 -0
  112. package/dist/src/cli/watchLease.d.ts.map +1 -0
  113. package/dist/src/cli/watchLease.js +204 -0
  114. package/dist/src/cli/watchLease.js.map +1 -0
  115. package/dist/src/cli/writerGuard.d.ts +37 -0
  116. package/dist/src/cli/writerGuard.d.ts.map +1 -0
  117. package/dist/src/cli/writerGuard.js +92 -0
  118. package/dist/src/cli/writerGuard.js.map +1 -0
  119. package/dist/src/index.d.ts +46 -0
  120. package/dist/src/index.d.ts.map +1 -0
  121. package/dist/src/index.js +46 -0
  122. package/dist/src/index.js.map +1 -0
  123. package/dist/src/main.d.ts +4 -0
  124. package/dist/src/main.d.ts.map +1 -0
  125. package/dist/src/services/AgentSessionReader.d.ts +121 -0
  126. package/dist/src/services/AgentSessionReader.d.ts.map +1 -0
  127. package/dist/src/services/AgentSessionReader.js +392 -0
  128. package/dist/src/services/AgentSessionReader.js.map +1 -0
  129. package/dist/src/services/ClockifyAuth.d.ts +47 -0
  130. package/dist/src/services/ClockifyAuth.d.ts.map +1 -0
  131. package/dist/src/services/ClockifyAuth.js +2 -2
  132. package/dist/src/services/ClockifyAuth.js.map +1 -1
  133. package/dist/src/services/CodexTranscript.d.ts +112 -0
  134. package/dist/src/services/CodexTranscript.d.ts.map +1 -0
  135. package/dist/src/services/CodexTranscript.js +96 -0
  136. package/dist/src/services/CodexTranscript.js.map +1 -0
  137. package/dist/src/services/ConfigService.d.ts +99 -0
  138. package/dist/src/services/ConfigService.d.ts.map +1 -0
  139. package/dist/src/services/ConfigService.js +79 -7
  140. package/dist/src/services/ConfigService.js.map +1 -1
  141. package/dist/src/services/HomeDirectory.d.ts +17 -0
  142. package/dist/src/services/HomeDirectory.d.ts.map +1 -0
  143. package/dist/src/services/HomeDirectory.js +1 -1
  144. package/dist/src/services/IssueFacts.d.ts +127 -0
  145. package/dist/src/services/IssueFacts.d.ts.map +1 -0
  146. package/dist/src/services/IssueFacts.js +277 -0
  147. package/dist/src/services/IssueFacts.js.map +1 -0
  148. package/dist/src/services/ProviderDeletion.d.ts +19 -0
  149. package/dist/src/services/ProviderDeletion.d.ts.map +1 -0
  150. package/dist/src/services/ProviderDeletion.js +37 -0
  151. package/dist/src/services/ProviderDeletion.js.map +1 -0
  152. package/dist/src/services/ReconcileService.d.ts +378 -0
  153. package/dist/src/services/ReconcileService.d.ts.map +1 -0
  154. package/dist/src/services/ReconcileService.js +1270 -79
  155. package/dist/src/services/ReconcileService.js.map +1 -1
  156. package/dist/src/services/SavedEntries.d.ts +40 -0
  157. package/dist/src/services/SavedEntries.d.ts.map +1 -0
  158. package/dist/src/services/SavedEntries.js +209 -0
  159. package/dist/src/services/SavedEntries.js.map +1 -0
  160. package/dist/src/services/SessionAttributor.d.ts +114 -0
  161. package/dist/src/services/SessionAttributor.d.ts.map +1 -0
  162. package/dist/src/services/SessionAttributor.js +240 -0
  163. package/dist/src/services/SessionAttributor.js.map +1 -0
  164. package/dist/src/services/SourceLedger.d.ts +104 -0
  165. package/dist/src/services/SourceLedger.d.ts.map +1 -0
  166. package/dist/src/services/SourceLedger.js +302 -0
  167. package/dist/src/services/SourceLedger.js.map +1 -0
  168. package/dist/src/services/StateWriter.d.ts +39 -0
  169. package/dist/src/services/StateWriter.d.ts.map +1 -0
  170. package/dist/src/services/TicketService.d.ts +63 -0
  171. package/dist/src/services/TicketService.d.ts.map +1 -0
  172. package/dist/src/services/TimerService.d.ts +145 -0
  173. package/dist/src/services/TimerService.d.ts.map +1 -0
  174. package/dist/src/services/TimerService.js +113 -80
  175. package/dist/src/services/TimerService.js.map +1 -1
  176. package/dist/src/services/internal/JiraWorklogPost.d.ts +7 -0
  177. package/dist/src/services/internal/JiraWorklogPost.d.ts.map +1 -0
  178. package/dist/src/services/internal/JiraWorklogPost.js +32 -0
  179. package/dist/src/services/internal/JiraWorklogPost.js.map +1 -0
  180. package/dist/src/testing/fakeHeadless.d.ts +318 -0
  181. package/dist/src/testing/fakeHeadless.d.ts.map +1 -0
  182. package/dist/src/testing/fakeHeadless.js +1149 -0
  183. package/dist/src/testing/fakeHeadless.js.map +1 -0
  184. package/dist/src/tui/App.d.ts +6 -0
  185. package/dist/src/tui/App.d.ts.map +1 -0
  186. package/dist/src/tui/App.js +1 -1
  187. package/dist/src/tui/App.js.map +1 -1
  188. package/dist/src/tui/atoms/runtime.d.ts +8 -0
  189. package/dist/src/tui/atoms/runtime.d.ts.map +1 -0
  190. package/dist/src/tui/atoms/runtime.js +1 -1
  191. package/dist/src/tui/atoms/runtime.js.map +1 -1
  192. package/dist/src/tui/atoms/tickets.d.ts +3 -0
  193. package/dist/src/tui/atoms/tickets.d.ts.map +1 -0
  194. package/dist/src/tui/atoms/timer.d.ts +11 -0
  195. package/dist/src/tui/atoms/timer.d.ts.map +1 -0
  196. package/dist/src/tui/atoms/timer.js +1 -1
  197. package/dist/src/tui/atoms/timer.js.map +1 -1
  198. package/dist/src/tui/atoms/ui.d.ts +11 -0
  199. package/dist/src/tui/atoms/ui.d.ts.map +1 -0
  200. package/dist/src/tui/atoms/ui.js +1 -1
  201. package/dist/src/tui/atoms/ui.js.map +1 -1
  202. package/dist/src/tui/components/BigTimer.d.ts +2 -0
  203. package/dist/src/tui/components/BigTimer.d.ts.map +1 -0
  204. package/dist/src/tui/components/Footer.d.ts +2 -0
  205. package/dist/src/tui/components/Footer.d.ts.map +1 -0
  206. package/dist/src/tui/components/Header.d.ts +2 -0
  207. package/dist/src/tui/components/Header.d.ts.map +1 -0
  208. package/dist/src/tui/components/Header.js +1 -1
  209. package/dist/src/tui/components/Header.js.map +1 -1
  210. package/dist/src/tui/components/PopupInput.d.ts +18 -0
  211. package/dist/src/tui/components/PopupInput.d.ts.map +1 -0
  212. package/dist/src/tui/components/PopupMessage.d.ts +20 -0
  213. package/dist/src/tui/components/PopupMessage.d.ts.map +1 -0
  214. package/dist/src/tui/components/TicketList.d.ts +2 -0
  215. package/dist/src/tui/components/TicketList.d.ts.map +1 -0
  216. package/dist/src/tui/components/TicketList.js +1 -1
  217. package/dist/src/tui/components/TicketList.js.map +1 -1
  218. package/dist/src/tui/components/TicketRow.d.ts +8 -0
  219. package/dist/src/tui/components/TicketRow.d.ts.map +1 -0
  220. package/dist/src/tui/components/TimerDisplay.d.ts +2 -0
  221. package/dist/src/tui/components/TimerDisplay.d.ts.map +1 -0
  222. package/dist/src/tui/components/index.d.ts +12 -0
  223. package/dist/src/tui/components/index.d.ts.map +1 -0
  224. package/dist/src/tui/context/theme.d.ts +15 -0
  225. package/dist/src/tui/context/theme.d.ts.map +1 -0
  226. package/dist/src/tui/hooks/useElapsedTimer.d.ts +6 -0
  227. package/dist/src/tui/hooks/useElapsedTimer.d.ts.map +1 -0
  228. package/dist/src/tui/hooks/useElapsedTimer.js +1 -1
  229. package/dist/src/tui/hooks/useElapsedTimer.js.map +1 -1
  230. package/dist/src/tui/hooks/useTerminalSize.d.ts +5 -0
  231. package/dist/src/tui/hooks/useTerminalSize.d.ts.map +1 -0
  232. package/dist/src/utils/hints.d.ts +12 -0
  233. package/dist/src/utils/hints.d.ts.map +1 -0
  234. package/dist/src/utils/hints.js +12 -0
  235. package/dist/src/utils/hints.js.map +1 -0
  236. package/dist/src/utils/time.d.ts +104 -0
  237. package/dist/src/utils/time.d.ts.map +1 -0
  238. package/dist/src/utils/time.js +74 -8
  239. package/dist/src/utils/time.js.map +1 -1
  240. package/dist/tsconfig.tsbuildinfo +1 -1
  241. package/package.json +36 -18
  242. package/skills/jcf/SKILL.md +93 -1
@@ -0,0 +1,318 @@
1
+ import type { ClockifyApiClientContract } from "@knpkv/clockify-api-client";
2
+ import { ClockifyApiClient } from "@knpkv/clockify-api-client";
3
+ import { JiraApiClient } from "@knpkv/jira-api-client";
4
+ import { JiraAuth } from "@knpkv/jira-cli/JiraAuth";
5
+ import * as Effect from "effect/Effect";
6
+ import * as FileSystem from "effect/FileSystem";
7
+ import { HttpClient } from "effect/http";
8
+ import * as Layer from "effect/Layer";
9
+ import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
10
+ import * as Schema from "effect/Schema";
11
+ import * as Stdio from "effect/Stdio";
12
+ import * as Terminal from "effect/Terminal";
13
+ import { ClockifyAuth } from "../services/ClockifyAuth.js";
14
+ import { ConfigService, type JcfConfig } from "../services/ConfigService.js";
15
+ import { HomeDirectory } from "../services/HomeDirectory.js";
16
+ import { type AttributionChoice, SessionAttributor } from "../services/SessionAttributor.js";
17
+ import { StateWriter } from "../services/StateWriter.js";
18
+ export declare const FAKE_HOME = "/fake-home";
19
+ export declare const FAKE_WORKSPACE_ID = "ws-fake";
20
+ export declare const FAKE_USER_ID = "user-fake";
21
+ /** A Clockify write the command performed. */
22
+ export interface CreatedClockifyEntry {
23
+ readonly description: string;
24
+ readonly start: string;
25
+ readonly end: string | undefined;
26
+ /** What the command asked Clockify to bill. `undefined` means it left the choice to Clockify. */
27
+ readonly billable: boolean | undefined;
28
+ }
29
+ /** The worklog fields the fake reads back off a POST body. */
30
+ declare const WorklogPayload: Schema.Struct<{
31
+ readonly started: Schema.optional<Schema.String>;
32
+ readonly timeSpentSeconds: Schema.optional<Schema.Finite>;
33
+ readonly comment: Schema.optionalKey<Schema.Codec<Schema.Json, Schema.Json, never, never>>;
34
+ }>;
35
+ type WorklogPayload = typeof WorklogPayload.Type;
36
+ /** A Jira worklog the command posted. */
37
+ export interface PostedJiraWorklog {
38
+ readonly issueKey: string;
39
+ readonly started: string;
40
+ readonly timeSpentSeconds: number;
41
+ /** The worklog comment as plain text, flattened out of Jira's document format. */
42
+ readonly comment: string;
43
+ }
44
+ /** Everything a test can observe after running a command. */
45
+ export interface FakeWorld {
46
+ readonly createdClockifyEntries: Array<CreatedClockifyEntry>;
47
+ readonly clockifyRequests: Array<{
48
+ readonly method: string;
49
+ readonly url: string;
50
+ }>;
51
+ readonly jiraWorklogs: Array<PostedJiraWorklog>;
52
+ readonly updatedClockifyEntries: Array<{
53
+ readonly id: string;
54
+ readonly payload: Parameters<ClockifyApiClientContract["updateTimeEntry"]>[2];
55
+ }>;
56
+ readonly updatedJiraWorklogs: Array<{
57
+ readonly id: string;
58
+ readonly issueKey: string;
59
+ readonly payload: WorklogPayload;
60
+ readonly adjustEstimate: string | undefined;
61
+ }>;
62
+ readonly attributorRequests: Array<{
63
+ readonly candidateKeys: ReadonlyArray<string>;
64
+ readonly digest: string;
65
+ }>;
66
+ /** One entry per Coding Agent *call*, holding the session ids that call covered. */
67
+ readonly attributorBatches: Array<ReadonlyArray<string>>;
68
+ /** Every work item a note was asked for, and the material it was asked from. */
69
+ readonly describeRequests: Array<{
70
+ readonly ticketKey: string | null;
71
+ readonly summary: string | null;
72
+ readonly digest: string;
73
+ }>;
74
+ /** One entry per description call, listing the Issue Keys it covered. */
75
+ readonly describeBatches: Array<ReadonlyArray<string | null>>;
76
+ /** High-water mark of overlapping attributor calls. 1 means they ran one after another. */
77
+ maxAttributorInFlight: number;
78
+ readonly stdout: Array<string>;
79
+ readonly stderr: Array<string>;
80
+ /** Raw terminal writes, including ANSI. Prompt wording is asserted with `toContain`. */
81
+ readonly prompts: Array<string>;
82
+ /**
83
+ * The transcripts on disk, keyed `"<project-dir>/<file>.jsonl"`, live rather than snapshotted.
84
+ * Append to it mid-run to model a session that is still being worked in.
85
+ */
86
+ readonly transcripts: Record<string, string>;
87
+ /** Every transcript path actually opened, so "never even read" is assertable rather than implied. */
88
+ readonly transcriptReads: Array<string>;
89
+ /** Files the command wrote, by path — the watch lease among them. */
90
+ readonly writtenFiles: Record<string, string>;
91
+ /** Mutable synthetic auth file, independent of the startup client. */
92
+ clockifyAuth: {
93
+ baseUrl: string;
94
+ workspaceId: string;
95
+ userId: string;
96
+ apiKey: string;
97
+ };
98
+ /** Mutable synthetic Jira profile used by the live per-request credential resolver. */
99
+ jiraAuth: {
100
+ accessToken: string;
101
+ accountId: string;
102
+ cloudId: string;
103
+ siteUrl: string;
104
+ };
105
+ /** Jira requests after credential resolution, retained without authorization headers. */
106
+ readonly jiraRequests: Array<{
107
+ readonly method: string;
108
+ readonly url: string;
109
+ }>;
110
+ clockifyVerifiedUserId: string;
111
+ clockifyUserReadFailuresRemaining: number;
112
+ clockifyEntryReadFailuresRemaining: number;
113
+ clockifyEntriesReadFailuresRemaining: number;
114
+ /** Whether Jira accepts worklogs. Flip it mid-test to model logging back in between two runs. */
115
+ jiraLoggedIn: boolean;
116
+ /** Running Clockify timer. Flip it mid-test to model one starting after a retained read. */
117
+ runningTimer: ExistingClockifyEntry | null;
118
+ /** Provider reads to fail before returning to normal; tests set this at synchronization hooks. */
119
+ jiraLoginStateReadFailuresRemaining: number;
120
+ jiraCurrentUserReadFailuresRemaining: number;
121
+ jiraWorklogReadFailuresRemaining: number;
122
+ jiraSearchFailuresRemaining: number;
123
+ /** Issues omitted from JQL search while direct worklog reads remain authoritative. */
124
+ readonly jiraSearchHiddenIssues: Set<string>;
125
+ /** Replace visible Clockify fixtures between synchronized phases of one command. */
126
+ readonly setClockifyEntries: (entries: ReadonlyArray<ExistingClockifyEntry>) => void;
127
+ /** Replace visible Jira fixtures between synchronized phases of one command. */
128
+ readonly setJiraWorklogs: (entries: Readonly<Record<string, ReadonlyArray<ExistingJiraWorklog>>>) => void;
129
+ }
130
+ /** An existing Clockify entry, in the shape a test wants to write it. */
131
+ export interface ExistingClockifyEntry {
132
+ readonly id?: string;
133
+ readonly userId?: string;
134
+ readonly billable?: boolean;
135
+ readonly projectId?: string | null;
136
+ readonly taskId?: string | null;
137
+ readonly tagIds?: ReadonlyArray<string> | null;
138
+ readonly description: string;
139
+ readonly start: string;
140
+ /** Omit to model a *running* entry — the case whose time is invisible to the tally. */
141
+ readonly end?: string | undefined;
142
+ }
143
+ /** An existing Jira worklog, keyed by issue in {@link FakeHeadlessOptions.jiraWorklogs}. */
144
+ export interface ExistingJiraWorklog {
145
+ readonly id?: string;
146
+ readonly author?: {
147
+ readonly accountId: string;
148
+ };
149
+ readonly created?: string;
150
+ readonly comment?: Schema.Json;
151
+ readonly visibility?: {
152
+ readonly type: "group" | "role";
153
+ readonly value: string;
154
+ };
155
+ readonly started: string;
156
+ readonly timeSpentSeconds: number;
157
+ }
158
+ export interface FakeHeadlessOptions {
159
+ /** Private file snapshot carried into a fresh fake process for restart tests. */
160
+ readonly writtenFiles?: Readonly<Record<string, string>> | undefined;
161
+ readonly clockifyAuth?: Partial<FakeWorld["clockifyAuth"]> | undefined;
162
+ readonly clockifyVerifiedUserId?: string | undefined;
163
+ readonly clockifyUserReadFails?: boolean | undefined;
164
+ readonly config?: Partial<JcfConfig> | undefined;
165
+ /** Let concurrent HTTP fixtures observe the same config snapshot before either saves. */
166
+ readonly delayConfigReads?: boolean | undefined;
167
+ /** Synthetic Linux namespace for crash-recovery tests; absent keeps the fake fail-closed. */
168
+ readonly pidNamespaceInode?: number | undefined;
169
+ /**
170
+ * Transcripts to serve from `~/.claude/projects`, keyed `"<project-dir>/<file>.jsonl"`.
171
+ */
172
+ readonly transcripts?: Readonly<Record<string, string>> | undefined;
173
+ readonly clockifyEntries?: ReadonlyArray<ExistingClockifyEntry> | undefined;
174
+ /** Keep exact Clockify entries readable while omitting them from period-list responses. */
175
+ readonly clockifyListHiddenIds?: ReadonlyArray<string> | undefined;
176
+ readonly clockifyProjects?: ReadonlyArray<{
177
+ readonly id: string;
178
+ readonly name: string;
179
+ readonly workspaceId: string;
180
+ readonly archived: boolean;
181
+ readonly billable: boolean;
182
+ readonly color: string;
183
+ }> | undefined;
184
+ readonly clockifyTags?: ReadonlyArray<{
185
+ readonly id: string;
186
+ readonly name: string;
187
+ readonly workspaceId: string;
188
+ readonly archived: boolean;
189
+ }> | undefined;
190
+ readonly jiraWorklogs?: Readonly<Record<string, ReadonlyArray<ExistingJiraWorklog>>> | undefined;
191
+ /** Keep exact Jira worklogs readable while omitting their issues from search-driven period reads. */
192
+ readonly jiraSearchHiddenIssues?: ReadonlyArray<string> | undefined;
193
+ /** Separate provider data by synthetic Jira cloud so profile-switch races are observable. */
194
+ readonly jiraWorklogsByCloudId?: Readonly<Record<string, Readonly<Record<string, ReadonlyArray<ExistingJiraWorklog>>>>> | undefined;
195
+ /** The Coding Agent's answer, or a failure to model one being unavailable. */
196
+ readonly attributor?: ((request: {
197
+ readonly candidateKeys: ReadonlyArray<string>;
198
+ }) => AttributionChoice | "fail") | undefined;
199
+ /**
200
+ * The note a Coding Agent returns for a work item. Omit for "the prompts do not say", which is
201
+ * what a real session with nothing quotable produces.
202
+ */
203
+ readonly describer?: ((request: {
204
+ readonly ticketKey: string | null;
205
+ readonly digest: string;
206
+ }) => string | null | "fail") | undefined;
207
+ /** Test synchronization hook immediately before a description batch is answered. */
208
+ readonly beforeDescribe?: ((world: FakeWorld) => void) | undefined;
209
+ /** Test synchronization hook after a prompt is shown but before its scripted input is read. */
210
+ readonly beforePromptInput?: ((world: FakeWorld) => void) | undefined;
211
+ /** Per-prompt key scripts for command tests with several interactive steps. */
212
+ readonly promptInputs?: ReadonlyArray<ReadonlyArray<"up" | "down" | "space" | "enter">> | undefined;
213
+ /** Test synchronization after a command prints its final pre-write summary. */
214
+ readonly afterConsoleLog?: ((line: string, world: FakeWorld) => void) | undefined;
215
+ /**
216
+ * Which proposal rows to leave checked in the picker, by position. Every row starts checked, so
217
+ * `[true, false]` unchecks the second. Omit entirely to send no input — the no-TTY case.
218
+ */
219
+ readonly keep?: ReadonlyArray<boolean> | undefined;
220
+ /** A Clockify timer already running when the command starts. */
221
+ readonly runningTimer?: {
222
+ readonly description: string;
223
+ readonly start: string;
224
+ } | undefined;
225
+ /** Whether Jira accepts worklog posts. */
226
+ readonly jiraLoggedIn?: boolean | undefined;
227
+ /** A successful create response without its optional provider ID. */
228
+ readonly jiraPostOmitsId?: boolean | undefined;
229
+ /** Exact synthetic Jira POST/readback identity; omitted to retain the legacy fake ID sequence. */
230
+ readonly jiraPostedWorklog?: {
231
+ readonly id: string;
232
+ readonly accountId: string;
233
+ readonly created?: string | undefined;
234
+ } | undefined;
235
+ /** Existing worklogs whose provider read omits its optional identity field. */
236
+ readonly jiraReadOmitsId?: boolean | undefined;
237
+ /** Override an exact Jira worklog response identity without changing the requested fixture. */
238
+ readonly jiraExactWorklogReturnedId?: string | undefined;
239
+ /** Production-shaped failures at the exact Jira worklog read boundary. */
240
+ readonly jiraExactWorklogReadFault?: "malformed-404" | "body-failure-404" | "permission-404" | "disabled-404" | "null-404" | "empty-404" | "401" | "403" | "500" | undefined;
241
+ /** Production-shaped failures at the exact Clockify time-entry read boundary. */
242
+ readonly clockifyExactEntryReadFault?: "malformed-404" | "body-failure-404" | "401" | "403" | "500" | undefined;
243
+ readonly jiraCloudId?: string | undefined;
244
+ /** Synthetic OAuth credential, readable through a getter to switch it at a reservation boundary. */
245
+ readonly jiraAccessToken?: string | undefined;
246
+ /** Test synchronization immediately before the generated client resolves a live Jira credential. */
247
+ readonly beforeJiraAuthResolution?: ((world: FakeWorld) => void) | undefined;
248
+ /** Test synchronization after one complete Clockify entry page has been captured. */
249
+ readonly afterClockifyEntriesRead?: ((page: number, world: FakeWorld) => void) | undefined;
250
+ /** Test synchronization after one complete Jira worklog page has been captured. */
251
+ readonly afterJiraWorklogsRead?: ((issueKey: string, startAt: number, world: FakeWorld) => void) | undefined;
252
+ /** Omit the account cached in Jira auth while provider reads remain available. */
253
+ readonly jiraCachedUserMissing?: boolean | undefined;
254
+ /** Make Jira's current-user endpoint fail while the stored auth session remains present. */
255
+ readonly jiraCurrentUserFails?: boolean | undefined;
256
+ /** Make every worklog *read* fail, to model a transient Jira outage mid-run. */
257
+ readonly jiraWorklogReadFails?: boolean | undefined;
258
+ /** Search reports a further page but supplies no continuation token. */
259
+ readonly jiraSearchClaimsMoreWithoutToken?: boolean | undefined;
260
+ /** Limit each Jira worklog read page while retaining the provider's total count. */
261
+ readonly jiraWorklogPageSize?: number | undefined;
262
+ /** Return invalid or failed evidence on a later Jira worklog page. */
263
+ readonly jiraWorklogPageFault?: "failure" | "missing" | "inconsistent" | "stalled" | "missing-duration" | "missing-started" | "missing-author" | "missing-id" | "empty-id" | "spaces-id" | "tab-newline-id" | undefined;
264
+ /** Make every Clockify entry creation fail, to model the write half refusing. */
265
+ readonly clockifyWritesFail?: boolean | undefined;
266
+ /** Deterministic test gate immediately before a Clockify create reaches the fake provider. */
267
+ readonly beforeClockifyWrite?: ((world: FakeWorld) => Effect.Effect<void>) | undefined;
268
+ /** Test-only boundary after a remote Clockify create but before its caller records the receipt. */
269
+ readonly afterClockifyWrite?: ((world: FakeWorld) => void) | undefined;
270
+ /** Make the running-timer safety read fail before a timer command can proceed. */
271
+ readonly clockifyRunningTimerReadFails?: boolean | undefined;
272
+ /**
273
+ * Serve existing Clockify entries this many per page, so a caller that reads only the first page
274
+ * demonstrably misses the rest. Unset means one page however many entries there are.
275
+ */
276
+ readonly clockifyPageSize?: number | undefined;
277
+ /** Paths whose writes fail with a permission error — an unwritable config directory. */
278
+ readonly unwritablePaths?: ReadonlyArray<string> | undefined;
279
+ /** Test synchronization after an in-memory file becomes visible but before its write completes. */
280
+ readonly afterFileWrite?: ((path: string) => Effect.Effect<void>) | undefined;
281
+ /** Paths whose file read or directory listing fails. Matched by suffix. */
282
+ readonly unreadableTranscripts?: ReadonlyArray<string> | undefined;
283
+ /** The terminal's width, which is what the picker lays its rows out for. */
284
+ readonly columns?: number | undefined;
285
+ /** Issue summaries Jira will return, keyed by issue key. Unlisted keys 404. */
286
+ readonly issueSummaries?: Readonly<Record<string, string>> | undefined;
287
+ /**
288
+ * Assignees by issue key. A key with a summary but no entry here omits the assignee field.
289
+ *
290
+ * By default a string serves as both the display name and account id. Tests can override the
291
+ * optional display name independently while preserving the account identity.
292
+ */
293
+ readonly issueAssignees?: Readonly<Record<string, string | null>> | undefined;
294
+ /** Override Jira's optional display name independently of its assignee account id. */
295
+ readonly issueAssigneeDisplayNames?: Readonly<Record<string, string | null>> | undefined;
296
+ /** The account this fake Jira is logged in as, for deciding whose tickets are whose. */
297
+ readonly jiraAccountId?: string | undefined;
298
+ }
299
+ /** Whoever the fake is logged in as unless a test says otherwise. */
300
+ export declare const FAKE_ACCOUNT_ID = "acct-me";
301
+ /**
302
+ * Translate "keep these rows" into the keys a multi-select actually receives.
303
+ *
304
+ * The picker's cursor starts on its two meta options (select-all, invert), so choice `i` sits at
305
+ * cursor position `i + 2`. Every row starts checked, so only the rows to *drop* need a `space`.
306
+ */
307
+ export declare const pickerKeys: (keep: ReadonlyArray<boolean>) => ReadonlyArray<Terminal.UserInput>;
308
+ /**
309
+ * Build a fully closed layer with the same services `HeadlessLayer` provides, plus the world the
310
+ * assertions read.
311
+ */
312
+ export declare const makeFakeHeadless: (options?: FakeHeadlessOptions) => {
313
+ layer: Layer.Layer<import("../services/AgentSessionReader.js").AgentSessionReader | ChildProcessSpawner.ChildProcessSpawner | ClockifyApiClient | ClockifyAuth | ConfigService | FileSystem.FileSystem | HomeDirectory | HttpClient.HttpClient | import("../services/IssueFacts.js").IssueFacts | JiraApiClient | JiraAuth | import("effect/Path").Path | import("../services/ReconcileService.js").ReconcileService | import("../services/SavedEntries.js").SavedEntries | SessionAttributor | import("../services/SourceLedger.js").SourceLedger | StateWriter | Stdio.Stdio | Terminal.Terminal | import("../services/TicketService.js").TicketService | import("../services/TimerService.js").TimerService, never, never>;
314
+ sourceLedgerLayer: Layer.Layer<import("../services/SourceLedger.js").SourceLedger, never, never>;
315
+ world: FakeWorld;
316
+ };
317
+ export {};
318
+ //# sourceMappingURL=fakeHeadless.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakeHeadless.d.ts","sourceRoot":"","sources":["../../../src/testing/fakeHeadless.ts"],"names":[],"mappings":"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"}