@knpkv/jira-clockify 1.2.1 → 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 (243) hide show
  1. package/README.md +254 -3
  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 +110 -71
  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/nvim/lua/jcf/state.lua +191 -13
  242. package/package.json +36 -18
  243. package/skills/jcf/SKILL.md +93 -1
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Normalize Codex rollouts into session messages. Only authoritative user events count as
3
+ * presence: response-item copies also contain injected instructions and replayed compacted history.
4
+ * Metadata and turn contexts supply the directory; native subagent rollouts supply no human time.
5
+ */
6
+ import * as Schema from "effect/Schema";
7
+ const TextPart = Schema.Struct({ type: Schema.String, text: Schema.optional(Schema.String) });
8
+ const Message = Schema.Struct({
9
+ type: Schema.Literal("message"),
10
+ role: Schema.Literal("assistant"),
11
+ content: Schema.Array(TextPart)
12
+ });
13
+ const UserEvent = Schema.Union([
14
+ Schema.Struct({ type: Schema.Literal("user_message"), message: Schema.String }),
15
+ Schema.Struct({
16
+ type: Schema.Literal("item_completed"),
17
+ started_at_ms: Schema.optional(Schema.Number),
18
+ item: Schema.Struct({
19
+ type: Schema.Literal("UserMessage"),
20
+ id: Schema.optional(Schema.String),
21
+ content: Schema.Array(TextPart)
22
+ })
23
+ })
24
+ ]);
25
+ const CodexLine = Schema.Union([
26
+ Schema.Struct({
27
+ type: Schema.Literal("session_meta"),
28
+ payload: Schema.Struct({
29
+ id: Schema.String,
30
+ cwd: Schema.String,
31
+ source: Schema.optional(Schema.Json),
32
+ git: Schema.optional(Schema.Struct({ branch: Schema.optional(Schema.String) }))
33
+ })
34
+ }),
35
+ Schema.Struct({
36
+ type: Schema.Literal("turn_context"),
37
+ timestamp: Schema.String,
38
+ payload: Schema.Struct({ cwd: Schema.String })
39
+ }),
40
+ Schema.Struct({ type: Schema.Literal("event_msg"), timestamp: Schema.String, payload: UserEvent }),
41
+ Schema.Struct({ type: Schema.Literal("response_item"), timestamp: Schema.String, payload: Message })
42
+ ]);
43
+ /** Discard tool payloads and malformed lines before retaining a rollout in memory. */
44
+ export const decodeCodexLine = Schema.decodeUnknownOption(Schema.fromJsonString(CodexLine));
45
+ /** The shared transcript segmenter handles time windows, branch changes and directory isolation. */
46
+ export function* codexTranscriptLines(lines) {
47
+ let sessionId = null;
48
+ let cwd = null;
49
+ let gitBranch = null;
50
+ const seen = new Set();
51
+ for (const line of lines) {
52
+ if (line.type === "session_meta") {
53
+ const source = line.payload.source;
54
+ if (source !== undefined && source !== "cli" && source !== "vscode")
55
+ return;
56
+ sessionId = line.payload.id;
57
+ cwd = line.payload.cwd;
58
+ gitBranch = line.payload.git?.branch ?? null;
59
+ continue;
60
+ }
61
+ if (sessionId === null || cwd === null)
62
+ continue;
63
+ if (line.type === "turn_context") {
64
+ // A branch recorded for the old directory cannot place work in the new one.
65
+ if (cwd !== line.payload.cwd)
66
+ gitBranch = null;
67
+ cwd = line.payload.cwd;
68
+ yield { type: "assistant", sessionId, cwd, gitBranch, timestamp: line.timestamp, message: { content: "" } };
69
+ continue;
70
+ }
71
+ if (line.type === "response_item") {
72
+ const content = line.payload.content.filter((part) => part.type === "output_text").map((part) => part.text ?? "")
73
+ .join("\n");
74
+ yield { type: "assistant", sessionId, cwd, gitBranch, timestamp: line.timestamp, message: { content } };
75
+ continue;
76
+ }
77
+ const event = line.payload;
78
+ const content = event.type === "user_message"
79
+ ? event.message
80
+ : event.item.content.filter((part) => part.type === "text").map((part) => part.text ?? "").join("\n");
81
+ const atMs = event.type === "item_completed"
82
+ ? event.started_at_ms ?? Date.parse(line.timestamp)
83
+ : Date.parse(line.timestamp);
84
+ const instant = new Date(atMs);
85
+ if (Number.isNaN(instant.getTime()))
86
+ continue;
87
+ const identity = event.type === "item_completed" && event.item.id !== undefined
88
+ ? event.item.id
89
+ : `${String(atMs)}:${content}`;
90
+ if (seen.has(identity))
91
+ continue;
92
+ seen.add(identity);
93
+ yield { type: "user", sessionId, cwd, gitBranch, timestamp: instant.toISOString(), message: { content } };
94
+ }
95
+ }
96
+ //# sourceMappingURL=CodexTranscript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexTranscript.js","sourceRoot":"","sources":["../../../src/services/CodexTranscript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * User configuration persistence for jcf defaults (JQL, project, billable).
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **File-backed with defaults**: Reads `~/.jcf/config.json`, merging stored values over
7
+ * {@link defaultJcfConfig}. Missing or corrupt files silently fall back to defaults.
8
+ * - **Partial updates**: {@link ConfigServiceContract.set} merges a patch over the current config.
9
+ *
10
+ * @module
11
+ */
12
+ import * as Context from "effect/Context";
13
+ import * as Effect from "effect/Effect";
14
+ import * as FileSystem from "effect/FileSystem";
15
+ import * as Layer from "effect/Layer";
16
+ import * as Path from "effect/Path";
17
+ import { SessionAgentSettings } from "../agent/agentSettings.js";
18
+ import { HomeDirectory } from "./HomeDirectory.js";
19
+ export interface JcfConfig {
20
+ /** Provider, model and effort read afresh for each session attribution or description. */
21
+ readonly sessionAgent: SessionAgentSettings;
22
+ readonly defaultJql: string;
23
+ readonly refreshInterval: number;
24
+ readonly projectMap: Record<string, string>;
25
+ readonly workspaceId: string | null;
26
+ readonly defaultProjectId: string | null;
27
+ readonly defaultProjectName: string | null;
28
+ readonly defaultBillable: boolean;
29
+ /**
30
+ * Session Roots: directory prefixes (`~` allowed) whose Agent Sessions may become Proposed
31
+ * Worklogs. Empty means nothing is opted in, so `reconcile --agent` finds nothing — an
32
+ * allowlist, because a denylist grows with every side project.
33
+ */
34
+ readonly sessionRoots: ReadonlyArray<string>;
35
+ /**
36
+ * Standing Attributions: directory prefix → Issue Key, for recurring work with no natural
37
+ * ticket (release notes, known-issues documents). Matched longest-prefix-first, and always
38
+ * loses to a branch or path signal, so adding one can only ever add attribution.
39
+ */
40
+ readonly sessionTicketMap: Record<string, string>;
41
+ /**
42
+ * Idle Cap in seconds: the longest gap between two Session Activity events still counted as
43
+ * work. 5 minutes is the only setting that produced defensible daily totals over the author's
44
+ * transcripts; 15 gave 6–12h days and 30 gave 11–13h.
45
+ */
46
+ readonly sessionIdleCapSeconds: number;
47
+ /**
48
+ * Below this Coding Agent confidence, an attribution is reported but never offered for
49
+ * confirmation, so "yes" at the confirm prompt stays usually-correct.
50
+ */
51
+ readonly sessionConfidenceFloor: number;
52
+ /**
53
+ * Dwell Floor in seconds: the shortest stretch that may own time on its own.
54
+ *
55
+ * Concurrent sessions interleave their prompts, and read literally that says the work changed
56
+ * ticket every few minutes. It did not. Fifteen minutes is a working granularity; zero turns the
57
+ * rule off and reports the raw interleaving, which is a day of unreadable slivers.
58
+ */
59
+ readonly sessionDwellSeconds: number;
60
+ /**
61
+ * Whether a proposal may name an Issue Key that is not assigned to you.
62
+ *
63
+ * `"assigned"` offers only your own tickets, because a branch cannot tell authoring from
64
+ * reviewing: checking out a colleague's PR puts their key on the branch, and that key then arrives
65
+ * as a proposal for your timesheet. `"any"` offers whatever the signals placed — right for someone
66
+ * who works on tickets assigned to a team rather than a person.
67
+ *
68
+ * Withheld, never dropped: an unowned row is still reported, with its hours, and
69
+ * {@link JcfConfig.sessionOwnershipOverrides} is how one becomes proposable for good.
70
+ */
71
+ readonly sessionOwnership: "assigned" | "any";
72
+ /**
73
+ * Issue Keys to treat as yours whatever Jira says — your work on somebody else's ticket.
74
+ *
75
+ * Per key rather than a switch, because the honest answer to "is this mine?" differs ticket by
76
+ * ticket, and answering it once should not have to be answered again next week.
77
+ */
78
+ readonly sessionOwnershipOverrides: ReadonlyArray<string>;
79
+ }
80
+ /** The values every unset field falls back to, and what `jcf config reset` restores. */
81
+ export declare const defaultJcfConfig: JcfConfig;
82
+ export interface ConfigServiceContract {
83
+ readonly get: Effect.Effect<JcfConfig>;
84
+ readonly set: (patch: Partial<JcfConfig>) => Effect.Effect<void>;
85
+ readonly configDir: Effect.Effect<string>;
86
+ }
87
+ declare const ConfigService_base: Context.ServiceClass<ConfigService, "jcf/ConfigService", ConfigServiceContract>;
88
+ export declare class ConfigService extends ConfigService_base {
89
+ }
90
+ /**
91
+ * The stored fields worth keeping, out of whatever `~/.jcf/config.json` happens to contain.
92
+ *
93
+ * Exported for testing: this is the one place a hand-edited file meets the rest of jcf, and a value
94
+ * that gets through here wrongly is one that changes behaviour with nothing on screen to explain it.
95
+ */
96
+ export declare const parseConfigPatch: (content: string) => Partial<JcfConfig>;
97
+ export declare const layer: Layer.Layer<ConfigService, never, FileSystem.FileSystem | HomeDirectory | Path.Path>;
98
+ export {};
99
+ //# sourceMappingURL=ConfigService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigService.d.ts","sourceRoot":"","sources":["../../../src/services/ConfigService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAGnC,OAAO,EAA+B,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAE7F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,WAAW,SAAS;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAA;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;IACtC;;;OAGG;IACH,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,gBAAgB,EAAE,UAAU,GAAG,KAAK,CAAA;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,yBAAyB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC1D;AAED,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,EAAE,SAgB9B,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACtC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CAC1C;;AAED,qBAAa,aAAc,SAAQ,kBAA4E;CAAG;AAkDlH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,YAAa,MAAM,KAAG,OAAO,CAAC,SAAS,CAqCnE,CAAA;AAED,eAAO,MAAM,KAAK,sFAyCjB,CAAA"}
@@ -4,7 +4,7 @@
4
4
  * **Mental model**
