@frehilm/ordna-cli 0.1.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/LICENSE +21 -0
- package/README.md +101 -0
- package/dist/agent.d.ts +18 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +36 -0
- package/dist/agent.js.map +1 -0
- package/dist/bin/ordna.d.ts +3 -0
- package/dist/bin/ordna.d.ts.map +1 -0
- package/dist/bin/ordna.js +11 -0
- package/dist/bin/ordna.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/colors.d.ts +12 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +18 -0
- package/dist/colors.js.map +1 -0
- package/dist/commands/assign.d.ts +2 -0
- package/dist/commands/assign.d.ts.map +1 -0
- package/dist/commands/assign.js +18 -0
- package/dist/commands/assign.js.map +1 -0
- package/dist/commands/commit.d.ts +2 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +14 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/create.d.ts +10 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +21 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +16 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/move.d.ts +2 -0
- package/dist/commands/move.d.ts.map +1 -0
- package/dist/commands/move.js +15 -0
- package/dist/commands/move.js.map +1 -0
- package/dist/commands/show.d.ts +2 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +13 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/web.d.ts +7 -0
- package/dist/commands/web.d.ts.map +1 -0
- package/dist/commands/web.js +26 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/format.d.ts +6 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +55 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/tui/App.d.ts +7 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +484 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Card.d.ts +12 -0
- package/dist/tui/Card.d.ts.map +1 -0
- package/dist/tui/Card.js +29 -0
- package/dist/tui/Card.js.map +1 -0
- package/dist/tui/Column.d.ts +18 -0
- package/dist/tui/Column.d.ts.map +1 -0
- package/dist/tui/Column.js +19 -0
- package/dist/tui/Column.js.map +1 -0
- package/dist/tui/SelectPrompt.d.ts +11 -0
- package/dist/tui/SelectPrompt.d.ts.map +1 -0
- package/dist/tui/SelectPrompt.js +25 -0
- package/dist/tui/SelectPrompt.js.map +1 -0
- package/dist/tui/Sidebar.d.ts +44 -0
- package/dist/tui/Sidebar.d.ts.map +1 -0
- package/dist/tui/Sidebar.js +84 -0
- package/dist/tui/Sidebar.js.map +1 -0
- package/dist/tui/Subbar.d.ts +11 -0
- package/dist/tui/Subbar.d.ts.map +1 -0
- package/dist/tui/Subbar.js +22 -0
- package/dist/tui/Subbar.js.map +1 -0
- package/dist/tui/TaskDetail.d.ts +12 -0
- package/dist/tui/TaskDetail.d.ts.map +1 -0
- package/dist/tui/TaskDetail.js +15 -0
- package/dist/tui/TaskDetail.js.map +1 -0
- package/dist/tui/TextPrompt.d.ts +10 -0
- package/dist/tui/TextPrompt.d.ts.map +1 -0
- package/dist/tui/TextPrompt.js +15 -0
- package/dist/tui/TextPrompt.js.map +1 -0
- package/dist/tui/hooks.d.ts +6 -0
- package/dist/tui/hooks.d.ts.map +1 -0
- package/dist/tui/hooks.js +21 -0
- package/dist/tui/hooks.js.map +1 -0
- package/dist/tui/index.d.ts +10 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +25 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/theme.d.ts +17 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +35 -0
- package/dist/tui/theme.js.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FreHilm
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# @frehilm/ordna-cli
|
|
2
|
+
|
|
3
|
+
The `ordna` binary plus an embeddable Ink-based Kanban TUI. Re-exports the entire [@frehilm/ordna-core](../core/README.md) API, so this is the only Ordna package you need if you're a terminal user or embedding the TUI in an IDE.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Global binary:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i -g @frehilm/ordna-cli # provides the `ordna` command
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
As a library:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pnpm add @frehilm/ordna-cli
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## CLI commands
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
ordna Launch the TUI (default)
|
|
23
|
+
ordna board Launch the TUI
|
|
24
|
+
ordna init Create .ordna/config.yaml and tasks/
|
|
25
|
+
ordna list [-s status] List tasks, optionally filtered
|
|
26
|
+
ordna show <id> Print a task
|
|
27
|
+
ordna create <title...> Create a task
|
|
28
|
+
-p, --priority <level> high | medium | low
|
|
29
|
+
-t, --tag <tag...> one or more tags
|
|
30
|
+
-d, --depends-on <id..> one or more dependency IDs
|
|
31
|
+
-a, --assignee <name>
|
|
32
|
+
-s, --status <status>
|
|
33
|
+
ordna move <id> <status> Change status (depends_on gate on the terminal status)
|
|
34
|
+
ordna assign <id> [name] Omit name to unassign
|
|
35
|
+
ordna commit [-m msg] Stage tasks/ and git commit
|
|
36
|
+
ordna web [-p port] Start the local web Kanban (delegates to @frehilm/ordna-web)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## TUI
|
|
40
|
+
|
|
41
|
+
Launch with `ordna` or `ordna board`. Three-pane layout: topbar · filter sidebar · board (columns) · subbar · footer hints.
|
|
42
|
+
|
|
43
|
+
| Key | Action |
|
|
44
|
+
|----------------|------------------------------------------|
|
|
45
|
+
| `Tab` | Toggle focus between sidebar and board |
|
|
46
|
+
| `← → / h l` | Switch column |
|
|
47
|
+
| `↑ ↓ / j k` | Select task / sidebar row |
|
|
48
|
+
| `Enter` | Open task detail popup / apply filter |
|
|
49
|
+
| `Space` | Pick up task; then `← →` to move columns |
|
|
50
|
+
| `c` | Create a new task |
|
|
51
|
+
| `m` | Move task via status picker |
|
|
52
|
+
| `a` | Set assignee |
|
|
53
|
+
| `e` | Edit the task file in `$EDITOR` |
|
|
54
|
+
| `x` | Archive selected task |
|
|
55
|
+
| `g` | Send task to agent hook (only if enabled)|
|
|
56
|
+
| `/` | Search |
|
|
57
|
+
| `Esc` | Clear search / drop / close |
|
|
58
|
+
| `q` | Quit |
|
|
59
|
+
|
|
60
|
+
### Sidebar
|
|
61
|
+
|
|
62
|
+
`Views` (All · per-status counts · Archived) · `Priority` (high / medium / low) · `Tags` (top 8 by usage). Counts are live; selected filter scopes the board and the subbar title.
|
|
63
|
+
|
|
64
|
+
### Columns
|
|
65
|
+
|
|
66
|
+
- Double-line border, colored dot for the status, title + count.
|
|
67
|
+
- Single-line rows: `› T-001 !h Title #tag @user ███░░ 3/5 ↪1` — priority letter, colored tag chips, assignee, acceptance-criteria progress bar, depends-on count.
|
|
68
|
+
- Scrolling: when a column overflows, `↑ N more` and `↓ N more` appear. Selection auto-scrolls to stay visible. Moving a task scrolls the target column to reveal it.
|
|
69
|
+
- Columns fill the available width evenly. The Archived view keeps a single-column width so it doesn't dominate.
|
|
70
|
+
|
|
71
|
+
### Popup
|
|
72
|
+
|
|
73
|
+
`Enter` on a task opens a centered modal with the full body. `e` opens in `$EDITOR`. `Esc` / `q` closes.
|
|
74
|
+
|
|
75
|
+
### Behavior
|
|
76
|
+
|
|
77
|
+
The TUI runs in the **alternate screen buffer** so it never pollutes your scrollback, and reloads automatically when task files change on disk (CLI, web, agent, editor — they all show up live).
|
|
78
|
+
|
|
79
|
+
## Embedded use
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { runBoard } from "@frehilm/ordna-cli";
|
|
83
|
+
|
|
84
|
+
await runBoard({
|
|
85
|
+
agentHook: {
|
|
86
|
+
url: "http://127.0.0.1:9999/agent",
|
|
87
|
+
label: "Claude",
|
|
88
|
+
headers: { "X-Token": "..." },
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
For a full IDE embedding (xterm.js + node-pty pane), see the [Host integration](../../README.md#host-integration) section in the root README.
|
|
94
|
+
|
|
95
|
+
## Configuration
|
|
96
|
+
|
|
97
|
+
Inherits everything from [@frehilm/ordna-core](../core/README.md#configuration). The CLI does not add or override any keys.
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT — see [LICENSE](../../LICENSE).
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Task } from "@frehilm/ordna-core";
|
|
2
|
+
export interface AgentHookConfig {
|
|
3
|
+
url: string;
|
|
4
|
+
label: string;
|
|
5
|
+
headers: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function loadAgentHook(): AgentHookConfig | null;
|
|
8
|
+
export interface AgentContext {
|
|
9
|
+
tasksDir: string;
|
|
10
|
+
cwd: string;
|
|
11
|
+
schema: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function sendAgent(hook: AgentHookConfig, task: Task, context: AgentContext): Promise<{
|
|
14
|
+
ok: boolean;
|
|
15
|
+
status: number;
|
|
16
|
+
body: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,aAAa,IAAI,eAAe,GAAG,IAAI,CAmBtD;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,SAAS,CAC9B,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAWxD"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function loadAgentHook() {
|
|
2
|
+
const url = process.env.ORDNA_AGENT_HOOK_URL;
|
|
3
|
+
if (!url)
|
|
4
|
+
return null;
|
|
5
|
+
const label = process.env.ORDNA_AGENT_HOOK_LABEL ?? "Agent";
|
|
6
|
+
const headers = {};
|
|
7
|
+
const rawHeaders = process.env.ORDNA_AGENT_HOOK_HEADERS;
|
|
8
|
+
if (rawHeaders) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(rawHeaders);
|
|
11
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
12
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
13
|
+
if (typeof v === "string")
|
|
14
|
+
headers[k] = v;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Malformed headers are ignored so the hook still works.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return { url, label, headers };
|
|
23
|
+
}
|
|
24
|
+
export async function sendAgent(hook, task, context) {
|
|
25
|
+
const res = await fetch(hook.url, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: {
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
...hook.headers,
|
|
30
|
+
},
|
|
31
|
+
body: JSON.stringify({ action: "agent", task, context }),
|
|
32
|
+
});
|
|
33
|
+
const body = await res.text();
|
|
34
|
+
return { ok: res.ok, status: res.status, body };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,aAAa;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC;IAC5D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACxD,IAAI,UAAU,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAC;YACjD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;oBACxE,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,yDAAyD;QAC1D,CAAC;IACF,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,IAAqB,EACrB,IAAU,EACV,OAAqB;IAErB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;QACjC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,cAAc,EAAE,kBAAkB;YAClC,GAAG,IAAI,CAAC,OAAO;SACf;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordna.d.ts","sourceRoot":"","sources":["../../src/bin/ordna.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { buildProgram } from "../cli.js";
|
|
3
|
+
async function main() {
|
|
4
|
+
const program = buildProgram();
|
|
5
|
+
await program.parseAsync(process.argv);
|
|
6
|
+
}
|
|
7
|
+
main().catch((error) => {
|
|
8
|
+
console.error(error instanceof Error ? error.message : error);
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=ordna.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ordna.js","sourceRoot":"","sources":["../../src/bin/ordna.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,KAAK,UAAU,IAAI;IAClB,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,YAAY,IAAI,OAAO,CAmFtC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { runAssign } from "./commands/assign.js";
|
|
3
|
+
import { runCommit } from "./commands/commit.js";
|
|
4
|
+
import { runCreate } from "./commands/create.js";
|
|
5
|
+
import { runInit } from "./commands/init.js";
|
|
6
|
+
import { runList } from "./commands/list.js";
|
|
7
|
+
import { runMove } from "./commands/move.js";
|
|
8
|
+
import { runShow } from "./commands/show.js";
|
|
9
|
+
import { runWebCommand } from "./commands/web.js";
|
|
10
|
+
export function buildProgram() {
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name("ordna")
|
|
14
|
+
.description("Git-native project management. Tasks as markdown.")
|
|
15
|
+
.version("0.0.0");
|
|
16
|
+
program
|
|
17
|
+
.command("init")
|
|
18
|
+
.description("Create .ordna/config.yaml and tasks/ if missing")
|
|
19
|
+
.action(() => runInit());
|
|
20
|
+
program
|
|
21
|
+
.command("list")
|
|
22
|
+
.alias("ls")
|
|
23
|
+
.description("List tasks")
|
|
24
|
+
.option("-s, --status <status>", "filter by status")
|
|
25
|
+
.option("-a, --assignee <name>", "filter by assignee")
|
|
26
|
+
.option("-t, --tag <tag>", "filter by tag")
|
|
27
|
+
.action((opts) => runList(opts));
|
|
28
|
+
program
|
|
29
|
+
.command("show <id>")
|
|
30
|
+
.description("Show a task")
|
|
31
|
+
.action((id) => runShow(id));
|
|
32
|
+
program
|
|
33
|
+
.command("create <title...>")
|
|
34
|
+
.description("Create a new task")
|
|
35
|
+
.option("-a, --assignee <name>", "assignee")
|
|
36
|
+
.option("-p, --priority <level>", "high | medium | low")
|
|
37
|
+
.option("-t, --tag <tag...>", "one or more tags")
|
|
38
|
+
.option("-d, --depends-on <id...>", "one or more dependency IDs")
|
|
39
|
+
.option("-s, --status <status>", "initial status")
|
|
40
|
+
.action((titleParts, opts) => runCreate(titleParts.join(" "), {
|
|
41
|
+
assignee: opts.assignee,
|
|
42
|
+
priority: opts.priority,
|
|
43
|
+
tags: opts.tag,
|
|
44
|
+
dependsOn: opts.dependsOn,
|
|
45
|
+
status: opts.status,
|
|
46
|
+
}));
|
|
47
|
+
program
|
|
48
|
+
.command("move <id> <status>")
|
|
49
|
+
.description("Move a task to a different status")
|
|
50
|
+
.action((id, status) => runMove(id, status));
|
|
51
|
+
program
|
|
52
|
+
.command("assign <id> [name]")
|
|
53
|
+
.description("Assign a task (omit name to unassign)")
|
|
54
|
+
.action((id, name) => runAssign(id, name));
|
|
55
|
+
program
|
|
56
|
+
.command("commit")
|
|
57
|
+
.description("Stage tasks/ and git commit")
|
|
58
|
+
.option("-m, --message <msg>", "commit message", "chore(tasks): update")
|
|
59
|
+
.action((opts) => runCommit(opts.message));
|
|
60
|
+
program
|
|
61
|
+
.command("web")
|
|
62
|
+
.description("Start the local web Kanban (opens browser)")
|
|
63
|
+
.option("-p, --port <port>", "port (default from config)", (v) => Number.parseInt(v, 10))
|
|
64
|
+
.option("-h, --host <host>", "host", "127.0.0.1")
|
|
65
|
+
.option("--no-open", "do not open browser")
|
|
66
|
+
.action((opts) => runWebCommand(opts));
|
|
67
|
+
program
|
|
68
|
+
.command("board")
|
|
69
|
+
.description("Open the Kanban TUI (default)")
|
|
70
|
+
.action(async () => {
|
|
71
|
+
const { runBoard } = await import("./tui/index.js");
|
|
72
|
+
await runBoard();
|
|
73
|
+
});
|
|
74
|
+
program.action(async () => {
|
|
75
|
+
const { runBoard } = await import("./tui/index.js");
|
|
76
|
+
await runBoard();
|
|
77
|
+
});
|
|
78
|
+
return program;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/colors.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const c: {
|
|
2
|
+
dim: (t: string) => string;
|
|
3
|
+
bold: (t: string) => string;
|
|
4
|
+
red: (t: string) => string;
|
|
5
|
+
green: (t: string) => string;
|
|
6
|
+
yellow: (t: string) => string;
|
|
7
|
+
blue: (t: string) => string;
|
|
8
|
+
magenta: (t: string) => string;
|
|
9
|
+
cyan: (t: string) => string;
|
|
10
|
+
gray: (t: string) => string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,CAAC;aACJ,MAAM;cACL,MAAM;aACP,MAAM;eACJ,MAAM;gBACL,MAAM;cACR,MAAM;iBACH,MAAM;cACT,MAAM;cACN,MAAM;CAChB,CAAC"}
|
package/dist/colors.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const isTTY = Boolean(process.stdout.isTTY) && process.env.NO_COLOR === undefined;
|
|
2
|
+
function wrap(code, text) {
|
|
3
|
+
if (!isTTY)
|
|
4
|
+
return text;
|
|
5
|
+
return `\x1b[${code}m${text}\x1b[0m`;
|
|
6
|
+
}
|
|
7
|
+
export const c = {
|
|
8
|
+
dim: (t) => wrap(2, t),
|
|
9
|
+
bold: (t) => wrap(1, t),
|
|
10
|
+
red: (t) => wrap(31, t),
|
|
11
|
+
green: (t) => wrap(32, t),
|
|
12
|
+
yellow: (t) => wrap(33, t),
|
|
13
|
+
blue: (t) => wrap(34, t),
|
|
14
|
+
magenta: (t) => wrap(35, t),
|
|
15
|
+
cyan: (t) => wrap(36, t),
|
|
16
|
+
gray: (t) => wrap(90, t),
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;AAElF,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,MAAM,CAAC,GAAG;IAChB,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/B,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;CAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createContext, updateTask } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
export async function runAssign(id, assignee) {
|
|
4
|
+
const ctx = createContext();
|
|
5
|
+
const value = assignee && assignee.length > 0 ? assignee : null;
|
|
6
|
+
try {
|
|
7
|
+
const task = await updateTask(id, { assignee: value }, ctx);
|
|
8
|
+
if (value === null)
|
|
9
|
+
console.log(`${c.bold(task.id)} unassigned`);
|
|
10
|
+
else
|
|
11
|
+
console.log(`${c.bold(task.id)} → ${c.magenta(`@${value}`)}`);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
console.error(c.red(error.message));
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=assign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,QAA4B;IACvE,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;;YAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { commitTasks, createContext } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
export async function runCommit(message) {
|
|
4
|
+
const ctx = createContext();
|
|
5
|
+
try {
|
|
6
|
+
await commitTasks(ctx, message);
|
|
7
|
+
console.log(c.green("Committed."));
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
console.error(c.red(error.message));
|
|
11
|
+
process.exitCode = 1;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA2B;IAC1D,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Priority } from "@frehilm/ordna-core";
|
|
2
|
+
export interface CreateOptions {
|
|
3
|
+
assignee?: string;
|
|
4
|
+
priority?: Priority;
|
|
5
|
+
tags?: string[];
|
|
6
|
+
dependsOn?: string[];
|
|
7
|
+
status?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function runCreate(title: string, options?: CreateOptions): Promise<void>;
|
|
10
|
+
//# 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,EAA6B,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createContext, createTask } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
export async function runCreate(title, options = {}) {
|
|
4
|
+
if (!title || title.trim().length === 0) {
|
|
5
|
+
console.error(c.red("Title is required."));
|
|
6
|
+
process.exitCode = 1;
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const ctx = createContext();
|
|
10
|
+
const task = await createTask({
|
|
11
|
+
title,
|
|
12
|
+
assignee: options.assignee ?? null,
|
|
13
|
+
priority: options.priority ?? null,
|
|
14
|
+
tags: options.tags ?? [],
|
|
15
|
+
depends_on: options.dependsOn ?? [],
|
|
16
|
+
status: options.status,
|
|
17
|
+
}, ctx);
|
|
18
|
+
console.log(c.green(`Created ${c.bold(task.id)}: ${task.title}`));
|
|
19
|
+
console.log(c.dim(` ${task.filePath}`));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAUjC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,UAAyB,EAAE;IACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,MAAM,UAAU,CAC5B;QACC,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;KACtB,EACD,GAAG,CACH,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAaA,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAsB,GAAG,IAAI,CA0BzD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { c } from "../colors.js";
|
|
4
|
+
const TEMPLATE = `# Ordna config — all keys optional.
|
|
5
|
+
tasksDir: tasks
|
|
6
|
+
schema: ordna
|
|
7
|
+
statuses: [todo, doing, done]
|
|
8
|
+
idPrefix: T
|
|
9
|
+
zeroPaddedIds: 3
|
|
10
|
+
webPort: 7420
|
|
11
|
+
`;
|
|
12
|
+
export function runInit(cwd = process.cwd()) {
|
|
13
|
+
const configDir = join(cwd, ".ordna");
|
|
14
|
+
const configFile = join(configDir, "config.yaml");
|
|
15
|
+
const tasksDir = join(cwd, "tasks");
|
|
16
|
+
let created = 0;
|
|
17
|
+
if (!existsSync(configDir)) {
|
|
18
|
+
mkdirSync(configDir, { recursive: true });
|
|
19
|
+
created++;
|
|
20
|
+
}
|
|
21
|
+
if (!existsSync(configFile)) {
|
|
22
|
+
writeFileSync(configFile, TEMPLATE, "utf8");
|
|
23
|
+
created++;
|
|
24
|
+
}
|
|
25
|
+
if (!existsSync(tasksDir)) {
|
|
26
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
27
|
+
created++;
|
|
28
|
+
}
|
|
29
|
+
if (created === 0) {
|
|
30
|
+
console.log(c.dim("Ordna already initialized in this repo."));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(c.green("Initialized Ordna."));
|
|
34
|
+
console.log(c.dim(` ${configFile}`));
|
|
35
|
+
console.log(c.dim(` ${tasksDir}/`));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjC,MAAM,QAAQ,GAAG;;;;;;;CAOhB,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEpC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAC9D,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createContext, listTasks } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
import { formatListRow, summarizeStatuses } from "../format.js";
|
|
4
|
+
export async function runList(options = {}) {
|
|
5
|
+
const ctx = createContext();
|
|
6
|
+
const tasks = await listTasks(ctx, options);
|
|
7
|
+
if (tasks.length === 0) {
|
|
8
|
+
console.log(c.dim("No tasks. Create one with `ordna create \"title\"`."));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
for (const task of tasks)
|
|
12
|
+
console.log(formatListRow(task));
|
|
13
|
+
console.log("");
|
|
14
|
+
console.log(summarizeStatuses(ctx.config, tasks));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAQhE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,UAAuB,EAAE;IACtD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC1E,OAAO;IACR,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createContext, moveTask } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
import { colorStatus } from "../format.js";
|
|
4
|
+
export async function runMove(id, status) {
|
|
5
|
+
const ctx = createContext();
|
|
6
|
+
try {
|
|
7
|
+
const task = await moveTask(id, status, ctx);
|
|
8
|
+
console.log(`${c.bold(task.id)} → ${colorStatus(task.status)}`);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.error(c.red(error.message));
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=move.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move.js","sourceRoot":"","sources":["../../src/commands/move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU,EAAE,MAAc;IACvD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACtB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createContext, getTask } from "@frehilm/ordna-core";
|
|
2
|
+
import { c } from "../colors.js";
|
|
3
|
+
import { formatTask } from "../format.js";
|
|
4
|
+
export async function runShow(id) {
|
|
5
|
+
const task = await getTask(id, createContext());
|
|
6
|
+
if (!task) {
|
|
7
|
+
console.error(c.red(`Task ${id} not found.`));
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
console.log(formatTask(task));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAU;IACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB3E"}
|