@codetreker/daynight 0.3.0 → 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 (133) 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.js +10 -20
  20. package/dist/cli/application.js.map +1 -1
  21. package/dist/cli/commands.d.ts +3 -3
  22. package/dist/cli/commands.js +29 -4
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/cli/schema.d.ts +52 -0
  25. package/dist/cli/schema.js +108 -0
  26. package/dist/cli/schema.js.map +1 -0
  27. package/dist/commands/completion/bash.d.ts +2 -0
  28. package/dist/commands/completion/bash.js +272 -0
  29. package/dist/commands/completion/bash.js.map +1 -0
  30. package/dist/commands/completion/command.d.ts +2 -0
  31. package/dist/commands/completion/command.js +20 -0
  32. package/dist/commands/completion/command.js.map +1 -0
  33. package/dist/commands/completion/definition.d.ts +2 -0
  34. package/dist/commands/completion/definition.js +8 -0
  35. package/dist/commands/completion/definition.js.map +1 -0
  36. package/dist/commands/completion/zsh.d.ts +2 -0
  37. package/dist/commands/completion/zsh.js +136 -0
  38. package/dist/commands/completion/zsh.js.map +1 -0
  39. package/dist/commands/project/command.d.ts +6 -0
  40. package/dist/commands/project/command.js +39 -0
  41. package/dist/commands/project/command.js.map +1 -0
  42. package/dist/commands/project/definition.d.ts +2 -0
  43. package/dist/commands/project/definition.js +34 -0
  44. package/dist/commands/project/definition.js.map +1 -0
  45. package/dist/commands/project/rendering.d.ts +4 -0
  46. package/dist/commands/project/rendering.js +17 -0
  47. package/dist/commands/project/rendering.js.map +1 -0
  48. package/dist/commands/review/adapters/copilot.d.ts +16 -9
  49. package/dist/commands/review/adapters/copilot.js +196 -99
  50. package/dist/commands/review/adapters/copilot.js.map +1 -1
  51. package/dist/commands/review/command.js +12 -98
  52. package/dist/commands/review/command.js.map +1 -1
  53. package/dist/commands/review/config.d.ts +1 -2
  54. package/dist/commands/review/config.js +24 -43
  55. package/dist/commands/review/config.js.map +1 -1
  56. package/dist/commands/review/coordinator.d.ts +2 -2
  57. package/dist/commands/review/coordinator.js +5 -1
  58. package/dist/commands/review/coordinator.js.map +1 -1
  59. package/dist/commands/review/definition.d.ts +2 -0
  60. package/dist/commands/review/definition.js +33 -0
  61. package/dist/commands/review/definition.js.map +1 -0
  62. package/dist/commands/review/listing.js +2 -8
  63. package/dist/commands/review/listing.js.map +1 -1
  64. package/dist/commands/review/paths.d.ts +2 -3
  65. package/dist/commands/review/paths.js +4 -6
  66. package/dist/commands/review/paths.js.map +1 -1
  67. package/dist/commands/review/processes.d.ts +2 -2
  68. package/dist/commands/review/repositories.js +13 -102
  69. package/dist/commands/review/repositories.js.map +1 -1
  70. package/dist/commands/review/runtime.d.ts +4 -1
  71. package/dist/commands/review/runtime.js +7 -4
  72. package/dist/commands/review/runtime.js.map +1 -1
  73. package/dist/commands/review/skill.d.ts +11 -0
  74. package/dist/commands/review/skill.js +242 -0
  75. package/dist/commands/review/skill.js.map +1 -0
  76. package/dist/commands/review/skills/daynight-review/SKILL.md +63 -0
  77. package/dist/commands/review/store.d.ts +4 -0
  78. package/dist/commands/review/store.js +8 -0
  79. package/dist/commands/review/store.js.map +1 -1
  80. package/dist/commands/server/runtime.d.ts +16 -0
  81. package/dist/commands/server/runtime.js +52 -0
  82. package/dist/commands/server/runtime.js.map +1 -0
  83. package/dist/commands/task/command.d.ts +8 -0
  84. package/dist/commands/task/command.js +106 -0
  85. package/dist/commands/task/command.js.map +1 -0
  86. package/dist/commands/task/definition.d.ts +2 -0
  87. package/dist/commands/task/definition.js +50 -0
  88. package/dist/commands/task/definition.js.map +1 -0
  89. package/dist/commands/task/rendering.d.ts +5 -0
  90. package/dist/commands/task/rendering.js +49 -0
  91. package/dist/commands/task/rendering.js.map +1 -0
  92. package/dist/commands/update/command.js +5 -15
  93. package/dist/commands/update/command.js.map +1 -1
  94. package/dist/commands/update/definition.d.ts +2 -0
  95. package/dist/commands/update/definition.js +7 -0
  96. package/dist/commands/update/definition.js.map +1 -0
  97. package/dist/config/document.d.ts +9 -0
  98. package/dist/config/document.js +45 -0
  99. package/dist/config/document.js.map +1 -0
  100. package/dist/config/files.d.ts +7 -0
  101. package/dist/config/files.js +69 -0
  102. package/dist/config/files.js.map +1 -0
  103. package/dist/config/paths.d.ts +6 -0
  104. package/dist/config/paths.js +9 -0
  105. package/dist/config/paths.js.map +1 -0
  106. package/dist/config/server.d.ts +7 -0
  107. package/dist/config/server.js +34 -0
  108. package/dist/config/server.js.map +1 -0
  109. package/dist/platform/files.d.ts +1 -0
  110. package/dist/platform/files.js +48 -0
  111. package/dist/platform/files.js.map +1 -0
  112. package/dist/platform/terminal.d.ts +1 -0
  113. package/dist/platform/terminal.js +10 -0
  114. package/dist/platform/terminal.js.map +1 -0
  115. package/dist/platform/text.d.ts +2 -0
  116. package/dist/platform/text.js +3 -0
  117. package/dist/platform/text.js.map +1 -0
  118. package/dist/repository/binding.d.ts +21 -0
  119. package/dist/repository/binding.js +242 -0
  120. package/dist/repository/binding.js.map +1 -0
  121. package/dist/repository/context.d.ts +10 -0
  122. package/dist/repository/context.js +32 -0
  123. package/dist/repository/context.js.map +1 -0
  124. package/dist/repository/git.d.ts +20 -0
  125. package/dist/repository/git.js +213 -0
  126. package/dist/repository/git.js.map +1 -0
  127. package/dist/repository/identity.d.ts +5 -0
  128. package/dist/repository/identity.js +154 -0
  129. package/dist/repository/identity.js.map +1 -0
  130. package/dist/repository/index.d.ts +4 -0
  131. package/dist/repository/index.js +3 -0
  132. package/dist/repository/index.js.map +1 -0
  133. package/package.json +5 -4
