@codetreker/daynight 0.2.4 → 0.6.1

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 (189) hide show
  1. package/dist/api/client.d.ts +43 -0
  2. package/dist/api/client.js +285 -0
  3. package/dist/api/client.js.map +1 -0
  4. package/dist/api/index.d.ts +7 -0
  5. package/dist/api/index.js +5 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/json.d.ts +3 -0
  8. package/dist/api/json.js +25 -0
  9. package/dist/api/json.js.map +1 -0
  10. package/dist/api/operation.d.ts +23 -0
  11. package/dist/api/operation.js +78 -0
  12. package/dist/api/operation.js.map +1 -0
  13. package/dist/api/parse.d.ts +12 -0
  14. package/dist/api/parse.js +160 -0
  15. package/dist/api/parse.js.map +1 -0
  16. package/dist/api/types.d.ts +75 -0
  17. package/dist/api/types.js +2 -0
  18. package/dist/api/types.js.map +1 -0
  19. package/dist/cli/application.d.ts +3 -0
  20. package/dist/cli/application.js +31 -0
  21. package/dist/cli/application.js.map +1 -0
  22. package/dist/cli/commands.d.ts +7 -0
  23. package/dist/cli/commands.js +38 -0
  24. package/dist/cli/commands.js.map +1 -0
  25. package/dist/cli/context.d.ts +17 -0
  26. package/dist/cli/context.js +19 -0
  27. package/dist/cli/context.js.map +1 -0
  28. package/dist/cli/schema.d.ts +52 -0
  29. package/dist/cli/schema.js +108 -0
  30. package/dist/cli/schema.js.map +1 -0
  31. package/dist/commands/completion/bash.d.ts +2 -0
  32. package/dist/commands/completion/bash.js +272 -0
  33. package/dist/commands/completion/bash.js.map +1 -0
  34. package/dist/commands/completion/command.d.ts +2 -0
  35. package/dist/commands/completion/command.js +20 -0
  36. package/dist/commands/completion/command.js.map +1 -0
  37. package/dist/commands/completion/definition.d.ts +2 -0
  38. package/dist/commands/completion/definition.js +8 -0
  39. package/dist/commands/completion/definition.js.map +1 -0
  40. package/dist/commands/completion/zsh.d.ts +2 -0
  41. package/dist/commands/completion/zsh.js +136 -0
  42. package/dist/commands/completion/zsh.js.map +1 -0
  43. package/dist/commands/project/command.d.ts +6 -0
  44. package/dist/commands/project/command.js +39 -0
  45. package/dist/commands/project/command.js.map +1 -0
  46. package/dist/commands/project/definition.d.ts +2 -0
  47. package/dist/commands/project/definition.js +34 -0
  48. package/dist/commands/project/definition.js.map +1 -0
  49. package/dist/commands/project/rendering.d.ts +4 -0
  50. package/dist/commands/project/rendering.js +17 -0
  51. package/dist/commands/project/rendering.js.map +1 -0
  52. package/dist/{copilot.d.ts → commands/review/adapters/copilot.d.ts} +20 -12
  53. package/dist/commands/review/adapters/copilot.js +360 -0
  54. package/dist/commands/review/adapters/copilot.js.map +1 -0
  55. package/dist/{github.d.ts → commands/review/adapters/github.d.ts} +2 -19
  56. package/dist/{github.js → commands/review/adapters/github.js} +0 -43
  57. package/dist/commands/review/adapters/github.js.map +1 -0
  58. package/dist/{git.d.ts → commands/review/adapters/worktrees.d.ts} +3 -2
  59. package/dist/{git.js → commands/review/adapters/worktrees.js} +3 -3
  60. package/dist/commands/review/adapters/worktrees.js.map +1 -0
  61. package/dist/commands/review/command.d.ts +11 -0
  62. package/dist/commands/review/command.js +42 -0
  63. package/dist/commands/review/command.js.map +1 -0
  64. package/dist/{config.d.ts → commands/review/config.d.ts} +8 -8
  65. package/dist/{config.js → commands/review/config.js} +25 -44
  66. package/dist/commands/review/config.js.map +1 -0
  67. package/dist/{coordinator.d.ts → commands/review/coordinator.d.ts} +8 -7
  68. package/dist/{coordinator.js → commands/review/coordinator.js} +8 -3
  69. package/dist/commands/review/coordinator.js.map +1 -0
  70. package/dist/commands/review/definition.d.ts +2 -0
  71. package/dist/commands/review/definition.js +33 -0
  72. package/dist/commands/review/definition.js.map +1 -0
  73. package/dist/commands/review/instance-lock.js.map +1 -0
  74. package/dist/commands/review/listing.d.ts +5 -0
  75. package/dist/{review-list.js → commands/review/listing.js} +3 -9
  76. package/dist/commands/review/listing.js.map +1 -0
  77. package/dist/commands/review/model.d.ts +79 -0
  78. package/dist/commands/review/model.js +2 -0
  79. package/dist/commands/review/model.js.map +1 -0
  80. package/dist/commands/review/paths.d.ts +11 -0
  81. package/dist/commands/review/paths.js +16 -0
  82. package/dist/commands/review/paths.js.map +1 -0
  83. package/dist/commands/review/polling.d.ts +21 -0
  84. package/dist/commands/review/polling.js +44 -0
  85. package/dist/commands/review/polling.js.map +1 -0
  86. package/dist/{processes.d.ts → commands/review/processes.d.ts} +3 -3
  87. package/dist/commands/review/processes.js.map +1 -0
  88. package/dist/{repositories.d.ts → commands/review/repositories.d.ts} +2 -2
  89. package/dist/commands/review/repositories.js +70 -0
  90. package/dist/commands/review/repositories.js.map +1 -0
  91. package/dist/{runtime.d.ts → commands/review/runtime.d.ts} +9 -6
  92. package/dist/{runtime.js → commands/review/runtime.js} +11 -8
  93. package/dist/commands/review/runtime.js.map +1 -0
  94. package/dist/commands/review/skill.d.ts +11 -0
  95. package/dist/commands/review/skill.js +242 -0
  96. package/dist/commands/review/skill.js.map +1 -0
  97. package/dist/commands/review/skills/daynight-review/SKILL.md +63 -0
  98. package/dist/{store.d.ts → commands/review/store.d.ts} +5 -79
  99. package/dist/{store.js → commands/review/store.js} +8 -0
  100. package/dist/commands/review/store.js.map +1 -0
  101. package/dist/commands/server/runtime.d.ts +16 -0
  102. package/dist/commands/server/runtime.js +52 -0
  103. package/dist/commands/server/runtime.js.map +1 -0
  104. package/dist/commands/task/command.d.ts +8 -0
  105. package/dist/commands/task/command.js +106 -0
  106. package/dist/commands/task/command.js.map +1 -0
  107. package/dist/commands/task/definition.d.ts +2 -0
  108. package/dist/commands/task/definition.js +50 -0
  109. package/dist/commands/task/definition.js.map +1 -0
  110. package/dist/commands/task/rendering.d.ts +5 -0
  111. package/dist/commands/task/rendering.js +49 -0
  112. package/dist/commands/task/rendering.js.map +1 -0
  113. package/dist/commands/update/command.d.ts +6 -0
  114. package/dist/commands/update/command.js +23 -0
  115. package/dist/commands/update/command.js.map +1 -0
  116. package/dist/commands/update/definition.d.ts +2 -0
  117. package/dist/commands/update/definition.js +7 -0
  118. package/dist/commands/update/definition.js.map +1 -0
  119. package/dist/{update.d.ts → commands/update/updater.d.ts} +2 -2
  120. package/dist/{update.js → commands/update/updater.js} +3 -3
  121. package/dist/commands/update/updater.js.map +1 -0
  122. package/dist/config/document.d.ts +9 -0
  123. package/dist/config/document.js +45 -0
  124. package/dist/config/document.js.map +1 -0
  125. package/dist/config/files.d.ts +7 -0
  126. package/dist/config/files.js +69 -0
  127. package/dist/config/files.js.map +1 -0
  128. package/dist/config/paths.d.ts +6 -0
  129. package/dist/config/paths.js +9 -0
  130. package/dist/config/paths.js.map +1 -0
  131. package/dist/config/server.d.ts +7 -0
  132. package/dist/config/server.js +34 -0
  133. package/dist/config/server.js.map +1 -0
  134. package/dist/main.js +6 -2
  135. package/dist/main.js.map +1 -1
  136. package/dist/platform/diagnostics.js.map +1 -0
  137. package/dist/platform/files.d.ts +1 -0
  138. package/dist/platform/files.js +48 -0
  139. package/dist/platform/files.js.map +1 -0
  140. package/dist/{paths.d.ts → platform/filesystem.d.ts} +0 -11
  141. package/dist/{paths.js → platform/filesystem.js} +1 -17
  142. package/dist/platform/filesystem.js.map +1 -0
  143. package/dist/platform/terminal.d.ts +1 -0
  144. package/dist/platform/terminal.js +10 -0
  145. package/dist/platform/terminal.js.map +1 -0
  146. package/dist/platform/text.d.ts +2 -0
  147. package/dist/platform/text.js +3 -0
  148. package/dist/platform/text.js.map +1 -0
  149. package/dist/repository/binding.d.ts +21 -0
  150. package/dist/repository/binding.js +242 -0
  151. package/dist/repository/binding.js.map +1 -0
  152. package/dist/repository/context.d.ts +10 -0
  153. package/dist/repository/context.js +32 -0
  154. package/dist/repository/context.js.map +1 -0
  155. package/dist/repository/git.d.ts +20 -0
  156. package/dist/repository/git.js +213 -0
  157. package/dist/repository/git.js.map +1 -0
  158. package/dist/repository/identity.d.ts +5 -0
  159. package/dist/repository/identity.js +154 -0
  160. package/dist/repository/identity.js.map +1 -0
  161. package/dist/repository/index.d.ts +4 -0
  162. package/dist/repository/index.js +3 -0
  163. package/dist/repository/index.js.map +1 -0
  164. package/package.json +6 -5
  165. package/dist/cli.d.ts +0 -19
  166. package/dist/cli.js +0 -202
  167. package/dist/cli.js.map +0 -1
  168. package/dist/config.js.map +0 -1
  169. package/dist/coordinator.js.map +0 -1
  170. package/dist/copilot.js +0 -263
  171. package/dist/copilot.js.map +0 -1
  172. package/dist/diagnostics.js.map +0 -1
  173. package/dist/git.js.map +0 -1
  174. package/dist/github.js.map +0 -1
  175. package/dist/instance-lock.js.map +0 -1
  176. package/dist/paths.js.map +0 -1
  177. package/dist/processes.js.map +0 -1
  178. package/dist/repositories.js +0 -159
  179. package/dist/repositories.js.map +0 -1
  180. package/dist/review-list.d.ts +0 -5
  181. package/dist/review-list.js.map +0 -1
  182. package/dist/runtime.js.map +0 -1
  183. package/dist/store.js.map +0 -1
  184. package/dist/update.js.map +0 -1
  185. /package/dist/{instance-lock.d.ts → commands/review/instance-lock.d.ts} +0 -0
  186. /package/dist/{instance-lock.js → commands/review/instance-lock.js} +0 -0
  187. /package/dist/{processes.js → commands/review/processes.js} +0 -0
  188. /package/dist/{diagnostics.d.ts → platform/diagnostics.d.ts} +0 -0
  189. /package/dist/{diagnostics.js → platform/diagnostics.js} +0 -0
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvE,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC7C,CAAC;IACzB,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACnG,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC7C,CAAC;IACzB,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC/G,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/platform/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE;IACpD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,cAAc,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const replaceFileAtomically: (file: string, contents: string | Uint8Array, mode?: number) => Promise<void>;
@@ -0,0 +1,48 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { open, rename, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ export const replaceFileAtomically = async (file, contents, mode) => {
5
+ const temporaryFile = path.join(path.dirname(file), `.atomic-${randomUUID()}.tmp`);
6
+ const handle = await open(temporaryFile, "wx", 0o600);
7
+ let failure;
8
+ let renamed = false;
9
+ let closed = false;
10
+ try {
11
+ await handle.writeFile(contents);
12
+ if (mode !== undefined) {
13
+ await handle.chmod(mode & 0o777);
14
+ }
15
+ await handle.sync();
16
+ await handle.close();
17
+ closed = true;
18
+ await rename(temporaryFile, file);
19
+ renamed = true;
20
+ }
21
+ catch (cause) {
22
+ failure = cause;
23
+ throw cause;
24
+ }
25
+ finally {
26
+ const cleanup = [];
27
+ if (!closed) {
28
+ try {
29
+ await handle.close();
30
+ }
31
+ catch (cause) {
32
+ cleanup.push(cause);
33
+ }
34
+ }
35
+ if (!renamed) {
36
+ try {
37
+ await unlink(temporaryFile);
38
+ }
39
+ catch (cause) {
40
+ cleanup.push(cause);
41
+ }
42
+ }
43
+ if (cleanup.length !== 0) {
44
+ throw new AggregateError(failure === undefined ? cleanup : [failure, ...cleanup], `Atomic replacement or temporary-file cleanup failed for ${file}.`);
45
+ }
46
+ }
47
+ };
48
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/platform/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,IAAY,EACZ,QAA6B,EAC7B,IAAa,EACE,EAAE;IACjB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,WAAW,UAAU,EAAE,MAAM,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,IAAI,OAAgB,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,GAAc,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QAC7E,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,cAAc,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,2DAA2D,IAAI,GAAG,CAAC,CAAC;QACxJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
@@ -1,15 +1,5 @@
1
1
  import path from "node:path";
2
2
  export type PathApi = Pick<typeof path, "resolve" | "join" | "dirname" | "relative" | "isAbsolute" | "normalize" | "sep">;
3
- export type RuntimePaths = {
4
- stateDirectory: string;
5
- configFile: string;
6
- databaseFile: string;
7
- lockFile: string;
8
- copilotDirectory: string;
9
- cacheDirectory: string;
10
- temporaryDirectory: string;
11
- logsDirectory: string;
12
- };
13
3
  export type PhysicalDirectory = {
14
4
  ancestorPath: string;
15
5
  ancestorIdentity: string;
@@ -17,7 +7,6 @@ export type PhysicalDirectory = {
17
7
  };
18
8
  export declare const resolvePhysicalDirectory: (target: string, missingDescendantError?: Error) => Promise<PhysicalDirectory>;
19
9
  export declare const ancestorIdentities: (directory: string) => Promise<Set<string>>;
20
- export declare const resolveRuntimePaths: (homeDirectory: string, pathApi?: PathApi) => RuntimePaths;
21
10
  export declare const pathsEqual: (first: string, second: string, pathApi?: PathApi) => boolean;
22
11
  export declare const pathsOverlap: (first: string, second: string, pathApi?: PathApi) => boolean;
23
12
  type PathProbeOperations = {
@@ -72,22 +72,6 @@ export const ancestorIdentities = async (directory) => {
72
72
  cursor = parent;
73
73
  }
74
74
  };
75
- export const resolveRuntimePaths = (homeDirectory, pathApi = path) => {
76
- if (!pathApi.isAbsolute(homeDirectory)) {
77
- throw new Error("The current user's home directory must be an absolute path.");
78
- }
79
- const stateDirectory = pathApi.resolve(homeDirectory, ".daynight");
80
- return {
81
- stateDirectory,
82
- configFile: pathApi.join(stateDirectory, "config.yml"),
83
- databaseFile: pathApi.join(stateDirectory, "state.sqlite"),
84
- lockFile: pathApi.join(stateDirectory, "instance.lock"),
85
- copilotDirectory: pathApi.join(stateDirectory, "copilot"),
86
- cacheDirectory: pathApi.join(stateDirectory, "cache"),
87
- temporaryDirectory: pathApi.join(stateDirectory, "tmp"),
88
- logsDirectory: pathApi.join(stateDirectory, "logs"),
89
- };
90
- };
91
75
  export const pathsEqual = (first, second, pathApi = path) => pathApi.resolve(first) === pathApi.resolve(second);
92
76
  const containsPath = (parent, child, pathApi) => {
93
77
  const resolvedParent = pathApi.resolve(parent);
@@ -152,4 +136,4 @@ export const missingPathsReferToSameDirectory = async (directory, first, second,
152
136
  }
153
137
  return sameDirectory;
154
138
  };
155
- //# sourceMappingURL=paths.js.map
139
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/platform/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const terminalText: (value: string) => string;
@@ -0,0 +1,10 @@
1
+ export const terminalText = (value) => value.replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029]/gu, (character) => {
2
+ if (character === "\n")
3
+ return "\\n";
4
+ if (character === "\r")
5
+ return "\\r";
6
+ if (character === "\t")
7
+ return "\\t";
8
+ return `\\u${character.codePointAt(0).toString(16).padStart(4, "0")}`;
9
+ });
10
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/platform/terminal.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,4CAA4C,EAAE,CAAC,SAAS,EAAE,EAAE;IAC/H,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const isText: (value: unknown) => value is string;
2
+ export declare const isNonemptyText: (value: unknown) => value is string;
@@ -0,0 +1,3 @@
1
+ export const isText = (value) => typeof value === "string" && value.isWellFormed() && !value.includes("\0");
2
+ export const isNonemptyText = (value) => isText(value) && /[^\p{White_Space}]/u.test(value);
3
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/platform/text.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEtI,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ApiClient, Operation, Project } from "../api/index.js";
2
+ export type ProjectApi = Pick<ApiClient, "getProject" | "listProjects">;
3
+ export type ProjectBinding = {
4
+ readonly serverUrl: string;
5
+ readonly repoIdentity: string;
6
+ readonly projectId: string;
7
+ };
8
+ export type ProjectRepositoryContext = {
9
+ readonly serverUrl: string;
10
+ readonly repoIdentity: string;
11
+ };
12
+ export declare const readProjectBinding: (root: string, operation: Operation) => Promise<ProjectBinding | undefined>;
13
+ export declare const projectRepositoryIdentity: (project: Project) => string;
14
+ export declare const verifyProjectBinding: (binding: ProjectBinding | undefined, context: ProjectRepositoryContext, api: ProjectApi, operation: Operation) => Promise<Project | undefined>;
15
+ export declare const persistProjectBinding: (options: {
16
+ readonly root: string;
17
+ readonly binding: ProjectBinding;
18
+ readonly project: Project;
19
+ readonly operation: Operation;
20
+ readonly api: ProjectApi;
21
+ }) => Promise<Project>;
@@ -0,0 +1,242 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { access, lstat, mkdir, open, readFile, unlink } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { parseDocument, stringify } from "yaml";
6
+ import { ApiError, canonicalId } from "../api/index.js";
7
+ import { normalizeServerUrl } from "../config/server.js";
8
+ import { replaceFileAtomically } from "../platform/files.js";
9
+ import { repositoryIdentity } from "./identity.js";
10
+ import { runRepositoryGit } from "./git.js";
11
+ const hasCode = (error, code) => error instanceof Error && "code" in error && error.code === code;
12
+ const metadataDirectory = (root) => path.join(root, ".daynight");
13
+ const bindingFile = (root) => path.join(metadataDirectory(root), "project.yml");
14
+ const inspectMetadataDirectory = async (root, operation) => {
15
+ operation.check();
16
+ try {
17
+ const entry = await lstat(metadataDirectory(root));
18
+ operation.check();
19
+ if (!entry.isDirectory())
20
+ throw new Error(`Repository metadata path ${metadataDirectory(root)} must be a directory; symbolic links are not supported.`);
21
+ return true;
22
+ }
23
+ catch (cause) {
24
+ if (hasCode(cause, "ENOENT"))
25
+ return false;
26
+ throw cause;
27
+ }
28
+ };
29
+ const parseBinding = (source, filename) => {
30
+ try {
31
+ const document = parseDocument(source, { strict: true, uniqueKeys: true, stringKeys: true, prettyErrors: false });
32
+ const problems = [...document.errors, ...document.warnings];
33
+ if (problems.length !== 0)
34
+ throw new AggregateError(problems, "Repository binding YAML was rejected.");
35
+ const mapping = document.toJS();
36
+ if (typeof mapping !== "object" || mapping === null || Array.isArray(mapping))
37
+ throw new Error("Repository binding must be a mapping.");
38
+ const value = mapping;
39
+ const fields = ["serverUrl", "repoIdentity", "projectId"];
40
+ if (Object.keys(value).some((key) => !fields.includes(key)) || fields.some((key) => !Object.hasOwn(value, key)))
41
+ throw new Error("Repository binding must contain exactly serverUrl, repoIdentity, and projectId.");
42
+ const serverUrl = normalizeServerUrl(value.serverUrl);
43
+ if (serverUrl !== value.serverUrl)
44
+ throw new Error("Repository binding serverUrl must be a normalized HTTP(S) origin.");
45
+ if (typeof value.repoIdentity !== "string" || value.repoIdentity === "" || !value.repoIdentity.isWellFormed() || /[\p{White_Space}\p{Cc}]/u.test(value.repoIdentity))
46
+ throw new Error("Repository binding repoIdentity must be a nonempty repository identity without whitespace or control characters.");
47
+ if (typeof value.projectId !== "string" || canonicalId(value.projectId) === null)
48
+ throw new Error("Repository binding projectId must be a UUID.");
49
+ return { serverUrl, repoIdentity: value.repoIdentity, projectId: canonicalId(value.projectId) };
50
+ }
51
+ catch (cause) {
52
+ throw new Error(`Invalid repository binding ${filename}.`, { cause });
53
+ }
54
+ };
55
+ export const readProjectBinding = async (root, operation) => {
56
+ if (!await inspectMetadataDirectory(root, operation))
57
+ return undefined;
58
+ const filename = bindingFile(root);
59
+ let entry;
60
+ try {
61
+ entry = await lstat(filename);
62
+ }
63
+ catch (cause) {
64
+ if (hasCode(cause, "ENOENT"))
65
+ return undefined;
66
+ throw new Error(`Cannot inspect repository binding ${filename}.`, { cause });
67
+ }
68
+ operation.check();
69
+ if (!entry.isFile())
70
+ throw new Error(`Repository binding ${filename} must be a regular file; symbolic links are not supported.`);
71
+ let source;
72
+ try {
73
+ source = await readFile(filename, "utf8");
74
+ }
75
+ catch (cause) {
76
+ throw new Error(`Cannot read repository binding ${filename}.`, { cause });
77
+ }
78
+ operation.check();
79
+ return parseBinding(source, filename);
80
+ };
81
+ export const projectRepositoryIdentity = (project) => {
82
+ try {
83
+ return repositoryIdentity(project.repoUrl);
84
+ }
85
+ catch (cause) {
86
+ throw new ApiError({ operation: "project.resolve", projectId: project.id }, "protocol", { cause });
87
+ }
88
+ };
89
+ export const verifyProjectBinding = async (binding, context, api, operation) => {
90
+ operation.check();
91
+ if (binding === undefined || binding.serverUrl !== context.serverUrl || binding.repoIdentity !== context.repoIdentity)
92
+ return undefined;
93
+ let project;
94
+ try {
95
+ project = await api.getProject(binding.projectId);
96
+ }
97
+ catch (cause) {
98
+ if (cause instanceof ApiError && cause.status === 404 && cause.code === "not_found" && cause.phase === "response") {
99
+ operation.check();
100
+ return undefined;
101
+ }
102
+ throw cause;
103
+ }
104
+ operation.check();
105
+ return projectRepositoryIdentity(project) === context.repoIdentity ? project : undefined;
106
+ };
107
+ const withBindingLock = async (root, operation, action) => {
108
+ operation.check();
109
+ if (!await inspectMetadataDirectory(root, operation)) {
110
+ try {
111
+ await mkdir(metadataDirectory(root));
112
+ }
113
+ catch (cause) {
114
+ if (!hasCode(cause, "EEXIST"))
115
+ throw cause;
116
+ }
117
+ await inspectMetadataDirectory(root, operation);
118
+ }
119
+ operation.check();
120
+ const filename = `${bindingFile(root)}.lock`;
121
+ let handle;
122
+ try {
123
+ handle = await open(filename, "wx", 0o600);
124
+ }
125
+ catch (cause) {
126
+ throw new Error(hasCode(cause, "EEXIST")
127
+ ? `Repository metadata is locked at ${filename}; confirm the writer has stopped before removing this lock. The lock contains its process ID and ownership token.`
128
+ : `Cannot acquire repository metadata lock ${filename}.`, { cause });
129
+ }
130
+ const content = `${JSON.stringify({ pid: process.pid, token: randomUUID() })}\n`;
131
+ let identity;
132
+ let failure;
133
+ let failed = false;
134
+ try {
135
+ identity = await handle.stat();
136
+ await handle.writeFile(content, "utf8");
137
+ await handle.sync();
138
+ operation.check();
139
+ return await action();
140
+ }
141
+ catch (cause) {
142
+ failed = true;
143
+ failure = cause;
144
+ throw cause;
145
+ }
146
+ finally {
147
+ const cleanup = [];
148
+ let owned = false;
149
+ try {
150
+ const current = await lstat(filename);
151
+ if (!current.isFile() || identity === undefined || current.dev !== identity.dev || current.ino !== identity.ino || await readFile(filename, "utf8") !== content)
152
+ throw new Error(`Repository metadata lock ownership changed at ${filename}; the replacement lock was retained.`);
153
+ owned = true;
154
+ }
155
+ catch (cause) {
156
+ cleanup.push(cause);
157
+ }
158
+ try {
159
+ await handle.close();
160
+ }
161
+ catch (cause) {
162
+ cleanup.push(cause);
163
+ }
164
+ if (owned) {
165
+ try {
166
+ await unlink(filename);
167
+ }
168
+ catch (cause) {
169
+ cleanup.push(cause);
170
+ }
171
+ }
172
+ if (cleanup.length !== 0)
173
+ throw new AggregateError(failed ? [failure, ...cleanup] : cleanup, "Repository metadata operation or lock cleanup failed.");
174
+ }
175
+ };
176
+ const ensureIgnored = async (root, operation) => {
177
+ operation.check();
178
+ const tracked = await runRepositoryGit(root, ["ls-files", "-z", "--", ".daynight"], operation);
179
+ if (tracked.stdout !== "")
180
+ throw new Error("Repository .daynight contents are tracked by Git; remove them from the index before using automatic project discovery.");
181
+ const filename = path.join(root, ".gitignore");
182
+ let entry;
183
+ try {
184
+ entry = await lstat(filename);
185
+ }
186
+ catch (cause) {
187
+ if (!hasCode(cause, "ENOENT"))
188
+ throw new Error(`Cannot inspect ${filename}.`, { cause });
189
+ }
190
+ operation.check();
191
+ if (entry !== undefined && !entry.isFile())
192
+ throw new Error(`Repository ignore file ${filename} must be a regular file; symbolic links are not supported.`);
193
+ if (entry !== undefined) {
194
+ if ((entry.mode & 0o222) === 0)
195
+ throw new Error(`Repository ignore file ${filename} is not writable.`);
196
+ await access(filename, constants.W_OK);
197
+ }
198
+ const source = entry === undefined ? Buffer.alloc(0) : await readFile(filename);
199
+ operation.check();
200
+ const containsRule = source.toString("latin1").split(/\r?\n/).includes("/.daynight/");
201
+ const ignored = await runRepositoryGit(root, ["check-ignore", "--quiet", "--", ".daynight/"], operation, { allowExitOne: true });
202
+ if (!containsRule || ignored.exitCode !== 0) {
203
+ const firstLineFeed = source.indexOf(0x0a);
204
+ const newline = firstLineFeed > 0 && source[firstLineFeed - 1] === 0x0d ? "\r\n" : "\n";
205
+ const separator = source.length === 0 || source.at(-1) === 0x0a ? "" : newline;
206
+ const updated = Buffer.concat([source, Buffer.from(`${separator}/.daynight/${newline}`)]);
207
+ operation.check();
208
+ await replaceFileAtomically(filename, updated, entry?.mode);
209
+ operation.check();
210
+ }
211
+ for (const target of [".daynight/", ".daynight/project.yml"]) {
212
+ const verified = await runRepositoryGit(root, ["check-ignore", "--quiet", "--", target], operation, { allowExitOne: true });
213
+ if (verified.exitCode !== 0)
214
+ throw new Error(`Repository ignore rule for ${target} is ineffective in ${filename}.`);
215
+ }
216
+ };
217
+ export const persistProjectBinding = async (options) => withBindingLock(options.root, options.operation, async () => {
218
+ const { root, binding, operation, api, project } = options;
219
+ const current = await readProjectBinding(root, operation);
220
+ const selected = await verifyProjectBinding(current, binding, api, operation);
221
+ if (selected !== undefined)
222
+ return selected;
223
+ if (current?.serverUrl === binding.serverUrl && current.repoIdentity === binding.repoIdentity && current.projectId === binding.projectId)
224
+ throw new Error(`Project ${binding.projectId} changed during repository discovery; retry the command to discover its current association.`);
225
+ await ensureIgnored(root, operation);
226
+ const filename = bindingFile(root);
227
+ let entry;
228
+ try {
229
+ entry = await lstat(filename);
230
+ }
231
+ catch (cause) {
232
+ if (!hasCode(cause, "ENOENT"))
233
+ throw cause;
234
+ }
235
+ operation.check();
236
+ if (entry !== undefined && !entry.isFile())
237
+ throw new Error(`Repository binding ${filename} must be a regular file; symbolic links are not supported.`);
238
+ await replaceFileAtomically(filename, stringify(binding), entry?.mode);
239
+ operation.check();
240
+ return project;
241
+ });
242
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/repository/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Operation, Project } from "../api/index.js";
2
+ import type { ProjectApi } from "./binding.js";
3
+ export type ResolveProjectOptions = {
4
+ readonly serverUrl: string;
5
+ readonly operation: Operation;
6
+ readonly api: ProjectApi;
7
+ readonly workingDirectory: string;
8
+ readonly projectId?: string;
9
+ };
10
+ export declare const resolveProject: (options: ResolveProjectOptions) => Promise<Project>;
@@ -0,0 +1,32 @@
1
+ import { persistProjectBinding, projectRepositoryIdentity, readProjectBinding, verifyProjectBinding } from "./binding.js";
2
+ import { discoverRepository } from "./git.js";
3
+ export const resolveProject = async (options) => {
4
+ const { operation, api, serverUrl } = options;
5
+ operation.check();
6
+ if (options.projectId !== undefined) {
7
+ const project = await api.getProject(options.projectId);
8
+ operation.check();
9
+ return project;
10
+ }
11
+ const repository = await discoverRepository(options.workingDirectory, operation);
12
+ operation.check();
13
+ const context = { serverUrl, repoIdentity: repository.identity };
14
+ const binding = await readProjectBinding(repository.root, operation);
15
+ const cached = await verifyProjectBinding(binding, context, api, operation);
16
+ if (cached !== undefined)
17
+ return cached;
18
+ const projects = await api.listProjects();
19
+ operation.check();
20
+ const matches = projects.filter((project) => projectRepositoryIdentity(project) === repository.identity);
21
+ operation.check();
22
+ if (matches.length === 0)
23
+ throw new Error("Project does not exist.");
24
+ if (matches.length !== 1)
25
+ throw new Error(`Multiple projects match this repository (${matches.map(({ id }) => id).join(", ")}); specify --project <id>.`);
26
+ const selected = await api.getProject(matches[0].id);
27
+ operation.check();
28
+ if (projectRepositoryIdentity(selected) !== repository.identity)
29
+ throw new Error(`Project ${selected.id} changed during repository discovery; retry the command to discover its current association.`);
30
+ return persistProjectBinding({ root: repository.root, binding: { ...context, projectId: selected.id }, project: selected, operation, api });
31
+ };
32
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/repository/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE1H,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAU9C,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAA8B,EAAoB,EAAE;IACvF,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9C,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxD,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACjF,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1C,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzG,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC1J,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC;IACtD,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,IAAI,yBAAyB,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,8FAA8F,CAAC,CAAC;IACvM,OAAO,qBAAqB,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9I,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Operation } from "../api/operation.js";
2
+ export type RepositoryGitResult = {
3
+ readonly stdout: string;
4
+ readonly stderr: string;
5
+ readonly exitCode: number;
6
+ };
7
+ export declare class RepositoryGitError extends Error {
8
+ readonly exitCode: number | null;
9
+ readonly signal: NodeJS.Signals | null;
10
+ readonly stderr: string;
11
+ constructor(message: string, exitCode: number | null, signal: NodeJS.Signals | null, stderr: string, options?: ErrorOptions);
12
+ }
13
+ export declare const runRepositoryGit: (cwd: string, args: readonly string[], operation: Operation, options?: {
14
+ readonly allowExitOne?: boolean;
15
+ }) => Promise<RepositoryGitResult>;
16
+ export declare const discoverRepository: (cwd: string, operation: Operation) => Promise<{
17
+ root: string;
18
+ remote: string;
19
+ identity: string;
20
+ }>;