@unbrained/pm-cli 2026.3.9

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 (245) hide show
  1. package/.pi/extensions/pm-cli/index.ts +778 -0
  2. package/AGENTS.md +475 -0
  3. package/LICENSE +21 -0
  4. package/PRD.md +1390 -0
  5. package/README.md +655 -0
  6. package/dist/cli/commands/activity.d.ts +14 -0
  7. package/dist/cli/commands/activity.js +80 -0
  8. package/dist/cli/commands/activity.js.map +1 -0
  9. package/dist/cli/commands/append.d.ts +13 -0
  10. package/dist/cli/commands/append.js +46 -0
  11. package/dist/cli/commands/append.js.map +1 -0
  12. package/dist/cli/commands/beads.d.ts +15 -0
  13. package/dist/cli/commands/beads.js +475 -0
  14. package/dist/cli/commands/beads.js.map +1 -0
  15. package/dist/cli/commands/claim.d.ts +19 -0
  16. package/dist/cli/commands/claim.js +79 -0
  17. package/dist/cli/commands/claim.js.map +1 -0
  18. package/dist/cli/commands/close.d.ts +12 -0
  19. package/dist/cli/commands/close.js +58 -0
  20. package/dist/cli/commands/close.js.map +1 -0
  21. package/dist/cli/commands/comments.d.ts +15 -0
  22. package/dist/cli/commands/comments.js +80 -0
  23. package/dist/cli/commands/comments.js.map +1 -0
  24. package/dist/cli/commands/completion.d.ts +10 -0
  25. package/dist/cli/commands/completion.js +469 -0
  26. package/dist/cli/commands/completion.js.map +1 -0
  27. package/dist/cli/commands/config.d.ts +15 -0
  28. package/dist/cli/commands/config.js +72 -0
  29. package/dist/cli/commands/config.js.map +1 -0
  30. package/dist/cli/commands/create.d.ts +60 -0
  31. package/dist/cli/commands/create.js +456 -0
  32. package/dist/cli/commands/create.js.map +1 -0
  33. package/dist/cli/commands/delete.d.ts +12 -0
  34. package/dist/cli/commands/delete.js +33 -0
  35. package/dist/cli/commands/delete.js.map +1 -0
  36. package/dist/cli/commands/docs.d.ts +16 -0
  37. package/dist/cli/commands/docs.js +113 -0
  38. package/dist/cli/commands/docs.js.map +1 -0
  39. package/dist/cli/commands/files.d.ts +17 -0
  40. package/dist/cli/commands/files.js +113 -0
  41. package/dist/cli/commands/files.js.map +1 -0
  42. package/dist/cli/commands/gc.d.ts +9 -0
  43. package/dist/cli/commands/gc.js +80 -0
  44. package/dist/cli/commands/gc.js.map +1 -0
  45. package/dist/cli/commands/get.d.ts +12 -0
  46. package/dist/cli/commands/get.js +28 -0
  47. package/dist/cli/commands/get.js.map +1 -0
  48. package/dist/cli/commands/health.d.ts +15 -0
  49. package/dist/cli/commands/health.js +288 -0
  50. package/dist/cli/commands/health.js.map +1 -0
  51. package/dist/cli/commands/history.d.ts +13 -0
  52. package/dist/cli/commands/history.js +72 -0
  53. package/dist/cli/commands/history.js.map +1 -0
  54. package/dist/cli/commands/index.d.ts +26 -0
  55. package/dist/cli/commands/index.js +27 -0
  56. package/dist/cli/commands/index.js.map +1 -0
  57. package/dist/cli/commands/init.d.ts +10 -0
  58. package/dist/cli/commands/init.js +59 -0
  59. package/dist/cli/commands/init.js.map +1 -0
  60. package/dist/cli/commands/install.d.ts +18 -0
  61. package/dist/cli/commands/install.js +87 -0
  62. package/dist/cli/commands/install.js.map +1 -0
  63. package/dist/cli/commands/list.d.ts +21 -0
  64. package/dist/cli/commands/list.js +137 -0
  65. package/dist/cli/commands/list.js.map +1 -0
  66. package/dist/cli/commands/reindex.d.ts +16 -0
  67. package/dist/cli/commands/reindex.js +154 -0
  68. package/dist/cli/commands/reindex.js.map +1 -0
  69. package/dist/cli/commands/restore.d.ts +20 -0
  70. package/dist/cli/commands/restore.js +208 -0
  71. package/dist/cli/commands/restore.js.map +1 -0
  72. package/dist/cli/commands/search.d.ts +45 -0
  73. package/dist/cli/commands/search.js +531 -0
  74. package/dist/cli/commands/search.js.map +1 -0
  75. package/dist/cli/commands/stats.d.ts +13 -0
  76. package/dist/cli/commands/stats.js +88 -0
  77. package/dist/cli/commands/stats.js.map +1 -0
  78. package/dist/cli/commands/test-all.d.ts +30 -0
  79. package/dist/cli/commands/test-all.js +157 -0
  80. package/dist/cli/commands/test-all.js.map +1 -0
  81. package/dist/cli/commands/test.d.ts +29 -0
  82. package/dist/cli/commands/test.js +492 -0
  83. package/dist/cli/commands/test.js.map +1 -0
  84. package/dist/cli/commands/update.d.ts +52 -0
  85. package/dist/cli/commands/update.js +467 -0
  86. package/dist/cli/commands/update.js.map +1 -0
  87. package/dist/cli/extension-command-options.d.ts +1 -0
  88. package/dist/cli/extension-command-options.js +76 -0
  89. package/dist/cli/extension-command-options.js.map +1 -0
  90. package/dist/cli/main.d.ts +2 -0
  91. package/dist/cli/main.js +1494 -0
  92. package/dist/cli/main.js.map +1 -0
  93. package/dist/cli.d.ts +2 -0
  94. package/dist/cli.js +3 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/command-types.d.ts +1 -0
  97. package/dist/command-types.js +2 -0
  98. package/dist/command-types.js.map +1 -0
  99. package/dist/constants.d.ts +1 -0
  100. package/dist/constants.js +2 -0
  101. package/dist/constants.js.map +1 -0
  102. package/dist/core/extensions/builtins.d.ts +3 -0
  103. package/dist/core/extensions/builtins.js +47 -0
  104. package/dist/core/extensions/builtins.js.map +1 -0
  105. package/dist/core/extensions/index.d.ts +13 -0
  106. package/dist/core/extensions/index.js +88 -0
  107. package/dist/core/extensions/index.js.map +1 -0
  108. package/dist/core/extensions/loader.d.ts +301 -0
  109. package/dist/core/extensions/loader.js +917 -0
  110. package/dist/core/extensions/loader.js.map +1 -0
  111. package/dist/core/fs/fs-utils.d.ts +6 -0
  112. package/dist/core/fs/fs-utils.js +58 -0
  113. package/dist/core/fs/fs-utils.js.map +1 -0
  114. package/dist/core/fs/index.d.ts +1 -0
  115. package/dist/core/fs/index.js +2 -0
  116. package/dist/core/fs/index.js.map +1 -0
  117. package/dist/core/history/history.d.ts +12 -0
  118. package/dist/core/history/history.js +44 -0
  119. package/dist/core/history/history.js.map +1 -0
  120. package/dist/core/history/index.d.ts +1 -0
  121. package/dist/core/history/index.js +2 -0
  122. package/dist/core/history/index.js.map +1 -0
  123. package/dist/core/item/id.d.ts +3 -0
  124. package/dist/core/item/id.js +54 -0
  125. package/dist/core/item/id.js.map +1 -0
  126. package/dist/core/item/index.d.ts +3 -0
  127. package/dist/core/item/index.js +4 -0
  128. package/dist/core/item/index.js.map +1 -0
  129. package/dist/core/item/item-format.d.ts +9 -0
  130. package/dist/core/item/item-format.js +363 -0
  131. package/dist/core/item/item-format.js.map +1 -0
  132. package/dist/core/item/parse.d.ts +3 -0
  133. package/dist/core/item/parse.js +72 -0
  134. package/dist/core/item/parse.js.map +1 -0
  135. package/dist/core/lock/index.d.ts +1 -0
  136. package/dist/core/lock/index.js +2 -0
  137. package/dist/core/lock/index.js.map +1 -0
  138. package/dist/core/lock/lock.d.ts +1 -0
  139. package/dist/core/lock/lock.js +100 -0
  140. package/dist/core/lock/lock.js.map +1 -0
  141. package/dist/core/output/output.d.ts +7 -0
  142. package/dist/core/output/output.js +79 -0
  143. package/dist/core/output/output.js.map +1 -0
  144. package/dist/core/search/cache.d.ts +17 -0
  145. package/dist/core/search/cache.js +212 -0
  146. package/dist/core/search/cache.js.map +1 -0
  147. package/dist/core/search/embedding-batches.d.ts +7 -0
  148. package/dist/core/search/embedding-batches.js +54 -0
  149. package/dist/core/search/embedding-batches.js.map +1 -0
  150. package/dist/core/search/providers.d.ts +59 -0
  151. package/dist/core/search/providers.js +265 -0
  152. package/dist/core/search/providers.js.map +1 -0
  153. package/dist/core/search/vector-stores.d.ts +89 -0
  154. package/dist/core/search/vector-stores.js +546 -0
  155. package/dist/core/search/vector-stores.js.map +1 -0
  156. package/dist/core/shared/command-types.d.ts +7 -0
  157. package/dist/core/shared/command-types.js +2 -0
  158. package/dist/core/shared/command-types.js.map +1 -0
  159. package/dist/core/shared/constants.d.ts +19 -0
  160. package/dist/core/shared/constants.js +134 -0
  161. package/dist/core/shared/constants.js.map +1 -0
  162. package/dist/core/shared/errors.d.ts +4 -0
  163. package/dist/core/shared/errors.js +9 -0
  164. package/dist/core/shared/errors.js.map +1 -0
  165. package/dist/core/shared/index.d.ts +3 -0
  166. package/dist/core/shared/index.js +4 -0
  167. package/dist/core/shared/index.js.map +1 -0
  168. package/dist/core/shared/serialization.d.ts +3 -0
  169. package/dist/core/shared/serialization.js +70 -0
  170. package/dist/core/shared/serialization.js.map +1 -0
  171. package/dist/core/shared/time.d.ts +3 -0
  172. package/dist/core/shared/time.js +28 -0
  173. package/dist/core/shared/time.js.map +1 -0
  174. package/dist/core/store/index.d.ts +3 -0
  175. package/dist/core/store/index.js +4 -0
  176. package/dist/core/store/index.js.map +1 -0
  177. package/dist/core/store/item-store.d.ts +42 -0
  178. package/dist/core/store/item-store.js +186 -0
  179. package/dist/core/store/item-store.js.map +1 -0
  180. package/dist/core/store/paths.d.ts +8 -0
  181. package/dist/core/store/paths.js +29 -0
  182. package/dist/core/store/paths.js.map +1 -0
  183. package/dist/core/store/settings.d.ts +4 -0
  184. package/dist/core/store/settings.js +148 -0
  185. package/dist/core/store/settings.js.map +1 -0
  186. package/dist/errors.d.ts +1 -0
  187. package/dist/errors.js +2 -0
  188. package/dist/errors.js.map +1 -0
  189. package/dist/extensions/builtins/beads/index.d.ts +8 -0
  190. package/dist/extensions/builtins/beads/index.js +29 -0
  191. package/dist/extensions/builtins/beads/index.js.map +1 -0
  192. package/dist/extensions/builtins/todos/import-export.d.ts +26 -0
  193. package/dist/extensions/builtins/todos/import-export.js +460 -0
  194. package/dist/extensions/builtins/todos/import-export.js.map +1 -0
  195. package/dist/extensions/builtins/todos/index.d.ts +8 -0
  196. package/dist/extensions/builtins/todos/index.js +38 -0
  197. package/dist/extensions/builtins/todos/index.js.map +1 -0
  198. package/dist/fs-utils.d.ts +1 -0
  199. package/dist/fs-utils.js +2 -0
  200. package/dist/fs-utils.js.map +1 -0
  201. package/dist/history.d.ts +1 -0
  202. package/dist/history.js +2 -0
  203. package/dist/history.js.map +1 -0
  204. package/dist/id.d.ts +1 -0
  205. package/dist/id.js +2 -0
  206. package/dist/id.js.map +1 -0
  207. package/dist/item-format.d.ts +1 -0
  208. package/dist/item-format.js +2 -0
  209. package/dist/item-format.js.map +1 -0
  210. package/dist/item-store.d.ts +1 -0
  211. package/dist/item-store.js +2 -0
  212. package/dist/item-store.js.map +1 -0
  213. package/dist/lock.d.ts +1 -0
  214. package/dist/lock.js +2 -0
  215. package/dist/lock.js.map +1 -0
  216. package/dist/output.d.ts +1 -0
  217. package/dist/output.js +2 -0
  218. package/dist/output.js.map +1 -0
  219. package/dist/parse.d.ts +1 -0
  220. package/dist/parse.js +2 -0
  221. package/dist/parse.js.map +1 -0
  222. package/dist/paths.d.ts +1 -0
  223. package/dist/paths.js +2 -0
  224. package/dist/paths.js.map +1 -0
  225. package/dist/serialization.d.ts +1 -0
  226. package/dist/serialization.js +2 -0
  227. package/dist/serialization.js.map +1 -0
  228. package/dist/settings.d.ts +1 -0
  229. package/dist/settings.js +2 -0
  230. package/dist/settings.js.map +1 -0
  231. package/dist/time.d.ts +1 -0
  232. package/dist/time.js +2 -0
  233. package/dist/time.js.map +1 -0
  234. package/dist/types/index.d.ts +1 -0
  235. package/dist/types/index.js +2 -0
  236. package/dist/types/index.js.map +1 -0
  237. package/dist/types.d.ts +179 -0
  238. package/dist/types.js +21 -0
  239. package/dist/types.js.map +1 -0
  240. package/docs/ARCHITECTURE.md +246 -0
  241. package/docs/EXTENSIONS.md +329 -0
  242. package/docs/RELEASING.md +65 -0
  243. package/package.json +79 -0
  244. package/scripts/install.ps1 +112 -0
  245. package/scripts/install.sh +113 -0
