@proletariat/cli 0.3.56 → 0.3.58
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 +69 -1
- package/bin/validate-better-sqlite3.cjs +44 -5
- package/dist/commands/dashboard.d.ts +38 -0
- package/dist/commands/dashboard.js +352 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/media/add.d.ts +19 -0
- package/dist/commands/media/add.js +94 -0
- package/dist/commands/media/add.js.map +1 -0
- package/dist/commands/media/index.d.ts +14 -0
- package/dist/commands/media/index.js +85 -0
- package/dist/commands/media/index.js.map +1 -0
- package/dist/commands/media/list.d.ts +15 -0
- package/dist/commands/media/list.js +89 -0
- package/dist/commands/media/list.js.map +1 -0
- package/dist/commands/media/preprocess.d.ts +19 -0
- package/dist/commands/media/preprocess.js +91 -0
- package/dist/commands/media/preprocess.js.map +1 -0
- package/dist/commands/media/remove.d.ts +18 -0
- package/dist/commands/media/remove.js +101 -0
- package/dist/commands/media/remove.js.map +1 -0
- package/dist/commands/media/show.d.ts +17 -0
- package/dist/commands/media/show.js +122 -0
- package/dist/commands/media/show.js.map +1 -0
- package/dist/commands/orchestrator/start.js +6 -0
- package/dist/commands/orchestrator/start.js.map +1 -1
- package/dist/commands/repo/fix-remotes.d.ts +14 -0
- package/dist/commands/repo/fix-remotes.js +154 -0
- package/dist/commands/repo/fix-remotes.js.map +1 -0
- package/dist/commands/work/start.d.ts +1 -0
- package/dist/commands/work/start.js +42 -17
- package/dist/commands/work/start.js.map +1 -1
- package/dist/lib/agents/commands.js +5 -7
- package/dist/lib/agents/commands.js.map +1 -1
- package/dist/lib/agents/index.js +6 -7
- package/dist/lib/agents/index.js.map +1 -1
- package/dist/lib/database/index.d.ts +49 -1
- package/dist/lib/database/index.js +127 -0
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/database/native-validation.d.ts +2 -0
- package/dist/lib/database/native-validation.js +30 -1
- package/dist/lib/database/native-validation.js.map +1 -1
- package/dist/lib/execution/runners.d.ts +24 -1
- package/dist/lib/execution/runners.js +309 -98
- package/dist/lib/execution/runners.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +2 -2
- package/dist/lib/execution/spawner.js +42 -23
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/types.d.ts +2 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/external-issues/shortcut.js +2 -1
- package/dist/lib/external-issues/shortcut.js.map +1 -1
- package/dist/lib/media/index.d.ts +91 -0
- package/dist/lib/media/index.js +475 -0
- package/dist/lib/media/index.js.map +1 -0
- package/dist/lib/repos/git.d.ts +44 -0
- package/dist/lib/repos/git.js +127 -0
- package/dist/lib/repos/git.js.map +1 -1
- package/dist/lib/repos/index.js +35 -2
- package/dist/lib/repos/index.js.map +1 -1
- package/dist/lib/work-source/config.d.ts +5 -0
- package/dist/lib/work-source/config.js +19 -0
- package/dist/lib/work-source/config.js.map +1 -1
- package/dist/lib/work-source/index.d.ts +1 -1
- package/dist/lib/work-source/index.js +1 -1
- package/dist/lib/work-source/index.js.map +1 -1
- package/oclif.manifest.json +3612 -3130
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -697,7 +697,7 @@ Claude Code handles its own authentication via `claude login`.
|
|
|
697
697
|
|
|
698
698
|
## Requirements
|
|
699
699
|
|
|
700
|
-
- **Node.js
|
|
700
|
+
- **Node.js 20+** (22 LTS recommended)
|
|
701
701
|
- **Git**
|
|
702
702
|
- **Claude Code** (`claude login` to authenticate)
|
|
703
703
|
- **SQLite**
|
|
@@ -706,6 +706,74 @@ Claude Code handles its own authentication via `claude login`.
|
|
|
706
706
|
|
|
707
707
|
---
|
|
708
708
|
|
|
709
|
+
## Troubleshooting Installation
|
|
710
|
+
|
|
711
|
+
### `bun install` fails on better-sqlite3
|
|
712
|
+
|
|
713
|
+
**Symptom**: `bun install -g @proletariat/cli` fails with `isexe` or `node-gyp` errors during the `better-sqlite3` native module build.
|
|
714
|
+
|
|
715
|
+
**Cause**: Bun's node-gyp compatibility is limited. The `which` dependency inside node-gyp uses `isexe`, which is incompatible with Bun's runtime shims.
|
|
716
|
+
|
|
717
|
+
**Fix**: Use `npm` or Homebrew instead:
|
|
718
|
+
|
|
719
|
+
```bash
|
|
720
|
+
# Option 1: Homebrew (macOS, recommended)
|
|
721
|
+
brew install chrismcdermut/proletariat/prlt
|
|
722
|
+
|
|
723
|
+
# Option 2: npm (all platforms)
|
|
724
|
+
npm install -g @proletariat/cli
|
|
725
|
+
|
|
726
|
+
# Option 3: pnpm
|
|
727
|
+
pnpm install -g @proletariat/cli
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
If you must use Bun, ensure Node.js 22 (LTS) is also installed and set `better-sqlite3` to use its prebuilt binaries:
|
|
731
|
+
|
|
732
|
+
```bash
|
|
733
|
+
npm rebuild better-sqlite3
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
### npm `EACCES: permission denied`
|
|
737
|
+
|
|
738
|
+
**Symptom**: `npm install -g @proletariat/cli` fails with `EACCES: permission denied` on `/opt/homebrew/lib/node_modules` or `/usr/local/lib/node_modules`.
|
|
739
|
+
|
|
740
|
+
**Fix**: Configure npm to use a user-writable directory:
|
|
741
|
+
|
|
742
|
+
```bash
|
|
743
|
+
mkdir -p ~/.npm-global
|
|
744
|
+
npm config set prefix '~/.npm-global'
|
|
745
|
+
export PATH="$HOME/.npm-global/bin:$PATH"
|
|
746
|
+
# Add the export line to your ~/.zshrc or ~/.bashrc
|
|
747
|
+
npm install -g @proletariat/cli
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
Or use Homebrew instead (macOS):
|
|
751
|
+
|
|
752
|
+
```bash
|
|
753
|
+
brew install chrismcdermut/proletariat/prlt
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
### Native module errors after install
|
|
757
|
+
|
|
758
|
+
**Symptom**: `prlt` runs but crashes with `better_sqlite3.node` or ABI mismatch errors.
|
|
759
|
+
|
|
760
|
+
**Fix**:
|
|
761
|
+
|
|
762
|
+
```bash
|
|
763
|
+
# Rebuild for the current Node version
|
|
764
|
+
npm rebuild better-sqlite3
|
|
765
|
+
|
|
766
|
+
# Verify it works
|
|
767
|
+
node -e "require('better-sqlite3')"
|
|
768
|
+
|
|
769
|
+
# If still failing, reinstall
|
|
770
|
+
npm install -g @proletariat/cli --force
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
See the [full troubleshooting guide](../../docs/troubleshooting.md) for more details.
|
|
774
|
+
|
|
775
|
+
---
|
|
776
|
+
|
|
709
777
|
## Support
|
|
710
778
|
|
|
711
779
|
- **Discord**: [discord.gg/tmZyjNNSvw](https://discord.gg/tmZyjNNSvw)
|
|
@@ -7,6 +7,11 @@ function parseNodeMajor(version) {
|
|
|
7
7
|
return match ? Number.parseInt(match[1], 10) : null
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
function isBunRuntime() {
|
|
11
|
+
return typeof process.versions.bun === 'string'
|
|
12
|
+
|| typeof globalThis.Bun !== 'undefined'
|
|
13
|
+
}
|
|
14
|
+
|
|
10
15
|
function runtimeInfo() {
|
|
11
16
|
return {
|
|
12
17
|
nodeVersion: process.version,
|
|
@@ -14,24 +19,32 @@ function runtimeInfo() {
|
|
|
14
19
|
abi: process.versions.modules,
|
|
15
20
|
platform: process.platform,
|
|
16
21
|
arch: process.arch,
|
|
22
|
+
isBun: isBunRuntime(),
|
|
17
23
|
}
|
|
18
24
|
}
|
|
19
25
|
|
|
26
|
+
function isBunNodeGypError(error) {
|
|
27
|
+
if (!(error instanceof Error)) return false
|
|
28
|
+
const msg = error.message.toLowerCase()
|
|
29
|
+
return msg.includes('isexe') || msg.includes('which.js') || msg.includes('node-gyp')
|
|
30
|
+
}
|
|
31
|
+
|
|
20
32
|
function buildMessage(error, context) {
|
|
21
33
|
const info = runtimeInfo()
|
|
34
|
+
const runtimeLabel = info.isBun ? 'bun' : 'node'
|
|
22
35
|
const nodeMajorHint = info.nodeMajor === null || SUPPORTED_NODE_MAJORS.includes(info.nodeMajor)
|
|
23
36
|
? ''
|
|
24
37
|
: `\n- Unsupported Node major for this CLI: ${info.nodeMajor} (supported: ${SUPPORTED_NODE_MAJORS.join(', ')})`
|
|
25
38
|
const reason = error instanceof Error ? error.message : String(error)
|
|
26
39
|
|
|
27
|
-
|
|
40
|
+
const lines = [
|
|
28
41
|
'',
|
|
29
42
|
'╔══════════════════════════════════════════════════════════════════╗',
|
|
30
43
|
'║ better-sqlite3 native module validation failed ║',
|
|
31
44
|
'╚══════════════════════════════════════════════════════════════════╝',
|
|
32
45
|
'',
|
|
33
46
|
`Context: ${context}`,
|
|
34
|
-
`Runtime:
|
|
47
|
+
`Runtime: ${runtimeLabel} ${info.nodeVersion} (ABI ${info.abi}) on ${info.platform}-${info.arch}${nodeMajorHint}`,
|
|
35
48
|
`Error: ${reason}`,
|
|
36
49
|
'',
|
|
37
50
|
'Fix steps:',
|
|
@@ -43,8 +56,22 @@ function buildMessage(error, context) {
|
|
|
43
56
|
'If the problem persists, ensure you have build tools installed:',
|
|
44
57
|
' macOS: xcode-select --install',
|
|
45
58
|
' Linux: sudo apt-get install build-essential python3',
|
|
46
|
-
|
|
47
|
-
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
if (info.isBun || isBunNodeGypError(error)) {
|
|
62
|
+
lines.push(
|
|
63
|
+
'',
|
|
64
|
+
'Bun users:',
|
|
65
|
+
' Bun\'s node-gyp compatibility is limited and may fail to compile',
|
|
66
|
+
' better-sqlite3. Recommended alternatives:',
|
|
67
|
+
' - Install with npm instead: npm install -g @proletariat/cli',
|
|
68
|
+
' - Install with Homebrew (macOS): brew install chrismcdermut/proletariat/prlt',
|
|
69
|
+
' - Use Node.js 22 (LTS) for best compatibility',
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
lines.push('')
|
|
74
|
+
return lines.join('\n')
|
|
48
75
|
}
|
|
49
76
|
|
|
50
77
|
function validate(context) {
|
|
@@ -61,6 +88,18 @@ function validate(context) {
|
|
|
61
88
|
try {
|
|
62
89
|
validate('postinstall')
|
|
63
90
|
} catch (error) {
|
|
64
|
-
|
|
91
|
+
const info = runtimeInfo()
|
|
92
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
93
|
+
// Under bun, native module build failures are expected — warn instead of
|
|
94
|
+
// hard-failing so the install can complete. The user will get a clear error
|
|
95
|
+
// at runtime with actionable fix steps.
|
|
96
|
+
if (info.isBun) {
|
|
97
|
+
console.warn(message)
|
|
98
|
+
console.warn('\n[warn] Continuing installation despite validation failure (bun detected).')
|
|
99
|
+
console.warn('[warn] Run prlt with Node.js, or reinstall with npm/Homebrew for full support.\n')
|
|
100
|
+
process.exit(0)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.error(message)
|
|
65
104
|
process.exit(1)
|
|
66
105
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt dashboard — unified TUI dashboard
|
|
3
|
+
*
|
|
4
|
+
* Combines kanban board, agent list, and session status
|
|
5
|
+
* into a single auto-refreshing terminal view.
|
|
6
|
+
*/
|
|
7
|
+
import { PMOCommand } from '../lib/pmo/index.js';
|
|
8
|
+
export default class Dashboard extends PMOCommand {
|
|
9
|
+
static description: string;
|
|
10
|
+
static examples: string[];
|
|
11
|
+
static flags: {
|
|
12
|
+
refresh: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
compact: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
execute(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Gather all dashboard data from board, agents, and sessions.
|
|
21
|
+
*/
|
|
22
|
+
private gatherData;
|
|
23
|
+
/**
|
|
24
|
+
* Auto-refresh loop: clear screen and redraw on interval.
|
|
25
|
+
*/
|
|
26
|
+
private runWithRefresh;
|
|
27
|
+
/**
|
|
28
|
+
* Output all dashboard data as JSON for AI agents.
|
|
29
|
+
*/
|
|
30
|
+
private outputJson;
|
|
31
|
+
private renderDashboard;
|
|
32
|
+
private renderBoardSection;
|
|
33
|
+
private renderTicketCompact;
|
|
34
|
+
private renderTicketFull;
|
|
35
|
+
private progressBar;
|
|
36
|
+
private renderAgentsSection;
|
|
37
|
+
private renderSessionsSection;
|
|
38
|
+
}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prlt dashboard — unified TUI dashboard
|
|
3
|
+
*
|
|
4
|
+
* Combines kanban board, agent list, and session status
|
|
5
|
+
* into a single auto-refreshing terminal view.
|
|
6
|
+
*/
|
|
7
|
+
import { Flags } from '@oclif/core';
|
|
8
|
+
import { PMOCommand, pmoBaseFlags, } from '../lib/pmo/index.js';
|
|
9
|
+
import { styles, formatPriority, formatCategory, getColumnStyle, getColumnEmoji, } from '../lib/styles.js';
|
|
10
|
+
import { shouldOutputJson, outputSuccessAsJson, createMetadata, } from '../lib/prompt-json.js';
|
|
11
|
+
import { SessionStore } from '../lib/session-store.js';
|
|
12
|
+
import { getWorkspaceInfo, getAllAgentsStatus, getAgentTmuxSessions, } from '../lib/agents/commands.js';
|
|
13
|
+
function formatDuration(ms) {
|
|
14
|
+
const seconds = Math.floor(ms / 1000);
|
|
15
|
+
if (seconds < 60)
|
|
16
|
+
return `${seconds}s`;
|
|
17
|
+
const minutes = Math.floor(seconds / 60);
|
|
18
|
+
if (minutes < 60)
|
|
19
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
20
|
+
const hours = Math.floor(minutes / 60);
|
|
21
|
+
return `${hours}h ${minutes % 60}m`;
|
|
22
|
+
}
|
|
23
|
+
function padEnd(str, len) {
|
|
24
|
+
return str.length >= len ? str.substring(0, len) : str + ' '.repeat(len - str.length);
|
|
25
|
+
}
|
|
26
|
+
function truncate(str, maxLen) {
|
|
27
|
+
if (str.length <= maxLen)
|
|
28
|
+
return str;
|
|
29
|
+
return str.substring(0, maxLen - 3) + '...';
|
|
30
|
+
}
|
|
31
|
+
export default class Dashboard extends PMOCommand {
|
|
32
|
+
static description = 'Unified TUI dashboard with board, agents, and sessions';
|
|
33
|
+
static examples = [
|
|
34
|
+
'<%= config.bin %> dashboard',
|
|
35
|
+
'<%= config.bin %> dashboard --refresh 10',
|
|
36
|
+
'<%= config.bin %> dashboard --compact',
|
|
37
|
+
'<%= config.bin %> dashboard --json',
|
|
38
|
+
];
|
|
39
|
+
static flags = {
|
|
40
|
+
...pmoBaseFlags,
|
|
41
|
+
refresh: Flags.integer({
|
|
42
|
+
char: 'r',
|
|
43
|
+
description: 'Auto-refresh interval in seconds (0 to disable)',
|
|
44
|
+
default: 0,
|
|
45
|
+
}),
|
|
46
|
+
compact: Flags.boolean({
|
|
47
|
+
char: 'c',
|
|
48
|
+
description: 'Compact ticket view (ID and title only)',
|
|
49
|
+
default: false,
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
async execute() {
|
|
53
|
+
const { flags } = await this.parse(Dashboard);
|
|
54
|
+
const jsonMode = shouldOutputJson(flags);
|
|
55
|
+
const projectId = await this.requireProject();
|
|
56
|
+
if (flags.refresh > 0 && !jsonMode) {
|
|
57
|
+
await this.runWithRefresh(projectId, flags.refresh, flags.compact);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const data = await this.gatherData(projectId);
|
|
61
|
+
if (jsonMode) {
|
|
62
|
+
this.outputJson(data, flags);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.renderDashboard(data, flags.compact);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Gather all dashboard data from board, agents, and sessions.
|
|
70
|
+
*/
|
|
71
|
+
async gatherData(projectId) {
|
|
72
|
+
const board = await this.storage.getBoard(projectId);
|
|
73
|
+
// Get agent status from workspace
|
|
74
|
+
let agents = [];
|
|
75
|
+
try {
|
|
76
|
+
const workspaceInfo = getWorkspaceInfo();
|
|
77
|
+
const activeAgents = workspaceInfo.agents.filter(a => a.status === 'active');
|
|
78
|
+
if (activeAgents.length > 0) {
|
|
79
|
+
agents = getAllAgentsStatus(workspaceInfo);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Workspace info might not be available — ignore
|
|
84
|
+
}
|
|
85
|
+
// Get sessions from global session store
|
|
86
|
+
let sessions = [];
|
|
87
|
+
let sessionStore = null;
|
|
88
|
+
try {
|
|
89
|
+
sessionStore = new SessionStore();
|
|
90
|
+
sessionStore.reconcile();
|
|
91
|
+
sessions = sessionStore.list('running');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Session store might not exist yet — ignore
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
sessionStore?.close();
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
board: board ? { name: board.name, columns: board.columns } : null,
|
|
101
|
+
agents,
|
|
102
|
+
sessions,
|
|
103
|
+
timestamp: new Date(),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Auto-refresh loop: clear screen and redraw on interval.
|
|
108
|
+
*/
|
|
109
|
+
async runWithRefresh(projectId, intervalSec, compact) {
|
|
110
|
+
const render = async () => {
|
|
111
|
+
const data = await this.gatherData(projectId);
|
|
112
|
+
// Clear screen
|
|
113
|
+
process.stdout.write('\x1B[2J\x1B[H');
|
|
114
|
+
this.renderDashboard(data, compact);
|
|
115
|
+
this.log(styles.muted(`\nAuto-refreshing every ${intervalSec}s. Press Ctrl+C to exit.`));
|
|
116
|
+
};
|
|
117
|
+
// Initial render
|
|
118
|
+
await render();
|
|
119
|
+
// Set up interval
|
|
120
|
+
const timer = setInterval(render, intervalSec * 1000);
|
|
121
|
+
// Wait for SIGINT
|
|
122
|
+
await new Promise((resolve) => {
|
|
123
|
+
const cleanup = () => {
|
|
124
|
+
clearInterval(timer);
|
|
125
|
+
resolve();
|
|
126
|
+
};
|
|
127
|
+
process.on('SIGINT', cleanup);
|
|
128
|
+
process.on('SIGTERM', cleanup);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Output all dashboard data as JSON for AI agents.
|
|
133
|
+
*/
|
|
134
|
+
outputJson(data, flags) {
|
|
135
|
+
outputSuccessAsJson({
|
|
136
|
+
board: data.board
|
|
137
|
+
? {
|
|
138
|
+
name: data.board.name,
|
|
139
|
+
columns: data.board.columns.map(col => ({
|
|
140
|
+
name: col.name,
|
|
141
|
+
ticketCount: col.tickets.length,
|
|
142
|
+
tickets: col.tickets.map(t => ({
|
|
143
|
+
id: t.id,
|
|
144
|
+
title: t.title,
|
|
145
|
+
priority: t.priority,
|
|
146
|
+
category: t.category,
|
|
147
|
+
assignee: t.assignee,
|
|
148
|
+
subtasksDone: t.subtasks.filter((s) => s.done).length,
|
|
149
|
+
subtasksTotal: t.subtasks.length,
|
|
150
|
+
})),
|
|
151
|
+
})),
|
|
152
|
+
totalTickets: data.board.columns.reduce((sum, col) => sum + col.tickets.length, 0),
|
|
153
|
+
}
|
|
154
|
+
: null,
|
|
155
|
+
agents: data.agents.map(a => ({
|
|
156
|
+
name: a.name,
|
|
157
|
+
exists: a.exists,
|
|
158
|
+
branch: a.branch,
|
|
159
|
+
assignedTickets: a.assignedTickets,
|
|
160
|
+
completedTickets: a.completedTickets,
|
|
161
|
+
running: getAgentTmuxSessions(a.name).length > 0,
|
|
162
|
+
})),
|
|
163
|
+
sessions: data.sessions.map(s => ({
|
|
164
|
+
id: s.id,
|
|
165
|
+
agentName: s.agentName,
|
|
166
|
+
runner: s.runner,
|
|
167
|
+
task: s.task,
|
|
168
|
+
environment: s.environment,
|
|
169
|
+
status: s.status,
|
|
170
|
+
duration: Date.now() - s.startedAt.getTime(),
|
|
171
|
+
startedAt: s.startedAt.toISOString(),
|
|
172
|
+
})),
|
|
173
|
+
timestamp: data.timestamp.toISOString(),
|
|
174
|
+
}, createMetadata('dashboard', flags));
|
|
175
|
+
}
|
|
176
|
+
// ===========================================================================
|
|
177
|
+
// Rendering
|
|
178
|
+
// ===========================================================================
|
|
179
|
+
renderDashboard(data, compact) {
|
|
180
|
+
const termWidth = process.stdout.columns || 80;
|
|
181
|
+
// Header
|
|
182
|
+
this.log(styles.title('\n PROLETARIAT DASHBOARD'));
|
|
183
|
+
this.log(styles.muted(` ${data.timestamp.toLocaleTimeString()} — ` +
|
|
184
|
+
`${data.agents.length} agent(s), ` +
|
|
185
|
+
`${data.sessions.length} session(s)`));
|
|
186
|
+
this.log(styles.muted(' ' + '═'.repeat(Math.min(termWidth - 4, 76))));
|
|
187
|
+
// Section 1: Kanban Board
|
|
188
|
+
this.renderBoardSection(data, compact);
|
|
189
|
+
// Section 2: Agents
|
|
190
|
+
this.renderAgentsSection(data);
|
|
191
|
+
// Section 3: Sessions
|
|
192
|
+
this.renderSessionsSection(data);
|
|
193
|
+
// Footer
|
|
194
|
+
this.log(styles.muted(' ' + '═'.repeat(Math.min(termWidth - 4, 76))));
|
|
195
|
+
this.log(styles.muted(' Commands: ') +
|
|
196
|
+
styles.primary('prlt dashboard -r 5') +
|
|
197
|
+
styles.muted(' (auto-refresh) ') +
|
|
198
|
+
styles.primary('prlt ps') +
|
|
199
|
+
styles.muted(' (sessions) ') +
|
|
200
|
+
styles.primary('prlt agent list') +
|
|
201
|
+
styles.muted(' (agents)'));
|
|
202
|
+
this.log('');
|
|
203
|
+
}
|
|
204
|
+
// -- Board ------------------------------------------------------------------
|
|
205
|
+
renderBoardSection(data, compact) {
|
|
206
|
+
this.log('');
|
|
207
|
+
this.log(styles.header(' BOARD'));
|
|
208
|
+
if (!data.board) {
|
|
209
|
+
this.log(styles.muted(' No board found.'));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// Summary bar: show counts per column inline
|
|
213
|
+
const summaryParts = data.board.columns
|
|
214
|
+
.map(col => {
|
|
215
|
+
const colStyle = getColumnStyle(col.name);
|
|
216
|
+
return colStyle(`${col.name}: ${col.tickets.length}`);
|
|
217
|
+
});
|
|
218
|
+
this.log(' ' + summaryParts.join(styles.muted(' | ')));
|
|
219
|
+
this.log(styles.muted(' ' + '─'.repeat(60)));
|
|
220
|
+
// Show tickets grouped by column (skip empty columns in compact mode)
|
|
221
|
+
for (const column of data.board.columns) {
|
|
222
|
+
if (compact && column.tickets.length === 0)
|
|
223
|
+
continue;
|
|
224
|
+
const headerColor = getColumnStyle(column.name);
|
|
225
|
+
const emoji = getColumnEmoji(column.name);
|
|
226
|
+
this.log(headerColor(` ${emoji} ${column.name} (${column.tickets.length})`));
|
|
227
|
+
if (column.tickets.length === 0) {
|
|
228
|
+
this.log(styles.muted(' (empty)'));
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
const sortedTickets = [...column.tickets].sort((a, b) => (a.position || 0) - (b.position || 0));
|
|
232
|
+
for (const ticket of sortedTickets) {
|
|
233
|
+
if (compact) {
|
|
234
|
+
this.renderTicketCompact(ticket);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
this.renderTicketFull(ticket);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
renderTicketCompact(ticket) {
|
|
243
|
+
const priority = formatPriority(ticket.priority);
|
|
244
|
+
const assignee = ticket.assignee ? styles.muted(` @${ticket.assignee}`) : '';
|
|
245
|
+
this.log(` ${styles.code(ticket.id)}: ${ticket.title} ${priority}${assignee}`);
|
|
246
|
+
}
|
|
247
|
+
renderTicketFull(ticket) {
|
|
248
|
+
const priority = formatPriority(ticket.priority);
|
|
249
|
+
const category = formatCategory(ticket.category);
|
|
250
|
+
const assignee = ticket.assignee ? styles.muted(` @${ticket.assignee}`) : '';
|
|
251
|
+
this.log(` ${styles.code(ticket.id)} ${ticket.title} ${priority} ${category}${assignee}`);
|
|
252
|
+
if (ticket.description) {
|
|
253
|
+
const shortDesc = ticket.description.split('\n')[0].substring(0, 50);
|
|
254
|
+
this.log(styles.muted(` ${shortDesc}${ticket.description.length > 50 ? '...' : ''}`));
|
|
255
|
+
}
|
|
256
|
+
if (ticket.subtasks.length > 0) {
|
|
257
|
+
const done = ticket.subtasks.filter(s => s.done).length;
|
|
258
|
+
const total = ticket.subtasks.length;
|
|
259
|
+
const pct = Math.round((done / total) * 100);
|
|
260
|
+
const bar = this.progressBar(done, total, 10);
|
|
261
|
+
this.log(styles.muted(` ${bar} ${done}/${total} (${pct}%)`));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
progressBar(done, total, width) {
|
|
265
|
+
const filled = Math.round((done / total) * width);
|
|
266
|
+
const empty = width - filled;
|
|
267
|
+
return styles.success('█'.repeat(filled)) + styles.muted('░'.repeat(empty));
|
|
268
|
+
}
|
|
269
|
+
// -- Agents -----------------------------------------------------------------
|
|
270
|
+
renderAgentsSection(data) {
|
|
271
|
+
this.log('');
|
|
272
|
+
this.log(styles.header(' AGENTS'));
|
|
273
|
+
if (data.agents.length === 0) {
|
|
274
|
+
this.log(styles.muted(' No agents found.'));
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
// Header row
|
|
278
|
+
this.log(styles.muted(' ' +
|
|
279
|
+
padEnd('Name', 18) +
|
|
280
|
+
padEnd('Status', 12) +
|
|
281
|
+
padEnd('Tickets', 24) +
|
|
282
|
+
'Branch'));
|
|
283
|
+
this.log(styles.muted(' ' + '─'.repeat(70)));
|
|
284
|
+
for (const agent of data.agents) {
|
|
285
|
+
const sessions = getAgentTmuxSessions(agent.name);
|
|
286
|
+
const isRunning = sessions.length > 0;
|
|
287
|
+
// Determine status
|
|
288
|
+
let statusLabel;
|
|
289
|
+
let statusStyled;
|
|
290
|
+
if (!agent.exists) {
|
|
291
|
+
statusLabel = 'missing';
|
|
292
|
+
statusStyled = styles.error(statusLabel);
|
|
293
|
+
}
|
|
294
|
+
else if (isRunning) {
|
|
295
|
+
statusLabel = 'running';
|
|
296
|
+
statusStyled = styles.success(statusLabel);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
statusLabel = 'idle';
|
|
300
|
+
statusStyled = styles.muted(statusLabel);
|
|
301
|
+
}
|
|
302
|
+
const ticketsLabel = agent.assignedTickets.length > 0
|
|
303
|
+
? truncate(agent.assignedTickets.join(', '), 22)
|
|
304
|
+
: 'none';
|
|
305
|
+
const ticketsStyled = agent.assignedTickets.length > 0
|
|
306
|
+
? styles.info(ticketsLabel)
|
|
307
|
+
: styles.muted(ticketsLabel);
|
|
308
|
+
const branchLabel = agent.branch ? truncate(agent.branch, 30) : '-';
|
|
309
|
+
const branchStyled = agent.branch ? styles.code(branchLabel) : styles.muted(branchLabel);
|
|
310
|
+
this.log(' ' +
|
|
311
|
+
padEnd(agent.name, 18) +
|
|
312
|
+
padEnd(statusLabel, 12).replace(statusLabel, statusStyled) +
|
|
313
|
+
padEnd(ticketsLabel, 24).replace(ticketsLabel, ticketsStyled) +
|
|
314
|
+
branchStyled);
|
|
315
|
+
}
|
|
316
|
+
// Agent summary
|
|
317
|
+
const activeCount = data.agents.filter(a => a.exists).length;
|
|
318
|
+
const runningCount = data.agents.filter(a => getAgentTmuxSessions(a.name).length > 0).length;
|
|
319
|
+
this.log(styles.muted(` Total: ${data.agents.length} | Active: ${activeCount} | Running: ${runningCount}`));
|
|
320
|
+
}
|
|
321
|
+
// -- Sessions ---------------------------------------------------------------
|
|
322
|
+
renderSessionsSection(data) {
|
|
323
|
+
this.log('');
|
|
324
|
+
this.log(styles.header(' SESSIONS'));
|
|
325
|
+
if (data.sessions.length === 0) {
|
|
326
|
+
this.log(styles.muted(' No running sessions.'));
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
// Header row
|
|
330
|
+
this.log(styles.muted(' ' +
|
|
331
|
+
padEnd('Agent', 16) +
|
|
332
|
+
padEnd('Runner', 12) +
|
|
333
|
+
padEnd('Task', 28) +
|
|
334
|
+
padEnd('Env', 8) +
|
|
335
|
+
padEnd('Duration', 10) +
|
|
336
|
+
'Status'));
|
|
337
|
+
this.log(styles.muted(' ' + '─'.repeat(78)));
|
|
338
|
+
for (const session of data.sessions) {
|
|
339
|
+
const duration = formatDuration(Date.now() - session.startedAt.getTime());
|
|
340
|
+
const taskDisplay = truncate(session.task, 26);
|
|
341
|
+
const statusColor = session.status === 'running' ? styles.success : styles.muted;
|
|
342
|
+
this.log(' ' +
|
|
343
|
+
padEnd(session.agentName, 16) +
|
|
344
|
+
padEnd(session.runner, 12) +
|
|
345
|
+
padEnd(taskDisplay, 28) +
|
|
346
|
+
padEnd(session.environment, 8) +
|
|
347
|
+
padEnd(duration, 10) +
|
|
348
|
+
statusColor(session.status));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PMOCommand } from '../../lib/pmo/index.js';
|
|
2
|
+
export default class Add extends PMOCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
path: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
interval: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
transcribe: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
machine: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
protected getPMOOptions(): {
|
|
16
|
+
promptIfMultiple: boolean;
|
|
17
|
+
};
|
|
18
|
+
execute(): Promise<void>;
|
|
19
|
+
}
|