@klarocards/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +125 -0
  2. package/dist/commands/cheatsheet.d.ts +3 -0
  3. package/dist/commands/cheatsheet.d.ts.map +1 -0
  4. package/dist/commands/cheatsheet.js +80 -0
  5. package/dist/commands/cheatsheet.js.map +1 -0
  6. package/dist/commands/completion.d.ts +3 -0
  7. package/dist/commands/completion.d.ts.map +1 -0
  8. package/dist/commands/completion.js +191 -0
  9. package/dist/commands/completion.js.map +1 -0
  10. package/dist/commands/config.d.ts +3 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +77 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/create.d.ts +3 -0
  15. package/dist/commands/create.d.ts.map +1 -0
  16. package/dist/commands/create.js +121 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/del.d.ts +3 -0
  19. package/dist/commands/del.d.ts.map +1 -0
  20. package/dist/commands/del.js +49 -0
  21. package/dist/commands/del.js.map +1 -0
  22. package/dist/commands/describe.d.ts +3 -0
  23. package/dist/commands/describe.d.ts.map +1 -0
  24. package/dist/commands/describe.js +105 -0
  25. package/dist/commands/describe.js.map +1 -0
  26. package/dist/commands/edit.d.ts +3 -0
  27. package/dist/commands/edit.d.ts.map +1 -0
  28. package/dist/commands/edit.js +91 -0
  29. package/dist/commands/edit.js.map +1 -0
  30. package/dist/commands/fetch.d.ts +3 -0
  31. package/dist/commands/fetch.d.ts.map +1 -0
  32. package/dist/commands/fetch.js +129 -0
  33. package/dist/commands/fetch.js.map +1 -0
  34. package/dist/commands/init.d.ts +3 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +122 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/login.d.ts +7 -0
  39. package/dist/commands/login.d.ts.map +1 -0
  40. package/dist/commands/login.js +101 -0
  41. package/dist/commands/login.js.map +1 -0
  42. package/dist/commands/logout.d.ts +3 -0
  43. package/dist/commands/logout.d.ts.map +1 -0
  44. package/dist/commands/logout.js +34 -0
  45. package/dist/commands/logout.js.map +1 -0
  46. package/dist/commands/ls.d.ts +3 -0
  47. package/dist/commands/ls.d.ts.map +1 -0
  48. package/dist/commands/ls.js +174 -0
  49. package/dist/commands/ls.js.map +1 -0
  50. package/dist/commands/read.d.ts +3 -0
  51. package/dist/commands/read.d.ts.map +1 -0
  52. package/dist/commands/read.js +64 -0
  53. package/dist/commands/read.js.map +1 -0
  54. package/dist/commands/set.d.ts +3 -0
  55. package/dist/commands/set.d.ts.map +1 -0
  56. package/dist/commands/set.js +61 -0
  57. package/dist/commands/set.js.map +1 -0
  58. package/dist/commands/sync.d.ts +3 -0
  59. package/dist/commands/sync.d.ts.map +1 -0
  60. package/dist/commands/sync.js +157 -0
  61. package/dist/commands/sync.js.map +1 -0
  62. package/dist/commands/update.d.ts +4 -0
  63. package/dist/commands/update.d.ts.map +1 -0
  64. package/dist/commands/update.js +68 -0
  65. package/dist/commands/update.js.map +1 -0
  66. package/dist/commands/use.d.ts +3 -0
  67. package/dist/commands/use.d.ts.map +1 -0
  68. package/dist/commands/use.js +29 -0
  69. package/dist/commands/use.js.map +1 -0
  70. package/dist/commands/whoami.d.ts +3 -0
  71. package/dist/commands/whoami.d.ts.map +1 -0
  72. package/dist/commands/whoami.js +30 -0
  73. package/dist/commands/whoami.js.map +1 -0
  74. package/dist/completions/bash.d.ts +2 -0
  75. package/dist/completions/bash.d.ts.map +1 -0
  76. package/dist/completions/bash.js +134 -0
  77. package/dist/completions/bash.js.map +1 -0
  78. package/dist/completions/commands.d.ts +18 -0
  79. package/dist/completions/commands.d.ts.map +1 -0
  80. package/dist/completions/commands.js +173 -0
  81. package/dist/completions/commands.js.map +1 -0
  82. package/dist/completions/fish.d.ts +2 -0
  83. package/dist/completions/fish.d.ts.map +1 -0
  84. package/dist/completions/fish.js +84 -0
  85. package/dist/completions/fish.js.map +1 -0
  86. package/dist/completions/zsh.d.ts +2 -0
  87. package/dist/completions/zsh.d.ts.map +1 -0
  88. package/dist/completions/zsh.js +113 -0
  89. package/dist/completions/zsh.js.map +1 -0
  90. package/dist/index.d.ts +3 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +158 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/lib/api.d.ts +34 -0
  95. package/dist/lib/api.d.ts.map +1 -0
  96. package/dist/lib/api.js +146 -0
  97. package/dist/lib/api.js.map +1 -0
  98. package/dist/lib/completion-cache.d.ts +34 -0
  99. package/dist/lib/completion-cache.d.ts.map +1 -0
  100. package/dist/lib/completion-cache.js +99 -0
  101. package/dist/lib/completion-cache.js.map +1 -0
  102. package/dist/lib/config.d.ts +12 -0
  103. package/dist/lib/config.d.ts.map +1 -0
  104. package/dist/lib/config.js +111 -0
  105. package/dist/lib/config.js.map +1 -0
  106. package/dist/lib/connector.d.ts +17 -0
  107. package/dist/lib/connector.d.ts.map +1 -0
  108. package/dist/lib/connector.js +2 -0
  109. package/dist/lib/connector.js.map +1 -0
  110. package/dist/lib/defaults.d.ts +9 -0
  111. package/dist/lib/defaults.d.ts.map +1 -0
  112. package/dist/lib/defaults.js +58 -0
  113. package/dist/lib/defaults.js.map +1 -0
  114. package/dist/lib/trace.d.ts +4 -0
  115. package/dist/lib/trace.d.ts.map +1 -0
  116. package/dist/lib/trace.js +13 -0
  117. package/dist/lib/trace.js.map +1 -0
  118. package/dist/lib/types.d.ts +70 -0
  119. package/dist/lib/types.d.ts.map +1 -0
  120. package/dist/lib/types.js +2 -0
  121. package/dist/lib/types.js.map +1 -0
  122. package/dist/utils/content.d.ts +26 -0
  123. package/dist/utils/content.d.ts.map +1 -0
  124. package/dist/utils/content.js +52 -0
  125. package/dist/utils/content.js.map +1 -0
  126. package/dist/utils/dimensions.d.ts +17 -0
  127. package/dist/utils/dimensions.d.ts.map +1 -0
  128. package/dist/utils/dimensions.js +41 -0
  129. package/dist/utils/dimensions.js.map +1 -0
  130. package/dist/utils/editor.d.ts +14 -0
  131. package/dist/utils/editor.d.ts.map +1 -0
  132. package/dist/utils/editor.js +56 -0
  133. package/dist/utils/editor.js.map +1 -0
  134. package/dist/utils/format.d.ts +17 -0
  135. package/dist/utils/format.d.ts.map +1 -0
  136. package/dist/utils/format.js +27 -0
  137. package/dist/utils/format.js.map +1 -0
  138. package/dist/utils/markdown.d.ts +24 -0
  139. package/dist/utils/markdown.d.ts.map +1 -0
  140. package/dist/utils/markdown.js +50 -0
  141. package/dist/utils/markdown.js.map +1 -0
  142. package/dist/utils/objects.d.ts +12 -0
  143. package/dist/utils/objects.d.ts.map +1 -0
  144. package/dist/utils/objects.js +31 -0
  145. package/dist/utils/objects.js.map +1 -0
  146. package/dist/utils/slugify.d.ts +10 -0
  147. package/dist/utils/slugify.d.ts.map +1 -0
  148. package/dist/utils/slugify.js +18 -0
  149. package/dist/utils/slugify.js.map +1 -0
  150. package/dist/utils/story-editor.d.ts +15 -0
  151. package/dist/utils/story-editor.d.ts.map +1 -0
  152. package/dist/utils/story-editor.js +43 -0
  153. package/dist/utils/story-editor.js.map +1 -0
  154. package/dist/utils/story-markdown.d.ts +36 -0
  155. package/dist/utils/story-markdown.d.ts.map +1 -0
  156. package/dist/utils/story-markdown.js +114 -0
  157. package/dist/utils/story-markdown.js.map +1 -0
  158. package/dist/utils/table.d.ts +18 -0
  159. package/dist/utils/table.d.ts.map +1 -0
  160. package/dist/utils/table.js +57 -0
  161. package/dist/utils/table.js.map +1 -0
  162. package/dist/utils/validation.d.ts +8 -0
  163. package/dist/utils/validation.d.ts.map +1 -0
  164. package/dist/utils/validation.js +17 -0
  165. package/dist/utils/validation.js.map +1 -0
  166. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # Klaro CLI
