epiq 0.0.4 → 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.
Files changed (102) hide show
  1. package/dist/cli.js +398 -33
  2. package/package.json +26 -11
  3. package/readme.md +54 -17
  4. package/dist/app.d.ts +0 -5
  5. package/dist/app.js +0 -18
  6. package/dist/board/components/Board.d.ts +0 -6
  7. package/dist/board/components/Board.js +0 -11
  8. package/dist/board/components/CommandLine.d.ts +0 -2
  9. package/dist/board/components/CommandLine.js +0 -26
  10. package/dist/board/components/ContextBar.d.ts +0 -4
  11. package/dist/board/components/ContextBar.js +0 -17
  12. package/dist/board/components/Help.d.ts +0 -4
  13. package/dist/board/components/Help.js +0 -28
  14. package/dist/board/components/Logo.d.ts +0 -2
  15. package/dist/board/components/Logo.js +0 -21
  16. package/dist/board/components/ScrollBox.d.ts +0 -9
  17. package/dist/board/components/ScrollBox.js +0 -22
  18. package/dist/board/components/Swimlane.d.ts +0 -9
  19. package/dist/board/components/Swimlane.js +0 -12
  20. package/dist/board/components/Swimlanes.d.ts +0 -8
  21. package/dist/board/components/Swimlanes.js +0 -17
  22. package/dist/board/components/TextInput.d.ts +0 -6
  23. package/dist/board/components/TextInput.js +0 -9
  24. package/dist/board/components/TicketListItem.d.ts +0 -6
  25. package/dist/board/components/TicketListItem.js +0 -13
  26. package/dist/board/components/TicketUI.d.ts +0 -8
  27. package/dist/board/components/TicketUI.js +0 -8
  28. package/dist/board/hints/hints.d.ts +0 -7
  29. package/dist/board/hints/hints.js +0 -21
  30. package/dist/board/mock/board.d.ts +0 -2
  31. package/dist/board/mock/board.js +0 -520
  32. package/dist/board/model/board.model.d.ts +0 -26
  33. package/dist/board/model/board.model.js +0 -6
  34. package/dist/board/render/color.d.ts +0 -7
  35. package/dist/board/render/color.js +0 -21
  36. package/dist/cli.d.ts +0 -3
  37. package/dist/debug-logger.d.ts +0 -2
  38. package/dist/debug-logger.js +0 -16
  39. package/dist/init-project.d.ts +0 -1
  40. package/dist/init-project.js +0 -1
  41. package/dist/navigation/actions/add/add-actions.d.ts +0 -2
  42. package/dist/navigation/actions/add/add-actions.js +0 -25
  43. package/dist/navigation/actions/add/add-item-actions.d.ts +0 -2
  44. package/dist/navigation/actions/add/add-item-actions.js +0 -25
  45. package/dist/navigation/actions/add-item/add-item-actions.d.ts +0 -3
  46. package/dist/navigation/actions/add-item/add-item-actions.js +0 -45
  47. package/dist/navigation/actions/board-action-map.d.ts +0 -10
  48. package/dist/navigation/actions/board-action-map.js +0 -12
  49. package/dist/navigation/actions/default/default-action-utils.d.ts +0 -8
  50. package/dist/navigation/actions/default/default-action-utils.js +0 -101
  51. package/dist/navigation/actions/default/default-actions.d.ts +0 -2
  52. package/dist/navigation/actions/default/default-actions.js +0 -64
  53. package/dist/navigation/actions/default/navigation-action-utils.d.ts +0 -16
  54. package/dist/navigation/actions/default/navigation-action-utils.js +0 -109
  55. package/dist/navigation/actions/input/command-line-input.d.ts +0 -2
  56. package/dist/navigation/actions/input/command-line-input.js +0 -18
  57. package/dist/navigation/actions/input/input-actions-utils.d.ts +0 -8
  58. package/dist/navigation/actions/input/input-actions-utils.js +0 -47
  59. package/dist/navigation/actions/input/input-actions.d.ts +0 -2
  60. package/dist/navigation/actions/input/input-actions.js +0 -44
  61. package/dist/navigation/actions/move/move-actions-routes.d.ts +0 -4
  62. package/dist/navigation/actions/move/move-actions-routes.js +0 -55
  63. package/dist/navigation/actions/move/move-actions-utils.d.ts +0 -4
  64. package/dist/navigation/actions/move/move-actions-utils.js +0 -66
  65. package/dist/navigation/actions/move/move-actions.d.ts +0 -4
  66. package/dist/navigation/actions/move/move-actions.js +0 -59
  67. package/dist/navigation/actions/navigate/navigation-action-utils.d.ts +0 -7
  68. package/dist/navigation/actions/navigate/navigation-action-utils.js +0 -48
  69. package/dist/navigation/actions/navigate/navigation-actions.d.ts +0 -2
  70. package/dist/navigation/actions/navigate/navigation-actions.js +0 -78
  71. package/dist/navigation/command-line/command-line-actions.d.ts +0 -2
  72. package/dist/navigation/command-line/command-line-actions.js +0 -32
  73. package/dist/navigation/command-line/command-line-intent.d.ts +0 -7
  74. package/dist/navigation/command-line/command-line-intent.js +0 -29
  75. package/dist/navigation/command-line/command-line-sequence-actions.d.ts +0 -2
  76. package/dist/navigation/command-line/command-line-sequence-actions.js +0 -44
  77. package/dist/navigation/command-line/command-line-sequence-intent.d.ts +0 -8
  78. package/dist/navigation/command-line/command-line-sequence-intent.js +0 -32
  79. package/dist/navigation/command-line/commands.d.ts +0 -2
  80. package/dist/navigation/command-line/commands.js +0 -58
  81. package/dist/navigation/keypress-listener.d.ts +0 -1
  82. package/dist/navigation/keypress-listener.js +0 -33
  83. package/dist/navigation/model/action-map.model.d.ts +0 -26
  84. package/dist/navigation/model/action-map.model.js +0 -6
  85. package/dist/navigation/model/navigation-ctx.model.d.ts +0 -1
  86. package/dist/navigation/model/navigation-ctx.model.js +0 -1
  87. package/dist/navigation/model/navigation-tree.model.d.ts +0 -11
  88. package/dist/navigation/model/navigation-tree.model.js +0 -1
  89. package/dist/navigation/navigation-ctx.d.ts +0 -1
  90. package/dist/navigation/navigation-ctx.js +0 -1
  91. package/dist/navigation/navigation.d.ts +0 -3
  92. package/dist/navigation/navigation.js +0 -82
  93. package/dist/navigation/state/command-line.state.d.ts +0 -18
  94. package/dist/navigation/state/command-line.state.js +0 -60
  95. package/dist/navigation/state/state.d.ts +0 -20
  96. package/dist/navigation/state/state.js +0 -38
  97. package/dist/navigation/utils/get-command-line-intent.d.ts +0 -3
  98. package/dist/navigation/utils/get-command-line-intent.js +0 -17
  99. package/dist/navigation/utils/getKeyIntent.d.ts +0 -5
  100. package/dist/navigation/utils/getKeyIntent.js +0 -71
  101. package/dist/navigation/utils/key-intent.d.ts +0 -25
  102. package/dist/navigation/utils/key-intent.js +0 -119