@@ -0,0 +1,272 @@
1
+ const shellQuote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
2
+ const shellArray = (values) => `(${values.map(shellQuote).join(" ")})`;
3
+ const commandCases = (root) => {
4
+ const nodes = [root];
5
+ const cases = [];
6
+ for (let index = 0; index < nodes.length; index += 1) {
7
+ const node = nodes[index];
8
+ const childNames = [];
9
+ const childNodes = [];
10
+ for (const child of node.commands ?? []) {
11
+ const childIndex = nodes.length;
12
+ nodes.push(child);
13
+ for (const name of [child.name, ...(child.aliases ?? [])]) {
14
+ childNames.push(name);
15
+ childNodes.push(String(childIndex));
16
+ }
17
+ }
18
+ const optionNames = [];
19
+ const optionIds = [];
20
+ const optionValues = [];
21
+ const optionActions = [];
22
+ const optionEmpty = [];
23
+ const optionRepeats = [];
24
+ for (const [optionIndex, option] of (node.options ?? []).entries()) {
25
+ for (const name of option.names) {
26
+ optionNames.push(name);
27
+ optionIds.push(String(optionIndex));
28
+ optionValues.push(option.value?.kind ?? "");
29
+ optionActions.push(option.action ?? "");
30
+ optionEmpty.push(option.value?.allowEmpty === true ? "1" : "0");
31
+ optionRepeats.push(option.repeatable === true ? "1" : "0");
32
+ }
33
+ }
34
+ const choices = (node.arguments ?? []).map((argument, argumentIndex) => ` ${argumentIndex}) dn_choices=${shellArray(argument.choices ?? [])} ;;`);
35
+ const valueChoices = (node.options ?? []).flatMap((option, optionIndex) => option.value?.choices === undefined ? [] :
36
+ [` ${optionIndex}) dn_value_choices=${shellArray(option.value.choices)} ;;`]);
37
+ cases.push(` ${index})
38
+ dn_children=${shellArray(childNames)}
39
+ dn_child_nodes=${shellArray(childNodes)}
40
+ dn_options=${shellArray(optionNames)}
41
+ dn_option_ids=${shellArray(optionIds)}
42
+ dn_option_values=${shellArray(optionValues)}
43
+ dn_option_actions=${shellArray(optionActions)}
44
+ dn_option_empty=${shellArray(optionEmpty)}
45
+ dn_option_repeats=${shellArray(optionRepeats)}
46
+ dn_argument_count=${node.arguments?.length ?? 0}
47
+ case "$dn_position" in
48
+ ${choices.join("\n")}
49
+ esac
50
+ case "$dn_value_option" in
51
+ ${valueChoices.join("\n")}
52
+ esac
53
+ ;;`);
54
+ }
55
+ return cases.join("\n");
56
+ };
57
+ // COMP_POINT counts bytes. The local C locale keeps substring offsets aligned
58
+ // while the arrays retain the original bytes of quoted and Unicode arguments.
59
+ const runtime = String.raw `
60
+ @PREFIX@_words() {
61
+ local dn_index dn_char dn_token='' dn_quote='' dn_escape=''
62
+ local dn_started=0
63
+ dn_words=()
64
+ dn_tilde=0
65
+ for ((dn_index=0; dn_index<COMP_POINT; dn_index++)); do
66
+ dn_char="@{COMP_LINE:dn_index:1}"
67
+ if [[ -n "$dn_escape" ]]; then
68
+ if [[ "$dn_escape" == double && "$dn_char" != '$' && "$dn_char" != '\' && "$dn_char" != '"' && "$dn_char" != $'\x60' && "$dn_char" != $'\n' ]]; then
69
+ dn_token+='\'
70
+ fi
71
+ [[ "$dn_char" == $'\n' ]] || dn_token+="$dn_char"
72
+ dn_escape=''
73
+ continue
74
+ fi
75
+ if [[ "$dn_quote" == single ]]; then
76
+ if [[ "$dn_char" == "'" ]]; then dn_quote=''; else dn_token+="$dn_char"; fi
77
+ continue
78
+ fi
79
+ if [[ "$dn_quote" == double ]]; then
80
+ case "$dn_char" in
81
+ '"') dn_quote='' ;;
82
+ '\') dn_escape=double ;;
83
+ *) dn_token+="$dn_char" ;;
84
+ esac
85
+ continue
86
+ fi
87
+ case "$dn_char" in
88
+ "'") dn_quote=single; dn_started=1 ;;
89
+ '"') dn_quote=double; dn_started=1 ;;
90
+ '\') dn_escape=plain; dn_started=1 ;;
91
+ ' '|$'\t'|$'\n')
92
+ if ((dn_started)); then dn_words+=("$dn_token"); fi
93
+ dn_token=''; dn_started=0; dn_tilde=0
94
+ ;;
95
+ ';'|'|'|'&'|'('|')')
96
+ dn_words=(); dn_token=''; dn_started=0; dn_tilde=0
97
+ ;;
98
+ '<'|'>') return 1 ;;
99
+ *)
100
+ if ((!dn_started)) && [[ "$dn_char" == '~' ]]; then dn_tilde=1; fi
101
+ dn_token+="$dn_char"; dn_started=1
102
+ ;;
103
+ esac
104
+ done
105
+ [[ -z "$dn_escape" ]] || return 1
106
+ dn_words+=("$dn_token")
107
+ }
108
+
109
+ @PREFIX@_schema() {
110
+ dn_children=(); dn_child_nodes=(); dn_options=(); dn_option_ids=()
111
+ dn_option_values=(); dn_option_actions=(); dn_choices=()
112
+ dn_option_empty=(); dn_option_repeats=(); dn_value_choices=()
113
+ case "$dn_node" in
114
+ @CASES@
115
+ esac
116
+ }
117
+
118
+ @PREFIX@_valid_value() {
119
+ [[ -n "$dn_value" || "@{dn_option_empty[dn_value_match]}" == 1 ]] || return 1
120
+ if ((@{#dn_value_choices[@]} > 0)); then
121
+ for dn_choice in "@{dn_value_choices[@]}"; do
122
+ [[ "$dn_value" != "$dn_choice" ]] || return 0
123
+ done
124
+ return 1
125
+ fi
126
+ return 0
127
+ }
128
+
129
+ @PREFIX@() {
130
+ local LC_ALL=C
131
+ local -a dn_words dn_children dn_child_nodes dn_options dn_option_ids
132
+ local -a dn_option_values dn_option_actions dn_choices
133
+ local -a dn_option_empty dn_option_repeats dn_value_choices
134
+ local dn_node=0 dn_position=0 dn_argument_count=0 dn_count=0 dn_pending=''
135
+ local dn_value_option=-1 dn_value_match=-1 dn_inline=0
136
+ local dn_used='|' dn_tilde dn_current dn_word dn_index dn_match dn_option
137
+ local dn_candidate dn_prefix dn_fragment dn_trim dn_choice
138
+ local dn_name dn_value dn_inline_prefix
139
+ COMPREPLY=()
140
+ compopt +o filenames +o nospace 2>/dev/null || :
141
+ @PREFIX@_words || return 0
142
+ ((@{#dn_words[@]} >= 2)) || return 0
143
+ dn_current="@{dn_words[@{#dn_words[@]}-1]}"
144
+ @PREFIX@_schema
145
+ for ((dn_index=1; dn_index<@{#dn_words[@]}-1; dn_index++)); do
146
+ dn_word="@{dn_words[dn_index]}"
147
+ if [[ -n "$dn_pending" ]]; then
148
+ [[ "$dn_word" != -* ]] || return 0
149
+ dn_value="$dn_word"
150
+ @PREFIX@_valid_value || return 0
151
+ dn_pending=''
152
+ dn_value_option=-1; dn_value_match=-1
153
+ @PREFIX@_schema
154
+ continue
155
+ fi
156
+ dn_name="$dn_word"; dn_inline=0
157
+ if [[ "$dn_word" == -*=* ]]; then dn_name="@{dn_word%%=*}"; dn_inline=1; fi
158
+ dn_match=-1
159
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
160
+ if [[ "$dn_name" == "@{dn_options[dn_option]}" ]]; then dn_match=$dn_option; break; fi
161
+ done
162
+ if ((dn_match >= 0)); then
163
+ [[ "@{dn_option_repeats[dn_match]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_match]}|"* ]] || return 0
164
+ [[ -z "@{dn_option_actions[dn_match]}" ]] || return 0
165
+ dn_used+="@{dn_option_ids[dn_match]}|"
166
+ dn_value_match=$dn_match; dn_value_option="@{dn_option_ids[dn_match]}"
167
+ @PREFIX@_schema
168
+ if ((dn_inline)); then
169
+ [[ "@{dn_option_values[dn_match]}" == text ]] || return 0
170
+ dn_value="@{dn_word#*=}"
171
+ @PREFIX@_valid_value || return 0
172
+ dn_value_option=-1; dn_value_match=-1
173
+ @PREFIX@_schema
174
+ else dn_pending="@{dn_option_values[dn_match]}"; fi
175
+ ((dn_count+=1))
176
+ continue
177
+ fi
178
+ [[ "$dn_word" != -* ]] || return 0
179
+ if ((@{#dn_children[@]} > 0)); then
180
+ dn_match=-1
181
+ for ((dn_option=0; dn_option<@{#dn_children[@]}; dn_option++)); do
182
+ if [[ "$dn_word" == "@{dn_children[dn_option]}" ]]; then dn_match=$dn_option; break; fi
183
+ done
184
+ ((dn_match >= 0)) || return 0
185
+ dn_node="@{dn_child_nodes[dn_match]}"
186
+ dn_position=0; dn_count=0; dn_used='|'
187
+ @PREFIX@_schema
188
+ continue
189
+ fi
190
+ ((dn_position < dn_argument_count)) || return 0
191
+ [[ "$dn_word" == *[!$' \t\n\r']* ]] || return 0
192
+ if ((@{#dn_choices[@]} > 0)); then
193
+ dn_match=0
194
+ for dn_choice in "@{dn_choices[@]}"; do
195
+ if [[ "$dn_word" == "$dn_choice" ]]; then dn_match=1; break; fi
196
+ done
197
+ ((dn_match)) || return 0
198
+ fi
199
+ ((dn_position+=1)); ((dn_count+=1))
200
+ @PREFIX@_schema
201
+ done
202
+ if [[ "$dn_pending" == text ]]; then
203
+ for dn_candidate in "@{dn_value_choices[@]}"; do
204
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
205
+ done
206
+ return 0
207
+ fi
208
+ if [[ "$dn_pending" == directory ]]; then
209
+ [[ "$dn_current" != -* ]] || return 0
210
+ dn_prefix="$dn_current"
211
+ if ((!dn_tilde)) && [[ "$dn_prefix" == '~'* ]]; then dn_prefix="./$dn_prefix"; fi
212
+ dn_fragment="@{COMP_WORDS[COMP_CWORD]}"
213
+ dn_trim=''
214
+ if [[ -n "$dn_fragment" && "$dn_current" == *"$dn_fragment" ]]; then
215
+ dn_trim="@{dn_current%"$dn_fragment"}"
216
+ fi
217
+ while IFS= read -r dn_candidate; do
218
+ if ((!dn_tilde)) && [[ "$dn_current" == '~'* ]]; then dn_candidate="@{dn_candidate#./}"; fi
219
+ if [[ -n "$dn_trim" ]]; then
220
+ # Readline cannot stat the suffix after a word break as the full path.
221
+ [[ "$dn_candidate" == */ ]] || dn_candidate+='/'
222
+ dn_candidate="@{dn_candidate#"$dn_trim"}"
223
+ fi
224
+ COMPREPLY+=("$dn_candidate")
225
+ done < <(compgen -d -- "$dn_prefix")
226
+ compopt -o filenames -o nospace 2>/dev/null || :
227
+ return 0
228
+ fi
229
+ if [[ "$dn_current" == -*=* ]]; then
230
+ dn_name="@{dn_current%%=*}"
231
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
232
+ [[ "$dn_name" == "@{dn_options[dn_option]}" ]] || continue
233
+ [[ "@{dn_option_values[dn_option]}" == text ]] || return 0
234
+ [[ "@{dn_option_repeats[dn_option]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_option]}|"* ]] || return 0
235
+ dn_value_option="@{dn_option_ids[dn_option]}"
236
+ @PREFIX@_schema
237
+ dn_inline_prefix="@{dn_name}="
238
+ dn_current="@{dn_current#*=}"
239
+ dn_fragment="@{COMP_WORDS[COMP_CWORD]}"
240
+ for dn_candidate in "@{dn_value_choices[@]}"; do
241
+ [[ "$dn_candidate" == "$dn_current"* ]] || continue
242
+ if [[ "$dn_fragment" == "$dn_inline_prefix"* ]]; then dn_candidate="$dn_inline_prefix$dn_candidate"; fi
243
+ COMPREPLY+=("$dn_candidate")
244
+ done
245
+ return 0
246
+ done
247
+ return 0
248
+ fi
249
+ for dn_candidate in "@{dn_children[@]}" "@{dn_choices[@]}"; do
250
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
251
+ done
252
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
253
+ [[ "@{dn_option_repeats[dn_option]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_option]}|"* ]] || continue
254
+ [[ -z "@{dn_option_actions[dn_option]}" || "$dn_count" == 0 ]] || continue
255
+ dn_candidate="@{dn_options[dn_option]}"
256
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
257
+ done
258
+ return 0
259
+ }
260
+
261
+ complete -F @PREFIX@ @COMMAND@
262
+ `;
263
+ export const renderBashCompletion = (root) => {
264
+ const prefix = `_${root.name.replaceAll(/[^a-zA-Z0-9_]/g, "_")}_completion`;
265
+ return `# Bash >=4.2 completion for ${root.name.replaceAll(/[\r\n]/g, " ")}
266
+ if [[ -z "\${BASH_VERSION-}" ]] || (( BASH_VERSINFO[0] < 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] < 2) )); then
267
+ printf '%s\\n' 'daynight completion requires Bash >=4.2.' >&2
268
+ return 1 2>/dev/null || exit 1
269
+ fi
270
+ ${runtime.replaceAll("@{", "${").replaceAll("@PREFIX@", prefix).replace("@COMMAND@", () => shellQuote(root.name)).replace("@CASES@", () => commandCases(root))}`;
271
+ };
272
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/commands/completion/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CliContext } from "../../cli/context.js";
2
+ export declare const runCompletionCommand: (args: readonly string[], context: CliContext) => Promise<void>;
@@ -0,0 +1,20 @@
1
+ import { commandTree } from "../../cli/commands.js";
2
+ import { parseCommand, renderCommandHelp } from "../../cli/schema.js";
3
+ import { completionDefinition } from "./definition.js";
4
+ import { renderBashCompletion } from "./bash.js";
5
+ import { renderZshCompletion } from "./zsh.js";
6
+ export const runCompletionCommand = async (args, context) => {
7
+ const commandPath = [commandTree.name, completionDefinition.name];
8
+ if (args.length === 0) {
9
+ context.stdout(renderCommandHelp(completionDefinition, commandPath));
10
+ return;
11
+ }
12
+ const parsed = parseCommand(completionDefinition, args, commandPath);
13
+ if (parsed.kind !== "run") {
14
+ context.stdout(renderCommandHelp(completionDefinition, commandPath));
15
+ return;
16
+ }
17
+ const render = parsed.values[0] === "bash" ? renderBashCompletion : renderZshCompletion;
18
+ context.stdout(render(commandTree));
19
+ };
20
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/completion/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAuB,EAAE,OAAmB,EAAiB,EAAE;IACxG,MAAM,WAAW,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,oBAAoB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACxF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandDefinition } from "../../cli/schema.js";
2
+ export declare const completionDefinition: CommandDefinition;
@@ -0,0 +1,8 @@
1
+ export const completionDefinition = {
2
+ name: "completion",
3
+ description: "Generate shell completion for Bash or zsh",
4
+ arguments: [{ name: "shell", description: "Shell to generate completion for (bash or zsh)", choices: ["bash", "zsh"] }],
5
+ options: [{ names: ["-h", "--help"], description: "Show this help", action: "help" }],
6
+ details: "Bash >=4.2: add source <(daynight completion bash) to ~/.bashrc.\nzsh: add source <(daynight completion zsh) after compinit in ~/.zshrc.\nReload the script in existing shells after updating daynight.",
7
+ };
8
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/completion/definition.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,2CAA2C;IACxD,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gDAAgD,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACvH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrF,OAAO,EAAE,yMAAyM;CACnN,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandDefinition } from "../../cli/schema.js";
2
+ export declare const renderZshCompletion: (root: CommandDefinition) => string;
@@ -0,0 +1,136 @@
1
+ const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
2
+ const escapeSpecification = (value) => value.replaceAll(/([\\\[\]:])/g, "\\$1");
3
+ const escapeDescription = (value) => value.replaceAll(/([\\:])/g, "\\$1");
4
+ const optionSpecifications = (option) => {
5
+ const exclusions = option.action === undefined ? option.names.map(escapeSpecification).join(" ") : "- *";
6
+ const action = option.value?.choices === undefined ? "->text_value" : `(${option.value.choices.map(quote).join(" ")})`;
7
+ const value = option.value === undefined
8
+ ? ""
9
+ : `:${escapeSpecification(option.value.name)}:${option.value.kind === "directory" ? "_files -/" : action}`;
10
+ return option.names.map((name) => `${option.repeatable === true ? "*" : `(${exclusions})`}${escapeSpecification(name)}${option.value?.kind === "text" ? "=" : ""}[${escapeSpecification(option.description)}]${value}`);
11
+ };
12
+ const valueValidation = (option, variable, indentation) => [
13
+ option.value?.allowEmpty === true ? "" : `${indentation}[[ -n "$${variable}" ]] || return 1`,
14
+ option.value?.choices === undefined ? "" : `${indentation}case "$${variable}" in\n${indentation} ${option.value.choices.map(quote).join("|")}) ;;\n${indentation} *) return 1 ;;\n${indentation}esac`,
15
+ ].filter((line) => line !== "").join("\n");
16
+ // _arguments tolerates unknown options and excess positionals; completion must retain the CLI's grammar.
17
+ const renderPrefixValidation = (command) => {
18
+ if (command.commands !== undefined) {
19
+ const names = command.commands.flatMap((child) => [child.name, ...(child.aliases ?? [])]);
20
+ return ` if (( CURRENT > 2 )); then
21
+ case "\${(Q)words[2]}" in
22
+ ${names.map(quote).join("|")}) ;;
23
+ *) return 1 ;;
24
+ esac
25
+ fi
26
+ `;
27
+ }
28
+ const options = command.options?.filter((option) => option.action === undefined) ?? [];
29
+ const arguments_ = command.arguments ?? [];
30
+ return ` local word option_value
31
+ local positional_count=0 expecting_value=0${options.map((_, index) => ` option_${index}=0`).join("")}
32
+ if (( CURRENT > 2 )); then
33
+ for word in "\${(@)words[2,CURRENT-1]}"; do
34
+ word="\${(Q)word}"
35
+ if (( expecting_value )); then
36
+ [[ "$word" == -* ]] && return 1
37
+ case "$expecting_value" in
38
+ ${options.flatMap((option, index) => option.value === undefined ? [] : [` ${index + 1})
39
+ ${valueValidation(option, "word", " ")}
40
+ ;;`]).join("\n")}
41
+ esac
42
+ expecting_value=0
43
+ continue
44
+ fi
45
+ case "$word" in
46
+ ${options.map((option, index) => ` ${option.names.flatMap((name) => [quote(name), ...(option.value?.kind === "text" ? [`${quote(`${name}=`)}*`] : [])]).join("|")})
47
+ ${option.repeatable === true ? "" : ` (( option_${index} )) && return 1\n`} option_${index}=1${option.value === undefined ? "" : `
48
+ if [[ "$word" == *=* ]]; then
49
+ option_value="\${word#*=}"
50
+ ${valueValidation(option, "option_value", " ")}
51
+ else expecting_value=${index + 1}; fi`}
52
+ ;;`).join("\n")}
53
+ -*) return 1 ;;
54
+ *)
55
+ ${arguments_.length === 0 ? " return 1" : ` case "$positional_count" in\n${arguments_.map((argument, index) => ` ${index})${argument.choices === undefined ? " ;;" : `\n case "$word" in\n ${argument.choices.map(quote).join("|")}) ;;\n *) return 1 ;;\n esac\n ;;`}`).join("\n")}\n *) return 1 ;;\n esac\n (( positional_count++ ))`}
56
+ ;;
57
+ esac
58
+ done
59
+ fi
60
+ `;
61
+ };
62
+ export const renderZshCompletion = (root) => {
63
+ const functions = [];
64
+ let nextIdentifier = 0;
65
+ const renderCommand = (command) => {
66
+ const functionName = `_daynight_command_${nextIdentifier++}`;
67
+ const children = command.commands?.map((child) => ({ command: child, functionName: renderCommand(child) })) ?? [];
68
+ const specifications = command.options?.filter((option) => option.action === undefined).flatMap(optionSpecifications) ?? [];
69
+ const informationOptions = command.options?.filter((option) => option.action !== undefined).flatMap(optionSpecifications) ?? [];
70
+ const states = [];
71
+ if (command.options?.some((option) => option.value?.kind === "text") === true) {
72
+ states.push(` text_value)
73
+ _message "$state_descr"
74
+ return 0
75
+ ;;`);
76
+ }
77
+ if (children.length !== 0) {
78
+ specifications.push("1:command:->command", "*::arguments:->arguments");
79
+ const descriptions = children.flatMap(({ command: child }) => [child.name, ...(child.aliases ?? [])]
80
+ .map((name) => quote(`${escapeDescription(name)}:${escapeDescription(child.description)}`)));
81
+ states.push(` command)
82
+ local -a commands=(
83
+ ${descriptions.map((description) => ` ${description}`).join("\n")}
84
+ )
85
+ _describe 'command' commands && result=0
86
+ ;;`, ` arguments)
87
+ case "\${(Q)line[1]}" in
88
+ ${children.map(({ command: child, functionName: childFunction }) => ` ${[child.name, ...(child.aliases ?? [])].map(quote).join("|")}) ${childFunction} && result=0 ;;`).join("\n")}
89
+ esac
90
+ ;;`);
91
+ }
92
+ else {
93
+ for (const [index, argument] of (command.arguments ?? []).entries()) {
94
+ const state = `argument_${index + 1}`;
95
+ specifications.push(`${index + 1}:${escapeSpecification(argument.description)}:->${state}`);
96
+ if (argument.choices !== undefined) {
97
+ states.push(` ${state})
98
+ local -a choices=( ${argument.choices.map((choice) => quote(escapeDescription(choice))).join(" ")} )
99
+ _describe ${quote(argument.name)} choices && result=0
100
+ ;;`);
101
+ }
102
+ }
103
+ }
104
+ functions.push(`${functionName}() {
105
+ local curcontext="$curcontext" state state_descr
106
+ local -a line
107
+ local -A opt_args
108
+ local result=1
109
+ ${renderPrefixValidation(command).trimEnd()}
110
+ local -a specifications=(
111
+ ${specifications.map((specification) => ` ${quote(specification)}`).join("\n")}
112
+ )
113
+ ${informationOptions.length === 0 ? "" : ` if (( CURRENT == 2 )); then\n specifications+=( ${informationOptions.map(quote).join(" ")} )\n fi\n`} (( $#specifications )) && _arguments -C "\${specifications[@]}" && result=0
114
+ ${states.length === 0 ? "" : ` case "$state" in\n${states.join("\n")}\n esac\n`} return result
115
+ }`);
116
+ return functionName;
117
+ };
118
+ const rootFunction = renderCommand(root);
119
+ return `# Native zsh completion generated by daynight.
120
+ if (( ! $+functions[compdef] )); then
121
+ print -u2 -r -- ${quote(`${root.name}: initialize zsh completion with 'autoload -Uz compinit; compinit' before sourcing this script.`)}
122
+ return 1
123
+ fi
124
+
125
+ ${functions.join("\n\n")}
126
+
127
+ _daynight() {
128
+ local -a completion_words=( "\${(@)words[1,CURRENT]}" )
129
+ local -a words=( "\${completion_words[@]}" )
130
+ ${rootFunction}
131
+ }
132
+
133
+ compdef _daynight ${quote(root.name)}
134
+ `;
135
+ };
136
+ //# sourceMappingURL=zsh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zsh.js","sourceRoot":"","sources":["../../../src/commands/completion/zsh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CliContext } from "../../cli/context.js";
2
+ import type { runServerCommand } from "../server/runtime.js";
3
+ export type ProjectCommandDependencies = {
4
+ runServerCommand: typeof runServerCommand;
5
+ };
6
+ export declare const runProjectCommand: (args: readonly string[], context: CliContext, dependencies?: ProjectCommandDependencies) => Promise<void>;
@@ -0,0 +1,39 @@
1
+ import { UsageError } from "../../cli/context.js";
2
+ import { parseCommand, renderCommandHelp } from "../../cli/schema.js";
3
+ import { isNonemptyText } from "../../platform/text.js";
4
+ import { projectDefinition } from "./definition.js";
5
+ const defaultDependencies = {
6
+ runServerCommand: async (...args) => (await import("../server/runtime.js")).runServerCommand(...args),
7
+ };
8
+ export const runProjectCommand = async (args, context, dependencies = defaultDependencies) => {
9
+ const command = parseCommand(projectDefinition, args, ["daynight", "project"], "daynight project --help");
10
+ if (command.kind !== "run") {
11
+ context.stdout(renderCommandHelp(command.command, command.path));
12
+ return;
13
+ }
14
+ const name = command.options.get("--name");
15
+ if (name !== undefined && !isNonemptyText(name)) {
16
+ throw new UsageError("Project name must be nonempty UTF-8 text without NUL characters.", "daynight project create --help");
17
+ }
18
+ let projectId;
19
+ if (command.command.name === "show") {
20
+ const { canonicalId } = await import("../../api/parse.js");
21
+ projectId = canonicalId(command.values[0]) ?? undefined;
22
+ if (projectId === undefined)
23
+ throw new UsageError("project-id must be a hyphenated UUID.", "daynight project show --help");
24
+ }
25
+ await dependencies.runServerCommand(context, async ({ api }) => {
26
+ const { renderProject, renderProjectJson, renderProjectList } = await import("./rendering.js");
27
+ if (command.command.name === "create") {
28
+ const project = await api.createProject({ name: name, repoUrl: command.options.get("--repo") });
29
+ return `Project created.\n${renderProject(project)}`;
30
+ }
31
+ if (command.command.name === "list") {
32
+ const projects = await api.listProjects();
33
+ return command.options.has("--json") ? renderProjectJson(projects) : renderProjectList(projects);
34
+ }
35
+ const project = await api.getProject(projectId);
36
+ return command.options.has("--json") ? renderProjectJson(project) : renderProject(project);
37
+ });
38
+ };
39
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/project/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CommandDefinition } from "../../cli/schema.js";
2
+ export declare const projectDefinition: CommandDefinition;
@@ -0,0 +1,34 @@
1
+ const helpOption = { names: ["-h", "--help"], description: "Show this help", action: "help" };
2
+ const jsonOption = { names: ["--json"], description: "Print the complete API resource data as JSON" };
3
+ export const projectDefinition = {
4
+ name: "project",
5
+ description: "Create and query projects on the configured server",
6
+ commands: [
7
+ {
8
+ name: "create",
9
+ description: "Create a project with its name and repository address",
10
+ options: [
11
+ { names: ["--name"], description: "Project name", value: { name: "name", kind: "text" }, required: true },
12
+ { names: ["--repo"], description: "Repository address to register", value: { name: "repo", kind: "text" }, required: true },
13
+ helpOption,
14
+ ],
15
+ details: "Submit the original name and repository address to the configured server.\nProject creation does not depend on the current Git repository.",
16
+ },
17
+ {
18
+ name: "list",
19
+ description: "List all projects on the configured server",
20
+ options: [jsonOption, helpOption],
21
+ details: "Read every project page before printing the complete result.\n--json prints one array containing all projects.",
22
+ },
23
+ {
24
+ name: "show",
25
+ description: "Show a project by its ID",
26
+ arguments: [{ name: "project-id", description: "Project UUID" }],
27
+ options: [jsonOption, helpOption],
28
+ details: "Read a project by its explicit ID, including outside a Git repository.\n--json prints the complete project object.",
29
+ },
30
+ ],
31
+ options: [helpOption],
32
+ details: "Server: serverUrl in ~/.daynight/config.yml\nRun daynight project <command> --help for command usage.",
33
+ };
34
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/project/definition.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAkB,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC7G,MAAM,UAAU,GAAkB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AAErH,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,oDAAoD;IACjE,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uDAAuD;YACpE,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACzG,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC3H,UAAU;aACX;YACD,OAAO,EAAE,4IAA4I;SACtJ;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4CAA4C;YACzD,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YACjC,OAAO,EAAE,gHAAgH;SAC1H;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,0BAA0B;YACvC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;YAChE,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YACjC,OAAO,EAAE,oHAAoH;SAC9H;KACF;IACD,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,OAAO,EAAE,uGAAuG;CACjH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Project } from "../../api/types.js";
2
+ export declare const renderProject: (project: Project) => string;
3
+ export declare const renderProjectList: (projects: readonly Project[]) => string;
4
+ export declare const renderProjectJson: (value: Project | readonly Project[]) => string;
@@ -0,0 +1,17 @@
1
+ import { stringifyApiJson } from "../../api/json.js";
2
+ import { terminalText } from "../../platform/terminal.js";
3
+ export const renderProject = (project) => [
4
+ `ID: ${terminalText(project.id)}`,
5
+ `Name: ${terminalText(project.name)}`,
6
+ `Repository: ${terminalText(project.repoUrl)}`,
7
+ `Created: ${terminalText(project.createdAt)}`,
8
+ `Updated: ${terminalText(project.updatedAt)}`,
9
+ "",
10
+ ].join("\n");
11
+ export const renderProjectList = (projects) => {
12
+ if (projects.length === 0)
13
+ return "No projects.\n";
14
+ return projects.map(renderProject).join("\n");
15
+ };
16
+ export const renderProjectJson = (value) => `${stringifyApiJson(value)}\n`;
17
+ //# sourceMappingURL=rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../src/commands/project/rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAU,EAAE,CAAC;IACzD,OAAO,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;IACjC,SAAS,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;IACrC,eAAe,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IAC9C,YAAY,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;IAC7C,YAAY,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;IAC7C,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAA4B,EAAU,EAAE;IACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACnD,OAAO,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAmC,EAAU,EAAE,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC"}