@codetreker/daynight 0.3.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +53 -0
  25. package/dist/cli/schema.js +113 -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 +279 -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 +165 -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 +35 -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 +16 -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,279 @@
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
+ dn_allow_terminator=${node.allowOptionsTerminator === true ? 1 : 0}
48
+ case "$dn_position" in
49
+ ${choices.join("\n")}
50
+ esac
51
+ case "$dn_value_option" in
52
+ ${valueChoices.join("\n")}
53
+ esac
54
+ ;;`);
55
+ }
56
+ return cases.join("\n");
57
+ };
58
+ // COMP_POINT counts bytes. The local C locale keeps substring offsets aligned
59
+ // while the arrays retain the original bytes of quoted and Unicode arguments.
60
+ const runtime = String.raw `
61
+ @PREFIX@_words() {
62
+ local dn_index dn_char dn_token='' dn_quote='' dn_escape=''
63
+ local dn_started=0
64
+ dn_words=()
65
+ dn_tilde=0
66
+ for ((dn_index=0; dn_index<COMP_POINT; dn_index++)); do
67
+ dn_char="@{COMP_LINE:dn_index:1}"
68
+ if [[ -n "$dn_escape" ]]; then
69
+ if [[ "$dn_escape" == double && "$dn_char" != '$' && "$dn_char" != '\' && "$dn_char" != '"' && "$dn_char" != $'\x60' && "$dn_char" != $'\n' ]]; then
70
+ dn_token+='\'
71
+ fi
72
+ [[ "$dn_char" == $'\n' ]] || dn_token+="$dn_char"
73
+ dn_escape=''
74
+ continue
75
+ fi
76
+ if [[ "$dn_quote" == single ]]; then
77
+ if [[ "$dn_char" == "'" ]]; then dn_quote=''; else dn_token+="$dn_char"; fi
78
+ continue
79
+ fi
80
+ if [[ "$dn_quote" == double ]]; then
81
+ case "$dn_char" in
82
+ '"') dn_quote='' ;;
83
+ '\') dn_escape=double ;;
84
+ *) dn_token+="$dn_char" ;;
85
+ esac
86
+ continue
87
+ fi
88
+ case "$dn_char" in
89
+ "'") dn_quote=single; dn_started=1 ;;
90
+ '"') dn_quote=double; dn_started=1 ;;
91
+ '\') dn_escape=plain; dn_started=1 ;;
92
+ ' '|$'\t'|$'\n')
93
+ if ((dn_started)); then dn_words+=("$dn_token"); fi
94
+ dn_token=''; dn_started=0; dn_tilde=0
95
+ ;;
96
+ ';'|'|'|'&'|'('|')')
97
+ dn_words=(); dn_token=''; dn_started=0; dn_tilde=0
98
+ ;;
99
+ '<'|'>') return 1 ;;
100
+ *)
101
+ if ((!dn_started)) && [[ "$dn_char" == '~' ]]; then dn_tilde=1; fi
102
+ dn_token+="$dn_char"; dn_started=1
103
+ ;;
104
+ esac
105
+ done
106
+ [[ -z "$dn_escape" ]] || return 1
107
+ dn_words+=("$dn_token")
108
+ }
109
+
110
+ @PREFIX@_schema() {
111
+ dn_children=(); dn_child_nodes=(); dn_options=(); dn_option_ids=()
112
+ dn_option_values=(); dn_option_actions=(); dn_choices=()
113
+ dn_option_empty=(); dn_option_repeats=(); dn_value_choices=()
114
+ case "$dn_node" in
115
+ @CASES@
116
+ esac
117
+ }
118
+
119
+ @PREFIX@_valid_value() {
120
+ [[ -n "$dn_value" || "@{dn_option_empty[dn_value_match]}" == 1 ]] || return 1
121
+ if ((@{#dn_value_choices[@]} > 0)); then
122
+ for dn_choice in "@{dn_value_choices[@]}"; do
123
+ [[ "$dn_value" != "$dn_choice" ]] || return 0
124
+ done
125
+ return 1
126
+ fi
127
+ return 0
128
+ }
129
+
130
+ @PREFIX@() {
131
+ local LC_ALL=C
132
+ local -a dn_words dn_children dn_child_nodes dn_options dn_option_ids
133
+ local -a dn_option_values dn_option_actions dn_choices
134
+ local -a dn_option_empty dn_option_repeats dn_value_choices
135
+ local dn_node=0 dn_position=0 dn_argument_count=0 dn_count=0 dn_pending=''
136
+ local dn_value_option=-1 dn_value_match=-1 dn_inline=0 dn_options_terminated=0 dn_allow_terminator=0
137
+ local dn_used='|' dn_tilde dn_current dn_word dn_index dn_match dn_option
138
+ local dn_candidate dn_prefix dn_fragment dn_trim dn_choice
139
+ local dn_name dn_value dn_inline_prefix
140
+ COMPREPLY=()
141
+ compopt +o filenames +o nospace 2>/dev/null || :
142
+ @PREFIX@_words || return 0
143
+ ((@{#dn_words[@]} >= 2)) || return 0
144
+ dn_current="@{dn_words[@{#dn_words[@]}-1]}"
145
+ @PREFIX@_schema
146
+ for ((dn_index=1; dn_index<@{#dn_words[@]}-1; dn_index++)); do
147
+ dn_word="@{dn_words[dn_index]}"
148
+ if [[ -n "$dn_pending" ]]; then
149
+ [[ "$dn_word" != -* ]] || return 0
150
+ dn_value="$dn_word"
151
+ @PREFIX@_valid_value || return 0
152
+ dn_pending=''
153
+ dn_value_option=-1; dn_value_match=-1
154
+ @PREFIX@_schema
155
+ continue
156
+ fi
157
+ if ((!dn_options_terminated && dn_allow_terminator)) && [[ "$dn_word" == -- ]]; then
158
+ dn_options_terminated=1
159
+ ((dn_count+=1))
160
+ continue
161
+ fi
162
+ dn_name="$dn_word"; dn_inline=0
163
+ if [[ "$dn_word" == -*=* ]]; then dn_name="@{dn_word%%=*}"; dn_inline=1; fi
164
+ dn_match=-1
165
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
166
+ if ((!dn_options_terminated)) && [[ "$dn_name" == "@{dn_options[dn_option]}" ]]; then dn_match=$dn_option; break; fi
167
+ done
168
+ if ((dn_match >= 0)); then
169
+ [[ "@{dn_option_repeats[dn_match]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_match]}|"* ]] || return 0
170
+ [[ -z "@{dn_option_actions[dn_match]}" ]] || return 0
171
+ dn_used+="@{dn_option_ids[dn_match]}|"
172
+ dn_value_match=$dn_match; dn_value_option="@{dn_option_ids[dn_match]}"
173
+ @PREFIX@_schema
174
+ if ((dn_inline)); then
175
+ [[ "@{dn_option_values[dn_match]}" == text ]] || return 0
176
+ dn_value="@{dn_word#*=}"
177
+ @PREFIX@_valid_value || return 0
178
+ dn_value_option=-1; dn_value_match=-1
179
+ @PREFIX@_schema
180
+ else dn_pending="@{dn_option_values[dn_match]}"; fi
181
+ ((dn_count+=1))
182
+ continue
183
+ fi
184
+ ((dn_options_terminated)) || [[ "$dn_word" != -* ]] || return 0
185
+ if ((@{#dn_children[@]} > 0)); then
186
+ dn_match=-1
187
+ for ((dn_option=0; dn_option<@{#dn_children[@]}; dn_option++)); do
188
+ if [[ "$dn_word" == "@{dn_children[dn_option]}" ]]; then dn_match=$dn_option; break; fi
189
+ done
190
+ ((dn_match >= 0)) || return 0
191
+ dn_node="@{dn_child_nodes[dn_match]}"
192
+ dn_position=0; dn_count=0; dn_used='|'
193
+ @PREFIX@_schema
194
+ continue
195
+ fi
196
+ ((dn_position < dn_argument_count)) || return 0
197
+ [[ -n "$dn_word" ]] || return 0
198
+ if ((@{#dn_choices[@]} > 0)); then
199
+ dn_match=0
200
+ for dn_choice in "@{dn_choices[@]}"; do
201
+ if [[ "$dn_word" == "$dn_choice" ]]; then dn_match=1; break; fi
202
+ done
203
+ ((dn_match)) || return 0
204
+ fi
205
+ ((dn_position+=1)); ((dn_count+=1))
206
+ @PREFIX@_schema
207
+ done
208
+ if [[ "$dn_pending" == text ]]; then
209
+ for dn_candidate in "@{dn_value_choices[@]}"; do
210
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
211
+ done
212
+ return 0
213
+ fi
214
+ if [[ "$dn_pending" == directory ]]; then
215
+ [[ "$dn_current" != -* ]] || return 0
216
+ dn_prefix="$dn_current"
217
+ if ((!dn_tilde)) && [[ "$dn_prefix" == '~'* ]]; then dn_prefix="./$dn_prefix"; fi
218
+ dn_fragment="@{COMP_WORDS[COMP_CWORD]}"
219
+ dn_trim=''
220
+ if [[ -n "$dn_fragment" && "$dn_current" == *"$dn_fragment" ]]; then
221
+ dn_trim="@{dn_current%"$dn_fragment"}"
222
+ fi
223
+ while IFS= read -r dn_candidate; do
224
+ if ((!dn_tilde)) && [[ "$dn_current" == '~'* ]]; then dn_candidate="@{dn_candidate#./}"; fi
225
+ if [[ -n "$dn_trim" ]]; then
226
+ # Readline cannot stat the suffix after a word break as the full path.
227
+ [[ "$dn_candidate" == */ ]] || dn_candidate+='/'
228
+ dn_candidate="@{dn_candidate#"$dn_trim"}"
229
+ fi
230
+ COMPREPLY+=("$dn_candidate")
231
+ done < <(compgen -d -- "$dn_prefix")
232
+ compopt -o filenames -o nospace 2>/dev/null || :
233
+ return 0
234
+ fi
235
+ if ((!dn_options_terminated)) && [[ "$dn_current" == -*=* ]]; then
236
+ dn_name="@{dn_current%%=*}"
237
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
238
+ [[ "$dn_name" == "@{dn_options[dn_option]}" ]] || continue
239
+ [[ "@{dn_option_values[dn_option]}" == text ]] || return 0
240
+ [[ "@{dn_option_repeats[dn_option]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_option]}|"* ]] || return 0
241
+ dn_value_option="@{dn_option_ids[dn_option]}"
242
+ @PREFIX@_schema
243
+ dn_inline_prefix="@{dn_name}="
244
+ dn_current="@{dn_current#*=}"
245
+ dn_fragment="@{COMP_WORDS[COMP_CWORD]}"
246
+ for dn_candidate in "@{dn_value_choices[@]}"; do
247
+ [[ "$dn_candidate" == "$dn_current"* ]] || continue
248
+ if [[ "$dn_fragment" == "$dn_inline_prefix"* ]]; then dn_candidate="$dn_inline_prefix$dn_candidate"; fi
249
+ COMPREPLY+=("$dn_candidate")
250
+ done
251
+ return 0
252
+ done
253
+ return 0
254
+ fi
255
+ for dn_candidate in "@{dn_children[@]}" "@{dn_choices[@]}"; do
256
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
257
+ done
258
+ ((dn_options_terminated)) && return 0
259
+ for ((dn_option=0; dn_option<@{#dn_options[@]}; dn_option++)); do
260
+ [[ "@{dn_option_repeats[dn_option]}" == 1 || "$dn_used" != *"|@{dn_option_ids[dn_option]}|"* ]] || continue
261
+ [[ -z "@{dn_option_actions[dn_option]}" || "$dn_count" == 0 ]] || continue
262
+ dn_candidate="@{dn_options[dn_option]}"
263
+ [[ "$dn_candidate" == "$dn_current"* ]] && COMPREPLY+=("$dn_candidate")
264
+ done
265
+ return 0
266
+ }
267
+
268
+ complete -F @PREFIX@ @COMMAND@
269
+ `;
270
+ export const renderBashCompletion = (root) => {
271
+ const prefix = `_${root.name.replaceAll(/[^a-zA-Z0-9_]/g, "_")}_completion`;
272
+ return `# Bash >=4.2 completion for ${root.name.replaceAll(/[\r\n]/g, " ")}
273
+ if [[ -z "\${BASH_VERSION-}" ]] || (( BASH_VERSINFO[0] < 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] < 2) )); then
274
+ printf '%s\\n' 'daynight completion requires Bash >=4.2.' >&2
275
+ return 1 2>/dev/null || exit 1
276
+ fi
277
+ ${runtime.replaceAll("@{", "${").replaceAll("@PREFIX@", prefix).replace("@COMMAND@", () => shellQuote(root.name)).replace("@CASES@", () => commandCases(root))}`;
278
+ };
279
+ //# 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,165 @@
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
+ const positionalValidation = arguments_.length === 0 ? " return 1" : ` [[ -n "$word" ]] || return 1
31
+ case "$positional_count" in
32
+ ${arguments_.map((argument, index) => ` ${index})${argument.choices === undefined ? " ;;" : `
33
+ case "$word" in
34
+ ${argument.choices.map(quote).join("|")}) ;;
35
+ *) return 1 ;;
36
+ esac
37
+ ;;`}`).join("\n")}
38
+ *) return 1 ;;
39
+ esac
40
+ (( positional_count++ ))`;
41
+ return ` local word option_value
42
+ local positional_count=0 expecting_value=0 options_terminated=0${options.map((_, index) => ` option_${index}=0`).join("")}
43
+ if (( CURRENT > 2 )); then
44
+ for word in "\${(@)words[2,CURRENT-1]}"; do
45
+ word="\${(Q)word}"
46
+ if (( expecting_value )); then
47
+ [[ "$word" == -* ]] && return 1
48
+ case "$expecting_value" in
49
+ ${options.flatMap((option, index) => option.value === undefined ? [] : [` ${index + 1})
50
+ ${valueValidation(option, "word", " ")}
51
+ ;;`]).join("\n")}
52
+ esac
53
+ expecting_value=0
54
+ continue
55
+ fi
56
+ ${command.allowOptionsTerminator === true ? ` if (( options_terminated )); then
57
+ ${positionalValidation}
58
+ continue
59
+ fi
60
+ if [[ "$word" == -- ]]; then
61
+ options_terminated=1
62
+ continue
63
+ fi
64
+ ` : ""} case "$word" in
65
+ ${options.map((option, index) => ` ${option.names.flatMap((name) => [quote(name), ...(option.value?.kind === "text" ? [`${quote(`${name}=`)}*`] : [])]).join("|")})
66
+ ${option.repeatable === true ? "" : ` (( option_${index} )) && return 1\n`} option_${index}=1${option.value === undefined ? "" : `
67
+ if [[ "$word" == *=* ]]; then
68
+ option_value="\${word#*=}"
69
+ ${valueValidation(option, "option_value", " ")}
70
+ else expecting_value=${index + 1}; fi`}
71
+ ;;`).join("\n")}
72
+ -*) return 1 ;;
73
+ *)
74
+ ${positionalValidation}
75
+ ;;
76
+ esac
77
+ done
78
+ fi
79
+ `;
80
+ };
81
+ export const renderZshCompletion = (root) => {
82
+ const functions = [];
83
+ let nextIdentifier = 0;
84
+ const renderCommand = (command) => {
85
+ const functionName = `_daynight_command_${nextIdentifier++}`;
86
+ const children = command.commands?.map((child) => ({ command: child, functionName: renderCommand(child) })) ?? [];
87
+ const specifications = command.options?.filter((option) => option.action === undefined).flatMap(optionSpecifications) ?? [];
88
+ const informationOptions = command.options?.filter((option) => option.action !== undefined).flatMap(optionSpecifications) ?? [];
89
+ const states = [];
90
+ const freeformSpecifications = [];
91
+ if (command.options?.some((option) => option.value?.kind === "text") === true) {
92
+ states.push(` text_value)
93
+ _message "$state_descr"
94
+ return 0
95
+ ;;`);
96
+ }
97
+ if (children.length !== 0) {
98
+ specifications.push("1:command:->command", "*::arguments:->arguments");
99
+ const descriptions = children.flatMap(({ command: child }) => [child.name, ...(child.aliases ?? [])]
100
+ .map((name) => quote(`${escapeDescription(name)}:${escapeDescription(child.description)}`)));
101
+ states.push(` command)
102
+ local -a commands=(
103
+ ${descriptions.map((description) => ` ${description}`).join("\n")}
104
+ )
105
+ _describe 'command' commands && result=0
106
+ ;;`, ` arguments)
107
+ case "\${(Q)line[1]}" in
108
+ ${children.map(({ command: child, functionName: childFunction }) => ` ${[child.name, ...(child.aliases ?? [])].map(quote).join("|")}) ${childFunction} && result=0 ;;`).join("\n")}
109
+ esac
110
+ ;;`);
111
+ }
112
+ else {
113
+ for (const [index, argument] of (command.arguments ?? []).entries()) {
114
+ const state = `argument_${index + 1}`;
115
+ const specification = `${index + 1}:${escapeSpecification(argument.description)}:->${state}`;
116
+ if (argument.choices === undefined) {
117
+ // zsh hides options beside a positional state unless the option prefix is present.
118
+ // An unstarted free-form value has no candidates, so omit its state until needed.
119
+ // https://zsh.sourceforge.io/Doc/Release/Completion-System.html (prefix-needed)
120
+ freeformSpecifications.push(` if (( positional_count > ${index} || expecting_value )) || [[ -n "\${(Q)words[CURRENT]}" ]]; then
121
+ specifications+=( ${quote(specification)} )
122
+ fi`);
123
+ }
124
+ else {
125
+ specifications.push(specification);
126
+ states.push(` ${state})
127
+ local -a choices=( ${argument.choices.map((choice) => quote(escapeDescription(choice))).join(" ")} )
128
+ _describe ${quote(argument.name)} choices && result=0
129
+ ;;`);
130
+ }
131
+ }
132
+ }
133
+ functions.push(`${functionName}() {
134
+ local curcontext="$curcontext" state state_descr
135
+ local -a line
136
+ local -A opt_args
137
+ local result=1
138
+ ${renderPrefixValidation(command).trimEnd()}
139
+ local -a specifications=(
140
+ ${specifications.map((specification) => ` ${quote(specification)}`).join("\n")}
141
+ )
142
+ ${freeformSpecifications.length === 0 ? "" : `${freeformSpecifications.join("\n")}\n`}${informationOptions.length === 0 ? "" : ` if (( CURRENT == 2 )); then\n specifications+=( ${informationOptions.map(quote).join(" ")} )\n fi\n`} (( $#specifications )) && _arguments -C${command.allowOptionsTerminator === true ? " -S" : ""} "\${specifications[@]}" && result=0
143
+ ${states.length === 0 ? "" : ` case "$state" in\n${states.join("\n")}\n esac\n`} return result
144
+ }`);
145
+ return functionName;
146
+ };
147
+ const rootFunction = renderCommand(root);
148
+ return `# Native zsh completion generated by daynight.
149
+ if (( ! $+functions[compdef] )); then
150
+ print -u2 -r -- ${quote(`${root.name}: initialize zsh completion with 'autoload -Uz compinit; compinit' before sourcing this script.`)}
151
+ return 1
152
+ fi
153
+
154
+ ${functions.join("\n\n")}
155
+
156
+ _daynight() {
157
+ local -a completion_words=( "\${(@)words[1,CURRENT]}" )
158
+ local -a words=( "\${completion_words[@]}" )
159
+ ${rootFunction}
160
+ }
161
+
162
+ compdef _daynight ${quote(root.name)}
163
+ `;
164
+ };
165
+ //# 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.command.name === "create" ? command.values[0] : undefined;
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,35 @@
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
+ arguments: [{ name: "name", description: "Project name" }],
11
+ allowOptionsTerminator: true,
12
+ options: [
13
+ { names: ["--repo"], description: "Repository address to register", value: { name: "repo", kind: "text" }, required: true },
14
+ helpOption,
15
+ ],
16
+ details: "Submit the original name and repository address to the configured server.\nProject creation does not depend on the current Git repository.\nFor a name beginning with a dash, put options first and use -- before the name.",
17
+ },
18
+ {
19
+ name: "list",
20
+ description: "List all projects on the configured server",
21
+ options: [jsonOption, helpOption],
22
+ details: "Read every project page before printing the complete result.\n--json prints one array containing all projects.",
23
+ },
24
+ {
25
+ name: "show",
26
+ description: "Show a project by its ID",
27
+ arguments: [{ name: "project-id", description: "Project UUID" }],
28
+ options: [jsonOption, helpOption],
29
+ details: "Read a project by its explicit ID, including outside a Git repository.\n--json prints the complete project object.",
30
+ },
31
+ ],
32
+ options: [helpOption],
33
+ details: "Server: serverUrl in ~/.daynight/config.yml\nRun daynight project <command> --help for command usage.",
34
+ };
35
+ //# 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,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;YAC1D,sBAAsB,EAAE,IAAI;YAC5B,OAAO,EAAE;gBACP,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,6NAA6N;SACvO;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