2
+
3
+ Command-line interface for [Klaro Cards](https://klaro.cards).
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @klarocards/cli
9
+ ```
10
+
11
+ Requires Node.js 18.0.0 or higher.
12
+
13
+ ## Getting Started
14
+
15
+ Login with your Klaro Cards credentials:
16
+
17
+ ```bash
18
+ klaro login [--env]
19
+ ```
20
+
21
+ Select the project you want to work with:
22
+
23
+ ```bash
24
+ klaro ls projects # see available projects
25
+ klaro use my-project # set the active project
26
+ ```
27
+
28
+ Explore the project structure:
29
+
30
+ ```bash
31
+ klaro ls boards # list boards in the project
32
+ klaro ls dimensions # list available dimensions
33
+ klaro describe board backlog # see a board's filters
34
+ klaro describe dimension status # see a dimension's values
35
+ ```
36
+
37
+ Start working with cards:
38
+
39
+ ```bash
40
+ klaro ls # list cards (default board)
41
+ klaro ls -b backlog # list cards from a specific board
42
+ klaro ls --dims status,assignee # show specific dimensions
43
+ klaro read 42 # read a card's full content
44
+ klaro create "My new card" # create a card
45
+ klaro update 42 status=done # update a card's dimension
46
+ klaro edit 42 # edit a card in your $EDITOR
47
+ ```
48
+
49
+ Run `klaro cheatsheet` for more examples, or `klaro <command> --help` for detailed usage.
50
+
51
+ ## Usage
52
+
53
+ ```
54
+ Usage: klaro [options] [command]
55
+
56
+ Command-line interface for Klaro Cards
57
+
58
+ Options:
59
+ -V, --version output the version number
60
+ --trace Enable API request/response tracing
61
+ --show <dimensions> Dimensions to display (comma-separated)
62
+ --board <board> Board identifier
63
+ --save-defaults Save --show and --board as project defaults
64
+ -h, --help display help for command
65
+
66
+ Commands:
67
+ login Login to Klaro Cards
68
+ logout Logout from Klaro Cards
69
+ whoami Show the currently logged in user
70
+ use <subdomain> Set the default Klaro project
71
+ ls List cards, projects, boards, or dimensions
72
+ create [options] [title] Create a new card in a board
73
+ del [options] <identifiers...> Delete one or more cards by identifier
74
+ set [options] <identifiers...> Update one or more cards by identifier
75
+ read [options] <identifiers...> Read one or more cards and display as markdown
76
+ edit [options] <identifiers...> Edit one or more cards in your default editor
77
+ config Manage project configuration and defaults
78
+ init [options] [folder] Initialize Klaro configuration
79
+ cheatsheet [options] Display a quick reference guide
80
+ fetch [options] <identifiers...> Download cards as markdown files for offline editing
81
+ sync [options] Upload local card changes and delete synced files
82
+ help [command] display help for command
83
+ ```
84
+
85
+ Run `klaro cheatsheet` for common usage examples.
86
+
87
+ ## Development
88
+
89
+ ```bash
90
+ npm install # Install dependencies
91
+ npm run build # Build
92
+ npm test # Run tests
93
+ ```
94
+
95
+ ### Running from source
96
+
97
+ Build and run directly:
98
+
99
+ ```bash
100
+ npm run build
101
+ node dist/index.js
102
+ ```
103
+
104
+ Or use watch mode for development (auto-recompiles on changes):
105
+
106
+ ```bash
107
+ npm run dev
108
+ ```
109
+
110
+ Then in another terminal:
111
+
112
+ ```bash
113
+ node dist/index.js
114
+ ```
115
+
116
+ To make the `klaro` command available globally from your local checkout:
117
+
118
+ ```bash
119
+ npm link
120
+ klaro
121
+ ```
122
+
123
+ ## License
124
+
125
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCheatsheetCommand(): Command;
3
+ //# sourceMappingURL=cheatsheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheatsheet.d.ts","sourceRoot":"","sources":["../../src/commands/cheatsheet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2EpC,wBAAgB,uBAAuB,IAAI,OAAO,CAajD"}
@@ -0,0 +1,80 @@
1
+ import { Command } from 'commander';
2
+ import { Bmg } from '@enspirit/bmg-js';
3
+ import { renderMarkdown } from '../utils/markdown.js';
4
+ const INTRO = `Klaro CLI is a command-line interface for managing cards on Klaro Cards.
5
+ It is designed to be AI-agent friendly, enabling seamless integration with
6
+ tools like Claude Code for backlog, task and project management workflows.`;
7
+ const TIPS = `- Use \`--raw\` with \`read\` to get plain markdown without highlighting
8
+ - Cards are identified by their numeric identifier (shown in ls output)
9
+ - Most commands support \`-p <project>\` to override the active project
10
+
11
+ Run \`klaro --help\` for all available commands and options.
12
+ Run \`klaro <command> --help\` for detailed help on a specific command.`;
13
+ const EXAMPLES = Bmg([
14
+ { category: 'Setup', example: 'klaro init .', explanation: 'Initialize klaro in current directory' },
15
+ { category: 'Setup', example: 'klaro login', explanation: 'Authenticate with email/password' },
16
+ { category: 'Setup', example: 'klaro use <project>', explanation: 'Set active project by subdomain' },
17
+ { category: 'Listing', example: 'klaro ls', explanation: 'List cards (default board: all)' },
18
+ { category: 'Listing', example: 'klaro ls -b backlog', explanation: 'List from specific board' },
19
+ { category: 'Listing', example: 'klaro ls --dims progress', explanation: 'Show specific dimensions' },
20
+ { category: 'Listing', example: 'klaro ls --filter status=open', explanation: 'Filter by dimension value' },
21
+ { category: 'Listing', example: 'klaro ls projects', explanation: 'List available projects' },
22
+ { category: 'Listing', example: 'klaro ls boards', explanation: 'List boards in project' },
23
+ { category: 'Listing', example: 'klaro ls dimensions', explanation: 'List dimensions in project' },
24
+ { category: 'Reading', example: 'klaro read 1', explanation: 'Read card as markdown' },
25
+ { category: 'Reading', example: 'klaro read 1 2 3', explanation: 'Read multiple cards' },
26
+ { category: 'Reading', example: 'klaro read 1 --dims progress', explanation: 'Include dimensions in output' },
27
+ { category: 'Editing', example: 'klaro edit 1', explanation: 'Edit card in $EDITOR' },
28
+ { category: 'Editing', example: 'klaro edit 1 2 3', explanation: 'Edit multiple cards sequentially' },
29
+ { category: 'Editing', example: 'klaro edit 1 --dims progress', explanation: 'Include dimensions in editor' },
30
+ { category: 'Creating', example: 'klaro create "Card title"', explanation: 'Create new card with title' },
31
+ { category: 'Creating', example: 'klaro create @card.md', explanation: 'Create from markdown file' },
32
+ { category: 'Creating', example: 'cat card.md | klaro create', explanation: 'Create from stdin' },
33
+ { category: 'Creating', example: 'klaro create "Title" -b backlog', explanation: 'Create in specific board' },
34
+ { category: 'Duplicating', example: 'klaro read 3 | klaro create', explanation: 'Duplicate card 3' },
35
+ { category: 'Duplicating', example: 'klaro read 3 | klaro create assignee=Bob', explanation: 'Duplicate and reassign' },
36
+ { category: 'Updating', example: 'klaro update 1 progress=done', explanation: 'Update a dimension' },
37
+ { category: 'Updating', example: 'klaro upd 1 2 3 progress=done', explanation: 'Update multiple cards' },
38
+ { category: 'Updating', example: 'klaro del 1', explanation: 'Delete a card' },
39
+ { category: 'Offline', example: 'klaro fetch 1 2 3', explanation: 'Download cards as markdown files' },
40
+ { category: 'Offline', example: 'klaro fetch 1 --dims progress', explanation: 'Include dimensions in downloaded files' },
41
+ { category: 'Offline', example: 'klaro sync', explanation: 'Upload changes and delete local files' },
42
+ { category: 'Offline', example: 'klaro sync --keep', explanation: 'Upload changes but keep local files' },
43
+ { category: 'Defaults', example: 'klaro config set board backlog', explanation: 'Set default board' },
44
+ { category: 'Defaults', example: 'klaro config set dims progress,assignee', explanation: 'Set default dimensions' },
45
+ { category: 'Defaults', example: 'klaro --save-defaults ls --dims progress', explanation: 'Save defaults as you go' },
46
+ { category: 'Defaults', example: 'klaro config list', explanation: 'View saved defaults' },
47
+ ]).group(['example', 'explanation'], 'examples', { allbut: true });
48
+ function buildCheatsheet(table) {
49
+ const lines = ['# Klaro CLI', '', INTRO, ''];
50
+ if (table) {
51
+ lines.push(EXAMPLES.toText({ border: 'rounded' }));
52
+ }
53
+ else {
54
+ for (const { category, examples } of EXAMPLES.tuples) {
55
+ lines.push(`## ${category}`, '');
56
+ for (const { example, explanation } of examples.tuples) {
57
+ lines.push(`${example.padEnd(45)} # ${explanation}`);
58
+ }
59
+ lines.push('');
60
+ }
61
+ }
62
+ lines.push('## Tips', '', TIPS);
63
+ return lines.join('\n');
64
+ }
65
+ export function createCheatsheetCommand() {
66
+ return new Command('cheatsheet')
67
+ .description('Display a quick reference guide')
68
+ .option('--table', 'Display in table format (for humans)')
69
+ .option('--raw', 'Output without syntax highlighting')
70
+ .action((options) => {
71
+ const content = buildCheatsheet(options.table ?? false);
72
+ if (options.raw) {
73
+ console.log(content);
74
+ }
75
+ else {
76
+ console.log(renderMarkdown(content));
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=cheatsheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cheatsheet.js","sourceRoot":"","sources":["../../src/commands/cheatsheet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCompletionCommand(): Command;
3
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0LpC,wBAAgB,uBAAuB,IAAI,OAAO,CAuCjD"}
@@ -0,0 +1,191 @@
1
+ import { Command } from 'commander';
2
+ import { generateBashCompletion } from '../completions/bash.js';
3
+ import { generateZshCompletion } from '../completions/zsh.js';
4
+ import { generateFishCompletion } from '../completions/fish.js';
5
+ import { getCachedProjects, getCachedBoards, setCachedProjects, setCachedBoards, } from '../lib/completion-cache.js';
6
+ import { createClient } from '../lib/api.js';
7
+ import { getToken, getProject } from '../lib/config.js';
8
+ function detectShell() {
9
+ const shell = process.env.SHELL ?? '';
10
+ if (shell.includes('zsh'))
11
+ return 'zsh';
12
+ if (shell.includes('bash'))
13
+ return 'bash';
14
+ if (shell.includes('fish'))
15
+ return 'fish';
16
+ return null;
17
+ }
18
+ function generateCompletion(shell) {
19
+ switch (shell) {
20
+ case 'bash':
21
+ return generateBashCompletion();
22
+ case 'zsh':
23
+ return generateZshCompletion();
24
+ case 'fish':
25
+ return generateFishCompletion();
26
+ }
27
+ }
28
+ async function refreshCache() {
29
+ const token = getToken();
30
+ const project = getProject();
31
+ if (!token) {
32
+ console.error('Not logged in. Run "klaro login" first to enable dynamic completions.');
33
+ return;
34
+ }
35
+ // Refresh projects
36
+ try {
37
+ const api = createClient(project ?? 'app', token);
38
+ const projects = await api.listProjects();
39
+ setCachedProjects(projects.map(p => ({ subdomain: p.subdomain, label: p.label })));
40
+ console.log(`Cached ${projects.length} project(s)`);
41
+ }
42
+ catch (error) {
43
+ console.error('Failed to refresh projects cache');
44
+ }
45
+ // Refresh boards for current project
46
+ if (project) {
47
+ try {
48
+ const api = createClient(project, token);
49
+ const boards = await api.listBoards();
50
+ setCachedBoards(project, boards.map(b => ({ identifier: b.identifier, label: b.label })));
51
+ console.log(`Cached ${boards.length} board(s) for project "${project}"`);
52
+ }
53
+ catch (error) {
54
+ console.error(`Failed to refresh boards cache for project "${project}"`);
55
+ }
56
+ }
57
+ }
58
+ async function completionAction(shell, options) {
59
+ // Handle internal options for shell scripts
60
+ if (options.listProjects) {
61
+ const projects = getCachedProjects();
62
+ if (projects.length > 0) {
63
+ console.log(projects.join('\n'));
64
+ }
65
+ else {
66
+ // Try to refresh cache silently
67
+ const token = getToken();
68
+ if (token) {
69
+ try {
70
+ const api = createClient(getProject() ?? 'app', token);
71
+ const freshProjects = await api.listProjects();
72
+ setCachedProjects(freshProjects.map(p => ({ subdomain: p.subdomain, label: p.label })));
73
+ console.log(freshProjects.map(p => p.subdomain).join('\n'));
74
+ }
75
+ catch {
76
+ // Silent failure
77
+ }
78
+ }
79
+ }
80
+ return;
81
+ }
82
+ if (options.listBoards) {
83
+ const project = getProject();
84
+ if (!project)
85
+ return;
86
+ const boards = getCachedBoards(project);
87
+ if (boards.length > 0) {
88
+ console.log(boards.join('\n'));
89
+ }
90
+ else {
91
+ // Try to refresh cache silently
92
+ const token = getToken();
93
+ if (token) {
94
+ try {
95
+ const api = createClient(project, token);
96
+ const freshBoards = await api.listBoards();
97
+ setCachedBoards(project, freshBoards.map(b => ({ identifier: b.identifier, label: b.label })));
98
+ console.log(freshBoards.map(b => b.identifier).join('\n'));
99
+ }
100
+ catch {
101
+ // Silent failure
102
+ }
103
+ }
104
+ }
105
+ return;
106
+ }
107
+ // No shell specified, detect or prompt
108
+ if (!shell) {
109
+ const detected = detectShell();
110
+ if (detected) {
111
+ console.log(generateCompletion(detected));
112
+ }
113
+ else {
114
+ console.error('Could not detect shell. Please specify: klaro completion bash|zsh|fish');
115
+ process.exit(1);
116
+ }
117
+ return;
118
+ }
119
+ // Validate shell argument
120
+ if (!['bash', 'zsh', 'fish'].includes(shell)) {
121
+ console.error(`Unknown shell: ${shell}. Supported shells: bash, zsh, fish`);
122
+ process.exit(1);
123
+ return;
124
+ }
125
+ console.log(generateCompletion(shell));
126
+ }
127
+ async function refreshAction() {
128
+ await refreshCache();
129
+ }
130
+ async function installAction() {
131
+ const shell = detectShell();
132
+ if (!shell) {
133
+ console.error('Could not detect shell. Please add completion manually.');
134
+ console.error('');
135
+ console.error('Bash: Add to ~/.bashrc:');
136
+ console.error(' eval "$(klaro completion bash)"');
137
+ console.error('');
138
+ console.error('Zsh: Add to ~/.zshrc:');
139
+ console.error(' eval "$(klaro completion zsh)"');
140
+ console.error('');
141
+ console.error('Fish: Add to ~/.config/fish/config.fish:');
142
+ console.error(' klaro completion fish | source');
143
+ process.exit(1);
144
+ return;
145
+ }
146
+ console.log(`Detected shell: ${shell}`);
147
+ console.log('');
148
+ console.log('Add the following line to your shell configuration:');
149
+ console.log('');
150
+ switch (shell) {
151
+ case 'bash':
152
+ console.log(' # Add to ~/.bashrc');
153
+ console.log(' eval "$(klaro completion bash)"');
154
+ break;
155
+ case 'zsh':
156
+ console.log(' # Add to ~/.zshrc');
157
+ console.log(' eval "$(klaro completion zsh)"');
158
+ break;
159
+ case 'fish':
160
+ console.log(' # Add to ~/.config/fish/config.fish');
161
+ console.log(' klaro completion fish | source');
162
+ break;
163
+ }
164
+ console.log('');
165
+ console.log('Then restart your shell or source the config file.');
166
+ }
167
+ export function createCompletionCommand() {
168
+ const cmd = new Command('completion')
169
+ .description('Generate shell completion scripts')
170
+ .argument('[shell]', 'Shell type (bash, zsh, fish)')
171
+ .option('--list-projects', 'List cached projects (internal)', false)
172
+ .option('--list-boards', 'List cached boards (internal)', false)
173
+ .action(completionAction);
174
+ cmd.addCommand(new Command('bash')
175
+ .description('Generate bash completions')
176
+ .action(() => console.log(generateBashCompletion())));
177
+ cmd.addCommand(new Command('zsh')
178
+ .description('Generate zsh completions')
179
+ .action(() => console.log(generateZshCompletion())));
180
+ cmd.addCommand(new Command('fish')
181
+ .description('Generate fish completions')
182
+ .action(() => console.log(generateFishCompletion())));
183
+ cmd.addCommand(new Command('install')
184
+ .description('Show installation instructions')
185
+ .action(installAction));
186
+ cmd.addCommand(new Command('refresh')
187
+ .description('Refresh completion cache')
188
+ .action(refreshAction));
189
+ return cmd;
190
+ }
191
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createConfigCommand(): Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0B7C"}
@@ -0,0 +1,77 @@
1
+ import { Command } from 'commander';
2
+ import { requireProject } from '../lib/config.js';
3
+ import { setProjectDefault, unsetProjectDefault, listProjectDefaults, getProjectDefaults, } from '../lib/defaults.js';
4
+ function setAction(key, value, _options, command) {
5
+ try {
6
+ const globalOpts = command.optsWithGlobals();
7
+ const project = requireProject(globalOpts.project);
8
+ if (!isValidKey(key)) {
9
+ console.error(`Error: Unknown option "${key}". Valid options: board, dims`);
10
+ process.exit(1);
11
+ return;
12
+ }
13
+ setProjectDefault(project, key, value);
14
+ console.log(`Set default ${key}="${value}" for project "${project}"`);
15
+ }
16
+ catch (error) {
17
+ console.error(error.message);
18
+ process.exit(1);
19
+ }
20
+ }
21
+ function unsetAction(key, _options, command) {
22
+ try {
23
+ const globalOpts = command.optsWithGlobals();
24
+ const project = requireProject(globalOpts.project);
25
+ if (!isValidKey(key)) {
26
+ console.error(`Error: Unknown option "${key}". Valid options: board, dims`);
27
+ process.exit(1);
28
+ return;
29
+ }
30
+ unsetProjectDefault(project, key);
31
+ console.log(`Removed default for "${key}" from project "${project}"`);
32
+ }
33
+ catch (error) {
34
+ console.error(error.message);
35
+ process.exit(1);
36
+ }
37
+ }
38
+ function listAction(_options, command) {
39
+ try {
40
+ const globalOpts = command.optsWithGlobals();
41
+ const project = requireProject(globalOpts.project);
42
+ const defaults = listProjectDefaults(project);
43
+ const projectDefaults = getProjectDefaults(project);
44
+ console.log(`Defaults for project "${project}":\n`);
45
+ for (const [key, value] of Object.entries(defaults)) {
46
+ const source = projectDefaults[key] !== undefined
47
+ ? '(configured)'
48
+ : '(default)';
49
+ console.log(` ${key}: ${value} ${source}`);
50
+ }
51
+ }
52
+ catch (error) {
53
+ console.error(error.message);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ function isValidKey(key) {
58
+ return key === 'board' || key === 'dims';
59
+ }
60
+ export function createConfigCommand() {
61
+ const cmd = new Command('config')
62
+ .description('Manage project configuration and defaults');
63
+ cmd.addCommand(new Command('set')
64
+ .description('Set a default option value for the current project')
65
+ .argument('<key>', 'Option name (board or dims)')
66
+ .argument('<value>', 'Default value')
67
+ .action(setAction));
68
+ cmd.addCommand(new Command('unset')
69
+ .description('Remove a default option value for the current project')
70
+ .argument('<key>', 'Option name to remove (board or dims)')
71
+ .action(unsetAction));
72
+ cmd.addCommand(new Command('list')
73
+ .description('List all default option values for the current project')
74
+ .action(listAction));
75
+ return cmd;
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCreateCommand(): Command;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyHpC,wBAAgB,mBAAmB,IAAI,OAAO,CAQ7C"}
@@ -0,0 +1,121 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync } from 'fs';
3
+ import { createClient, KlaroApiError } from '../lib/api.js';
4
+ import { requireProject, requireToken } from '../lib/config.js';
5
+ import { resolveBoard, resolveDims } from '../lib/defaults.js';
6
+ import { splitArgs, parseDimensions } from '../utils/dimensions.js';
7
+ import { editStoryInEditor } from '../utils/story-editor.js';
8
+ import { printTable } from '../utils/table.js';
9
+ import { parseStoryMarkdown } from '../utils/story-markdown.js';
10
+ async function readStdin() {
11
+ const chunks = [];
12
+ for await (const chunk of process.stdin) {
13
+ chunks.push(chunk);
14
+ }
15
+ return Buffer.concat(chunks).toString('utf-8');
16
+ }
17
+ function readFromFile(path) {
18
+ return readFileSync(path, 'utf-8');
19
+ }
20
+ async function createAction(args, options, command) {
21
+ try {
22
+ const globalOpts = command.optsWithGlobals();
23
+ const project = requireProject(globalOpts.project);
24
+ const token = requireToken();
25
+ const board = resolveBoard(globalOpts.board ?? options.board, project);
26
+ // Split args into title/file and key=value dimensions
27
+ const { regularArgs, dimensionArgs } = splitArgs(args);
28
+ const titleOrFile = regularArgs[0];
29
+ const cliDimensions = parseDimensions(dimensionArgs);
30
+ let title;
31
+ let specification;
32
+ let fileDimensions = {};
33
+ if (!titleOrFile) {
34
+ // No argument - read from stdin
35
+ if (process.stdin.isTTY) {
36
+ console.error('Error: No title provided. Use a title argument, @file.md, or pipe content.');
37
+ process.exit(1);
38
+ return;
39
+ }
40
+ const content = await readStdin();
41
+ const parsed = parseStoryMarkdown(content);
42
+ title = parsed.title;
43
+ specification = parsed.specification;
44
+ fileDimensions = parsed.dimensions ?? {};
45
+ }
46
+ else if (titleOrFile.startsWith('@')) {
47
+ // @file.md syntax - read from file
48
+ const filePath = titleOrFile.slice(1);
49
+ if (!filePath) {
50
+ console.error('Error: No file path provided after @');
51
+ process.exit(1);
52
+ return;
53
+ }
54
+ const content = readFromFile(filePath);
55
+ const parsed = parseStoryMarkdown(content);
56
+ title = parsed.title;
57
+ specification = parsed.specification;
58
+ fileDimensions = parsed.dimensions ?? {};
59
+ }
60
+ else {
61
+ // Plain title argument
62
+ title = titleOrFile;
63
+ }
64
+ const api = createClient(project, token);
65
+ const input = {
66
+ title,
67
+ specification,
68
+ ...fileDimensions,
69
+ ...cliDimensions, // CLI dimensions override file dimensions
70
+ };
71
+ let story = await api.createStory(board, input);
72
+ // If --edit flag is set, open the card in editor immediately
73
+ if (options.edit) {
74
+ const dimsOpt = resolveDims(globalOpts.dims ?? options.dims, project);
75
+ const dimensions = dimsOpt?.split(',').map((d) => d.trim());
76
+ const result = editStoryInEditor(story, dimensions);
77
+ if (result.error) {
78
+ console.error(result.error);
79
+ process.exit(1);
80
+ return;
81
+ }
82
+ if (result.changed && result.update) {
83
+ const updated = await api.updateStories(board, [result.update]);
84
+ story = updated[0];
85
+ console.log(`Card ${story.identifier} created and updated.`);
86
+ }
87
+ else {
88
+ console.log(`Card ${story.identifier} created (no edits made).`);
89
+ }
90
+ }
91
+ else {
92
+ // Display created card in table format (like ls does)
93
+ const dimsOpt = resolveDims(globalOpts.dims ?? options.dims, project);
94
+ const dimColumns = dimsOpt?.split(',').map((d) => d.trim()) ?? [];
95
+ const columns = ['identifier', 'title', ...dimColumns];
96
+ printTable([story], columns);
97
+ }
98
+ }
99
+ catch (error) {
100
+ if (error instanceof KlaroApiError) {
101
+ console.error(`Error: ${error.message}`);
102
+ }
103
+ else if (error instanceof Error) {
104
+ console.error(`Error: ${error.message}`);
105
+ }
106
+ else {
107
+ console.error('An unexpected error occurred');
108
+ }
109
+ process.exit(1);
110
+ }
111
+ }
112
+ export function createCreateCommand() {
113
+ return new Command('create')
114
+ .description('Create a new card in a board')
115
+ .argument('[args...]', 'Card title (or @file.md), followed by optional key=value dimensions')
116
+ .option('-b, --board <board>', 'Board identifier (default: "all")')
117
+ .option('--dims <dimensions>', 'Dimensions to include (comma-separated)')
118
+ .option('-e, --edit', 'Open the card in editor immediately after creation')
119
+ .action(createAction);
120
+ }
121
+ //# sourceMappingURL=create.js.map