package/package.json CHANGED
@@ -1,34 +1,48 @@
1
1
  {
2
2
  "name": "epiq",
3
- "version": "0.0.4",
3
+ "version": "0.1.0",
4
4
  "license": "MIT",
5
- "bin": "dist/cli.js",
6
5
  "type": "module",
7
6
  "description": "EPIQ - CLI based issue tracker",
7
+ "bin": {
8
+ "epiq": "dist/cli.js"
9
+ },
8
10
  "engines": {
9
11
  "node": ">=16"
10
12
  },
11
13
  "scripts": {
12
- "build": "tsc",
13
- "dev": "tsc --watch",
14
- "test": "prettier --check . && xo && ava",
15
- "start": "node dist/cli.js"
14
+ "clean": "node -e \"import('node:fs').then(fs => fs.rmSync('dist', { recursive: true, force: true }))\"",
15
+ "build": "tsc --noEmit",
16
+ "build:publish": "pnpm clean && esbuild source/cli.tsx --bundle --platform=node --format=esm --target=node16 --minify --outfile=dist/cli.js --banner:js='#!/usr/bin/env node' --external:react-devtools-core",
17
+ "dev": "tsc --watch --noEmit",
18
+ "dev:start": "IS_LOCAL=true tsx source/cli.tsx",
19
+ "start": "node dist/cli.js",
20
+ "start:debug": "IS_LOCAL=true node dist/cli.js",
21
+ "test": "prettier --check \"**/*.{ts,tsx}\" && vitest run",
22
+ "prepack": "pnpm build:publish",
23
+ "pack:check": "npm pack && tar -tf epiq-*.tgz",
24
+ "publish:dry": "npm publish --dry-run",
25
+ "release": "pnpm test && pnpm pack:check && npm publish"
16
26
  },
17
27
  "files": [
18
28
  "dist"
19
29
  ],
20
30
  "dependencies": {
21
- "ink": "^4.1.0",
22
- "meow": "^11.0.0",
23
- "react": "^18.2.0"
31
+ "ink": "^6.8.0",
32
+ "json-stringify-pretty-compact": "^4.0.0",
33
+ "marked": "^17.0.3",
34
+ "marked-terminal": "^7.3.0",
35
+ "meow": "^14.1.0",
36
+ "react": "^19.2.4",
37
+ "ulid": "^3.0.2"
24
38
  },
25
39
  "devDependencies": {
26
40
  "@sindresorhus/tsconfig": "^3.0.1",
41
+ "@types/marked-terminal": "^6.1.1",
27
42
  "@types/react": "^18.0.32",
28
43
  "@vdemedes/prettier-config": "^2.0.1",
29
- "ava": "^5.2.0",
30
44
  "chalk": "^5.2.0",
31
- "eslint-config-xo-react": "^0.27.0",
45
+ "esbuild": "^0.25.0",
32
46
  "eslint-plugin-react": "^7.32.2",
33
47
  "eslint-plugin-react-hooks": "^4.6.0",
34
48
  "ink-testing-library": "^3.0.0",
@@ -36,6 +50,7 @@
36
50
  "ts-node": "^10.9.1",
37
51
  "tsx": "^4.20.3",
38
52
  "typescript": "^5.0.3",
53
+ "vitest": "^4.1.0",
39
54
  "xo": "^0.53.1"
40
55
  },
41
56
  "ava": {
package/readme.md CHANGED
@@ -1,37 +1,74 @@
1
1
  # epiq
2
2
 
3
- ## Local dev
3
+ > **The ultimate productivity tool** — a CLI-based issue tracking client powered by Git as its backend, living directly inside the repository you work in.
4
+ > No external services. No context switching. Just tickets - versioned and colocated with your code.
4
5
 
5
- Start dev server in background terminal session:
6
+ ---
7
+
8
+ ## Why epiq?
9
+
10
+ - **Simplicity** — Skip the additional tooling complexity
11
+ - **Repo-native** — Lives inside your project directory
12
+ - **Offline-ready** — Works wherever Git works
13
+ - **Team-friendly** — Collaborate through normal Git workflows
14
+ - **Shareable** — ASCII board exported to `.md`, viewable in the CLI, on GitHub/GitLab, or as your project README.
15
+ - **CLI-first** — Fast, scriptable, and developer/agent-friendly
16
+
17
+ ---
18
+
19
+ ## 📦 Installation
20
+
21
+ Install globally using npm:
6
22
 
7
23
  ```bash
8
- $ npm run dev
24
+ npm install --global epiq
9
25
  ```
10
26
 
11
- Run app with:
27
+ Verify installation:
12
28
 
13
29
  ```bash
14
- $ npm run execute
30
+ epiq --version
15
31
  ```
16
32
 
17
- ## Install (WIP!)
33
+ ---
34
+
35
+ ## 🚀 Getting Started
36
+
37
+ ### Initialize a project
38
+
39
+ Create a new epiq workspace inside your current directory:
18
40
 
19
41
  ```bash
20
- $ npm install --global epiq
42
+ epiq --init "Project Name"
21
43
  ```
22
44
 
23
- ## CLI (WIP!)
45
+ This sets up epiq in your repository and prepares it for issue tracking.
24
46
 
25
- ```
26
- $ epiq --help
47
+ ---
27
48
 
28
- Usage
29
- $ epiq
49
+ ### Open the workspace
30
50
 
31
- Options
32
- --name Your name
51
+ Run epiq inside any initialized repository:
33
52
 
34
- Examples
35
- $ epiq --name=Jane
36
- Hello, Jane
53
+ ```bash
54
+ epiq
37
55
  ```
56
+
57
+ This opens the interactive CLI workspace.
58
+
59
+ ---
60
+
61
+ ## 🛠 Philosophy
62
+
63
+ epiq keeps issue tracking:
64
+
65
+ - Close to your code
66
+ - Versioned with your commits
67
+ - Simple and transparent
68
+ - Independent from external platforms
69
+
70
+ If you use Git, you already have everything you need.
71
+
72
+ ---
73
+
74
+ Built for developers who live in the terminal.
package/dist/app.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- import { Board } from './board/model/board.model.js';
3
- export default function App({ board }: {
4
- board: Board;
5
- }): React.JSX.Element;
package/dist/app.js DELETED
@@ -1,18 +0,0 @@
1
- import { Box } from 'ink';
2
- import React from 'react';
3
- import { BoardUI } from './board/components/Board.js';
4
- import { ContextBar } from './board/components/ContextBar.js';
5
- import { HelpUI } from './board/components/Help.js';
6
- import { Mode } from './navigation/model/action-map.model.js';
7
- import { appState } from './navigation/state/state.js';
8
- export default function App({ board }) {
9
- const width = process.stdout.columns || 120;
10
- const swimlaneMaxWidth = Math.floor(process.stdout.columns / 3);
11
- const swimlaneDynamicWidth = Math.floor(width / board.children.length);
12
- const renderedWidth = swimlaneDynamicWidth * board.children.length;
13
- const swimlaneWidth = Math.min(renderedWidth, swimlaneMaxWidth);
14
- return (React.createElement(Box, { flexDirection: "column" },
15
- !(appState.mode === Mode.HELP) && (React.createElement(BoardUI, { board: board, swimlaneWidth: swimlaneWidth })),
16
- appState.mode === Mode.HELP && React.createElement(HelpUI, { width: renderedWidth }),
17
- React.createElement(ContextBar, { width: width })));
18
- }
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import { Board } from '../model/board.model.js';
3
- export declare const BoardUI: React.FC<{
4
- board: Board;
5
- swimlaneWidth: number;
6
- }>;
@@ -1,11 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- import { appState } from '../../navigation/state/state.js';
4
- import { BoardContentUI } from './Swimlanes.js';
5
- export const BoardUI = ({ board, swimlaneWidth, }) => {
6
- return (React.createElement(Box, { flexDirection: "column" },
7
- React.createElement(Box, { paddingLeft: 1 },
8
- React.createElement(Text, null, appState.breadCrumb.map(b => ' > ' + b.name))),
9
- React.createElement(Box, { flexDirection: "row" },
10
- React.createElement(BoardContentUI, { items: board.children, width: swimlaneWidth }))));
11
- };
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export declare const CommandLine: React.FC;
@@ -1,26 +0,0 @@
1
- import React, { useEffect, useState } from 'react';
2
- import { Box, Text } from 'ink';
3
- import { getCommandLineInput, subscribeCommandLineState, } from '../../navigation/state/command-line.state.js';
4
- const roleColors = {
5
- command: 'cyan',
6
- argument: 'white',
7
- };
8
- export const CommandLine = () => {
9
- const [input, setInput] = useState(getCommandLineInput());
10
- useEffect(() => {
11
- const unsubscribe = subscribeCommandLineState(() => {
12
- setInput(getCommandLineInput());
13
- });
14
- return () => {
15
- unsubscribe();
16
- };
17
- }, []);
18
- const [command, ...rest] = input.split(' ');
19
- const argument = rest.join(' ');
20
- return (React.createElement(Box, null,
21
- React.createElement(Text, { color: "gray" }, ":"),
22
- command && React.createElement(Text, { color: roleColors.command }, command),
23
- argument && (React.createElement(Text, null,
24
- ' ',
25
- React.createElement(Text, { color: roleColors.argument }, "'" + argument + "'")))));
26
- };
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- export declare const ContextBar: React.FC<{
3
- width: number;
4
- }>;
@@ -1,17 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- import { Mode } from '../../navigation/model/action-map.model.js';
4
- import { appState } from '../../navigation/state/state.js';
5
- import { CommandLine } from './CommandLine.js';
6
- export const ContextBar = ({ width }) => (React.createElement(Box, { flexDirection: "column", paddingLeft: 1, paddingRight: 1, borderColor: "gray", borderStyle: "round", width: width },
7
- React.createElement(Box, null, appState.mode === Mode.COMMAND_LINE ? (React.createElement(CommandLine, null)) : (React.createElement(Box, { flexDirection: "row", gap: 2 },
8
- React.createElement(Text, null, "\uD83D\uDCA1"),
9
- appState.availableHints.map((x, index) => {
10
- const [command, ...rest] = x.split(' ');
11
- const argument = rest.join(' ');
12
- return (React.createElement(Box, { key: index },
13
- React.createElement(Text, { color: "cyan" }, command),
14
- argument && (React.createElement(React.Fragment, null,
15
- React.createElement(Text, null, " "),
16
- React.createElement(Text, { color: "gray" }, argument)))));
17
- }))))));
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- export declare const HelpUI: React.FC<{
3
- width: number;
4
- }>;
@@ -1,28 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import { appState } from '../../navigation/state/state.js';
3
- import React from 'react';
4
- import { Mode } from '../../navigation/model/action-map.model.js';
5
- export const HelpUI = ({ width }) => (React.createElement(Box, { flexDirection: "column", marginTop: 3, borderColor: "gray", borderStyle: "round", width: width, minHeight: 19 },
6
- React.createElement(Box, { flexDirection: "column", width: width }, appState.mode === Mode.HELP
7
- ? [
8
- {
9
- action: '',
10
- description: '[COMMAND] DESCRIPTION',
11
- mode: appState.mode,
12
- },
13
- ...appState.availableActions,
14
- ]
15
- .filter(action => Boolean(action.description))
16
- // .filter(x => x.mode === navigationState.mode)
17
- .map((action, index) => {
18
- const [leftRaw, rightRaw] = action.description.split(']');
19
- const left = leftRaw?.replace('[', '');
20
- const right = rightRaw?.trim(); // no extra space
21
- return (React.createElement(Box, { paddingLeft: 1, key: index, flexDirection: "row" },
22
- React.createElement(Box, { key: index, flexDirection: "row", paddingBottom: index ? 0 : 1 },
23
- React.createElement(Box, { flexGrow: 1, width: 30 },
24
- React.createElement(Text, { color: index ? 'white' : 'gray' }, right)),
25
- React.createElement(Box, { width: 20 },
26
- React.createElement(Text, { color: index ? 'yellow' : 'gray' }, left)))));
27
- })
28
- : null)));
@@ -1,2 +0,0 @@
1
- import React from 'react';
2
- export default function Logo(): React.JSX.Element;
@@ -1,21 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import { highlight } from '../render/color.js';
3
- import React from 'react';
4
- function replaceRange(str, start, end, replacement) {
5
- return str.slice(0, start) + replacement + str.slice(end);
6
- }
7
- const logoLines = [
8
- ` ______ _____ _____ _____`,
9
- `| ____| __ \\ |_ _| / ____|`,
10
- `| |__ | |__)\\ | | | | `,
11
- `| __| | ___/ | | | | `,
12
- `| |____| | _| |_ | |____ `,
13
- `|______|__| |_____| \\____ |`,
14
- ` (_|`,
15
- ];
16
- const coloredLogo = logoLines
17
- .map(line => replaceRange(line, 0, 7, highlight(line.slice(0, 7), 'cyan')))
18
- .map(line => replaceRange(line, 31, 39, highlight(line.slice(31, 39), 'yellow')));
19
- export default function Logo() {
20
- return (React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, coloredLogo.map((line, idx) => (React.createElement(Text, { key: idx }, line)))));
21
- }
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- type Props = {
3
- width: number;
4
- children?: React.ReactNode[];
5
- size: number;
6
- selectedIndex: number;
7
- };
8
- export declare const ScrollBoxUI: React.FC<Props>;
9
- export {};
@@ -1,22 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- export const ScrollBoxUI = ({ children = [], size, selectedIndex, }) => {
4
- if (children.length === 0) {
5
- return null;
6
- }
7
- const scrollIndex = Math.floor(Math.max(selectedIndex, 0) / size);
8
- const start = scrollIndex * size;
9
- const end = start + size;
10
- // Clamp values to avoid overflow
11
- const visibleChildren = children.slice(start, end);
12
- // Scrollbar calculations
13
- const scrollBarHeight = size;
14
- const scrollSteps = Math.floor(children.length / size) + 1;
15
- const indexBarHeight = Math.ceil(scrollBarHeight / scrollSteps);
16
- const barOffset = scrollIndex * indexBarHeight;
17
- return (React.createElement(Box, { flexDirection: "row" },
18
- children.length > size && (React.createElement(Box, { flexDirection: "column", width: 1, height: scrollBarHeight, marginRight: 1 }, Array.from({ length: scrollBarHeight }).map((_, i) => (React.createElement(Text, { key: i, color: i >= barOffset && i < barOffset + indexBarHeight
19
- ? 'cyan'
20
- : 'gray' }, "\u2502"))))),
21
- React.createElement(Box, { flexDirection: "column" }, visibleChildren)));
22
- };
@@ -1,9 +0,0 @@
1
- import React from 'react';
2
- import { Swimlane } from '../model/board.model.js';
3
- type Props = {
4
- item: Swimlane;
5
- width: number;
6
- isSelected: boolean;
7
- };
8
- export declare const SwimlaneUI: React.FC<Props>;
9
- export {};
@@ -1,12 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- import { ScrollBoxUI } from './ScrollBox.js';
4
- import { TicketListItemUI } from './TicketListItem.js';
5
- export const SwimlaneUI = ({ item, isSelected, width }) => {
6
- const color = isSelected ? 'cyan' : 'gray';
7
- return (React.createElement(Box, { flexDirection: "column", width: width, borderStyle: "round", borderColor: 'gray', paddingRight: 1, paddingLeft: 1, minHeight: 15, height: 20 },
8
- React.createElement(Box, { borderStyle: "round", borderColor: color, justifyContent: "center" },
9
- React.createElement(Text, { bold: true }, item.name)),
10
- React.createElement(Box, { padding: 1 },
11
- React.createElement(ScrollBoxUI, { selectedIndex: item.children.findIndex(x => x.isSelected), width: width, size: 10, children: item.children.map((ticket, index) => (React.createElement(TicketListItemUI, { key: index, width: width, ticket: ticket }))) }))));
12
- };
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { Swimlane } from '../model/board.model.js';
3
- type Props = {
4
- items: Swimlane[];
5
- width: number;
6
- };
7
- export declare const BoardContentUI: React.FC<Props>;
8
- export {};
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
- import { Box } from 'ink';
3
- import { appState } from '../../navigation/state/state.js';
4
- import { BoardItemTypes } from '../model/board.model.js';
5
- import { SwimlaneUI } from './Swimlane.js';
6
- import { TicketUI } from './TicketUI.js';
7
- export const BoardContentUI = ({ items, width }) => {
8
- const actionContext = appState.currentNode.actionContext;
9
- const isTicketContext = actionContext === BoardItemTypes.TICKET_LIST_ITEM;
10
- const isSwimlaneContext = actionContext === BoardItemTypes.BOARD ||
11
- actionContext === BoardItemTypes.SWIMLANE;
12
- return (React.createElement(Box, { flexDirection: "row" },
13
- isSwimlaneContext &&
14
- items.map((lane, index) => (React.createElement(SwimlaneUI, { key: index, width: width, isSelected: appState.currentNode.actionContext === 'BOARD' &&
15
- appState.selectedIndex === index, item: lane }))),
16
- isTicketContext && appState.currentNode && (React.createElement(TicketUI, { width: width * items.length, item: appState.breadCrumb[appState.breadCrumb.length - 1] }))));
17
- };
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- export declare const TextInput: React.FC<{
3
- value: string;
4
- onChange: (value: string) => void;
5
- onSubmit: (value: string) => void;
6
- }>;
@@ -1,9 +0,0 @@
1
- import { Text } from 'ink';
2
- import React from 'react';
3
- // const onChange = (_value: string) => {
4
- // // No-op for now
5
- // };
6
- // const onSubmit = (_value: string) => {
7
- // // No-op for now
8
- // };
9
- export const TextInput = ({ value }) => React.createElement(Text, null, value);
@@ -1,6 +0,0 @@
1
- import React from 'react';
2
- import { TicketListItem } from '../model/board.model.js';
3
- export declare const TicketListItemUI: React.FC<{
4
- width: number;
5
- ticket: TicketListItem;
6
- }>;
@@ -1,13 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- import { Mode } from '../../navigation/model/action-map.model.js';
4
- import { appState } from '../../navigation/state/state.js';
5
- const truncateWithEllipsis = (str, width) => str.length >= width ? str.slice(0, width - 3) + '...' : str;
6
- export const TicketListItemUI = ({ width, ticket }) => (React.createElement(Box, { borderBottom: true },
7
- React.createElement(Text, { color: ticket.isSelected && appState.mode === Mode.MOVE
8
- ? 'cyan'
9
- : ticket.isSelected
10
- ? 'cyan'
11
- : appState.mode === Mode.MOVE
12
- ? 'gray'
13
- : 'white' }, truncateWithEllipsis(ticket.name, width - 6))));
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { Ticket } from '../model/board.model.js';
3
- type Props = {
4
- item: Ticket;
5
- width: number;
6
- };
7
- export declare const TicketUI: React.FC<Props>;
8
- export {};
@@ -1,8 +0,0 @@
1
- import { Box, Text } from 'ink';
2
- import React from 'react';
3
- export const TicketUI = ({ item, width }) => (React.createElement(Box, { flexDirection: "column", padding: 1, paddingLeft: 2, borderStyle: "round", width: width, minHeight: 20, borderColor: "gray" }, item.children.map(child => (React.createElement(Box, { key: child.id, flexDirection: "row", borderStyle: 'round', borderColor: child.isSelected ? 'cyan' : 'gray', paddingLeft: 1 },
4
- React.createElement(Box, { width: 30 },
5
- React.createElement(Text, { color: "cyan" },
6
- child.name,
7
- ":")),
8
- React.createElement(Text, null, child.description))))));
@@ -1,7 +0,0 @@
1
- export declare const Hints: {
2
- readonly [x: string]: readonly [] | readonly [":h Help", "hjkl: navigate", "enter: confirm"] | readonly ["q: exit"] | readonly ["i: edit", "y: yank/move"] | readonly ["q: exit", "i: edit"] | readonly ["hjkl: move selection", "e/enter: confirm move/yank", "q: exit"] | readonly ["hjkl: move selection", "e/enter: confirm move/yank", "y: confirm move/yank", "q: exit"];
3
- readonly BOARD: readonly [];
4
- readonly SWIMLANE: readonly [":h Help", "hjkl: navigate", "enter: confirm"];
5
- readonly TICKET_LIST_ITEM: readonly ["i: edit", "y: yank/move"];
6
- readonly TICKET: readonly ["q: exit", "i: edit"];
7
- };
@@ -1,21 +0,0 @@
1
- import { Mode } from '../../navigation/model/action-map.model.js';
2
- import { BoardItemTypes } from '../model/board.model.js';
3
- export const Hints = {
4
- [BoardItemTypes.BOARD]: [],
5
- [BoardItemTypes.SWIMLANE]: [':h Help', 'hjkl: navigate', 'enter: confirm'],
6
- [BoardItemTypes.TICKET_LIST_ITEM + Mode.HELP]: ['q: exit'],
7
- [BoardItemTypes.SWIMLANE + Mode.HELP]: ['q: exit'],
8
- [BoardItemTypes.TICKET_LIST_ITEM]: ['i: edit', 'y: yank/move'],
9
- [BoardItemTypes.TICKET]: ['q: exit', 'i: edit'],
10
- [BoardItemTypes.SWIMLANE + Mode.MOVE]: [
11
- 'hjkl: move selection',
12
- 'e/enter: confirm move/yank',
13
- 'q: exit',
14
- ],
15
- [BoardItemTypes.TICKET_LIST_ITEM + Mode.MOVE]: [
16
- 'hjkl: move selection',
17
- 'e/enter: confirm move/yank',
18
- 'y: confirm move/yank',
19
- 'q: exit',
20
- ],
21
- };
@@ -1,2 +0,0 @@
1
- import { Board } from '../model/board.model.js';
2
- export declare const board: Board;