@@ -0,0 +1,469 @@
1
+ import { EXIT_CODE } from "../../core/shared/constants.js";
2
+ import { PmCliError } from "../../core/shared/errors.js";
3
+ const VALID_SHELLS = ["bash", "zsh", "fish"];
4
+ const ALL_COMMANDS = [
5
+ "init",
6
+ "config",
7
+ "install",
8
+ "create",
9
+ "list",
10
+ "list-all",
11
+ "list-draft",
12
+ "list-open",
13
+ "list-in-progress",
14
+ "list-blocked",
15
+ "list-closed",
16
+ "list-canceled",
17
+ "get",
18
+ "search",
19
+ "reindex",
20
+ "history",
21
+ "activity",
22
+ "restore",
23
+ "update",
24
+ "close",
25
+ "delete",
26
+ "append",
27
+ "comments",
28
+ "files",
29
+ "docs",
30
+ "test",
31
+ "test-all",
32
+ "stats",
33
+ "health",
34
+ "gc",
35
+ "claim",
36
+ "release",
37
+ "beads",
38
+ "todos",
39
+ "completion",
40
+ "help",
41
+ ];
42
+ const LIST_FLAGS = "--type --tag --priority --deadline-before --deadline-after --assignee --sprint --release --limit --json --quiet --path --no-extensions --profile --help";
43
+ const CREATE_FLAGS = "-t --title -d --description --type -s --status -p --priority --tags -b --body --deadline --estimate --estimated-minutes --acceptance-criteria --ac --author --message --assignee --parent --reviewer --risk --confidence --sprint --release --blocked-by --blocked-reason --unblock-note --reporter --severity --environment --repro-steps --resolution --expected-result --actual-result --affected-version --fixed-version --component --regression --customer-impact --definition-of-ready --order --rank --goal --objective --value --impact --outcome --why-now --dep --comment --note --learning --file --test --doc --json --quiet --path --no-extensions --profile --help";
44
+ const UPDATE_FLAGS = "-t --title -d --description -s --status -p --priority --type --tags --deadline --estimate --estimated-minutes --acceptance-criteria --ac --assignee --parent --reviewer --risk --confidence --sprint --release --blocked-by --blocked-reason --unblock-note --reporter --severity --environment --repro-steps --resolution --expected-result --actual-result --affected-version --fixed-version --component --regression --customer-impact --definition-of-ready --order --rank --goal --objective --value --impact --outcome --why-now --author --message --force --json --quiet --path --no-extensions --profile --help";
45
+ const SEARCH_FLAGS = "--mode --include-linked --limit --type --tag --priority --deadline-before --deadline-after --json --quiet --path --no-extensions --profile --help";
46
+ const MUTATION_FLAGS = "--author --message --force --json --quiet --path --no-extensions --profile --help";
47
+ const GLOBAL_FLAGS = "--json --quiet --path --no-extensions --profile --version --help";
48
+ export function generateBashScript() {
49
+ const cmds = ALL_COMMANDS.join(" ");
50
+ // Note: "${...}" inside regular (non-template) strings are literal characters,
51
+ // not JS interpolation. Only backtick template literals interpolate ${...}.
52
+ const compgen = (flags) => `$(compgen -W "${flags}" -- "$cur")`;
53
+ return [
54
+ "# bash completion for pm",
55
+ '# Source this file or add \'eval "$(pm completion bash)"\' to ~/.bashrc',
56
+ "",
57
+ "_pm_completion() {",
58
+ " local cur prev words cword",
59
+ " _init_completion 2>/dev/null || {",
60
+ ' cur="${COMP_WORDS[COMP_CWORD]}"',
61
+ ' prev="${COMP_WORDS[COMP_CWORD-1]}"',
62
+ " cword=$COMP_CWORD",
63
+ " }",
64
+ "",
65
+ " if [[ $cword -eq 1 ]]; then",
66
+ ` COMPREPLY=(${compgen(cmds)})`,
67
+ " return 0",
68
+ " fi",
69
+ "",
70
+ ' local cmd="${COMP_WORDS[1]}"',
71
+ "",
72
+ ' case "$cmd" in',
73
+ " list|list-all|list-draft|list-open|list-in-progress|list-blocked|list-closed|list-canceled)",
74
+ ` COMPREPLY=(${compgen(LIST_FLAGS)})`,
75
+ " ;;",
76
+ " create)",
77
+ ` COMPREPLY=(${compgen(CREATE_FLAGS)})`,
78
+ " ;;",
79
+ " update)",
80
+ ` COMPREPLY=(${compgen(UPDATE_FLAGS)})`,
81
+ " ;;",
82
+ " search)",
83
+ ` COMPREPLY=(${compgen(SEARCH_FLAGS)})`,
84
+ " ;;",
85
+ " reindex)",
86
+ ` COMPREPLY=(${compgen("--mode --json --quiet --path --no-extensions --profile --help")})`,
87
+ " ;;",
88
+ " config)",
89
+ ` COMPREPLY=(${compgen("--criterion --json --quiet --path --no-extensions --profile --help")})`,
90
+ " ;;",
91
+ " install)",
92
+ ` COMPREPLY=(${compgen("pi --project --global --json --quiet --path --no-extensions --profile --help")})`,
93
+ " ;;",
94
+ " comments)",
95
+ ` COMPREPLY=(${compgen("--add --limit --json --quiet --path --no-extensions --profile --help")})`,
96
+ " ;;",
97
+ " files|docs)",
98
+ ` COMPREPLY=(${compgen("--add --remove --json --quiet --path --no-extensions --profile --help")})`,
99
+ " ;;",
100
+ " test)",
101
+ ` COMPREPLY=(${compgen("--add --remove --run --timeout --json --quiet --path --no-extensions --profile --help")})`,
102
+ " ;;",
103
+ " test-all)",
104
+ ` COMPREPLY=(${compgen("--status --timeout --json --quiet --path --no-extensions --profile --help")})`,
105
+ " ;;",
106
+ " history|activity)",
107
+ ` COMPREPLY=(${compgen("--limit --json --quiet --path --no-extensions --profile --help")})`,
108
+ " ;;",
109
+ " claim|release|close|delete|append|restore)",
110
+ ` COMPREPLY=(${compgen(MUTATION_FLAGS)})`,
111
+ " ;;",
112
+ " beads)",
113
+ ` COMPREPLY=(${compgen("import")})`,
114
+ " ;;",
115
+ " todos)",
116
+ ` COMPREPLY=(${compgen("import export")})`,
117
+ " ;;",
118
+ " completion)",
119
+ ` COMPREPLY=(${compgen("bash zsh fish")})`,
120
+ " ;;",
121
+ " *)",
122
+ ` COMPREPLY=(${compgen(GLOBAL_FLAGS)})`,
123
+ " ;;",
124
+ " esac",
125
+ " return 0",
126
+ "}",
127
+ "",
128
+ "complete -F _pm_completion pm",
129
+ ].join("\n");
130
+ }
131
+ export function generateZshScript() {
132
+ const cmds = ALL_COMMANDS.map((c) => `'${c}'`).join(" ");
133
+ return `#compdef pm
134
+ # zsh completion for pm
135
+ # Source this file or add 'eval "$(pm completion zsh)"' to ~/.zshrc
136
+
137
+ _pm_commands() {
138
+ local -a commands
139
+ commands=(
140
+ 'init:Initialize .agents/pm storage and settings'
141
+ 'config:Read or update deterministic pm settings'
142
+ 'install:Install supported integrations'
143
+ 'create:Create a new item'
144
+ 'list:List items with optional filters'
145
+ 'list-all:List all items with optional filters'
146
+ 'list-draft:List draft items'
147
+ 'list-open:List open items'
148
+ 'list-in-progress:List in-progress items'
149
+ 'list-blocked:List blocked items'
150
+ 'list-closed:List closed items'
151
+ 'list-canceled:List canceled items'
152
+ 'get:Get item details by id'
153
+ 'search:Search items across keyword and optional semantic/hybrid modes'
154
+ 'reindex:Rebuild deterministic search artifacts'
155
+ 'history:Show item history'
156
+ 'activity:Show recent activity'
157
+ 'restore:Restore item to previous state'
158
+ 'update:Update item fields'
159
+ 'close:Close an item with required reason text'
160
+ 'delete:Delete an item'
161
+ 'append:Append text to item body'
162
+ 'comments:List or append comments for an item'
163
+ 'files:Manage linked files'
164
+ 'docs:Manage linked docs'
165
+ 'test:Manage linked tests and optionally run them'
166
+ 'test-all:Run linked test commands across many items'
167
+ 'stats:Show tracker statistics summary'
168
+ 'health:Show tracker health checks summary'
169
+ 'gc:Collect optional cache artifacts'
170
+ 'claim:Claim ownership of an item'
171
+ 'release:Release ownership of an item'
172
+ 'beads:Built-in Beads extension commands'
173
+ 'todos:Built-in todos extension commands'
174
+ 'completion:Generate shell completion script'
175
+ 'help:Display help for a command'
176
+ )
177
+ _describe 'command' commands
178
+ }
179
+
180
+ _pm() {
181
+ local context state line
182
+ _arguments -C \\
183
+ '--json[Output JSON instead of TOON]' \\
184
+ '--quiet[Suppress stdout output]' \\
185
+ '--path[Override PM path for this command]:path:_files -/' \\
186
+ '--no-extensions[Disable extension loading]' \\
187
+ '--profile[Print deterministic timing diagnostics]' \\
188
+ '(-V --version)--version[Output the version number]' \\
189
+ '(-h --help)--help[Display help]' \\
190
+ '1: :_pm_commands' \\
191
+ '*:: :->args' && return 0
192
+
193
+ case $state in
194
+ args)
195
+ case $line[1] in
196
+ list|list-all|list-draft|list-open|list-in-progress|list-blocked|list-closed|list-canceled)
197
+ _arguments \\
198
+ '--type[Filter by item type]:(Epic Feature Task Chore Issue)' \\
199
+ '--tag[Filter by tag]:tag' \\
200
+ '--priority[Filter by priority]:(0 1 2 3 4)' \\
201
+ '--deadline-before[Filter by deadline upper bound]:date' \\
202
+ '--deadline-after[Filter by deadline lower bound]:date' \\
203
+ '--assignee[Filter by assignee (use none for unassigned)]:assignee' \\
204
+ '--sprint[Filter by sprint]:sprint' \\
205
+ '--release[Filter by release]:release' \\
206
+ '--limit[Limit returned item count]:number' \\
207
+ '--json[Output JSON]' \\
208
+ '--quiet[Suppress stdout]' \\
209
+ '--path[Override PM path]:path:_files -/'
210
+ ;;
211
+ create)
212
+ _arguments \\
213
+ '(-t --title)'{-t,--title}'[Item title]:title' \\
214
+ '(-d --description)'{-d,--description}'[Item description]:description' \\
215
+ '--type[Item type]:(Epic Feature Task Chore Issue)' \\
216
+ '(-s --status)'{-s,--status}'[Item status]:(draft open in_progress blocked)' \\
217
+ '(-p --priority)'{-p,--priority}'[Priority (0-4)]:(0 1 2 3 4)' \\
218
+ '--tags[Comma-separated tags]:tags' \\
219
+ '(-b --body)'{-b,--body}'[Item body]:body' \\
220
+ '--deadline[Deadline (ISO or relative +1d/+2w)]:deadline' \\
221
+ '--estimate[Estimated minutes]:minutes' \\
222
+ '--acceptance-criteria[Acceptance criteria]:criteria' \\
223
+ '--author[Mutation author]:author' \\
224
+ '--message[History message]:message' \\
225
+ '--assignee[Assignee (none to unset)]:assignee' \\
226
+ '--json[Output JSON]' \\
227
+ '--quiet[Suppress stdout]'
228
+ ;;
229
+ update)
230
+ _arguments \\
231
+ '(-t --title)'{-t,--title}'[Item title]:title' \\
232
+ '(-d --description)'{-d,--description}'[Item description]:description' \\
233
+ '(-s --status)'{-s,--status}'[Item status]:(draft open in_progress blocked canceled)' \\
234
+ '(-p --priority)'{-p,--priority}'[Priority (0-4)]:(0 1 2 3 4)' \\
235
+ '--type[Item type]:(Epic Feature Task Chore Issue)' \\
236
+ '--tags[Comma-separated tags]:tags' \\
237
+ '--author[Mutation author]:author' \\
238
+ '--message[History message]:message' \\
239
+ '--force[Force override]' \\
240
+ '--json[Output JSON]' \\
241
+ '--quiet[Suppress stdout]'
242
+ ;;
243
+ search)
244
+ _arguments \\
245
+ '--mode[Search mode]:(keyword semantic hybrid)' \\
246
+ '--include-linked[Include linked content in scoring]' \\
247
+ '--limit[Max results]:number' \\
248
+ '--type[Filter by type]:(Epic Feature Task Chore Issue)' \\
249
+ '--tag[Filter by tag]:tag' \\
250
+ '--priority[Filter by priority]:(0 1 2 3 4)' \\
251
+ '--json[Output JSON]' \\
252
+ '--quiet[Suppress stdout]'
253
+ ;;
254
+ reindex)
255
+ _arguments \\
256
+ '--mode[Reindex mode]:(keyword semantic hybrid)' \\
257
+ '--json[Output JSON]' \\
258
+ '--quiet[Suppress stdout]'
259
+ ;;
260
+ history|activity)
261
+ _arguments \\
262
+ '--limit[Max entries]:number' \\
263
+ '--json[Output JSON]' \\
264
+ '--quiet[Suppress stdout]'
265
+ ;;
266
+ test-all)
267
+ _arguments \\
268
+ '--status[Filter by status]:(open in_progress)' \\
269
+ '--timeout[Default timeout seconds]:seconds' \\
270
+ '--json[Output JSON]' \\
271
+ '--quiet[Suppress stdout]'
272
+ ;;
273
+ install)
274
+ _arguments \\
275
+ '--project[Install Pi extension into current project .pi/extensions]' \\
276
+ '--global[Install Pi extension into global PI_CODING_AGENT_DIR or ~/.pi/agent]' \\
277
+ '--json[Output JSON]' \\
278
+ '--quiet[Suppress stdout]' \\
279
+ '1:target:(pi)'
280
+ ;;
281
+ completion)
282
+ _arguments '1:shell:(bash zsh fish)'
283
+ ;;
284
+ beads)
285
+ local -a beads_cmds
286
+ beads_cmds=('import:Import Beads JSONL records')
287
+ _describe 'beads command' beads_cmds
288
+ ;;
289
+ todos)
290
+ local -a todos_cmds
291
+ todos_cmds=('import:Import todos markdown files' 'export:Export todos markdown files')
292
+ _describe 'todos command' todos_cmds
293
+ ;;
294
+ esac
295
+ ;;
296
+ esac
297
+ }
298
+
299
+ compdef _pm pm`;
300
+ }
301
+ export function generateFishScript() {
302
+ const listCmds = [
303
+ "list",
304
+ "list-all",
305
+ "list-draft",
306
+ "list-open",
307
+ "list-in-progress",
308
+ "list-blocked",
309
+ "list-closed",
310
+ "list-canceled",
311
+ ].join(" ");
312
+ return `# Fish shell completion for pm
313
+ # Save to ~/.config/fish/completions/pm.fish
314
+ # or run: pm completion fish > ~/.config/fish/completions/pm.fish
315
+
316
+ # Disable file completion by default
317
+ complete -c pm -f
318
+
319
+ # Global flags (available for all subcommands)
320
+ complete -c pm -l json -d 'Output JSON instead of TOON'
321
+ complete -c pm -l quiet -d 'Suppress stdout output'
322
+ complete -c pm -l path -d 'Override PM path for this command' -r
323
+ complete -c pm -l no-extensions -d 'Disable extension loading'
324
+ complete -c pm -l profile -d 'Print deterministic timing diagnostics'
325
+ complete -c pm -s V -l version -d 'Output the version number'
326
+ complete -c pm -s h -l help -d 'Display help'
327
+
328
+ # Helper: true when no subcommand has been given yet
329
+ function __pm_no_subcommand
330
+ not __fish_seen_subcommand_from init config install create list list-all list-draft list-open list-in-progress list-blocked list-closed list-canceled get search reindex history activity restore update close delete append comments files docs test test-all stats health gc claim release beads todos completion help
331
+ end
332
+
333
+ # Subcommands
334
+ complete -c pm -n __pm_no_subcommand -a init -d 'Initialize .agents/pm storage and settings'
335
+ complete -c pm -n __pm_no_subcommand -a config -d 'Read or update deterministic pm settings'
336
+ complete -c pm -n __pm_no_subcommand -a install -d 'Install supported integrations'
337
+ complete -c pm -n __pm_no_subcommand -a create -d 'Create a new item'
338
+ complete -c pm -n __pm_no_subcommand -a list -d 'List items with optional filters'
339
+ complete -c pm -n __pm_no_subcommand -a list-all -d 'List all items with optional filters'
340
+ complete -c pm -n __pm_no_subcommand -a list-draft -d 'List draft items'
341
+ complete -c pm -n __pm_no_subcommand -a list-open -d 'List open items'
342
+ complete -c pm -n __pm_no_subcommand -a list-in-progress -d 'List in-progress items'
343
+ complete -c pm -n __pm_no_subcommand -a list-blocked -d 'List blocked items'
344
+ complete -c pm -n __pm_no_subcommand -a list-closed -d 'List closed items'
345
+ complete -c pm -n __pm_no_subcommand -a list-canceled -d 'List canceled items'
346
+ complete -c pm -n __pm_no_subcommand -a get -d 'Get item details by id'
347
+ complete -c pm -n __pm_no_subcommand -a search -d 'Search items across keyword and optional semantic/hybrid modes'
348
+ complete -c pm -n __pm_no_subcommand -a reindex -d 'Rebuild deterministic search artifacts'
349
+ complete -c pm -n __pm_no_subcommand -a history -d 'Show item history'
350
+ complete -c pm -n __pm_no_subcommand -a activity -d 'Show recent activity'
351
+ complete -c pm -n __pm_no_subcommand -a restore -d 'Restore item to previous state'
352
+ complete -c pm -n __pm_no_subcommand -a update -d 'Update item fields'
353
+ complete -c pm -n __pm_no_subcommand -a close -d 'Close an item with required reason text'
354
+ complete -c pm -n __pm_no_subcommand -a delete -d 'Delete an item'
355
+ complete -c pm -n __pm_no_subcommand -a append -d 'Append text to item body'
356
+ complete -c pm -n __pm_no_subcommand -a comments -d 'List or append comments for an item'
357
+ complete -c pm -n __pm_no_subcommand -a files -d 'Manage linked files'
358
+ complete -c pm -n __pm_no_subcommand -a docs -d 'Manage linked docs'
359
+ complete -c pm -n __pm_no_subcommand -a test -d 'Manage linked tests and optionally run them'
360
+ complete -c pm -n __pm_no_subcommand -a test-all -d 'Run linked test commands across many items'
361
+ complete -c pm -n __pm_no_subcommand -a stats -d 'Show tracker statistics summary'
362
+ complete -c pm -n __pm_no_subcommand -a health -d 'Show tracker health checks summary'
363
+ complete -c pm -n __pm_no_subcommand -a gc -d 'Collect optional cache artifacts'
364
+ complete -c pm -n __pm_no_subcommand -a claim -d 'Claim ownership of an item'
365
+ complete -c pm -n __pm_no_subcommand -a release -d 'Release ownership of an item'
366
+ complete -c pm -n __pm_no_subcommand -a beads -d 'Built-in Beads extension commands'
367
+ complete -c pm -n __pm_no_subcommand -a todos -d 'Built-in todos extension commands'
368
+ complete -c pm -n __pm_no_subcommand -a completion -d 'Generate shell completion script'
369
+
370
+ # list* flags
371
+ for list_cmd in ${listCmds}
372
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l type -d 'Filter by item type' -r -a 'Epic Feature Task Chore Issue'
373
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l tag -d 'Filter by tag' -r
374
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l priority -d 'Filter by priority' -r -a '0 1 2 3 4'
375
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l assignee -d 'Filter by assignee (none for unassigned)' -r
376
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l sprint -d 'Filter by sprint' -r
377
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l release -d 'Filter by release' -r
378
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l limit -d 'Limit returned item count' -r
379
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l deadline-before -d 'Filter by deadline upper bound' -r
380
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l deadline-after -d 'Filter by deadline lower bound' -r
381
+ end
382
+
383
+ # create flags
384
+ complete -c pm -n '__fish_seen_subcommand_from create' -s t -l title -d 'Item title' -r
385
+ complete -c pm -n '__fish_seen_subcommand_from create' -s d -l description -d 'Item description' -r
386
+ complete -c pm -n '__fish_seen_subcommand_from create' -l type -d 'Item type' -r -a 'Epic Feature Task Chore Issue'
387
+ complete -c pm -n '__fish_seen_subcommand_from create' -s s -l status -d 'Item status' -r -a 'draft open in_progress blocked'
388
+ complete -c pm -n '__fish_seen_subcommand_from create' -s p -l priority -d 'Priority (0-4)' -r -a '0 1 2 3 4'
389
+ complete -c pm -n '__fish_seen_subcommand_from create' -l tags -d 'Comma-separated tags' -r
390
+ complete -c pm -n '__fish_seen_subcommand_from create' -s b -l body -d 'Item body' -r
391
+ complete -c pm -n '__fish_seen_subcommand_from create' -l deadline -d 'Deadline (ISO or relative +1d/+2w)' -r
392
+ complete -c pm -n '__fish_seen_subcommand_from create' -l estimate -d 'Estimated minutes' -r
393
+ complete -c pm -n '__fish_seen_subcommand_from create' -l acceptance-criteria -d 'Acceptance criteria' -r
394
+ complete -c pm -n '__fish_seen_subcommand_from create' -l author -d 'Mutation author' -r
395
+ complete -c pm -n '__fish_seen_subcommand_from create' -l message -d 'History message' -r
396
+ complete -c pm -n '__fish_seen_subcommand_from create' -l assignee -d 'Assignee (none to unset)' -r
397
+
398
+ # update flags
399
+ complete -c pm -n '__fish_seen_subcommand_from update' -s t -l title -d 'Item title' -r
400
+ complete -c pm -n '__fish_seen_subcommand_from update' -s d -l description -d 'Item description' -r
401
+ complete -c pm -n '__fish_seen_subcommand_from update' -s s -l status -d 'Item status' -r -a 'draft open in_progress blocked canceled'
402
+ complete -c pm -n '__fish_seen_subcommand_from update' -s p -l priority -d 'Priority (0-4)' -r -a '0 1 2 3 4'
403
+ complete -c pm -n '__fish_seen_subcommand_from update' -l type -d 'Item type' -r -a 'Epic Feature Task Chore Issue'
404
+ complete -c pm -n '__fish_seen_subcommand_from update' -l author -d 'Mutation author' -r
405
+ complete -c pm -n '__fish_seen_subcommand_from update' -l message -d 'History message' -r
406
+ complete -c pm -n '__fish_seen_subcommand_from update' -l force -d 'Force override'
407
+
408
+ # search flags
409
+ complete -c pm -n '__fish_seen_subcommand_from search' -l mode -d 'Search mode' -r -a 'keyword semantic hybrid'
410
+ complete -c pm -n '__fish_seen_subcommand_from search' -l include-linked -d 'Include linked content in scoring'
411
+ complete -c pm -n '__fish_seen_subcommand_from search' -l limit -d 'Max results' -r
412
+ complete -c pm -n '__fish_seen_subcommand_from search' -l type -d 'Filter by type' -r -a 'Epic Feature Task Chore Issue'
413
+ complete -c pm -n '__fish_seen_subcommand_from search' -l tag -d 'Filter by tag' -r
414
+ complete -c pm -n '__fish_seen_subcommand_from search' -l priority -d 'Filter by priority' -r -a '0 1 2 3 4'
415
+
416
+ # reindex flags
417
+ complete -c pm -n '__fish_seen_subcommand_from reindex' -l mode -d 'Reindex mode' -r -a 'keyword semantic hybrid'
418
+
419
+ # history / activity flags
420
+ complete -c pm -n '__fish_seen_subcommand_from history' -l limit -d 'Max history entries' -r
421
+ complete -c pm -n '__fish_seen_subcommand_from activity' -l limit -d 'Max activity entries' -r
422
+
423
+ # test-all flags
424
+ complete -c pm -n '__fish_seen_subcommand_from test-all' -l status -d 'Filter by status' -r -a 'open in_progress'
425
+ complete -c pm -n '__fish_seen_subcommand_from test-all' -l timeout -d 'Default timeout seconds' -r
426
+
427
+ # completion shell argument
428
+ complete -c pm -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish' -d 'Shell type'
429
+
430
+ # install target and flags
431
+ complete -c pm -n '__fish_seen_subcommand_from install' -a 'pi' -d 'Install pm Pi extension'
432
+ complete -c pm -n '__fish_seen_subcommand_from install' -l project -d 'Install into current project .pi/extensions'
433
+ complete -c pm -n '__fish_seen_subcommand_from install' -l global -d 'Install into PI_CODING_AGENT_DIR or ~/.pi/agent'
434
+
435
+ # beads subcommands
436
+ complete -c pm -n '__fish_seen_subcommand_from beads' -a import -d 'Import Beads JSONL records'
437
+
438
+ # todos subcommands
439
+ complete -c pm -n '__fish_seen_subcommand_from todos' -a import -d 'Import todos markdown files'
440
+ complete -c pm -n '__fish_seen_subcommand_from todos' -a export -d 'Export todos markdown files'`;
441
+ }
442
+ const SETUP_HINTS = {
443
+ bash: 'Add to ~/.bashrc or ~/.bash_profile: eval "$(pm completion bash)"',
444
+ zsh: 'Add to ~/.zshrc: eval "$(pm completion zsh)"',
445
+ fish: "Run: pm completion fish > ~/.config/fish/completions/pm.fish",
446
+ };
447
+ export function runCompletion(shell) {
448
+ const normalized = shell.trim().toLowerCase();
449
+ if (!VALID_SHELLS.includes(normalized)) {
450
+ throw new PmCliError(`Unknown shell: "${shell}". Supported shells: ${VALID_SHELLS.join(", ")}.`, EXIT_CODE.USAGE);
451
+ }
452
+ const validShell = normalized;
453
+ let script;
454
+ if (validShell === "bash") {
455
+ script = generateBashScript();
456
+ }
457
+ else if (validShell === "zsh") {
458
+ script = generateZshScript();
459
+ }
460
+ else {
461
+ script = generateFishScript();
462
+ }
463
+ return {
464
+ shell: validShell,
465
+ script,
466
+ setup_hint: SETUP_HINTS[validShell],
467
+ };
468
+ }
469
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/cli/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAUzD,MAAM,YAAY,GAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,YAAY,GAAG;IACnB,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,UAAU;IACV,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB,cAAc;IACd,aAAa;IACb,eAAe;IACf,KAAK;IACL,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;IACN,MAAM;IACN,UAAU;IACV,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,YAAY;IACZ,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,GACd,yJAAyJ,CAAC;AAE5J,MAAM,YAAY,GAChB,mpBAAmpB,CAAC;AAEtpB,MAAM,YAAY,GAChB,2lBAA2lB,CAAC;AAE9lB,MAAM,YAAY,GAChB,mJAAmJ,CAAC;AAEtJ,MAAM,cAAc,GAAG,mFAAmF,CAAC;AAE3G,MAAM,YAAY,GAAG,kEAAkE,CAAC;AAExF,MAAM,UAAU,kBAAkB;IAChC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,+EAA+E;IAC/E,4EAA4E;IAC5E,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,iBAAiB,KAAK,cAAc,CAAC;IAChF,OAAO;QACL,0BAA0B;QAC1B,yEAAyE;QACzE,EAAE;QACF,oBAAoB;QACpB,8BAA8B;QAC9B,qCAAqC;QACrC,qCAAqC;QACrC,wCAAwC;QACxC,uBAAuB;QACvB,KAAK;QACL,EAAE;QACF,+BAA+B;QAC/B,kBAAkB,OAAO,CAAC,IAAI,CAAC,GAAG;QAClC,cAAc;QACd,MAAM;QACN,EAAE;QACF,gCAAgC;QAChC,EAAE;QACF,kBAAkB;QAClB,iGAAiG;QACjG,oBAAoB,OAAO,CAAC,UAAU,CAAC,GAAG;QAC1C,UAAU;QACV,aAAa;QACb,oBAAoB,OAAO,CAAC,YAAY,CAAC,GAAG;QAC5C,UAAU;QACV,aAAa;QACb,oBAAoB,OAAO,CAAC,YAAY,CAAC,GAAG;QAC5C,UAAU;QACV,aAAa;QACb,oBAAoB,OAAO,CAAC,YAAY,CAAC,GAAG;QAC5C,UAAU;QACV,cAAc;QACd,oBAAoB,OAAO,CAAC,+DAA+D,CAAC,GAAG;QAC/F,UAAU;QACV,aAAa;QACb,oBAAoB,OAAO,CAAC,oEAAoE,CAAC,GAAG;QACpG,UAAU;QACV,cAAc;QACd,oBAAoB,OAAO,CAAC,8EAA8E,CAAC,GAAG;QAC9G,UAAU;QACV,eAAe;QACf,oBAAoB,OAAO,CAAC,sEAAsE,CAAC,GAAG;QACtG,UAAU;QACV,iBAAiB;QACjB,oBAAoB,OAAO,CAAC,uEAAuE,CAAC,GAAG;QACvG,UAAU;QACV,WAAW;QACX,oBAAoB,OAAO,CAAC,uFAAuF,CAAC,GAAG;QACvH,UAAU;QACV,eAAe;QACf,oBAAoB,OAAO,CAAC,2EAA2E,CAAC,GAAG;QAC3G,UAAU;QACV,uBAAuB;QACvB,oBAAoB,OAAO,CAAC,gEAAgE,CAAC,GAAG;QAChG,UAAU;QACV,gDAAgD;QAChD,oBAAoB,OAAO,CAAC,cAAc,CAAC,GAAG;QAC9C,UAAU;QACV,YAAY;QACZ,oBAAoB,OAAO,CAAC,QAAQ,CAAC,GAAG;QACxC,UAAU;QACV,YAAY;QACZ,oBAAoB,OAAO,CAAC,eAAe,CAAC,GAAG;QAC/C,UAAU;QACV,iBAAiB;QACjB,oBAAoB,OAAO,CAAC,eAAe,CAAC,GAAG;QAC/C,UAAU;QACV,QAAQ;QACR,oBAAoB,OAAO,CAAC,YAAY,CAAC,GAAG;QAC5C,UAAU;QACV,QAAQ;QACR,YAAY;QACZ,GAAG;QACH,EAAE;QACF,+BAA+B;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAsKM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG;QACf,MAAM;QACN,UAAU;QACV,YAAY;QACZ,WAAW;QACX,kBAAkB;QAClB,cAAc;QACd,aAAa;QACb,eAAe;KAChB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2DS,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iGAqEuE,CAAC;AAClG,CAAC;AAED,MAAM,WAAW,GAAoC;IACnD,IAAI,EAAE,mEAAmE;IACzE,GAAG,EAAE,8CAA8C;IACnD,IAAI,EAAE,8DAA8D;CACrE,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAA6B,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,UAAU,CAClB,mBAAmB,KAAK,wBAAwB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC1E,SAAS,CAAC,KAAK,CAChB,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,UAA6B,CAAC;IACjD,IAAI,MAAc,CAAC;IACnB,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,GAAG,kBAAkB,EAAE,CAAC;IAChC,CAAC;SAAM,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QAChC,MAAM,GAAG,iBAAiB,EAAE,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,kBAAkB,EAAE,CAAC;IAChC,CAAC;IACD,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,MAAM;QACN,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { GlobalOptions } from "../../core/shared/command-types.js";
2
+ declare const CONFIG_SCOPE_VALUES: readonly ["project", "global"];
3
+ type ConfigScope = (typeof CONFIG_SCOPE_VALUES)[number];
4
+ export interface ConfigCommandOptions {
5
+ criterion?: string[];
6
+ }
7
+ export interface ConfigResult {
8
+ scope: ConfigScope;
9
+ key: "definition_of_done";
10
+ criteria: string[];
11
+ settings_path: string;
12
+ changed: boolean;
13
+ }
14
+ export declare function runConfig(scopeValue: string, actionValue: string, keyValue: string, options: ConfigCommandOptions, global: GlobalOptions): Promise<ConfigResult>;
15
+ export {};
@@ -0,0 +1,72 @@
1
+ import { pathExists } from "../../core/fs/fs-utils.js";
2
+ import { EXIT_CODE } from "../../core/shared/constants.js";
3
+ import { PmCliError } from "../../core/shared/errors.js";
4
+ import { getSettingsPath, resolveGlobalPmRoot, resolvePmRoot, } from "../../core/store/paths.js";
5
+ import { readSettings, writeSettings } from "../../core/store/settings.js";
6
+ const CONFIG_SCOPE_VALUES = ["project", "global"];
7
+ const CONFIG_KEY_VALUES = ["definition-of-done", "definition_of_done"];
8
+ function normalizeScope(value) {
9
+ if (CONFIG_SCOPE_VALUES.includes(value)) {
10
+ return value;
11
+ }
12
+ throw new PmCliError(`Invalid config scope "${value}". Allowed: ${CONFIG_SCOPE_VALUES.join(", ")}`, EXIT_CODE.USAGE);
13
+ }
14
+ function normalizeAction(value) {
15
+ if (value === "get" || value === "set") {
16
+ return value;
17
+ }
18
+ throw new PmCliError(`Invalid config action "${value}". Allowed: get, set`, EXIT_CODE.USAGE);
19
+ }
20
+ function normalizeKey(value) {
21
+ if (CONFIG_KEY_VALUES.includes(value)) {
22
+ return "definition_of_done";
23
+ }
24
+ throw new PmCliError(`Invalid config key "${value}". Supported: ${CONFIG_KEY_VALUES.join(", ")}`, EXIT_CODE.USAGE);
25
+ }
26
+ function normalizeCriteria(values) {
27
+ const normalized = [...new Set((values ?? []).map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
28
+ if (normalized.length === 0) {
29
+ throw new PmCliError("Config set definition-of-done requires at least one non-empty --criterion value", EXIT_CODE.USAGE);
30
+ }
31
+ return normalized;
32
+ }
33
+ async function resolveSettingsTarget(scope, global) {
34
+ const cwd = process.cwd();
35
+ const pmRoot = scope === "project" ? resolvePmRoot(cwd, global.path) : resolveGlobalPmRoot(cwd);
36
+ const settingsPath = getSettingsPath(pmRoot);
37
+ if (scope === "project" && !(await pathExists(settingsPath))) {
38
+ throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
39
+ }
40
+ return { pmRoot, settingsPath };
41
+ }
42
+ export async function runConfig(scopeValue, actionValue, keyValue, options, global) {
43
+ const scope = normalizeScope(scopeValue);
44
+ const action = normalizeAction(actionValue);
45
+ const key = normalizeKey(keyValue);
46
+ const target = await resolveSettingsTarget(scope, global);
47
+ const settings = await readSettings(target.pmRoot);
48
+ if (action === "get") {
49
+ return {
50
+ scope,
51
+ key,
52
+ criteria: [...settings.workflow.definition_of_done],
53
+ settings_path: target.settingsPath,
54
+ changed: false,
55
+ };
56
+ }
57
+ const nextCriteria = normalizeCriteria(options.criterion);
58
+ const changed = nextCriteria.length !== settings.workflow.definition_of_done.length ||
59
+ nextCriteria.some((value, index) => value !== settings.workflow.definition_of_done[index]);
60
+ settings.workflow.definition_of_done = nextCriteria;
61
+ if (changed) {
62
+ await writeSettings(target.pmRoot, settings, "config:set:definition_of_done");
63
+ }
64
+ return {
65
+ scope,
66
+ key,
67
+ criteria: [...settings.workflow.definition_of_done],
68
+ settings_path: target.settingsPath,
69
+ changed,
70
+ };
71
+ }
72
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { GlobalOptions } from "../../core/shared/command-types.js";
2
+ import type { ItemFrontMatter } from "../../types/index.js";
3
+ export interface CreateCommandOptions {
4
+ title: string;
5
+ description: string;
6
+ type: string;
7
+ status: string;
8
+ priority: string;
9
+ tags: string;
10
+ body: string;
11
+ deadline: string;
12
+ estimatedMinutes: string;
13
+ acceptanceCriteria: string;
14
+ definitionOfReady?: string;
15
+ order?: string;
16
+ rank?: string;
17
+ goal?: string;
18
+ objective?: string;
19
+ value?: string;
20
+ impact?: string;
21
+ outcome?: string;
22
+ whyNow?: string;
23
+ author: string;
24
+ message: string;
25
+ assignee: string;
26
+ parent?: string;
27
+ reviewer?: string;
28
+ risk?: string;
29
+ confidence?: string;
30
+ sprint?: string;
31
+ release?: string;
32
+ blockedBy?: string;
33
+ blockedReason?: string;
34
+ unblockNote?: string;
35
+ reporter?: string;
36
+ severity?: string;
37
+ environment?: string;
38
+ reproSteps?: string;
39
+ resolution?: string;
40
+ expectedResult?: string;
41
+ actualResult?: string;
42
+ affectedVersion?: string;
43
+ fixedVersion?: string;
44
+ component?: string;
45
+ regression?: string;
46
+ customerImpact?: string;
47
+ dep?: string[];
48
+ comment?: string[];
49
+ note?: string[];
50
+ learning?: string[];
51
+ file?: string[];
52
+ test?: string[];
53
+ doc?: string[];
54
+ }
55
+ export interface CreateResult {
56
+ item: ItemFrontMatter;
57
+ changed_fields: string[];
58
+ warnings: string[];
59
+ }
60
+ export declare function runCreate(options: CreateCommandOptions, global: GlobalOptions): Promise<CreateResult>;