@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.
- package/README.md +125 -0
- package/dist/commands/cheatsheet.d.ts +3 -0
- package/dist/commands/cheatsheet.d.ts.map +1 -0
- package/dist/commands/cheatsheet.js +80 -0
- package/dist/commands/cheatsheet.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +191 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +77 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +121 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/del.d.ts +3 -0
- package/dist/commands/del.d.ts.map +1 -0
- package/dist/commands/del.js +49 -0
- package/dist/commands/del.js.map +1 -0
- package/dist/commands/describe.d.ts +3 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +105 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +91 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/fetch.d.ts +3 -0
- package/dist/commands/fetch.d.ts.map +1 -0
- package/dist/commands/fetch.js +129 -0
- package/dist/commands/fetch.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +122 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +101 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +34 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/ls.d.ts +3 -0
- package/dist/commands/ls.d.ts.map +1 -0
- package/dist/commands/ls.js +174 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/read.d.ts +3 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +64 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +61 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +157 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +68 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/use.d.ts +3 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +29 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +30 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/completions/bash.d.ts +2 -0
- package/dist/completions/bash.d.ts.map +1 -0
- package/dist/completions/bash.js +134 -0
- package/dist/completions/bash.js.map +1 -0
- package/dist/completions/commands.d.ts +18 -0
- package/dist/completions/commands.d.ts.map +1 -0
- package/dist/completions/commands.js +173 -0
- package/dist/completions/commands.js.map +1 -0
- package/dist/completions/fish.d.ts +2 -0
- package/dist/completions/fish.d.ts.map +1 -0
- package/dist/completions/fish.js +84 -0
- package/dist/completions/fish.js.map +1 -0
- package/dist/completions/zsh.d.ts +2 -0
- package/dist/completions/zsh.d.ts.map +1 -0
- package/dist/completions/zsh.js +113 -0
- package/dist/completions/zsh.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +158 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +34 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +146 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/completion-cache.d.ts +34 -0
- package/dist/lib/completion-cache.d.ts.map +1 -0
- package/dist/lib/completion-cache.js +99 -0
- package/dist/lib/completion-cache.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +111 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/connector.d.ts +17 -0
- package/dist/lib/connector.d.ts.map +1 -0
- package/dist/lib/connector.js +2 -0
- package/dist/lib/connector.js.map +1 -0
- package/dist/lib/defaults.d.ts +9 -0
- package/dist/lib/defaults.d.ts.map +1 -0
- package/dist/lib/defaults.js +58 -0
- package/dist/lib/defaults.js.map +1 -0
- package/dist/lib/trace.d.ts +4 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +13 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/types.d.ts +70 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/utils/content.d.ts +26 -0
- package/dist/utils/content.d.ts.map +1 -0
- package/dist/utils/content.js +52 -0
- package/dist/utils/content.js.map +1 -0
- package/dist/utils/dimensions.d.ts +17 -0
- package/dist/utils/dimensions.d.ts.map +1 -0
- package/dist/utils/dimensions.js +41 -0
- package/dist/utils/dimensions.js.map +1 -0
- package/dist/utils/editor.d.ts +14 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +56 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/format.d.ts +17 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +27 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/markdown.d.ts +24 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +50 -0
- package/dist/utils/markdown.js.map +1 -0
- package/dist/utils/objects.d.ts +12 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +31 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/slugify.d.ts +10 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +18 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/utils/story-editor.d.ts +15 -0
- package/dist/utils/story-editor.d.ts.map +1 -0
- package/dist/utils/story-editor.js +43 -0
- package/dist/utils/story-editor.js.map +1 -0
- package/dist/utils/story-markdown.d.ts +36 -0
- package/dist/utils/story-markdown.d.ts.map +1 -0
- package/dist/utils/story-markdown.js +114 -0
- package/dist/utils/story-markdown.js.map +1 -0
- package/dist/utils/table.d.ts +18 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +57 -0
- package/dist/utils/table.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +17 -0
- package/dist/utils/validation.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|