@nemus-cli/nemus 0.2.4 → 0.2.6
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 +40 -1
- package/assets/README.md +5 -0
- package/assets/avatar-500.png +0 -0
- package/assets/social-preview.png +0 -0
- 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 -10
- package/skills/archive-workspace.md +0 -8
- package/skills/branch-create.md +0 -10
- package/skills/create-workspace.md +0 -20
- package/skills/delete-workspace.md +0 -14
- package/skills/list-org-repos.md +0 -13
- package/skills/list-suites.md +0 -10
- package/skills/list-workspaces.md +0 -14
- package/skills/nemus/SKILL.md +110 -0
- package/skills/{workspace-manager → nemus}/references/ai-prompt.md +0 -14
- package/skills/{workspace-manager → nemus}/references/analyze-deps.md +0 -18
- package/skills/nemus/references/archive-workspace.md +22 -0
- package/skills/{workspace-manager → nemus}/references/branch-create.md +0 -8
- package/skills/{workspace-manager → nemus}/references/branch-merge.md +0 -9
- package/skills/{workspace-manager → nemus}/references/branch-rebase.md +0 -9
- package/skills/{workspace-manager → nemus}/references/cache-clear.md +0 -8
- package/skills/{workspace-manager → nemus}/references/cache-info.md +0 -8
- package/skills/{workspace-manager → nemus}/references/configure-claude.md +0 -8
- package/skills/{workspace-manager → nemus}/references/configure.md +0 -8
- package/skills/{workspace-manager → nemus}/references/create-workspace.md +0 -9
- package/skills/{workspace-manager → nemus}/references/dashboard.md +0 -15
- package/skills/{workspace-manager → nemus}/references/delete-workspace.md +0 -9
- package/skills/{workspace-manager → nemus}/references/generate-docs.md +0 -16
- package/skills/{workspace-manager → nemus}/references/ghq-status.md +0 -14
- package/skills/{workspace-manager → nemus}/references/go.md +0 -11
- package/skills/{workspace-manager → nemus}/references/history.md +0 -17
- package/skills/{workspace-manager → nemus}/references/list-org-repos.md +0 -9
- package/skills/{workspace-manager → nemus}/references/list-suites.md +0 -9
- package/skills/{workspace-manager → nemus}/references/list-workspaces.md +0 -9
- package/skills/{workspace-manager → nemus}/references/mcp.md +3 -21
- package/skills/{workspace-manager → nemus}/references/remove-repo.md +0 -8
- package/skills/{workspace-manager → nemus}/references/run-command.md +1 -10
- package/skills/{workspace-manager → nemus}/references/search-repos.md +0 -9
- package/skills/{workspace-manager → nemus}/references/sessions.md +0 -12
- package/skills/{workspace-manager → nemus}/references/suite-create.md +0 -9
- package/skills/{workspace-manager → nemus}/references/suite-delete.md +0 -8
- package/skills/{workspace-manager → nemus}/references/suite-export.md +0 -9
- package/skills/{workspace-manager → nemus}/references/suite-import.md +0 -9
- package/skills/{workspace-manager → nemus}/references/suite-use.md +0 -9
- package/skills/{workspace-manager → nemus}/references/switch-branch.md +0 -9
- package/skills/{workspace-manager → nemus}/references/update-cache.md +0 -8
- package/skills/{workspace-manager → nemus}/references/update-workspace.md +0 -11
- package/skills/{workspace-manager → nemus}/references/workspace-cleanup.md +0 -9
- package/skills/{workspace-manager → nemus}/references/workspace-diff.md +0 -8
- package/skills/{workspace-manager → nemus}/references/workspace-doctor.md +0 -9
- package/skills/{workspace-manager → nemus}/references/workspace-info.md +0 -8
- package/skills/nemus/references/workspace-status.md +26 -0
- package/skills/{workspace-manager → nemus}/references/workspace-sync.md +0 -9
- package/skills/refresh-workspace-docs.md +5 -81
- package/skills/remove-repo.md +0 -8
- package/skills/run-command.md +0 -10
- package/skills/save-context.md +1 -25
- package/skills/search-repos.md +0 -15
- package/skills/snapshot-list.md +0 -10
- package/skills/snapshot-save.md +0 -4
- package/skills/switch-branch.md +0 -10
- package/skills/update-cache.md +0 -8
- package/skills/update-workspace.md +0 -24
- package/skills/workspace-cleanup.md +0 -10
- package/skills/workspace-diff.md +0 -10
- package/skills/workspace-doctor.md +0 -10
- package/skills/workspace-info.md +0 -26
- package/skills/workspace-status.md +0 -13
- package/skills/workspace-sync.md +0 -10
- 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/skills/workspace-manager/references/archive-workspace.md +0 -38
- package/skills/workspace-manager/references/workspace-status.md +0 -43
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.6] - 2026-08-25
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Skills are now command-first ("one shot").** Each skill's body no longer
|
|
15
|
+
restates its frontmatter `description` under a heading before the command — it
|
|
16
|
+
leads straight with the command(s). Cut the skills corpus a further ~25%
|
|
17
|
+
(~1724 → ~1300 lines) with no loss of actual guidance.
|
|
18
|
+
- Fixed an unclosed code fence in the `save-context` skill.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- `assets/social-preview.png` (1280×640) and `assets/avatar-500.png` (500×500)
|
|
23
|
+
for the GitHub repo social preview and org/profile avatar.
|
|
24
|
+
|
|
25
|
+
## [0.2.5] - 2026-08-25
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **Simplified the bundled skills.** Removed repetitive ceremony sections
|
|
30
|
+
(`Success Criteria`, `Suggested Follow-ups`, `Presenting Results`, etc.) and
|
|
31
|
+
slimmed the routing `SKILL.md`, cutting the skills corpus ~20% with no loss of
|
|
32
|
+
actual guidance.
|
|
33
|
+
- **Removed the `workspace-manager` name from the code.** The bundled skill
|
|
34
|
+
folder is now `skills/nemus/`, the MCP server registers as **`nemus`** (tools
|
|
35
|
+
are `mcp__nemus__*`, `.mcp.json` key `nemus`), and internal state paths moved
|
|
36
|
+
to `~/.nemus/*` / `~/.nemus-*`. The legacy `WORKSPACE_MANAGER_DIR` /
|
|
37
|
+
`WORKSPACE_MANAGER_CACHE_DIR` env vars and the `~/.workspace-manager-cache`
|
|
38
|
+
migration source are kept for backward compatibility.
|
|
39
|
+
|
|
40
|
+
### Security
|
|
41
|
+
|
|
42
|
+
- Hardened the CI version-bump reminder to skip fork PRs (whose read-only token
|
|
43
|
+
can't post), confirming the workflows never expose secrets to forks:
|
|
44
|
+
CI runs on `pull_request` (not `pull_request_target`) and `NPM_TOKEN` lives
|
|
45
|
+
only in the push/dispatch-triggered, approval-gated release workflow.
|
|
46
|
+
|
|
10
47
|
## [0.2.4] - 2026-08-25
|
|
11
48
|
|
|
12
49
|
### Changed
|
|
@@ -125,7 +162,9 @@ Initial open-source release of **Nemus**.
|
|
|
125
162
|
- Automatic retries with backoff on flaky network operations.
|
|
126
163
|
- Optional shell integration (auto-cd on create + quick-navigate helper).
|
|
127
164
|
|
|
128
|
-
[Unreleased]: https://github.com/me-public/nemus/compare/v0.2.
|
|
165
|
+
[Unreleased]: https://github.com/me-public/nemus/compare/v0.2.6...HEAD
|
|
166
|
+
[0.2.6]: https://github.com/me-public/nemus/compare/v0.2.5...v0.2.6
|
|
167
|
+
[0.2.5]: https://github.com/me-public/nemus/compare/v0.2.4...v0.2.5
|
|
129
168
|
[0.2.4]: https://github.com/me-public/nemus/compare/v0.2.3...v0.2.4
|
|
130
169
|
[0.2.3]: https://github.com/me-public/nemus/compare/v0.2.2...v0.2.3
|
|
131
170
|
[0.2.2]: https://github.com/me-public/nemus/compare/v0.2.1...v0.2.2
|
package/assets/README.md
CHANGED
|
@@ -51,3 +51,8 @@ rsvg-convert -w 1280 -h 640 banner.svg -o banner.png
|
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
All artwork is original and released under the project's [MIT license](../LICENSE).
|
|
54
|
+
|
|
55
|
+
## GitHub images
|
|
56
|
+
|
|
57
|
+
- `social-preview.png` (1280×640) — upload at **Repo → Settings → General → Social preview** (shown in link unfurls).
|
|
58
|
+
- `avatar-500.png` (500×500) — square icon for use as an **org/profile avatar** if desired.
|
|
Binary file
|
|
Binary file
|
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.6",
|
|
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
|
@@ -3,12 +3,6 @@ name: analyze-deps
|
|
|
3
3
|
description: Analyze inter-repository dependencies in a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Analyze Dependencies
|
|
7
|
-
|
|
8
|
-
Analyze inter-repository dependencies in a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus analyze-deps <workspace-name>
|
|
14
8
|
```
|
|
@@ -17,7 +11,3 @@ Or for the current workspace:
|
|
|
17
11
|
```bash
|
|
18
12
|
nemus analyze-deps
|
|
19
13
|
```
|
|
20
|
-
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
Report dependency relationships between repos (which repos depend on which via package.json).
|
|
@@ -3,18 +3,10 @@ name: archive-workspace
|
|
|
3
3
|
description: Archive or unarchive a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Archive Workspace
|
|
7
|
-
|
|
8
|
-
Archive or unarchive a workspace.
|
|
9
|
-
|
|
10
|
-
## Archiving
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus archive <workspace-name>
|
|
14
8
|
```
|
|
15
9
|
|
|
16
|
-
## Unarchiving
|
|
17
|
-
|
|
18
10
|
```bash
|
|
19
11
|
nemus archive --unarchive <workspace-name>
|
|
20
12
|
```
|
package/skills/branch-create.md
CHANGED
|
@@ -3,16 +3,6 @@ name: branch-create
|
|
|
3
3
|
description: Create a new branch across all repos in a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Branch Create
|
|
7
|
-
|
|
8
|
-
Create a new branch across all repos in a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus branch create <workspace-name> <branch-name>
|
|
14
8
|
```
|
|
15
|
-
|
|
16
|
-
## Presenting Results
|
|
17
|
-
|
|
18
|
-
Report which repos had the branch created successfully and any that failed.
|
|
@@ -3,19 +3,11 @@ name: create-workspace
|
|
|
3
3
|
description: Create a new multi-repo workspace by cloning repositories from the org using `nemus create`. ALWAYS use this skill — never run `git clone` directly — when the user asks to create a workspace, set up a new workspace, or start fresh with a set of repos.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Create Workspace
|
|
7
|
-
|
|
8
|
-
Create a new workspace by cloning repositories.
|
|
9
|
-
|
|
10
|
-
## Resolving Repositories
|
|
11
|
-
|
|
12
6
|
If the user hasn't specified which repos to clone, help them discover:
|
|
13
7
|
```bash
|
|
14
8
|
nemus cache search <keyword>
|
|
15
9
|
```
|
|
16
10
|
|
|
17
|
-
## Creating the Workspace
|
|
18
|
-
|
|
19
11
|
Run non-interactively:
|
|
20
12
|
```bash
|
|
21
13
|
nemus create --workspace <name> --repos <repo1,repo2,...> --yes
|
|
@@ -25,15 +17,3 @@ Or interactively (prompts for workspace name and repos):
|
|
|
25
17
|
```bash
|
|
26
18
|
nemus create
|
|
27
19
|
```
|
|
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
|
|
@@ -3,19 +3,11 @@ name: delete-workspace
|
|
|
3
3
|
description: Delete one or more workspaces and all their contents permanently
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Delete Workspace
|
|
7
|
-
|
|
8
|
-
Delete one or more workspaces permanently.
|
|
9
|
-
|
|
10
|
-
## Resolving the Workspace
|
|
11
|
-
|
|
12
6
|
If the user hasn't specified which workspace to delete:
|
|
13
7
|
```bash
|
|
14
8
|
nemus list 2>&1 | cat
|
|
15
9
|
```
|
|
16
10
|
|
|
17
|
-
## Deleting
|
|
18
|
-
|
|
19
11
|
Run non-interactively:
|
|
20
12
|
```bash
|
|
21
13
|
nemus delete --workspace <name> --yes
|
|
@@ -26,12 +18,6 @@ Or interactively (prompts for confirmation):
|
|
|
26
18
|
nemus delete
|
|
27
19
|
```
|
|
28
20
|
|
|
29
|
-
## Important Notes
|
|
30
|
-
|
|
31
21
|
- This permanently removes the workspace directory and all its contents
|
|
32
22
|
- There is no undo — repos will need to be re-cloned
|
|
33
23
|
- Always confirm with the user before deleting
|
|
34
|
-
|
|
35
|
-
## Suggested Follow-ups
|
|
36
|
-
|
|
37
|
-
- `nemus list` to verify the workspace is gone
|