@nemus-cli/nemus 0.2.4 → 0.2.5
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/CHANGELOG.md +24 -1
- package/dist/cli/ai-prompt.js +1 -1
- package/dist/cli/tui.js +1 -1
- package/dist/commands/configure.js +1 -1
- package/dist/commands/ghq-status.js +1 -1
- package/dist/mcp/install.js +12 -12
- package/dist/mcp/server.js +2 -2
- package/dist/pi-extensions/permission-sync.ts.template +1 -1
- package/dist/pi-extensions/permissions-gate.ts.template +1 -1
- package/dist/pi-extensions/pr-fix-trigger.ts.template +2 -2
- package/dist/pi-extensions/review-reminder.ts.template +1 -1
- package/dist/pi-extensions/workspace-input-status.ts.template +3 -3
- package/dist/scripts/workspace-table.py +3 -3
- package/dist/utils/agent-state.js +1 -1
- package/dist/utils/bug-report.js +3 -3
- package/dist/utils/claude-integration.js +8 -8
- package/dist/utils/permission-sync.js +10 -10
- package/dist/utils/pi-extensions.js +5 -5
- package/package.json +1 -1
- package/skills/analyze-deps.md +0 -3
- package/skills/branch-create.md +0 -3
- package/skills/create-workspace.md +0 -11
- package/skills/delete-workspace.md +0 -3
- package/skills/list-org-repos.md +0 -6
- package/skills/list-suites.md +0 -4
- package/skills/list-workspaces.md +0 -7
- package/skills/nemus/SKILL.md +110 -0
- package/skills/{workspace-manager → nemus}/references/ai-prompt.md +0 -6
- package/skills/{workspace-manager → nemus}/references/analyze-deps.md +0 -11
- package/skills/{workspace-manager → nemus}/references/archive-workspace.md +0 -9
- package/skills/{workspace-manager → nemus}/references/branch-create.md +0 -3
- package/skills/{workspace-manager → nemus}/references/branch-merge.md +0 -4
- package/skills/{workspace-manager → nemus}/references/branch-rebase.md +0 -4
- package/skills/{workspace-manager → nemus}/references/cache-clear.md +0 -3
- package/skills/{workspace-manager → nemus}/references/cache-info.md +0 -3
- package/skills/{workspace-manager → nemus}/references/configure-claude.md +0 -3
- package/skills/{workspace-manager → nemus}/references/configure.md +1 -4
- package/skills/{workspace-manager → nemus}/references/create-workspace.md +0 -4
- package/skills/{workspace-manager → nemus}/references/dashboard.md +0 -4
- package/skills/{workspace-manager → nemus}/references/delete-workspace.md +0 -4
- package/skills/{workspace-manager → nemus}/references/generate-docs.md +0 -9
- package/skills/{workspace-manager → nemus}/references/ghq-status.md +0 -5
- package/skills/{workspace-manager → nemus}/references/go.md +0 -4
- package/skills/{workspace-manager → nemus}/references/history.md +1 -5
- package/skills/{workspace-manager → nemus}/references/list-org-repos.md +0 -4
- package/skills/{workspace-manager → nemus}/references/list-suites.md +0 -4
- package/skills/{workspace-manager → nemus}/references/list-workspaces.md +1 -5
- package/skills/{workspace-manager → nemus}/references/mcp.md +3 -8
- package/skills/{workspace-manager → nemus}/references/remove-repo.md +0 -3
- package/skills/{workspace-manager → nemus}/references/run-command.md +1 -5
- package/skills/{workspace-manager → nemus}/references/search-repos.md +0 -4
- package/skills/{workspace-manager → nemus}/references/sessions.md +0 -5
- package/skills/{workspace-manager → nemus}/references/suite-create.md +0 -4
- package/skills/{workspace-manager → nemus}/references/suite-delete.md +0 -3
- package/skills/{workspace-manager → nemus}/references/suite-export.md +0 -4
- package/skills/{workspace-manager → nemus}/references/suite-import.md +0 -4
- package/skills/{workspace-manager → nemus}/references/suite-use.md +0 -4
- package/skills/{workspace-manager → nemus}/references/switch-branch.md +0 -4
- package/skills/{workspace-manager → nemus}/references/update-cache.md +0 -3
- package/skills/{workspace-manager → nemus}/references/update-workspace.md +0 -4
- package/skills/{workspace-manager → nemus}/references/workspace-cleanup.md +0 -4
- package/skills/{workspace-manager → nemus}/references/workspace-diff.md +0 -3
- package/skills/{workspace-manager → nemus}/references/workspace-doctor.md +0 -4
- package/skills/{workspace-manager → nemus}/references/workspace-info.md +0 -3
- package/skills/{workspace-manager → nemus}/references/workspace-status.md +1 -13
- package/skills/{workspace-manager → nemus}/references/workspace-sync.md +0 -4
- package/skills/refresh-workspace-docs.md +6 -78
- package/skills/run-command.md +0 -3
- package/skills/save-context.md +1 -13
- package/skills/search-repos.md +0 -6
- package/skills/snapshot-list.md +0 -3
- package/skills/snapshot-save.md +1 -1
- package/skills/switch-branch.md +0 -3
- package/skills/update-workspace.md +0 -11
- package/skills/workspace-cleanup.md +0 -3
- package/skills/workspace-diff.md +0 -3
- package/skills/workspace-doctor.md +0 -3
- package/skills/workspace-info.md +0 -17
- package/skills/workspace-status.md +0 -6
- package/skills/workspace-sync.md +0 -3
- package/src/cli/ai-prompt.ts +1 -1
- package/src/cli/tui.tsx +1 -1
- package/src/commands/configure.ts +1 -1
- package/src/commands/ghq-status.ts +1 -1
- package/src/mcp/install.ts +12 -12
- package/src/mcp/server.ts +2 -2
- package/src/pi-extensions/permission-sync.ts.template +1 -1
- package/src/pi-extensions/permissions-gate.ts.template +1 -1
- package/src/pi-extensions/pr-fix-trigger.ts.template +2 -2
- package/src/pi-extensions/review-reminder.ts.template +1 -1
- package/src/pi-extensions/workspace-input-status.ts.template +3 -3
- package/src/scripts/workspace-table.py +3 -3
- package/src/utils/agent-state.ts +1 -1
- package/src/utils/bug-report.ts +3 -3
- package/src/utils/claude-integration.ts +8 -8
- package/src/utils/permission-sync.test.ts +4 -4
- package/src/utils/permission-sync.ts +10 -10
- package/src/utils/pi-extensions.test.ts +1 -1
- package/src/utils/pi-extensions.ts +5 -5
- package/src/utils/repo-resolver.test.ts +1 -1
- package/skills/workspace-manager/SKILL.md +0 -201
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.5] - 2026-08-25
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Simplified the bundled skills.** Removed repetitive ceremony sections
|
|
15
|
+
(`Success Criteria`, `Suggested Follow-ups`, `Presenting Results`, etc.) and
|
|
16
|
+
slimmed the routing `SKILL.md`, cutting the skills corpus ~20% with no loss of
|
|
17
|
+
actual guidance.
|
|
18
|
+
- **Removed the `workspace-manager` name from the code.** The bundled skill
|
|
19
|
+
folder is now `skills/nemus/`, the MCP server registers as **`nemus`** (tools
|
|
20
|
+
are `mcp__nemus__*`, `.mcp.json` key `nemus`), and internal state paths moved
|
|
21
|
+
to `~/.nemus/*` / `~/.nemus-*`. The legacy `WORKSPACE_MANAGER_DIR` /
|
|
22
|
+
`WORKSPACE_MANAGER_CACHE_DIR` env vars and the `~/.workspace-manager-cache`
|
|
23
|
+
migration source are kept for backward compatibility.
|
|
24
|
+
|
|
25
|
+
### Security
|
|
26
|
+
|
|
27
|
+
- Hardened the CI version-bump reminder to skip fork PRs (whose read-only token
|
|
28
|
+
can't post), confirming the workflows never expose secrets to forks:
|
|
29
|
+
CI runs on `pull_request` (not `pull_request_target`) and `NPM_TOKEN` lives
|
|
30
|
+
only in the push/dispatch-triggered, approval-gated release workflow.
|
|
31
|
+
|
|
10
32
|
## [0.2.4] - 2026-08-25
|
|
11
33
|
|
|
12
34
|
### Changed
|
|
@@ -125,7 +147,8 @@ Initial open-source release of **Nemus**.
|
|
|
125
147
|
- Automatic retries with backoff on flaky network operations.
|
|
126
148
|
- Optional shell integration (auto-cd on create + quick-navigate helper).
|
|
127
149
|
|
|
128
|
-
[Unreleased]: https://github.com/me-public/nemus/compare/v0.2.
|
|
150
|
+
[Unreleased]: https://github.com/me-public/nemus/compare/v0.2.5...HEAD
|
|
151
|
+
[0.2.5]: https://github.com/me-public/nemus/compare/v0.2.4...v0.2.5
|
|
129
152
|
[0.2.4]: https://github.com/me-public/nemus/compare/v0.2.3...v0.2.4
|
|
130
153
|
[0.2.3]: https://github.com/me-public/nemus/compare/v0.2.2...v0.2.3
|
|
131
154
|
[0.2.2]: https://github.com/me-public/nemus/compare/v0.2.1...v0.2.2
|
package/dist/cli/ai-prompt.js
CHANGED
|
@@ -200,7 +200,7 @@ function throwExtractionError(cmd, c) {
|
|
|
200
200
|
if (c.timedOut) {
|
|
201
201
|
const secs = Math.round(EXTRACTION_TIMEOUT_MS / 1000);
|
|
202
202
|
let msg = `${cmd} did not respond within ${secs}s while parsing your request.\n` +
|
|
203
|
-
` This is usually a transient model/provider stall, not a
|
|
203
|
+
` This is usually a transient model/provider stall, not a nemus bug.\n` +
|
|
204
204
|
` • Verify the agent itself responds quickly: time ${testCmd}\n` +
|
|
205
205
|
` • If it's slow, your default model may be heavy (e.g. Opus) or the provider\n` +
|
|
206
206
|
` may be rate-limiting/refreshing credentials. Retry, or switch to a faster model.\n` +
|
package/dist/cli/tui.js
CHANGED
|
@@ -11,7 +11,7 @@ const main = async () => {
|
|
|
11
11
|
try {
|
|
12
12
|
(0, logger_1.logInfo)('Interactive TUI mode');
|
|
13
13
|
console.log((0, colors_1.colorize)('\n╔══════════════════════════════════════════╗', 'cyan'));
|
|
14
|
-
console.log((0, colors_1.colorize)('║
|
|
14
|
+
console.log((0, colors_1.colorize)('║ Nemus - Interactive UI ║', 'cyan'));
|
|
15
15
|
console.log((0, colors_1.colorize)('╚══════════════════════════════════════════╝\n', 'cyan'));
|
|
16
16
|
const workspaces = await (0, workspace_meta_1.listWorkspaces)();
|
|
17
17
|
if (workspaces.length === 0) {
|
|
@@ -56,7 +56,7 @@ function registerConfigureCommand(parent) {
|
|
|
56
56
|
}
|
|
57
57
|
async function handleConfigure() {
|
|
58
58
|
console.log('\n' + '='.repeat(60));
|
|
59
|
-
console.log((0, colors_1.colorize)('
|
|
59
|
+
console.log((0, colors_1.colorize)('Nemus Configuration', 'bright'));
|
|
60
60
|
console.log('='.repeat(60) + '\n');
|
|
61
61
|
const current = (0, config_1.getUserConfig)();
|
|
62
62
|
console.log('Current settings:');
|
|
@@ -55,7 +55,7 @@ async function handleGhqStatus() {
|
|
|
55
55
|
(0, ghq_integration_1.displayGhqInfo)();
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
-
console.log((0, colors_1.colorize)('
|
|
58
|
+
console.log((0, colors_1.colorize)('Nemus Behavior:', 'cyan'));
|
|
59
59
|
console.log(' • Auto-detects ghq installation');
|
|
60
60
|
console.log(' • Uses ghq when available');
|
|
61
61
|
console.log(' • Falls back to git clone if needed');
|
package/dist/mcp/install.js
CHANGED
|
@@ -145,12 +145,12 @@ function installHooksAndSkills() {
|
|
|
145
145
|
catch { /* ignore */ }
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
// Install
|
|
148
|
+
// Install nemus skills (MCP + CLI command skills) — always for all active agents
|
|
149
149
|
try {
|
|
150
150
|
(0, permission_sync_1.installWorkspaceSkills)();
|
|
151
151
|
}
|
|
152
152
|
catch (error) {
|
|
153
|
-
(0, logger_1.logError)('Failed to install
|
|
153
|
+
(0, logger_1.logError)('Failed to install nemus skills');
|
|
154
154
|
if (error instanceof Error) {
|
|
155
155
|
(0, logger_1.logError)(error.message);
|
|
156
156
|
}
|
|
@@ -177,7 +177,7 @@ function installHooksAndSkills() {
|
|
|
177
177
|
}
|
|
178
178
|
/**
|
|
179
179
|
* Backfill .mcp.json for all existing workspaces that don't have the
|
|
180
|
-
*
|
|
180
|
+
* nemus entry yet.
|
|
181
181
|
*/
|
|
182
182
|
async function backfillMcpJson() {
|
|
183
183
|
const { installMcp } = (0, config_1.getUserConfig)();
|
|
@@ -294,9 +294,9 @@ async function install() {
|
|
|
294
294
|
const serverPath = getMcpServerPath();
|
|
295
295
|
(0, logger_1.logInfo)(`MCP server path: ${(0, colors_1.colorize)(serverPath, 'cyan')}`);
|
|
296
296
|
try {
|
|
297
|
-
(0, child_process_1.execSync)(`claude mcp add
|
|
297
|
+
(0, child_process_1.execSync)(`claude mcp add nemus -s user -- node "${serverPath}"`, { stdio: 'pipe' });
|
|
298
298
|
(0, logger_1.logSuccess)('MCP server registered globally with Claude Code');
|
|
299
|
-
console.log('\nYou can now use
|
|
299
|
+
console.log('\nYou can now use nemus tools in any Claude Code session.');
|
|
300
300
|
console.log('Try asking: "list my workspaces" or "what\'s the status of my-workspace"');
|
|
301
301
|
}
|
|
302
302
|
catch (error) {
|
|
@@ -366,13 +366,13 @@ async function upgrade() {
|
|
|
366
366
|
(0, logger_1.logSuccess)('Upgrade complete');
|
|
367
367
|
}
|
|
368
368
|
function uninstall() {
|
|
369
|
-
// Remove
|
|
369
|
+
// Remove nemus skills (from all agent directories)
|
|
370
370
|
try {
|
|
371
371
|
(0, permission_sync_1.uninstallWorkspaceSkills)();
|
|
372
372
|
(0, logger_1.logSuccess)('Workspace-manager skills removed from all agents');
|
|
373
373
|
}
|
|
374
374
|
catch (error) {
|
|
375
|
-
(0, logger_1.logError)('Failed to remove
|
|
375
|
+
(0, logger_1.logError)('Failed to remove nemus skills');
|
|
376
376
|
if (error instanceof Error) {
|
|
377
377
|
(0, logger_1.logError)(error.message);
|
|
378
378
|
}
|
|
@@ -410,7 +410,7 @@ function uninstall() {
|
|
|
410
410
|
// Unregister MCP from Claude (if available)
|
|
411
411
|
if ((0, agent_config_1.isAgentCliAvailable)('claude')) {
|
|
412
412
|
try {
|
|
413
|
-
(0, child_process_1.execSync)('claude mcp remove
|
|
413
|
+
(0, child_process_1.execSync)('claude mcp remove nemus -s user', { stdio: 'inherit' });
|
|
414
414
|
(0, logger_1.logSuccess)('MCP server unregistered from Claude Code');
|
|
415
415
|
}
|
|
416
416
|
catch (error) {
|
|
@@ -450,10 +450,10 @@ function status() {
|
|
|
450
450
|
if (agent.supportsMcp) {
|
|
451
451
|
try {
|
|
452
452
|
const output = (0, child_process_1.execSync)('claude mcp list', { encoding: 'utf-8' });
|
|
453
|
-
const isRegistered = output.includes('
|
|
453
|
+
const isRegistered = output.includes('nemus');
|
|
454
454
|
if (isRegistered) {
|
|
455
455
|
(0, logger_1.logSuccess)(' MCP server registered');
|
|
456
|
-
const lines = output.split('\n').filter(l => l.includes('
|
|
456
|
+
const lines = output.split('\n').filter(l => l.includes('nemus'));
|
|
457
457
|
if (lines.length > 0) {
|
|
458
458
|
console.log(` ${lines[0].trim()}`);
|
|
459
459
|
}
|
|
@@ -496,7 +496,7 @@ function syncPermissions() {
|
|
|
496
496
|
(0, permission_sync_1.syncAllWorkspacePermissions)(config_1.WORKSPACES_DIR);
|
|
497
497
|
}
|
|
498
498
|
function updateSkills() {
|
|
499
|
-
(0, logger_1.logInfo)('Updating
|
|
499
|
+
(0, logger_1.logInfo)('Updating nemus skills...');
|
|
500
500
|
try {
|
|
501
501
|
(0, permission_sync_1.installWorkspaceSkills)();
|
|
502
502
|
}
|
|
@@ -534,7 +534,7 @@ async function main(subCommandArg) {
|
|
|
534
534
|
MCP Integration
|
|
535
535
|
|
|
536
536
|
Usage:
|
|
537
|
-
w mcp install Register
|
|
537
|
+
w mcp install Register nemus MCP server with Claude Code
|
|
538
538
|
w mcp uninstall Unregister the MCP server
|
|
539
539
|
w mcp upgrade Update hooks and skills without re-registering the MCP server
|
|
540
540
|
w mcp update-skills Update only the Claude Code skills (faster than full upgrade)
|
package/dist/mcp/server.js
CHANGED
|
@@ -14,7 +14,7 @@ const wsName = zod_1.z.string().min(1).max(64).regex(WS_NAME_RE, 'may contain on
|
|
|
14
14
|
const tools_1 = require("./tools");
|
|
15
15
|
const config_1 = require("../utils/config");
|
|
16
16
|
const server = new mcp_js_1.McpServer({
|
|
17
|
-
name: '
|
|
17
|
+
name: 'nemus',
|
|
18
18
|
version: (0, config_1.getPackageVersion)(),
|
|
19
19
|
});
|
|
20
20
|
server.tool('list-workspaces', 'List all workspaces with their repo counts and creation dates', {
|
|
@@ -390,7 +390,7 @@ server.tool('save-context', 'Save a progress summary to the workspace. Use this
|
|
|
390
390
|
async function main() {
|
|
391
391
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
392
392
|
await server.connect(transport);
|
|
393
|
-
process.stderr.write('
|
|
393
|
+
process.stderr.write('nemus MCP server started\n');
|
|
394
394
|
}
|
|
395
395
|
main().catch((error) => {
|
|
396
396
|
process.stderr.write(`MCP server error: ${error}\n`);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pi Permission Sync Extension (auto-generated by
|
|
2
|
+
* Pi Permission Sync Extension (auto-generated by nemus)
|
|
3
3
|
*
|
|
4
4
|
* Equivalent of Claude Code's sync-permissions.sh Stop hook.
|
|
5
5
|
* Syncs project-level permissions to global settings on session shutdown.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pi PR-Fix Trigger Extension (auto-generated by
|
|
2
|
+
* Pi PR-Fix Trigger Extension (auto-generated by nemus)
|
|
3
3
|
*
|
|
4
4
|
* Equivalent of Claude Code's check-pr-fix-trigger.sh PostToolUse hook.
|
|
5
5
|
* Detects `gh pr create` in bash tool results, extracts the PR URL,
|
|
6
6
|
* and injects a directive to monitor CI and address review comments.
|
|
7
7
|
*
|
|
8
|
-
* @managed
|
|
8
|
+
* @managed nemus
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pi Review Reminder Extension (auto-generated by
|
|
2
|
+
* Pi Review Reminder Extension (auto-generated by nemus)
|
|
3
3
|
*
|
|
4
4
|
* Equivalent of Claude Code's check-review-reminder.sh SessionStart hook.
|
|
5
5
|
* Reminds user to review global permissions periodically.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Workspace input status — Claude-Code-style layout (auto-generated by
|
|
2
|
+
* Workspace input status — Claude-Code-style layout (auto-generated by nemus)
|
|
3
3
|
*
|
|
4
4
|
* Layout (matching the Claude Code reference):
|
|
5
5
|
*
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
* ⠋ ✦ sonnet-4-6 ⚡ high 📂 ws:foo (3) 🧠 24k/200k 34% 💰 $0.42 ⏱ 2m 5s
|
|
10
10
|
*
|
|
11
11
|
* REPO BRANCH PR DIRTY
|
|
12
|
-
*
|
|
13
|
-
* ▸
|
|
12
|
+
* nemus-fix-… feat/oauth #41 open ✓
|
|
13
|
+
* ▸ nemus-security security/x #45 draft *2
|
|
14
14
|
*
|
|
15
15
|
* [pi's default footer renders below — untouched]
|
|
16
16
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
workspace-table.py —
|
|
4
|
-
(auto-generated by
|
|
3
|
+
workspace-table.py — Nemus status-line extension for Claude Code
|
|
4
|
+
(auto-generated by nemus)
|
|
5
5
|
|
|
6
6
|
Outputs ONLY the workspace repo table (branch · PR · CI · dirty state).
|
|
7
7
|
Claude Code already renders model / cost / context itself, so this script
|
|
@@ -10,7 +10,7 @@ adds only what it doesn't show.
|
|
|
10
10
|
Configure in ~/.claude/settings.json:
|
|
11
11
|
"statusLine": {
|
|
12
12
|
"type": "command",
|
|
13
|
-
"command": "~/.
|
|
13
|
+
"command": "~/.nemus-table.py",
|
|
14
14
|
"padding": 0
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -43,7 +43,7 @@ const fs = __importStar(require("fs"));
|
|
|
43
43
|
const path = __importStar(require("path"));
|
|
44
44
|
const os = __importStar(require("os"));
|
|
45
45
|
const dashboard_1 = require("../types/dashboard");
|
|
46
|
-
exports.AGENTS_STATE_DIR = path.join(os.homedir(), '.
|
|
46
|
+
exports.AGENTS_STATE_DIR = path.join(os.homedir(), '.nemus', 'agents');
|
|
47
47
|
function ensureStateDir() {
|
|
48
48
|
fs.mkdirSync(exports.AGENTS_STATE_DIR, { recursive: true });
|
|
49
49
|
}
|
package/dist/utils/bug-report.js
CHANGED
|
@@ -183,7 +183,7 @@ function buildIssueBody(err, env) {
|
|
|
183
183
|
const sig = errorSignature(err.message, err.stack);
|
|
184
184
|
const stack = err.stack ? sanitize(err.stack).slice(0, 4000) : '(no stack captured)';
|
|
185
185
|
return [
|
|
186
|
-
`**Auto-reported by
|
|
186
|
+
`**Auto-reported by nemus.**`,
|
|
187
187
|
``,
|
|
188
188
|
`**Signature:** \`${sig}\``,
|
|
189
189
|
`**Command:** \`${sanitize(err.command)}\``,
|
|
@@ -202,7 +202,7 @@ function buildIssueBody(err, env) {
|
|
|
202
202
|
`### Environment`,
|
|
203
203
|
`| | |`,
|
|
204
204
|
`|---|---|`,
|
|
205
|
-
`|
|
|
205
|
+
`| nemus | ${env.version} |`,
|
|
206
206
|
`| node | ${env.node} |`,
|
|
207
207
|
`| os | ${env.os} |`,
|
|
208
208
|
`| arch | ${env.arch} |`,
|
|
@@ -273,7 +273,7 @@ function ensureLabel() {
|
|
|
273
273
|
'label', 'create', exports.BUG_LABEL,
|
|
274
274
|
'--repo', exports.BUG_REPORT_REPO,
|
|
275
275
|
'--color', 'B60205',
|
|
276
|
-
'--description', 'Auto-reported by
|
|
276
|
+
'--description', 'Auto-reported by nemus',
|
|
277
277
|
], { encoding: 'utf-8', timeout: 15000, stdio: 'ignore' });
|
|
278
278
|
}
|
|
279
279
|
catch {
|
|
@@ -143,7 +143,7 @@ async function backfillAgentRules(workspacePath, workspaceName) {
|
|
|
143
143
|
return updated;
|
|
144
144
|
}
|
|
145
145
|
async function loadClaudeConfig() {
|
|
146
|
-
const configFile = path.join(process.env.HOME || '~', '.
|
|
146
|
+
const configFile = path.join(process.env.HOME || '~', '.nemus-claude-config.json');
|
|
147
147
|
try {
|
|
148
148
|
const content = await fs.readFile(configFile, 'utf-8');
|
|
149
149
|
return { ...DEFAULT_CONFIG, ...JSON.parse(content) };
|
|
@@ -156,7 +156,7 @@ async function loadClaudeConfig() {
|
|
|
156
156
|
* Save Claude integration config
|
|
157
157
|
*/
|
|
158
158
|
async function saveClaudeConfig(config) {
|
|
159
|
-
const configFile = path.join(process.env.HOME || '~', '.
|
|
159
|
+
const configFile = path.join(process.env.HOME || '~', '.nemus-claude-config.json');
|
|
160
160
|
try {
|
|
161
161
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2), 'utf-8');
|
|
162
162
|
}
|
|
@@ -201,7 +201,7 @@ async function generateClaudeContext(workspacePath, workspaceName, repos, metada
|
|
|
201
201
|
const { githubOrg } = (0, config_1.getUserConfig)();
|
|
202
202
|
let content = `# Workspace: ${workspaceName}
|
|
203
203
|
|
|
204
|
-
This workspace was created with [
|
|
204
|
+
This workspace was created with [Nemus](https://github.com/${githubOrg}/nemus).
|
|
205
205
|
|
|
206
206
|
## Organization
|
|
207
207
|
|
|
@@ -328,7 +328,7 @@ This workspace contains ${entries.length} repositories for focused development w
|
|
|
328
328
|
await fs.writeFile(contextFile, fileContent, 'utf-8');
|
|
329
329
|
(0, logger_1.logSuccess)(`Generated ${(0, colors_1.colorize)(fileName, 'cyan')} with workspace context`);
|
|
330
330
|
}
|
|
331
|
-
// Generate .mcp.json with
|
|
331
|
+
// Generate .mcp.json with nemus MCP server (if enabled)
|
|
332
332
|
const { installMcp } = (0, config_1.getUserConfig)();
|
|
333
333
|
if (installMcp) {
|
|
334
334
|
await generateMcpConfig(workspacePath);
|
|
@@ -410,9 +410,9 @@ function resolveMcpServerPath() {
|
|
|
410
410
|
return null;
|
|
411
411
|
}
|
|
412
412
|
/**
|
|
413
|
-
* Generate .mcp.json with
|
|
413
|
+
* Generate .mcp.json with nemus MCP server config.
|
|
414
414
|
* This ensures Claude Code sessions in the workspace have access to
|
|
415
|
-
*
|
|
415
|
+
* nemus tools even without global MCP registration.
|
|
416
416
|
*/
|
|
417
417
|
async function generateMcpConfig(workspacePath) {
|
|
418
418
|
try {
|
|
@@ -434,14 +434,14 @@ async function generateMcpConfig(workspacePath) {
|
|
|
434
434
|
...existingConfig,
|
|
435
435
|
mcpServers: {
|
|
436
436
|
...(existingConfig.mcpServers || {}),
|
|
437
|
-
'
|
|
437
|
+
'nemus': {
|
|
438
438
|
command: 'node',
|
|
439
439
|
args: [serverPath],
|
|
440
440
|
},
|
|
441
441
|
},
|
|
442
442
|
};
|
|
443
443
|
await fs.writeFile(mcpFile, JSON.stringify(mcpConfig, null, 2) + '\n', 'utf-8');
|
|
444
|
-
(0, logger_1.logSuccess)(`Generated ${(0, colors_1.colorize)('.mcp.json', 'cyan')} with
|
|
444
|
+
(0, logger_1.logSuccess)(`Generated ${(0, colors_1.colorize)('.mcp.json', 'cyan')} with nemus MCP server`);
|
|
445
445
|
return true;
|
|
446
446
|
}
|
|
447
447
|
catch (error) {
|
|
@@ -404,7 +404,7 @@ function getSkillsSourceDir() {
|
|
|
404
404
|
throw new Error('Could not find skills/ directory. Make sure the package is installed correctly.');
|
|
405
405
|
}
|
|
406
406
|
/**
|
|
407
|
-
* Install all
|
|
407
|
+
* Install all nemus skills from the skills/ directory.
|
|
408
408
|
* Each .md file becomes a skill under <skillsDir>/<skill-name>/SKILL.md.
|
|
409
409
|
* Installs to all active agent skills directories.
|
|
410
410
|
* Idempotent — safe to call multiple times.
|
|
@@ -449,7 +449,7 @@ function installWorkspaceSkills(skillsDir) {
|
|
|
449
449
|
installed++;
|
|
450
450
|
}
|
|
451
451
|
if (installed > 0) {
|
|
452
|
-
(0, logger_1.logSuccess)(`Installed ${installed}
|
|
452
|
+
(0, logger_1.logSuccess)(`Installed ${installed} nemus skills in ${targetBase}`);
|
|
453
453
|
}
|
|
454
454
|
}
|
|
455
455
|
}
|
|
@@ -470,7 +470,7 @@ function copyDirRecursive(src, dest) {
|
|
|
470
470
|
}
|
|
471
471
|
}
|
|
472
472
|
/**
|
|
473
|
-
* Remove all
|
|
473
|
+
* Remove all nemus skills from all possible agent directories.
|
|
474
474
|
* Reads the skills/ source directory to know which skill names to remove.
|
|
475
475
|
* Removes from both Claude and Pi dirs regardless of current config to avoid orphans.
|
|
476
476
|
*/
|
|
@@ -508,7 +508,7 @@ function uninstallWorkspaceSkills(skillsDir) {
|
|
|
508
508
|
}
|
|
509
509
|
// ─── Workspace status-line ────────────────────────────────────────────────────
|
|
510
510
|
/** Absolute install path for the workspace-table Python script. */
|
|
511
|
-
const WORKSPACE_TABLE_SCRIPT = path.join(os.homedir(), '.
|
|
511
|
+
const WORKSPACE_TABLE_SCRIPT = path.join(os.homedir(), '.nemus-table.py');
|
|
512
512
|
/**
|
|
513
513
|
* Resolve the bundled workspace-table.py path from the installed package.
|
|
514
514
|
* When compiled, __dirname is dist/utils/; the scripts/ dir is at dist/scripts/.
|
|
@@ -530,7 +530,7 @@ function getWorkspaceTableSourcePath() {
|
|
|
530
530
|
* Claude Code shows its default footer — the user's existing styling is
|
|
531
531
|
* never affected.
|
|
532
532
|
*
|
|
533
|
-
* The script is copied to ~/.
|
|
533
|
+
* The script is copied to ~/.nemus-table.py and registered in
|
|
534
534
|
* ~/.claude/settings.json only when no statusLine is already configured —
|
|
535
535
|
* we never overwrite a custom status line the user already has.
|
|
536
536
|
*
|
|
@@ -541,7 +541,7 @@ function installWorkspaceStatusLine(settingsPath) {
|
|
|
541
541
|
const settings = readClaudeSettings(filePath);
|
|
542
542
|
if (settings.statusLine) {
|
|
543
543
|
(0, logger_1.logInfo)('statusLine already configured in ~/.claude/settings.json — skipping workspace-table install');
|
|
544
|
-
(0, logger_1.logInfo)(` To use
|
|
544
|
+
(0, logger_1.logInfo)(` To use nemus\'s table, replace your statusLine command with: ${WORKSPACE_TABLE_SCRIPT}`);
|
|
545
545
|
return;
|
|
546
546
|
}
|
|
547
547
|
// Copy the script
|
|
@@ -566,7 +566,7 @@ function installWorkspaceStatusLine(settingsPath) {
|
|
|
566
566
|
}
|
|
567
567
|
/**
|
|
568
568
|
* Remove the workspace status-line from Claude Code\'s settings.json.
|
|
569
|
-
* Only removes it if the command points to
|
|
569
|
+
* Only removes it if the command points to nemus\'s own script.
|
|
570
570
|
*
|
|
571
571
|
* @param settingsPath Override ~/.claude/settings.json (for testing).
|
|
572
572
|
*/
|
|
@@ -579,8 +579,8 @@ function uninstallWorkspaceStatusLine(settingsPath) {
|
|
|
579
579
|
return;
|
|
580
580
|
}
|
|
581
581
|
const cmd = existing.command ?? '';
|
|
582
|
-
if (!cmd.includes('
|
|
583
|
-
(0, logger_1.logInfo)('statusLine is not managed by
|
|
582
|
+
if (!cmd.includes('nemus-table')) {
|
|
583
|
+
(0, logger_1.logInfo)('statusLine is not managed by nemus — leaving it unchanged');
|
|
584
584
|
return;
|
|
585
585
|
}
|
|
586
586
|
delete settings.statusLine;
|
|
@@ -605,7 +605,7 @@ function extractScriptPath(command) {
|
|
|
605
605
|
return bare ? bare[1] : null;
|
|
606
606
|
}
|
|
607
607
|
/**
|
|
608
|
-
* Detect and repair
|
|
608
|
+
* Detect and repair nemus hook commands in ~/.claude/settings.json
|
|
609
609
|
* that point to script paths which no longer exist on disk.
|
|
610
610
|
*
|
|
611
611
|
* This happens when the package is installed via a manager (e.g. Volta) whose
|
|
@@ -51,8 +51,8 @@ const path = __importStar(require("path"));
|
|
|
51
51
|
const os = __importStar(require("os"));
|
|
52
52
|
const logger_1 = require("./logger");
|
|
53
53
|
const PI_EXTENSIONS_DIR = path.join(os.homedir(), '.pi', 'agent', 'extensions');
|
|
54
|
-
/** Marker comment that identifies
|
|
55
|
-
const MANAGED_MARKER = '(auto-generated by
|
|
54
|
+
/** Marker comment that identifies nemus managed extensions */
|
|
55
|
+
const MANAGED_MARKER = '(auto-generated by nemus)';
|
|
56
56
|
function getTemplatesDir() {
|
|
57
57
|
// When compiled: dist/utils/ -> dist/pi-extensions/
|
|
58
58
|
const distPath = path.resolve(__dirname, '..', 'pi-extensions');
|
|
@@ -108,7 +108,7 @@ function getExtensionTemplates(options = {}) {
|
|
|
108
108
|
return templates;
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
|
-
* Install all
|
|
111
|
+
* Install all nemus Pi extensions.
|
|
112
112
|
* Idempotent — overwrites existing managed extensions with latest templates.
|
|
113
113
|
*
|
|
114
114
|
* @param extensionsDir Override the extensions directory (for testing).
|
|
@@ -150,14 +150,14 @@ function installPiExtensions(extensionsDir, options = {}) {
|
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
/**
|
|
153
|
-
* Uninstall
|
|
153
|
+
* Uninstall nemus managed Pi extensions.
|
|
154
154
|
* Only removes extensions that contain the managed marker or match
|
|
155
155
|
* known installed names.
|
|
156
156
|
*
|
|
157
157
|
* @param extensionsDir Override the extensions directory (for testing).
|
|
158
158
|
*/
|
|
159
159
|
/**
|
|
160
|
-
* Uninstall
|
|
160
|
+
* Uninstall nemus managed Pi extensions.
|
|
161
161
|
* Pass `onlyNames` to remove only specific extension files (for opt-out).
|
|
162
162
|
*
|
|
163
163
|
* @param extensionsDir Override the extensions directory (for testing).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nemus-cli/nemus",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Nemus — a CLI for managing multi-repository workspaces. Create, sync, and operate across dozens of repos with a single command, and wire them up to your favorite coding agent.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"workspace",
|
package/skills/analyze-deps.md
CHANGED
package/skills/branch-create.md
CHANGED
|
@@ -26,14 +26,3 @@ Or interactively (prompts for workspace name and repos):
|
|
|
26
26
|
nemus create
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
## Presenting Results
|
|
30
|
-
|
|
31
|
-
Report:
|
|
32
|
-
- Workspace created at path
|
|
33
|
-
- Successfully cloned repos
|
|
34
|
-
- Any failures with their error reason
|
|
35
|
-
|
|
36
|
-
## Suggested Follow-ups
|
|
37
|
-
|
|
38
|
-
- `nemus status <name>` to verify
|
|
39
|
-
- `nemus update --workspace <name> --repos <more-repos>` to add more repos later
|
package/skills/list-org-repos.md
CHANGED
package/skills/list-suites.md
CHANGED
|
@@ -18,10 +18,3 @@ Note: This command opens an interactive picker. To just see the output without s
|
|
|
18
18
|
nemus list 2>&1 | cat
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
Show each workspace with:
|
|
24
|
-
- Name
|
|
25
|
-
- Number of repositories
|
|
26
|
-
- Creation date
|
|
27
|
-
- Last active session (if any)
|