@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/skills/switch-branch.md
CHANGED
|
@@ -3,16 +3,6 @@ name: switch-branch
|
|
|
3
3
|
description: Switch all repos in a workspace to a specified branch
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Switch Branch
|
|
7
|
-
|
|
8
|
-
Switch all repos in a workspace to a specified branch.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus branch switch <workspace-name> <branch-name>
|
|
14
8
|
```
|
|
15
|
-
|
|
16
|
-
## Presenting Results
|
|
17
|
-
|
|
18
|
-
Report which repos were switched and any that couldn't switch (e.g., uncommitted changes).
|
package/skills/update-cache.md
CHANGED
|
@@ -3,19 +3,11 @@ name: update-cache
|
|
|
3
3
|
description: Force refresh the GitHub repository cache
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Update Cache
|
|
7
|
-
|
|
8
|
-
Force refresh the GitHub repository cache.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus cache refresh
|
|
14
8
|
```
|
|
15
9
|
|
|
16
10
|
This fetches the latest list of repositories from the GitHub org and updates the local cache.
|
|
17
11
|
|
|
18
|
-
## When to Use
|
|
19
|
-
|
|
20
12
|
- When `nemus cache search` doesn't find a recently created repo
|
|
21
13
|
- Periodically to keep the cache fresh (auto-refreshes daily)
|
|
@@ -3,16 +3,10 @@ name: update-workspace
|
|
|
3
3
|
description: Add one or more repositories to an existing workspace. ALWAYS use this skill — never run `git clone` directly — when the user asks to add, clone, include, or pull a new repo into the current workspace. Triggers on phrases like "add repo X", "include X in this workspace", "I need X here", "clone X into workspace", "add a service".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Update Workspace
|
|
7
|
-
|
|
8
6
|
> **CRITICAL**: NEVER use `git clone` directly to add repositories to a workspace.
|
|
9
7
|
> Always use `nemus update` — it registers the repo in workspace metadata, updates
|
|
10
8
|
> the context file, and keeps `nemus status`/`nemus sync` working correctly.
|
|
11
9
|
|
|
12
|
-
Add more repositories to an existing workspace.
|
|
13
|
-
|
|
14
|
-
## Resolving the Workspace
|
|
15
|
-
|
|
16
10
|
If the user hasn't specified a workspace, run:
|
|
17
11
|
```bash
|
|
18
12
|
nemus list 2>&1 | cat
|
|
@@ -23,8 +17,6 @@ Or to see what's in a specific workspace (from inside the workspace directory):
|
|
|
23
17
|
cat .workspace-meta.json
|
|
24
18
|
```
|
|
25
19
|
|
|
26
|
-
## Resolving Repositories
|
|
27
|
-
|
|
28
20
|
If the user hasn't specified which repos to add, help them discover:
|
|
29
21
|
```bash
|
|
30
22
|
nemus cache search <keyword>
|
|
@@ -35,15 +27,11 @@ To see what's already in the workspace (avoid adding duplicates):
|
|
|
35
27
|
cat .workspace-meta.json | jq '.repositories[].name'
|
|
36
28
|
```
|
|
37
29
|
|
|
38
|
-
## Adding Repos
|
|
39
|
-
|
|
40
30
|
Run the update command non-interactively:
|
|
41
31
|
```bash
|
|
42
32
|
nemus update --workspace <name> --repos <repo1,repo2,...> --yes
|
|
43
33
|
```
|
|
44
34
|
|
|
45
|
-
### Adding the same repo more than once (instances)
|
|
46
|
-
|
|
47
35
|
Append `:suffix` to a repo name to add it again under a separate folder
|
|
48
36
|
(`<repo>-<suffix>`) — e.g. a second checkout for another branch instead of a
|
|
49
37
|
`git worktree` (worktrees are invisible to `nemus status`/`nemus sync`):
|
|
@@ -52,15 +40,3 @@ nemus update --workspace <name> --repos casper:cas-101 --yes # -> casper-cas-1
|
|
|
52
40
|
```
|
|
53
41
|
Suffix = letters, numbers, hyphens, underscores. Each instance is tracked
|
|
54
42
|
independently by `nemus status`/`nemus sync`.
|
|
55
|
-
|
|
56
|
-
## Presenting Results
|
|
57
|
-
|
|
58
|
-
The command output shows which repos were added and which were skipped. Report:
|
|
59
|
-
- Successfully added repos
|
|
60
|
-
- Skipped repos (already exist in workspace) - this is not an error
|
|
61
|
-
- Any failures with their error reason
|
|
62
|
-
|
|
63
|
-
## Suggested Follow-ups
|
|
64
|
-
|
|
65
|
-
- `nemus status <workspace>` to verify the new repos
|
|
66
|
-
- `nemus sync <workspace>` to pull latest on all repos
|
|
@@ -3,16 +3,6 @@ name: workspace-cleanup
|
|
|
3
3
|
description: Remove node_modules and build artifacts to free disk space
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Cleanup
|
|
7
|
-
|
|
8
|
-
Remove node_modules and build artifacts to free disk space.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus cleanup <workspace-name>
|
|
14
8
|
```
|
|
15
|
-
|
|
16
|
-
## Presenting Results
|
|
17
|
-
|
|
18
|
-
Report how much disk space was freed and which directories were removed.
|
package/skills/workspace-diff.md
CHANGED
|
@@ -3,12 +3,6 @@ name: workspace-diff
|
|
|
3
3
|
description: Show diff summary for all repos in a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Diff
|
|
7
|
-
|
|
8
|
-
Show diff summary across all repos in a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus diff <workspace-name>
|
|
14
8
|
```
|
|
@@ -17,7 +11,3 @@ Or for the current workspace:
|
|
|
17
11
|
```bash
|
|
18
12
|
nemus diff
|
|
19
13
|
```
|
|
20
|
-
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
Report per-repo diff stats (files changed, insertions, deletions).
|
|
@@ -3,12 +3,6 @@ name: workspace-doctor
|
|
|
3
3
|
description: Run health checks on a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Doctor
|
|
7
|
-
|
|
8
|
-
Run health checks on a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus doctor <workspace-name>
|
|
14
8
|
```
|
|
@@ -17,7 +11,3 @@ Or for the current workspace:
|
|
|
17
11
|
```bash
|
|
18
12
|
nemus doctor
|
|
19
13
|
```
|
|
20
|
-
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
Report any issues found (missing repos, broken git state, etc.) and suggestions for fixes.
|
package/skills/workspace-info.md
CHANGED
|
@@ -3,19 +3,11 @@ name: workspace-info
|
|
|
3
3
|
description: Get detailed metadata for a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Info
|
|
7
|
-
|
|
8
|
-
Get detailed metadata for a workspace including all repository info, tags, and disk path.
|
|
9
|
-
|
|
10
|
-
## Resolving the Workspace
|
|
11
|
-
|
|
12
6
|
If the user hasn't specified a workspace name, list them:
|
|
13
7
|
```bash
|
|
14
8
|
nemus list 2>&1 | cat
|
|
15
9
|
```
|
|
16
10
|
|
|
17
|
-
## Getting Info
|
|
18
|
-
|
|
19
11
|
Read the workspace metadata file (path is relative to the workspace directory):
|
|
20
12
|
```bash
|
|
21
13
|
cat <workspace-path>/.workspace-meta.json
|
|
@@ -25,21 +17,3 @@ The workspace path can be found by checking the current directory or using:
|
|
|
25
17
|
```bash
|
|
26
18
|
nemus status <workspace-name>
|
|
27
19
|
```
|
|
28
|
-
|
|
29
|
-
## Presenting Results
|
|
30
|
-
|
|
31
|
-
The JSON contains workspace metadata. Present clearly:
|
|
32
|
-
|
|
33
|
-
- **Name** and **creation date**
|
|
34
|
-
- **Disk path** where the workspace lives
|
|
35
|
-
- **Repositories** - list each with:
|
|
36
|
-
- Directory name (may differ from repo name if a suffix was used)
|
|
37
|
-
- Clone URL
|
|
38
|
-
- Status (success/failed from creation)
|
|
39
|
-
- **Tags** and any custom metadata if present
|
|
40
|
-
|
|
41
|
-
## Suggested Follow-ups
|
|
42
|
-
|
|
43
|
-
- `nemus status <workspace>` to see current git status of each repo
|
|
44
|
-
- `nemus update --workspace <name> --repos <repos>` to add more repos
|
|
45
|
-
- `nemus doctor <workspace>` to check workspace health
|
|
@@ -3,12 +3,6 @@ name: workspace-status
|
|
|
3
3
|
description: Show git status for all repos in a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Status
|
|
7
|
-
|
|
8
|
-
Show git status across all repos in a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus status <workspace-name>
|
|
14
8
|
```
|
|
@@ -17,10 +11,3 @@ Or for the current workspace:
|
|
|
17
11
|
```bash
|
|
18
12
|
nemus status
|
|
19
13
|
```
|
|
20
|
-
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
The command shows per-repo git status (branch, uncommitted changes, ahead/behind). Report:
|
|
24
|
-
- Which repos have uncommitted changes
|
|
25
|
-
- Which repos are on non-default branches
|
|
26
|
-
- Any repos that are ahead/behind remote
|
package/skills/workspace-sync.md
CHANGED
|
@@ -3,12 +3,6 @@ name: workspace-sync
|
|
|
3
3
|
description: Git pull all repos in a workspace
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Workspace Sync
|
|
7
|
-
|
|
8
|
-
Pull latest changes for all repos in a workspace.
|
|
9
|
-
|
|
10
|
-
## Running
|
|
11
|
-
|
|
12
6
|
```bash
|
|
13
7
|
nemus sync <workspace-name>
|
|
14
8
|
```
|
|
@@ -17,7 +11,3 @@ Or for the current workspace:
|
|
|
17
11
|
```bash
|
|
18
12
|
nemus sync
|
|
19
13
|
```
|
|
20
|
-
|
|
21
|
-
## Presenting Results
|
|
22
|
-
|
|
23
|
-
Report which repos were updated and any that had conflicts or errors.
|
package/src/cli/ai-prompt.ts
CHANGED
|
@@ -186,7 +186,7 @@ function throwExtractionError(
|
|
|
186
186
|
const secs = Math.round(EXTRACTION_TIMEOUT_MS / 1000);
|
|
187
187
|
let msg =
|
|
188
188
|
`${cmd} did not respond within ${secs}s while parsing your request.\n` +
|
|
189
|
-
` This is usually a transient model/provider stall, not a
|
|
189
|
+
` This is usually a transient model/provider stall, not a nemus bug.\n` +
|
|
190
190
|
` • Verify the agent itself responds quickly: time ${testCmd}\n` +
|
|
191
191
|
` • If it's slow, your default model may be heavy (e.g. Opus) or the provider\n` +
|
|
192
192
|
` may be rate-limiting/refreshing credentials. Retry, or switch to a faster model.\n` +
|
package/src/cli/tui.tsx
CHANGED
|
@@ -10,7 +10,7 @@ export const main = async () => {
|
|
|
10
10
|
try {
|
|
11
11
|
logInfo('Interactive TUI mode');
|
|
12
12
|
console.log(colorize('\n╔══════════════════════════════════════════╗', 'cyan'));
|
|
13
|
-
console.log(colorize('║
|
|
13
|
+
console.log(colorize('║ Nemus - Interactive UI ║', 'cyan'));
|
|
14
14
|
console.log(colorize('╚══════════════════════════════════════════╝\n', 'cyan'));
|
|
15
15
|
|
|
16
16
|
const workspaces = await listWorkspaces();
|
|
@@ -20,7 +20,7 @@ export function registerConfigureCommand(parent: Command) {
|
|
|
20
20
|
|
|
21
21
|
async function handleConfigure() {
|
|
22
22
|
console.log('\n' + '='.repeat(60));
|
|
23
|
-
console.log(colorize('
|
|
23
|
+
console.log(colorize('Nemus Configuration', 'bright'));
|
|
24
24
|
console.log('='.repeat(60) + '\n');
|
|
25
25
|
|
|
26
26
|
const current = getUserConfig();
|
|
@@ -56,7 +56,7 @@ async function handleGhqStatus() {
|
|
|
56
56
|
if (showInfo) { displayGhqInfo(); }
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
console.log(colorize('
|
|
59
|
+
console.log(colorize('Nemus Behavior:', 'cyan'));
|
|
60
60
|
console.log(' • Auto-detects ghq installation');
|
|
61
61
|
console.log(' • Uses ghq when available');
|
|
62
62
|
console.log(' • Falls back to git clone if needed');
|
package/src/mcp/install.ts
CHANGED
|
@@ -114,11 +114,11 @@ function installHooksAndSkills() {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
// Install
|
|
117
|
+
// Install nemus skills (MCP + CLI command skills) — always for all active agents
|
|
118
118
|
try {
|
|
119
119
|
installWorkspaceSkills();
|
|
120
120
|
} catch (error) {
|
|
121
|
-
logError('Failed to install
|
|
121
|
+
logError('Failed to install nemus skills');
|
|
122
122
|
if (error instanceof Error) {
|
|
123
123
|
logError(error.message);
|
|
124
124
|
}
|
|
@@ -143,7 +143,7 @@ function installHooksAndSkills() {
|
|
|
143
143
|
|
|
144
144
|
/**
|
|
145
145
|
* Backfill .mcp.json for all existing workspaces that don't have the
|
|
146
|
-
*
|
|
146
|
+
* nemus entry yet.
|
|
147
147
|
*/
|
|
148
148
|
async function backfillMcpJson() {
|
|
149
149
|
const { installMcp } = getUserConfig();
|
|
@@ -265,11 +265,11 @@ async function install() {
|
|
|
265
265
|
|
|
266
266
|
try {
|
|
267
267
|
execSync(
|
|
268
|
-
`claude mcp add
|
|
268
|
+
`claude mcp add nemus -s user -- node "${serverPath}"`,
|
|
269
269
|
{ stdio: 'pipe' }
|
|
270
270
|
);
|
|
271
271
|
logSuccess('MCP server registered globally with Claude Code');
|
|
272
|
-
console.log('\nYou can now use
|
|
272
|
+
console.log('\nYou can now use nemus tools in any Claude Code session.');
|
|
273
273
|
console.log('Try asking: "list my workspaces" or "what\'s the status of my-workspace"');
|
|
274
274
|
} catch (error) {
|
|
275
275
|
const stderr = error instanceof Error && 'stderr' in error
|
|
@@ -341,12 +341,12 @@ async function upgrade() {
|
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
function uninstall() {
|
|
344
|
-
// Remove
|
|
344
|
+
// Remove nemus skills (from all agent directories)
|
|
345
345
|
try {
|
|
346
346
|
uninstallWorkspaceSkills();
|
|
347
347
|
logSuccess('Workspace-manager skills removed from all agents');
|
|
348
348
|
} catch (error) {
|
|
349
|
-
logError('Failed to remove
|
|
349
|
+
logError('Failed to remove nemus skills');
|
|
350
350
|
if (error instanceof Error) {
|
|
351
351
|
logError(error.message);
|
|
352
352
|
}
|
|
@@ -384,7 +384,7 @@ function uninstall() {
|
|
|
384
384
|
// Unregister MCP from Claude (if available)
|
|
385
385
|
if (isAgentCliAvailable('claude')) {
|
|
386
386
|
try {
|
|
387
|
-
execSync('claude mcp remove
|
|
387
|
+
execSync('claude mcp remove nemus -s user', { stdio: 'inherit' });
|
|
388
388
|
logSuccess('MCP server unregistered from Claude Code');
|
|
389
389
|
} catch (error) {
|
|
390
390
|
logError('Failed to unregister MCP server');
|
|
@@ -427,10 +427,10 @@ function status() {
|
|
|
427
427
|
if (agent.supportsMcp) {
|
|
428
428
|
try {
|
|
429
429
|
const output = execSync('claude mcp list', { encoding: 'utf-8' });
|
|
430
|
-
const isRegistered = output.includes('
|
|
430
|
+
const isRegistered = output.includes('nemus');
|
|
431
431
|
if (isRegistered) {
|
|
432
432
|
logSuccess(' MCP server registered');
|
|
433
|
-
const lines = output.split('\n').filter(l => l.includes('
|
|
433
|
+
const lines = output.split('\n').filter(l => l.includes('nemus'));
|
|
434
434
|
if (lines.length > 0) {
|
|
435
435
|
console.log(` ${lines[0].trim()}`);
|
|
436
436
|
}
|
|
@@ -473,7 +473,7 @@ function syncPermissions() {
|
|
|
473
473
|
}
|
|
474
474
|
|
|
475
475
|
function updateSkills() {
|
|
476
|
-
logInfo('Updating
|
|
476
|
+
logInfo('Updating nemus skills...');
|
|
477
477
|
try {
|
|
478
478
|
installWorkspaceSkills();
|
|
479
479
|
} catch (error) {
|
|
@@ -512,7 +512,7 @@ export async function main(subCommandArg?: string) {
|
|
|
512
512
|
MCP Integration
|
|
513
513
|
|
|
514
514
|
Usage:
|
|
515
|
-
w mcp install Register
|
|
515
|
+
w mcp install Register nemus MCP server with Claude Code
|
|
516
516
|
w mcp uninstall Unregister the MCP server
|
|
517
517
|
w mcp upgrade Update hooks and skills without re-registering the MCP server
|
|
518
518
|
w mcp update-skills Update only the Claude Code skills (faster than full upgrade)
|
package/src/mcp/server.ts
CHANGED
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
import { getPackageVersion } from '../utils/config';
|
|
47
47
|
|
|
48
48
|
const server = new McpServer({
|
|
49
|
-
name: '
|
|
49
|
+
name: 'nemus',
|
|
50
50
|
version: getPackageVersion(),
|
|
51
51
|
});
|
|
52
52
|
|
|
@@ -570,7 +570,7 @@ server.tool(
|
|
|
570
570
|
async function main() {
|
|
571
571
|
const transport = new StdioServerTransport();
|
|
572
572
|
await server.connect(transport);
|
|
573
|
-
process.stderr.write('
|
|
573
|
+
process.stderr.write('nemus MCP server started\n');
|
|
574
574
|
}
|
|
575
575
|
|
|
576
576
|
main().catch((error) => {
|
|
@@ -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
|
|
package/src/utils/agent-state.ts
CHANGED
|
@@ -3,7 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import * as os from 'os';
|
|
4
4
|
import { AgentState, DASHBOARD_DEFAULTS } from '../types/dashboard';
|
|
5
5
|
|
|
6
|
-
export const AGENTS_STATE_DIR = path.join(os.homedir(), '.
|
|
6
|
+
export const AGENTS_STATE_DIR = path.join(os.homedir(), '.nemus', 'agents');
|
|
7
7
|
|
|
8
8
|
export function ensureStateDir(): void {
|
|
9
9
|
fs.mkdirSync(AGENTS_STATE_DIR, { recursive: true });
|
package/src/utils/bug-report.ts
CHANGED
|
@@ -165,7 +165,7 @@ export function buildIssueBody(err: CapturedError, env: BugReportEnv): string {
|
|
|
165
165
|
const sig = errorSignature(err.message, err.stack);
|
|
166
166
|
const stack = err.stack ? sanitize(err.stack).slice(0, 4000) : '(no stack captured)';
|
|
167
167
|
return [
|
|
168
|
-
`**Auto-reported by
|
|
168
|
+
`**Auto-reported by nemus.**`,
|
|
169
169
|
``,
|
|
170
170
|
`**Signature:** \`${sig}\``,
|
|
171
171
|
`**Command:** \`${sanitize(err.command)}\``,
|
|
@@ -184,7 +184,7 @@ export function buildIssueBody(err: CapturedError, env: BugReportEnv): string {
|
|
|
184
184
|
`### Environment`,
|
|
185
185
|
`| | |`,
|
|
186
186
|
`|---|---|`,
|
|
187
|
-
`|
|
|
187
|
+
`| nemus | ${env.version} |`,
|
|
188
188
|
`| node | ${env.node} |`,
|
|
189
189
|
`| os | ${env.os} |`,
|
|
190
190
|
`| arch | ${env.arch} |`,
|
|
@@ -261,7 +261,7 @@ function ensureLabel(): void {
|
|
|
261
261
|
'label', 'create', BUG_LABEL,
|
|
262
262
|
'--repo', BUG_REPORT_REPO,
|
|
263
263
|
'--color', 'B60205',
|
|
264
|
-
'--description', 'Auto-reported by
|
|
264
|
+
'--description', 'Auto-reported by nemus',
|
|
265
265
|
], { encoding: 'utf-8', timeout: 15_000, stdio: 'ignore' });
|
|
266
266
|
} catch {
|
|
267
267
|
/* may already exist or no perms — ignore */
|
|
@@ -112,7 +112,7 @@ export async function backfillAgentRules(workspacePath: string, workspaceName: s
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
export async function loadClaudeConfig(): Promise<ClaudeConfig> {
|
|
115
|
-
const configFile = path.join(process.env.HOME || '~', '.
|
|
115
|
+
const configFile = path.join(process.env.HOME || '~', '.nemus-claude-config.json');
|
|
116
116
|
|
|
117
117
|
try {
|
|
118
118
|
const content = await fs.readFile(configFile, 'utf-8');
|
|
@@ -126,7 +126,7 @@ export async function loadClaudeConfig(): Promise<ClaudeConfig> {
|
|
|
126
126
|
* Save Claude integration config
|
|
127
127
|
*/
|
|
128
128
|
export async function saveClaudeConfig(config: ClaudeConfig): Promise<void> {
|
|
129
|
-
const configFile = path.join(process.env.HOME || '~', '.
|
|
129
|
+
const configFile = path.join(process.env.HOME || '~', '.nemus-claude-config.json');
|
|
130
130
|
|
|
131
131
|
try {
|
|
132
132
|
await fs.writeFile(configFile, JSON.stringify(config, null, 2), 'utf-8');
|
|
@@ -184,7 +184,7 @@ export async function generateClaudeContext(
|
|
|
184
184
|
|
|
185
185
|
let content = `# Workspace: ${workspaceName}
|
|
186
186
|
|
|
187
|
-
This workspace was created with [
|
|
187
|
+
This workspace was created with [Nemus](https://github.com/${githubOrg}/nemus).
|
|
188
188
|
|
|
189
189
|
## Organization
|
|
190
190
|
|
|
@@ -328,7 +328,7 @@ This workspace contains ${entries.length} repositories for focused development w
|
|
|
328
328
|
logSuccess(`Generated ${colorize(fileName, 'cyan')} with workspace context`);
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
-
// Generate .mcp.json with
|
|
331
|
+
// Generate .mcp.json with nemus MCP server (if enabled)
|
|
332
332
|
const { installMcp } = getUserConfig();
|
|
333
333
|
if (installMcp) {
|
|
334
334
|
await generateMcpConfig(workspacePath);
|
|
@@ -408,9 +408,9 @@ function resolveMcpServerPath(): string | null {
|
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/**
|
|
411
|
-
* Generate .mcp.json with
|
|
411
|
+
* Generate .mcp.json with nemus MCP server config.
|
|
412
412
|
* This ensures Claude Code sessions in the workspace have access to
|
|
413
|
-
*
|
|
413
|
+
* nemus tools even without global MCP registration.
|
|
414
414
|
*/
|
|
415
415
|
export async function generateMcpConfig(workspacePath: string): Promise<boolean> {
|
|
416
416
|
try {
|
|
@@ -434,7 +434,7 @@ export async function generateMcpConfig(workspacePath: string): Promise<boolean>
|
|
|
434
434
|
...existingConfig,
|
|
435
435
|
mcpServers: {
|
|
436
436
|
...(existingConfig.mcpServers || {}),
|
|
437
|
-
'
|
|
437
|
+
'nemus': {
|
|
438
438
|
command: 'node',
|
|
439
439
|
args: [serverPath],
|
|
440
440
|
},
|
|
@@ -442,7 +442,7 @@ export async function generateMcpConfig(workspacePath: string): Promise<boolean>
|
|
|
442
442
|
};
|
|
443
443
|
|
|
444
444
|
await fs.writeFile(mcpFile, JSON.stringify(mcpConfig, null, 2) + '\n', 'utf-8');
|
|
445
|
-
logSuccess(`Generated ${colorize('.mcp.json', 'cyan')} with
|
|
445
|
+
logSuccess(`Generated ${colorize('.mcp.json', 'cyan')} with nemus MCP server`);
|
|
446
446
|
return true;
|
|
447
447
|
} catch (error) {
|
|
448
448
|
logWarning('Failed to generate .mcp.json file');
|
|
@@ -21,7 +21,7 @@ describe('isReusablePermission', () => {
|
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('keeps mcp tool permissions', () => {
|
|
24
|
-
expect(isReusablePermission('
|
|
24
|
+
expect(isReusablePermission('mcp__nemus__list-workspaces')).toBe(true);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
it('keeps Skill and WebFetch permissions', () => {
|
|
@@ -480,7 +480,7 @@ describe('uninstallWorkspaceSkills', () => {
|
|
|
480
480
|
expect(() => uninstallWorkspaceSkills(targetDir)).not.toThrow();
|
|
481
481
|
});
|
|
482
482
|
|
|
483
|
-
it('does not remove non-
|
|
483
|
+
it('does not remove non-nemus skills', () => {
|
|
484
484
|
const targetDir = path.join(tmpDir, 'skills');
|
|
485
485
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
486
486
|
|
|
@@ -520,7 +520,7 @@ describe('repairStaleHooks', () => {
|
|
|
520
520
|
expect(repairStaleHooks(missing)).toBe(0);
|
|
521
521
|
});
|
|
522
522
|
|
|
523
|
-
it('returns 0 when there are no
|
|
523
|
+
it('returns 0 when there are no nemus hooks', () => {
|
|
524
524
|
const settingsPath = path.join(tmpDir, 'settings.json');
|
|
525
525
|
fs.writeFileSync(settingsPath, JSON.stringify({
|
|
526
526
|
hooks: { Stop: [{ hooks: [{ type: 'command', command: 'echo hi' }] }] },
|
|
@@ -544,7 +544,7 @@ describe('repairStaleHooks', () => {
|
|
|
544
544
|
Stop: [{
|
|
545
545
|
hooks: [{
|
|
546
546
|
type: 'command',
|
|
547
|
-
command: 'bash "/Users/x/.volta/tmp/image/packages/.tmpABC/lib/node_modules/@acme/
|
|
547
|
+
command: 'bash "/Users/x/.volta/tmp/image/packages/.tmpABC/lib/node_modules/@acme/nemus/sync-permissions.sh"',
|
|
548
548
|
}],
|
|
549
549
|
}],
|
|
550
550
|
},
|