claude-code-kanban 3.1.2 → 3.2.1
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/install.js +2 -1
- package/package.json +1 -1
- package/public/app.js +22 -1
- package/server.js +2 -1
package/install.js
CHANGED
|
@@ -159,7 +159,7 @@ async function runInstall() {
|
|
|
159
159
|
} else if (!settings.statusLine) {
|
|
160
160
|
console.log(`\n StatusLine: ${dim('not configured')}`);
|
|
161
161
|
if (await prompt(` Set up context tracking statusline? [Y/n] `)) {
|
|
162
|
-
settings.statusLine = { command: CTX_COMMAND };
|
|
162
|
+
settings.statusLine = { type: 'command', command: CTX_COMMAND };
|
|
163
163
|
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\n');
|
|
164
164
|
console.log(` ${green('✓')} StatusLine configured`);
|
|
165
165
|
} else {
|
|
@@ -169,6 +169,7 @@ async function runInstall() {
|
|
|
169
169
|
const existing = settings.statusLine.command;
|
|
170
170
|
console.log(`\n StatusLine: ${dim(`current: ${existing}`)}`);
|
|
171
171
|
if (await prompt(` Prepend context spy to existing statusline? [Y/n] `)) {
|
|
172
|
+
settings.statusLine.type = 'command';
|
|
172
173
|
settings.statusLine.command = `${CTX_COMMAND} | ${existing}`;
|
|
173
174
|
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2) + '\n');
|
|
174
175
|
console.log(` ${green('✓')} StatusLine updated`);
|
package/package.json
CHANGED
package/public/app.js
CHANGED
|
@@ -25,7 +25,7 @@ let agentPollInterval = null;
|
|
|
25
25
|
let selectedTaskId = null;
|
|
26
26
|
let selectedSessionId = null;
|
|
27
27
|
let focusZone = 'board'; // 'board' | 'sidebar'
|
|
28
|
-
let appConfig = { marketplaceUrl: null, costUrl: null };
|
|
28
|
+
let appConfig = { marketplaceUrl: null, costUrl: null, memoryUrl: null };
|
|
29
29
|
let selectedSessionIdx = -1;
|
|
30
30
|
let selectedSessionKbId = null;
|
|
31
31
|
let sessionJustSelected = false;
|
|
@@ -1330,6 +1330,8 @@ function _renderPinToDetail(pin) {
|
|
|
1330
1330
|
const SESSION_PIN_SVG = PIN_SVG.replace('width="14" height="14"', 'width="12" height="12"');
|
|
1331
1331
|
const MARKETPLACE_SVG =
|
|
1332
1332
|
'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z"/><line x1="3" y1="6" x2="21" y2="6"/><path d="M16 10a4 4 0 01-8 0"/></svg>';
|
|
1333
|
+
const MEMORY_SVG =
|
|
1334
|
+
'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>';
|
|
1333
1335
|
|
|
1334
1336
|
//#endregion
|
|
1335
1337
|
|
|
@@ -2244,6 +2246,7 @@ function renderSessions() {
|
|
|
2244
2246
|
${session.planSourceSessionId ? `<span class="plan-indicator" title="Implements plan — click to reveal plan session" onclick="event.stopPropagation(); revealPlanSession('${escapeHtml(session.planSourceSessionId)}')">📋</span>` : ''}
|
|
2245
2247
|
${session.hasWaitingForUser ? '<span class="agent-badge" title="Waiting for user">❓</span>' : ''}
|
|
2246
2248
|
${(window.__HUB__?.enabled || appConfig.marketplaceUrl) && session.project ? `<span class="marketplace-btn" data-project-path="${escapeHtml(session.project)}" onclick="event.stopPropagation(); openMarketplace(this.dataset.projectPath)" title="Open in Marketplace">${MARKETPLACE_SVG}</span>` : ''}
|
|
2249
|
+
${(window.__HUB__?.enabled || appConfig.memoryUrl) && session.project ? `<span class="marketplace-btn" data-project-path="${escapeHtml(session.project)}" onclick="event.stopPropagation(); openMemory(this.dataset.projectPath)" title="Open in Memory">${MEMORY_SVG}</span>` : ''}
|
|
2247
2250
|
${isLive ? '<span class="pulse"></span>' : ''}
|
|
2248
2251
|
</span>
|
|
2249
2252
|
<div class="progress-bar"><div class="progress-fill" style="width: ${percent}%"></div></div>
|
|
@@ -3993,6 +3996,12 @@ document.addEventListener('keydown', (e) => {
|
|
|
3993
3996
|
hubNavigate('marketplace', mSession?.project ? `?project=${encodeURIComponent(mSession.project)}` : undefined);
|
|
3994
3997
|
return;
|
|
3995
3998
|
}
|
|
3999
|
+
if (e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && e.key === 'm') {
|
|
4000
|
+
e.preventDefault();
|
|
4001
|
+
const mSession = contextSid ? sessions.find((s) => s.id === contextSid) : null;
|
|
4002
|
+
hubNavigate('memory', mSession?.project ? `?project=${encodeURIComponent(mSession.project)}` : undefined);
|
|
4003
|
+
return;
|
|
4004
|
+
}
|
|
3996
4005
|
if (matchKey(e, 'KeyR')) {
|
|
3997
4006
|
e.preventDefault();
|
|
3998
4007
|
if (_manualRefreshing) return;
|
|
@@ -5115,6 +5124,18 @@ function openMarketplace(projectPath) {
|
|
|
5115
5124
|
}
|
|
5116
5125
|
}
|
|
5117
5126
|
|
|
5127
|
+
// biome-ignore lint/correctness/noUnusedVariables: used in HTML
|
|
5128
|
+
function openMemory(projectPath) {
|
|
5129
|
+
const params = new URLSearchParams({ project: projectPath });
|
|
5130
|
+
if (window.__HUB__?.enabled) {
|
|
5131
|
+
hubNavigate('memory', `?${params}`);
|
|
5132
|
+
} else if (appConfig.memoryUrl) {
|
|
5133
|
+
const url = new URL(appConfig.memoryUrl);
|
|
5134
|
+
url.search = params.toString();
|
|
5135
|
+
window.open(url.toString(), '_blank');
|
|
5136
|
+
}
|
|
5137
|
+
}
|
|
5138
|
+
|
|
5118
5139
|
//#endregion
|
|
5119
5140
|
|
|
5120
5141
|
//#region OWNER_FILTER
|
package/server.js
CHANGED
|
@@ -60,6 +60,7 @@ function getArgUrl(argName, envName) {
|
|
|
60
60
|
|
|
61
61
|
const MARKETPLACE_URL = getArgUrl('marketplace-url', 'MARKETPLACE_URL');
|
|
62
62
|
const COST_URL = getArgUrl('cost-url', 'COST_URL');
|
|
63
|
+
const MEMORY_URL = getArgUrl('memory-url', 'MEMORY_URL');
|
|
63
64
|
const CLAUDE_DIR = getClaudeDir();
|
|
64
65
|
const TASKS_DIR = path.join(CLAUDE_DIR, 'tasks');
|
|
65
66
|
const PROJECTS_DIR = path.join(CLAUDE_DIR, 'projects');
|
|
@@ -1277,7 +1278,7 @@ app.get('/api/version', (req, res) => {
|
|
|
1277
1278
|
});
|
|
1278
1279
|
|
|
1279
1280
|
app.get('/api/config', (req, res) => {
|
|
1280
|
-
res.json({ marketplaceUrl: MARKETPLACE_URL, costUrl: COST_URL });
|
|
1281
|
+
res.json({ marketplaceUrl: MARKETPLACE_URL, costUrl: COST_URL, memoryUrl: MEMORY_URL });
|
|
1281
1282
|
});
|
|
1282
1283
|
|
|
1283
1284
|
// API: Get all tasks across all sessions
|