5
5
  *
6
6
  * - **File-backed with defaults**: Reads `~/.jcf/config.json`, merging stored values over
7
- * {@link defaultConfig}. Missing or corrupt files silently fall back to defaults.
7
+ * {@link defaultJcfConfig}. Missing or corrupt files silently fall back to defaults.
8
8
  * - **Partial updates**: {@link ConfigServiceContract.set} merges a patch over the current config.
9
9
  *
10
10
  * @module
@@ -13,22 +13,42 @@ import * as Context from "effect/Context";
13
13
  import * as Effect from "effect/Effect";
14
14
  import * as FileSystem from "effect/FileSystem";
15
15
  import * as Layer from "effect/Layer";
16
+ import * as Option from "effect/Option";
16
17
  import * as Path from "effect/Path";
17
18
  import * as Predicate from "effect/Predicate";
19
+ import * as Schema from "effect/Schema";
20
+ import { defaultSessionAgentSettings, SessionAgentSettings } from "../agent/agentSettings.js";
21
+ import { isTicketKey } from "../agent/sessions.js";
18
22
  import { HomeDirectory } from "./HomeDirectory.js";
19
- const defaultConfig = {
23
+ /** The values every unset field falls back to, and what `jcf config reset` restores. */
24
+ export const defaultJcfConfig = {
25
+ sessionAgent: defaultSessionAgentSettings,
20
26
  defaultJql: "assignee = currentUser() AND status != Done ORDER BY updated DESC",
21
27
  refreshInterval: 30,
22
28
  projectMap: {},
23
29
  workspaceId: null,
24
30
  defaultProjectId: null,
25
31
  defaultProjectName: null,
26
- defaultBillable: true
32
+ defaultBillable: true,
33
+ sessionRoots: [],
34
+ sessionTicketMap: {},
35
+ sessionIdleCapSeconds: 300,
36
+ sessionConfidenceFloor: 0.7,
37
+ sessionDwellSeconds: 900,
38
+ sessionOwnership: "assigned",
39
+ sessionOwnershipOverrides: []
27
40
  };
28
41
  export class ConfigService extends Context.Service()("jcf/ConfigService") {
29
42
  }
30
43
  const CONFIG_DIR = ".jcf";
31
44
  const CONFIG_FILE = "config.json";
45
+ /** A directory-prefix → Issue Key map, keeping only the entries whose value is a real Issue Key. */
46
+ const ticketMap = (value) => {
47
+ const record = stringRecord(value);
48
+ if (record === undefined)
49
+ return undefined;
50
+ return Object.fromEntries(Object.entries(record).filter(([, ticketKey]) => isTicketKey(ticketKey)));
51
+ };
32
52
  const stringRecord = (value) => {
33
53
  if (!Predicate.isObject(value))
34
54
  return undefined;
@@ -40,12 +60,64 @@ const stringRecord = (value) => {
40
60
  }
41
61
  return result;
42
62
  };
43
- const parseConfigPatch = (content) => {
63
+ const stringArray = (value) => {
64
+ if (!Array.isArray(value))
65
+ return undefined;
66
+ return value.every((entry) => Predicate.isString(entry)) ? value : undefined;
67
+ };
68
+ /**
69
+ * A finite, positive number of seconds.
70
+ *
71
+ * Zero is rejected rather than merely odd: an Idle Cap of zero makes every presence window
72
+ * zero-length, so both `reconcile --agent` and `watch` report nothing to propose, forever, with
73
+ * nothing on screen to explain it. `jcf config set idle-cap` already refuses it — this is the same
74
+ * rule for the file, which is the other way in.
75
+ */
76
+ const positiveSeconds = (value) => Predicate.isNumber(value) && Number.isFinite(value) && value > 0 ? value : undefined;
77
+ /**
78
+ * A confidence in `[0, 1]`, or nothing.
79
+ *
80
+ * Narrower than {@link nonNegativeNumber} because the value is compared against a confidence that is
81
+ * itself clamped to `[0, 1]`. There is no `jcf config set` subcommand for this field, so hand-editing
82
+ * the file is the only way to set it — which is exactly where `70` gets written for "70%". Accepting
83
+ * it would withhold every Coding Agent attribution from then on, permanently and with nothing to
84
+ * point at. Out of range falls back to the default instead.
85
+ */
86
+ const confidence = (value) => Predicate.isNumber(value) && Number.isFinite(value) && value >= 0 && value <= 1 ? value : undefined;
87
+ /**
88
+ * The stored fields worth keeping, out of whatever `~/.jcf/config.json` happens to contain.
89
+ *
90
+ * Exported for testing: this is the one place a hand-edited file meets the rest of jcf, and a value
91
+ * that gets through here wrongly is one that changes behaviour with nothing on screen to explain it.
92
+ */
93
+ export const parseConfigPatch = (content) => {
44
94
  const parsed = JSON.parse(content);
45
95
  if (!Predicate.isObject(parsed))
46
96
  return {};
97
+ const sessionAgent = Option.getOrUndefined(Schema.decodeUnknownOption(SessionAgentSettings)(parsed.sessionAgent));
47
98
  const projectMap = stringRecord(parsed.projectMap);
99
+ const sessionRoots = stringArray(parsed.sessionRoots);
100
+ const sessionTicketMap = ticketMap(parsed.sessionTicketMap);
101
+ const sessionIdleCapSeconds = positiveSeconds(parsed.sessionIdleCapSeconds);
102
+ // Zero is meaningful here, unlike an Idle Cap: it turns the Dwell Floor off.
103
+ const sessionDwellSeconds = Predicate.isNumber(parsed.sessionDwellSeconds) &&
104
+ Number.isFinite(parsed.sessionDwellSeconds) && parsed.sessionDwellSeconds >= 0
105
+ ? parsed.sessionDwellSeconds
106
+ : undefined;
107
+ const sessionConfidenceFloor = confidence(parsed.sessionConfidenceFloor);
108
+ const sessionOwnership = parsed.sessionOwnership === "assigned" || parsed.sessionOwnership === "any"
109
+ ? parsed.sessionOwnership
110
+ : undefined;
111
+ const sessionOwnershipOverrides = stringArray(parsed.sessionOwnershipOverrides)?.filter(isTicketKey);
48
112
  return {
113
+ ...((sessionAgent !== undefined) && { sessionAgent }),
114
+ ...((sessionOwnership !== undefined) && { sessionOwnership }),
115
+ ...((sessionOwnershipOverrides !== undefined) && { sessionOwnershipOverrides }),
116
+ ...((sessionRoots !== undefined) && { sessionRoots }),
117
+ ...((sessionTicketMap !== undefined) && { sessionTicketMap }),
118
+ ...((sessionIdleCapSeconds !== undefined) && { sessionIdleCapSeconds }),
119
+ ...((sessionDwellSeconds !== undefined) && { sessionDwellSeconds }),
120
+ ...((sessionConfidenceFloor !== undefined) && { sessionConfidenceFloor }),
49
121
  ...((Predicate.isString(parsed.defaultJql)) && { defaultJql: parsed.defaultJql }),
50
122
  ...((Predicate.isNumber(parsed.refreshInterval)) && { refreshInterval: parsed.refreshInterval }),
51
123
  ...((projectMap !== undefined) && { projectMap }),
@@ -71,14 +143,14 @@ export const layer = Layer.effect(ConfigService, Effect.gen(function* () {
71
143
  const read = Effect.gen(function* () {
72
144
  const exists = yield* fs.exists(filePath);
73
145
  if (!exists)
74
- return defaultConfig;
146
+ return defaultJcfConfig;
75
147
  const content = yield* fs.readFileString(filePath);
76
148
  const parsed = yield* Effect.try({
77
149
  try: () => parseConfigPatch(content),
78
150
  catch: () => ({})
79
151
  });
80
- return { ...defaultConfig, ...parsed };
81
- }).pipe(Effect.catch(() => Effect.succeed(defaultConfig)));
152
+ return { ...defaultJcfConfig, ...parsed };
153
+ }).pipe(Effect.catch(() => Effect.succeed(defaultJcfConfig)));
82
154
  const write = (config) => Effect.gen(function* () {
83
155
  yield* ensureDir;
84
156
  yield* fs.writeFileString(filePath, JSON.stringify(config, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../../src/services/ConfigService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../../src/services/ConfigService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * User home directory lookup as an Effect service.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Config from "effect/Config";
7
+ import * as Context from "effect/Context";
8
+ import * as Layer from "effect/Layer";
9
+ export interface HomeDirectoryContract {
10
+ readonly path: string;
11
+ }
12
+ declare const HomeDirectory_base: Context.ServiceClass<HomeDirectory, "jcf/HomeDirectory", HomeDirectoryContract>;
13
+ export declare class HomeDirectory extends HomeDirectory_base {
14
+ }
15
+ export declare const layer: Layer.Layer<HomeDirectory, Config.ConfigError, never>;
16
+ export {};
17
+ //# sourceMappingURL=HomeDirectory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomeDirectory.d.ts","sourceRoot":"","sources":["../../../src/services/HomeDirectory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;;AAED,qBAAa,aAAc,SAAQ,kBAA4E;CAAG;AAOlH,eAAO,MAAM,KAAK,uDAGjB,CAAA"}
@@ -9,6 +9,6 @@ import * as Effect from "effect/Effect";
9
9
  import * as Layer from "effect/Layer";
10
10
  export class HomeDirectory extends Context.Service()("jcf/HomeDirectory") {
11
11
  }
12
- const homePath = Config.string("HOME").pipe(Config.orElse(() => Config.string("USERPROFILE")), Config.orElse(() => Config.succeed("/")));
12
+ const homePath = Config.String("HOME").pipe(Config.orElse(() => Config.String("USERPROFILE")), Config.orElse(() => Config.succeed("/")));
13
13
  export const layer = Layer.effect(HomeDirectory, homePath.pipe(Effect.map((path) => HomeDirectory.of({ path }))));
14
14
  //# sourceMappingURL=HomeDirectory.js.map
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Who an Issue Key belongs to, and what it is called.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **A branch cannot tell authoring from reviewing.** Checking out a colleague's PR puts their
7
+ * Issue Key on the branch, and branch attribution then offers their ticket as your work. Jira
8
+ * knows the difference, so ownership is asked of Jira rather than guessed from the transcript.
9
+ * - **One search, not one request per key.** A week of rows on six tickets costs a single
10
+ * `key in (…)` search, which also returns the titles — an Issue Key alone is not a timesheet
11
+ * anybody can read six months later.
12
+ * - **Cached to disk, because neither fact moves quickly.** A title almost never changes and an
13
+ * assignee rarely does, so a week already looked at answers from `~/.jcf/issues.json` and a
14
+ * Jira outage costs nothing. Entries past {@link OWNERSHIP_TTL_MS} are re-asked.
15
+ * - **Unknown is not "not yours".** Every failure — no login, an unreachable site, an issue in a
16
+ * project you cannot see — leaves a key with no fact. A caller may hide what Jira says belongs to
17
+ * someone else; it must never hide what Jira was not asked about, because that would silently drop
18
+ * hours nobody could then find.
19
+ *
20
+ * @module
21
+ */
22
+ import { JiraApiClient } from "@knpkv/jira-api-client";
23
+ import { JiraAuth } from "@knpkv/jira-cli/JiraAuth";
24
+ import * as Context from "effect/Context";
25
+ import * as Effect from "effect/Effect";
26
+ import * as FileSystem from "effect/FileSystem";
27
+ import * as Layer from "effect/Layer";
28
+ import * as Path from "effect/Path";
29
+ import { HomeDirectory } from "./HomeDirectory.js";
30
+ /** What Jira says about one Issue Key. */
31
+ export interface IssueFact {
32
+ readonly key: string;
33
+ /** The issue title, or null when Jira answered without one. */
34
+ readonly title: string | null;
35
+ /** Assignee display name, or null when Jira reports none or omits it. */
36
+ readonly assignee: string | null;
37
+ /** Account-relative assignment, independent of the optional display name. */
38
+ readonly assignment: "mine" | "other-assignee" | "unassigned" | "unknown";
39
+ /** True for me, false for a known other or no owner, null when Jira omits the identity. */
40
+ readonly mine: boolean | null;
41
+ }
42
+ /**
43
+ * The answer to one lookup.
44
+ *
45
+ * `checked` says whether Jira was actually reached, so a surface can tell "these are not yours"
46
+ * apart from "nobody could ask" — the second is a warning to show, never a reason to filter.
47
+ */
48
+ export interface IssueFactsResult {
49
+ readonly facts: ReadonlyMap<string, IssueFact>;
50
+ readonly checked: boolean;
51
+ }
52
+ export interface IssueFactsContract {
53
+ readonly lookup: (keys: ReadonlyArray<string>) => Effect.Effect<IssueFactsResult>;
54
+ }
55
+ declare const IssueFacts_base: Context.ServiceClass<IssueFacts, "jcf/IssueFacts", IssueFactsContract>;
56
+ export declare class IssueFacts extends IssueFacts_base {
57
+ }
58
+ /** The configured rule and known Jira facts used to admit an attributed ticket. */
59
+ export interface OwnershipPolicy {
60
+ readonly facts: ReadonlyMap<string, IssueFact>;
61
+ readonly mode: "assigned" | "any";
62
+ readonly overrides: ReadonlyArray<string>;
63
+ }
64
+ /** Admit unknown tickets, but withhold a positive other-owner fact unless explicitly overridden. */
65
+ export declare const isOwnedByMe: (ticketKey: string, policy: OwnershipPolicy) => boolean;
66
+ /**
67
+ * How long an ownership answer is trusted before it is asked again.
68
+ *
69
+ * Twelve hours, which is a working day: a ticket reassigned this morning is right by tomorrow, and
70
+ * nothing here is load-bearing enough to justify a request per page load. A title is cached under
71
+ * the same clock only because it travels in the same response.
72
+ */
73
+ export declare const OWNERSHIP_TTL_MS: number;
74
+ /** One cached fact, with when it was learned. */
75
+ export interface CachedFact extends IssueFact {
76
+ readonly checkedAtMs: number;
77
+ }
78
+ /**
79
+ * The cache file's shape.
80
+ *
81
+ * `accountId` and `cloudId` are stored beside the facts because `mine` is a claim about one account
82
+ * on one Jira site. Switching either makes every stored claim meaningless rather than merely stale,
83
+ * so the whole file is discarded when the identity disagrees.
84
+ */
85
+ export interface IssueCache {
86
+ readonly accountId: string | null;
87
+ readonly cloudId: string | null;
88
+ readonly issues: ReadonlyMap<string, CachedFact>;
89
+ }
90
+ export declare const emptyCache: IssueCache;
91
+ /**
92
+ * Shape the issues one search returned into facts, deciding ownership by account id.
93
+ *
94
+ * By account id and never by display name: two people can share a name, a name can be changed, and
95
+ * a display name is absent entirely on a site that hides profiles. `mine` is false for an
96
+ * unassigned issue — nobody owns it, so nothing about it is evidence that you do.
97
+ */
98
+ export declare const factsFromIssues: (issues: ReadonlyArray<unknown>, myAccountId: string | null) => ReadonlyMap<string, IssueFact>;
99
+ /**
100
+ * Read the cache file, keeping only entries that still parse as facts about `accountId`.
101
+ *
102
+ * Total, including on text that is not JSON at all: a cache is a convenience, so a file somebody
103
+ * hand-edited badly costs one Jira search rather than a failed page load.
104
+ */
105
+ export declare const parseIssueCache: (content: string) => IssueCache;
106
+ export declare const serializeIssueCache: (cache: IssueCache) => string;
107
+ /** The keys a lookup has to actually ask about: never seen, or seen too long ago. */
108
+ export declare const staleKeys: (options: {
109
+ readonly keys: ReadonlyArray<string>;
110
+ readonly cache: IssueCache;
111
+ readonly nowMs: number;
112
+ readonly ttlMs: number;
113
+ }) => ReadonlyArray<string>;
114
+ /** Fold fresh answers into the cache, keeping what was not asked about this time. */
115
+ export declare const mergeCache: (options: {
116
+ readonly cache: IssueCache;
117
+ readonly fresh: ReadonlyMap<string, IssueFact>;
118
+ readonly accountId: string | null;
119
+ readonly cloudId: string | null;
120
+ readonly queriedKeys: ReadonlyArray<string>;
121
+ readonly nowMs: number;
122
+ }) => IssueCache;
123
+ /** `key in (A-1, A-2)`, for the keys a search is about. */
124
+ export declare const keyClause: (keys: ReadonlyArray<string>) => string;
125
+ export declare const layer: Layer.Layer<IssueFacts, never, FileSystem.FileSystem | HomeDirectory | JiraApiClient | JiraAuth | Path.Path>;
126
+ export {};
127
+ //# sourceMappingURL=IssueFacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IssueFacts.d.ts","sourceRoot":"","sources":["../../../src/services/IssueFacts.ts"],"names":[],"mappings":"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"}