super-opencode 1.1.2 ā 1.2.0
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/.opencode/agents/architect.md +54 -31
- package/.opencode/agents/backend.md +61 -34
- package/.opencode/agents/data-agent.md +422 -0
- package/.opencode/agents/devops-agent.md +331 -0
- package/.opencode/agents/frontend.md +63 -36
- package/.opencode/agents/mobile-agent.md +636 -0
- package/.opencode/agents/optimizer.md +25 -18
- package/.opencode/agents/pm-agent.md +114 -50
- package/.opencode/agents/quality.md +36 -29
- package/.opencode/agents/researcher.md +30 -21
- package/.opencode/agents/reviewer.md +39 -32
- package/.opencode/agents/security.md +42 -34
- package/.opencode/agents/writer.md +42 -31
- package/.opencode/commands/soc-analyze.md +55 -31
- package/.opencode/commands/soc-brainstorm.md +48 -26
- package/.opencode/commands/soc-cleanup.md +47 -25
- package/.opencode/commands/soc-deploy.md +271 -0
- package/.opencode/commands/soc-design.md +51 -26
- package/.opencode/commands/soc-explain.md +46 -23
- package/.opencode/commands/soc-git.md +47 -25
- package/.opencode/commands/soc-help.md +35 -14
- package/.opencode/commands/soc-implement.md +59 -29
- package/.opencode/commands/soc-improve.md +42 -20
- package/.opencode/commands/soc-onboard.md +329 -0
- package/.opencode/commands/soc-plan.md +215 -0
- package/.opencode/commands/soc-pm.md +40 -18
- package/.opencode/commands/soc-research.md +43 -20
- package/.opencode/commands/soc-review.md +39 -18
- package/.opencode/commands/soc-test.md +43 -21
- package/.opencode/commands/soc-validate.md +221 -0
- package/.opencode/commands/soc-workflow.md +38 -17
- package/.opencode/skills/confidence-check/SKILL.md +26 -19
- package/.opencode/skills/debug-protocol/SKILL.md +27 -17
- package/.opencode/skills/decision-log/SKILL.md +236 -0
- package/.opencode/skills/doc-sync/SKILL.md +345 -0
- package/.opencode/skills/package-manager/SKILL.md +502 -0
- package/.opencode/skills/package-manager/scripts/README.md +106 -0
- package/.opencode/skills/package-manager/scripts/detect-package-manager.sh +796 -0
- package/.opencode/skills/reflexion/SKILL.md +18 -11
- package/.opencode/skills/security-audit/SKILL.md +19 -14
- package/.opencode/skills/self-check/SKILL.md +30 -14
- package/.opencode/skills/simplification/SKILL.md +19 -5
- package/.opencode/skills/tech-debt/SKILL.md +245 -0
- package/LICENSE +1 -1
- package/README.md +126 -9
- package/dist/cli.js +143 -41
- package/package.json +27 -12
- package/.opencode/settings.json +0 -3
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Super-OpenCode provides a structured framework for AI-assisted software developm
|
|
|
16
16
|
|
|
17
17
|
### Prerequisites
|
|
18
18
|
|
|
19
|
-
- Node.js 18+
|
|
19
|
+
- Node.js 18+
|
|
20
20
|
- npm, pnpm, or yarn
|
|
21
21
|
|
|
22
22
|
### Quick Install
|
|
@@ -32,6 +32,7 @@ super-opencode
|
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
The installer will guide you through:
|
|
35
|
+
|
|
35
36
|
1. Choosing installation scope (global or project)
|
|
36
37
|
2. Selecting components to install (agents, commands, skills, core)
|
|
37
38
|
3. Configuring optional MCP servers (Context7, Serena, Tavily, etc.)
|
|
@@ -39,8 +40,15 @@ The installer will guide you through:
|
|
|
39
40
|
### Manual Install
|
|
40
41
|
|
|
41
42
|
After npm install, the framework files will be available at:
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
**Global Installation:**
|
|
45
|
+
|
|
46
|
+
- **Linux/macOS**: `~/.config/opencode/`
|
|
47
|
+
- **Windows**: `%APPDATA%\opencode\`
|
|
48
|
+
|
|
49
|
+
**Project Installation:**
|
|
50
|
+
|
|
51
|
+
- **All Platforms**: Files are copied to the current working directory under `.opencode/` and `AGENTS.md`
|
|
44
52
|
|
|
45
53
|
## Features
|
|
46
54
|
|
|
@@ -71,6 +79,7 @@ Reusable capabilities that agents can invoke:
|
|
|
71
79
|
- **reflexion**: Post-action analysis and learning
|
|
72
80
|
- **debug-protocol**: Root cause analysis workflow
|
|
73
81
|
- **simplification**: Complexity reduction
|
|
82
|
+
- **package-manager**: Multi-language package manager detection (npm, yarn, pnpm, poetry, cargo, and 40+ more)
|
|
74
83
|
|
|
75
84
|
### Slash Commands
|
|
76
85
|
|
|
@@ -91,11 +100,62 @@ Pre-built workflows for common tasks:
|
|
|
91
100
|
- `/soc-improve` - Continuous improvement
|
|
92
101
|
- `/soc-help` - Help and documentation
|
|
93
102
|
|
|
103
|
+
### Package Manager Detection
|
|
104
|
+
|
|
105
|
+
Super-OpenCode includes a powerful multi-language package manager detection system that automatically identifies the correct package manager for any project:
|
|
106
|
+
|
|
107
|
+
**Supported Languages:** JavaScript/TypeScript, Python, Go, Rust, Java, Ruby, PHP, .NET, Elixir, Haskell, C/C++, Swift, Scala, Clojure, Julia, R
|
|
108
|
+
|
|
109
|
+
**Quick Usage:**
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# After installing super-opencode
|
|
113
|
+
detect-pm
|
|
114
|
+
|
|
115
|
+
# Or use directly from node_modules
|
|
116
|
+
npx super-opencode detect-pm
|
|
117
|
+
|
|
118
|
+
# Get JSON output for CI/CD
|
|
119
|
+
detect-pm --json
|
|
120
|
+
|
|
121
|
+
# Detect specific language
|
|
122
|
+
detect-pm python
|
|
123
|
+
detect-pm javascript
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Example Output:**
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"languages": [
|
|
131
|
+
{
|
|
132
|
+
"language": "javascript",
|
|
133
|
+
"package_manager": "pnpm",
|
|
134
|
+
"confidence": 95,
|
|
135
|
+
"commands": {
|
|
136
|
+
"install": "pnpm install --frozen-lockfile",
|
|
137
|
+
"add": "pnpm add"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**CI/CD Integration:**
|
|
145
|
+
|
|
146
|
+
```yaml
|
|
147
|
+
- name: Detect Package Manager
|
|
148
|
+
run: |
|
|
149
|
+
PM=$(npx detect-pm --recommend)
|
|
150
|
+
$PM install
|
|
151
|
+
```
|
|
152
|
+
|
|
94
153
|
### MCP Server Integration
|
|
95
154
|
|
|
96
155
|
The framework supports configuration of various MCP servers:
|
|
97
156
|
|
|
98
157
|
**Recommended (Core)**:
|
|
158
|
+
|
|
99
159
|
- Context7 - Official documentation lookup
|
|
100
160
|
- Serena - Codebase analysis and navigation
|
|
101
161
|
- Tavily Search - Web search for research
|
|
@@ -103,6 +163,7 @@ The framework supports configuration of various MCP servers:
|
|
|
103
163
|
- Sequential Thinking - Multi-step reasoning
|
|
104
164
|
|
|
105
165
|
**Optional**:
|
|
166
|
+
|
|
106
167
|
- GitHub - GitHub API integration
|
|
107
168
|
- SQLite - Database operations
|
|
108
169
|
- Chrome DevTools - Browser debugging
|
|
@@ -146,21 +207,25 @@ super-opencode/
|
|
|
146
207
|
### Example Workflows
|
|
147
208
|
|
|
148
209
|
#### Implement a Feature
|
|
210
|
+
|
|
149
211
|
```bash
|
|
150
212
|
/soc-implement "User Authentication" --agent backend
|
|
151
213
|
```
|
|
152
214
|
|
|
153
215
|
#### Design a System
|
|
216
|
+
|
|
154
217
|
```bash
|
|
155
218
|
/soc-design "Microservices Architecture"
|
|
156
219
|
```
|
|
157
220
|
|
|
158
221
|
#### Code Review
|
|
222
|
+
|
|
159
223
|
```bash
|
|
160
224
|
/soc-review
|
|
161
225
|
```
|
|
162
226
|
|
|
163
227
|
#### Research
|
|
228
|
+
|
|
164
229
|
```bash
|
|
165
230
|
/soc-research "Best practices for React state management"
|
|
166
231
|
```
|
|
@@ -170,25 +235,30 @@ super-opencode/
|
|
|
170
235
|
Super-OpenCode enforces a structured development approach:
|
|
171
236
|
|
|
172
237
|
### 1. Evidence-Based Development
|
|
238
|
+
|
|
173
239
|
- Always verify with official sources
|
|
174
240
|
- Use context7 MCP for documentation lookup
|
|
175
241
|
- Check existing code before implementing
|
|
176
242
|
- Never guess or make assumptions
|
|
177
243
|
|
|
178
244
|
### 2. Confidence-First Implementation
|
|
245
|
+
|
|
179
246
|
- Check confidence before starting work
|
|
180
247
|
- **ā„90%**: Proceed with implementation
|
|
181
248
|
- **70-89%**: Investigate more, present alternatives
|
|
182
249
|
- **<70%**: STOP - ask questions, gather context
|
|
183
250
|
|
|
184
251
|
### 3. Parallel-First Execution
|
|
252
|
+
|
|
185
253
|
- Use Wave ā Checkpoint ā Wave pattern
|
|
186
254
|
- Batch read operations together
|
|
187
255
|
- Analyze together before editing
|
|
188
256
|
- 3.5x faster than sequential execution
|
|
189
257
|
|
|
190
258
|
### 4. Self-Correction Protocol
|
|
259
|
+
|
|
191
260
|
When errors occur:
|
|
261
|
+
|
|
192
262
|
1. STOP - Don't retry immediately
|
|
193
263
|
2. INVESTIGATE - Research root cause
|
|
194
264
|
3. HYPOTHESIZE - Form theory with evidence
|
|
@@ -200,44 +270,91 @@ When errors occur:
|
|
|
200
270
|
|
|
201
271
|
### OpenCode Configuration
|
|
202
272
|
|
|
203
|
-
After installation, configuration is stored in:
|
|
204
|
-
|
|
205
|
-
|
|
273
|
+
After installation, configuration is stored in platform-specific locations:
|
|
274
|
+
|
|
275
|
+
**Global Configuration:**
|
|
276
|
+
|
|
277
|
+
- **Linux**: `~/.config/opencode/opencode.json` (follows XDG Base Directory Specification)
|
|
278
|
+
- **macOS**: `~/Library/Application Support/opencode/opencode.json`
|
|
279
|
+
- **Windows**: `%APPDATA%\opencode\opencode.json` (typically `C:\Users\<username>\AppData\Roaming\opencode\opencode.json`)
|
|
280
|
+
|
|
281
|
+
**Project Configuration:**
|
|
282
|
+
|
|
283
|
+
- **All Platforms**: `./opencode.json` in your project root
|
|
284
|
+
|
|
285
|
+
**Environment Variables:**
|
|
286
|
+
|
|
287
|
+
- `OPENCODE_CONFIG_DIR`: Override the global config directory
|
|
288
|
+
- `OPENCODE_CONFIG`: Override the full path to the config file
|
|
289
|
+
- `OPENCODE_CONFIG_CONTENT`: Provide inline JSON configuration
|
|
290
|
+
|
|
291
|
+
### Framework Installation Locations
|
|
292
|
+
|
|
293
|
+
When installing Super-OpenCode globally:
|
|
294
|
+
|
|
295
|
+
- **Linux**: `~/.config/opencode/` (follows XDG Base Directory Specification)
|
|
296
|
+
- **macOS**: `~/.config/opencode/` (same as Linux for consistency with OpenCode)
|
|
297
|
+
- **Windows**: `%APPDATA%\opencode\` (typically `C:\Users\<username>\AppData\Roaming\opencode\`)
|
|
298
|
+
|
|
299
|
+
**Note**: Framework files (agents, commands, skills) are stored alongside the OpenCode config file for easy access.
|
|
300
|
+
|
|
301
|
+
**Project Installation:**
|
|
302
|
+
|
|
303
|
+
- **All Platforms**: Current working directory (where you run the installer)
|
|
206
304
|
|
|
207
305
|
### MCP Server Configuration
|
|
208
306
|
|
|
209
|
-
MCP servers are configured in the `mcp` section of your config:
|
|
307
|
+
MCP servers are configured in the `mcp` section of your config. According to the [OpenCode MCP documentation](https://opencode.ai/docs/mcp-servers):
|
|
210
308
|
|
|
211
309
|
```json
|
|
212
310
|
{
|
|
311
|
+
"$schema": "https://opencode.ai/config.json",
|
|
213
312
|
"mcp": {
|
|
214
313
|
"context7": {
|
|
215
314
|
"type": "local",
|
|
216
|
-
"command": ["npx", "-y", "@upstash/context7-mcp"]
|
|
315
|
+
"command": ["npx", "-y", "@upstash/context7-mcp"],
|
|
316
|
+
"enabled": true
|
|
217
317
|
},
|
|
218
318
|
"filesystem": {
|
|
219
319
|
"type": "local",
|
|
220
|
-
"command": [
|
|
320
|
+
"command": [
|
|
321
|
+
"npx",
|
|
322
|
+
"-y",
|
|
323
|
+
"@modelcontextprotocol/server-filesystem",
|
|
324
|
+
"/path/to/project"
|
|
325
|
+
]
|
|
326
|
+
},
|
|
327
|
+
"tavily": {
|
|
328
|
+
"type": "local",
|
|
329
|
+
"command": ["npx", "-y", "tavily-mcp@latest"],
|
|
330
|
+
"environment": {
|
|
331
|
+
"TAVILY_API_KEY": "your-api-key"
|
|
332
|
+
}
|
|
221
333
|
}
|
|
222
334
|
}
|
|
223
335
|
}
|
|
224
336
|
```
|
|
225
337
|
|
|
338
|
+
**Note**: MCP servers can be enabled/disabled per agent by modifying the agent configuration. For more details, see the [official OpenCode MCP docs](https://opencode.ai/docs/mcp-servers).
|
|
339
|
+
|
|
226
340
|
## Quality Standards
|
|
227
341
|
|
|
228
342
|
### Code Quality
|
|
343
|
+
|
|
229
344
|
- All public functions require docstrings
|
|
230
345
|
- Use type hints where supported
|
|
231
346
|
- Follow existing project patterns
|
|
232
347
|
- Include usage examples for complex functions
|
|
233
348
|
|
|
234
349
|
### Documentation Quality
|
|
350
|
+
|
|
235
351
|
- Current with "Last Verified" dates
|
|
236
352
|
- Minimal but necessary information
|
|
237
353
|
- Clear with concrete examples
|
|
238
354
|
- Practical and copy-paste ready
|
|
239
355
|
|
|
240
356
|
### Testing Standards
|
|
357
|
+
|
|
241
358
|
- Write tests for new functionality
|
|
242
359
|
- Aim for >80% code coverage
|
|
243
360
|
- Include edge cases and error conditions
|
package/dist/cli.js
CHANGED
|
@@ -10,26 +10,80 @@ import ora from "ora";
|
|
|
10
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
11
11
|
const __dirname = path.dirname(__filename);
|
|
12
12
|
const FRAMEWORK_DIR = path.join(__dirname, "..");
|
|
13
|
-
const MCP_KEY = "mcp";
|
|
14
|
-
const MCP_SERVERS_KEY = "mcpServers";
|
|
15
|
-
const CONFIG_FILENAME = "opencode.json";
|
|
16
|
-
const FALLBACK_FILENAME = "mcp_settings.json";
|
|
17
13
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
14
|
+
* Get the platform-specific global configuration directory for OpenCode
|
|
15
|
+
* Follows XDG Base Directory Specification on Linux, standard locations on macOS and Windows
|
|
20
16
|
*/
|
|
21
|
-
function
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
//
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
function getGlobalConfigDir() {
|
|
18
|
+
const platform = os.platform();
|
|
19
|
+
const homeDir = os.homedir();
|
|
20
|
+
// Check for OPENCODE_CONFIG_DIR environment variable first
|
|
21
|
+
const envConfigDir = process.env.OPENCODE_CONFIG_DIR;
|
|
22
|
+
if (envConfigDir) {
|
|
23
|
+
return path.resolve(envConfigDir);
|
|
24
|
+
}
|
|
25
|
+
if (platform === "win32") {
|
|
26
|
+
// Windows: %APPDATA%\opencode or %LOCALAPPDATA%\opencode
|
|
27
|
+
const appData = process.env.APPDATA || path.join(homeDir, "AppData", "Roaming");
|
|
28
|
+
return path.join(appData, "opencode");
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// macOS and Linux: use ~/.config/opencode per spec
|
|
32
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME;
|
|
33
|
+
if (xdgConfigHome) {
|
|
34
|
+
return path.join(xdgConfigHome, "opencode");
|
|
35
|
+
}
|
|
36
|
+
// Default: ~/.config/opencode
|
|
37
|
+
return path.join(homeDir, ".config", "opencode");
|
|
30
38
|
}
|
|
31
|
-
return resolvedTarget;
|
|
32
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the framework installation directory
|
|
42
|
+
* Returns the appropriate directory based on installation scope
|
|
43
|
+
*
|
|
44
|
+
* Note: According to OpenCode spec, framework files (agents, skills, commands)
|
|
45
|
+
* should be in ~/.config/opencode/ alongside the opencode.json config file
|
|
46
|
+
*/
|
|
47
|
+
function getFrameworkInstallDir(scope) {
|
|
48
|
+
if (scope === "global") {
|
|
49
|
+
// For global installations, use the config directory (NOT data directory)
|
|
50
|
+
// This places agents/, skills/, commands/ alongside opencode.json
|
|
51
|
+
return getGlobalConfigDir();
|
|
52
|
+
}
|
|
53
|
+
// For project installations, use current working directory
|
|
54
|
+
return process.cwd();
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the path to the opencode.json configuration file
|
|
58
|
+
*/
|
|
59
|
+
function getConfigFilePath(scope, targetDir) {
|
|
60
|
+
if (scope === "global") {
|
|
61
|
+
return path.join(getGlobalConfigDir(), CONFIG_FILENAME);
|
|
62
|
+
}
|
|
63
|
+
return path.join(targetDir, CONFIG_FILENAME);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get the default allowed paths for Filesystem MCP based on platform
|
|
67
|
+
*/
|
|
68
|
+
function getDefaultFilesystemPaths(targetDir) {
|
|
69
|
+
const platform = os.platform();
|
|
70
|
+
const homeDir = os.homedir();
|
|
71
|
+
// Always include the target project directory
|
|
72
|
+
const paths = [targetDir];
|
|
73
|
+
if (platform === "win32") {
|
|
74
|
+
// Windows: include Documents folder and home
|
|
75
|
+
paths.push(path.join(homeDir, "Documents"));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Unix-like: include home directory
|
|
79
|
+
paths.push(homeDir);
|
|
80
|
+
}
|
|
81
|
+
return paths;
|
|
82
|
+
}
|
|
83
|
+
const MCP_KEY = "mcp";
|
|
84
|
+
const MCP_SERVERS_KEY = "mcpServers";
|
|
85
|
+
const CONFIG_FILENAME = "opencode.json";
|
|
86
|
+
const FALLBACK_FILENAME = "mcp_settings.json";
|
|
33
87
|
function sanitizePaths(pathInput) {
|
|
34
88
|
const paths = pathInput
|
|
35
89
|
.split(",")
|
|
@@ -152,8 +206,15 @@ function getMcpServerConfig(serverId, envVars, targetDir) {
|
|
|
152
206
|
return configs[serverId];
|
|
153
207
|
}
|
|
154
208
|
async function copyFile(src, dest, targetDir, overwrite) {
|
|
155
|
-
const srcPath =
|
|
156
|
-
const destPath =
|
|
209
|
+
const srcPath = path.join(FRAMEWORK_DIR, src);
|
|
210
|
+
const destPath = path.join(targetDir, dest);
|
|
211
|
+
// Only validate destination path (user-controlled)
|
|
212
|
+
const resolvedDest = path.resolve(destPath);
|
|
213
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
214
|
+
if (!resolvedDest.startsWith(resolvedTarget + path.sep) &&
|
|
215
|
+
resolvedDest !== resolvedTarget) {
|
|
216
|
+
throw new Error(`Path traversal detected: ${resolvedDest} is outside ${resolvedTarget}`);
|
|
217
|
+
}
|
|
157
218
|
if (await fs.pathExists(srcPath)) {
|
|
158
219
|
try {
|
|
159
220
|
await fs.copy(srcPath, destPath, { overwrite });
|
|
@@ -166,12 +227,17 @@ async function copyFile(src, dest, targetDir, overwrite) {
|
|
|
166
227
|
}
|
|
167
228
|
}
|
|
168
229
|
}
|
|
169
|
-
async function installModules(modules, targetDir, overwrite) {
|
|
230
|
+
async function installModules(modules, targetDir, overwrite, scope) {
|
|
231
|
+
// For global installs, copy directly to targetDir/agents (no .opencode wrapper)
|
|
232
|
+
// For project installs, copy to targetDir/.opencode/agents
|
|
233
|
+
const agentsDest = scope === "global" ? "agents" : ".opencode/agents";
|
|
234
|
+
const commandsDest = scope === "global" ? "commands" : ".opencode/commands";
|
|
235
|
+
const skillsDest = scope === "global" ? "skills" : ".opencode/skills";
|
|
170
236
|
const moduleMap = {
|
|
171
237
|
core: ["README.md", "README.md"],
|
|
172
|
-
agents: [".opencode/agents",
|
|
173
|
-
commands: [".opencode/commands",
|
|
174
|
-
skills: [".opencode/skills",
|
|
238
|
+
agents: [".opencode/agents", agentsDest],
|
|
239
|
+
commands: [".opencode/commands", commandsDest],
|
|
240
|
+
skills: [".opencode/skills", skillsDest],
|
|
175
241
|
};
|
|
176
242
|
for (const module of modules) {
|
|
177
243
|
const [src, dest] = moduleMap[module] || [];
|
|
@@ -181,7 +247,6 @@ async function installModules(modules, targetDir, overwrite) {
|
|
|
181
247
|
await fs.ensureDir(path.join(targetDir, ".opencode"));
|
|
182
248
|
await copyFile("AGENTS.md", "AGENTS.md", targetDir, overwrite);
|
|
183
249
|
await copyFile("LICENSE", "LICENSE", targetDir, overwrite);
|
|
184
|
-
await copyFile(".opencode/settings.json", ".opencode/settings.json", targetDir, overwrite);
|
|
185
250
|
}
|
|
186
251
|
}
|
|
187
252
|
}
|
|
@@ -237,22 +302,43 @@ async function collectEnvVars(serverDef) {
|
|
|
237
302
|
return envVars;
|
|
238
303
|
}
|
|
239
304
|
async function configureFilesystemMcp(targetDir) {
|
|
305
|
+
const defaultPaths = getDefaultFilesystemPaths(targetDir);
|
|
240
306
|
const { allowedPaths: pathsInput } = await inquirer.prompt([
|
|
241
307
|
{
|
|
242
308
|
type: "input",
|
|
243
309
|
name: "allowedPaths",
|
|
244
310
|
message: "Enter absolute paths for Filesystem MCP (comma separated):",
|
|
245
|
-
default:
|
|
311
|
+
default: defaultPaths.join(", "),
|
|
246
312
|
},
|
|
247
313
|
]);
|
|
248
314
|
const sanitizedPaths = sanitizePaths(pathsInput);
|
|
315
|
+
// Validate that paths exist and are accessible
|
|
316
|
+
const validPaths = [];
|
|
317
|
+
for (const p of sanitizedPaths) {
|
|
318
|
+
try {
|
|
319
|
+
const stats = await fs.stat(p);
|
|
320
|
+
if (stats.isDirectory()) {
|
|
321
|
+
validPaths.push(p);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
console.warn(chalk.yellow(`ā ļø Skipping non-directory path: ${p}`));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
console.warn(chalk.yellow(`ā ļø Path does not exist or is not accessible: ${p}`));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (validPaths.length === 0) {
|
|
332
|
+
console.warn(chalk.yellow("ā ļø No valid paths provided. Using target directory only."));
|
|
333
|
+
validPaths.push(targetDir);
|
|
334
|
+
}
|
|
249
335
|
return {
|
|
250
336
|
type: "local",
|
|
251
337
|
command: [
|
|
252
338
|
"npx",
|
|
253
339
|
"-y",
|
|
254
340
|
"@modelcontextprotocol/server-filesystem",
|
|
255
|
-
...
|
|
341
|
+
...validPaths,
|
|
256
342
|
],
|
|
257
343
|
};
|
|
258
344
|
}
|
|
@@ -276,9 +362,7 @@ async function collectMcpServerConfigs(selectedServers, targetDir) {
|
|
|
276
362
|
return mcpServers;
|
|
277
363
|
}
|
|
278
364
|
async function writeMcpConfiguration(mcpServers, scope, targetDir) {
|
|
279
|
-
const configPath = scope
|
|
280
|
-
? path.join(os.homedir(), ".config", "opencode", CONFIG_FILENAME)
|
|
281
|
-
: path.join(targetDir, CONFIG_FILENAME);
|
|
365
|
+
const configPath = getConfigFilePath(scope, targetDir);
|
|
282
366
|
let finalSettings = {};
|
|
283
367
|
let writeTarget = configPath;
|
|
284
368
|
if (scope === "global") {
|
|
@@ -325,26 +409,38 @@ async function handleMcpInstallation(scope, targetDir) {
|
|
|
325
409
|
}
|
|
326
410
|
async function main() {
|
|
327
411
|
console.log(chalk.cyan.bold("\nš Welcome to Super-OpenCode Installer\n"));
|
|
412
|
+
// Show platform info
|
|
413
|
+
const platform = os.platform();
|
|
414
|
+
const homeDir = os.homedir();
|
|
415
|
+
console.log(chalk.gray(`Platform: ${platform} | Home: ${homeDir}\n`));
|
|
416
|
+
// Display installation options info before selection
|
|
417
|
+
console.log(chalk.cyan("š¦ Installation Options:\n"));
|
|
418
|
+
console.log(chalk.white("š Global Install (Recommended)"));
|
|
419
|
+
console.log(chalk.gray(` Framework: ${getGlobalConfigDir()}`));
|
|
420
|
+
console.log(chalk.gray(` Config: ${path.join(getGlobalConfigDir(), "opencode.json")}`));
|
|
421
|
+
console.log(chalk.gray(` Available for all projects\n`));
|
|
422
|
+
console.log(chalk.white("š Project Install (Current Directory)"));
|
|
423
|
+
console.log(chalk.gray(` Framework: ${process.cwd()}`));
|
|
424
|
+
console.log(chalk.gray(` Config: ${path.join(process.cwd(), "opencode.json")}`));
|
|
425
|
+
console.log(chalk.gray(` Project-specific only\n`));
|
|
328
426
|
const scopeAnswer = await inquirer.prompt([
|
|
329
427
|
{
|
|
330
428
|
type: "list",
|
|
331
429
|
name: "scope",
|
|
332
430
|
message: "Where would you like to install Super-OpenCode?",
|
|
333
431
|
choices: [
|
|
334
|
-
{ name: "Global (Recommended
|
|
335
|
-
{ name: "Project (Current Directory)", value: "project" },
|
|
432
|
+
{ name: "š Global (Recommended)", value: "global" },
|
|
433
|
+
{ name: "š Project (Current Directory)", value: "project" },
|
|
336
434
|
],
|
|
337
435
|
default: "global",
|
|
338
436
|
},
|
|
339
437
|
]);
|
|
340
|
-
const targetDir = scopeAnswer.scope
|
|
341
|
-
? path.join(os.homedir(), ".opencode")
|
|
342
|
-
: process.cwd();
|
|
438
|
+
const targetDir = getFrameworkInstallDir(scopeAnswer.scope);
|
|
343
439
|
const questions = [
|
|
344
440
|
{
|
|
345
441
|
type: "confirm",
|
|
346
442
|
name: "proceed",
|
|
347
|
-
message:
|
|
443
|
+
message: `\nš¦ Ready to install to:\n ${chalk.cyan(targetDir)}\n\n ${chalk.gray("This will create:")}\n ${chalk.gray("⢠Framework files (agents, commands, skills)")}\n ${chalk.gray("⢠Configuration file (opencode.json)")}\n\nProceed with installation?`,
|
|
348
444
|
default: true,
|
|
349
445
|
},
|
|
350
446
|
{
|
|
@@ -353,7 +449,7 @@ async function main() {
|
|
|
353
449
|
message: "Select components to install:",
|
|
354
450
|
choices: [
|
|
355
451
|
{
|
|
356
|
-
name: "Core (README, LICENSE, AGENTS.md
|
|
452
|
+
name: "Core (README, LICENSE, AGENTS.md)",
|
|
357
453
|
value: "core",
|
|
358
454
|
checked: true,
|
|
359
455
|
},
|
|
@@ -375,6 +471,7 @@ async function main() {
|
|
|
375
471
|
when: (answers) => answers.proceed,
|
|
376
472
|
},
|
|
377
473
|
];
|
|
474
|
+
// biome-ignore lint/suspicious/noExplicitAny: inquirer types are complex, using any for compatibility
|
|
378
475
|
const answers = await inquirer.prompt(questions);
|
|
379
476
|
if (!answers.proceed) {
|
|
380
477
|
console.log(chalk.yellow("Installation cancelled."));
|
|
@@ -383,19 +480,24 @@ async function main() {
|
|
|
383
480
|
const spinner = ora("Installing Super-OpenCode...").start();
|
|
384
481
|
try {
|
|
385
482
|
const { modules, overwrite } = answers;
|
|
386
|
-
await installModules(modules, targetDir, overwrite);
|
|
483
|
+
await installModules(modules, targetDir, overwrite, scopeAnswer.scope);
|
|
387
484
|
spinner.stop();
|
|
388
485
|
await handleMcpInstallation(scopeAnswer.scope, targetDir);
|
|
389
486
|
spinner.start();
|
|
390
487
|
spinner.succeed(chalk.green("Installation complete!"));
|
|
391
|
-
console.log("\
|
|
488
|
+
console.log(chalk.green.bold("\n⨠Installation Summary\n"));
|
|
489
|
+
console.log(chalk.white(`š¦ Framework: ${chalk.cyan(targetDir)}`));
|
|
490
|
+
console.log(chalk.white(`āļø Config: ${chalk.cyan(getConfigFilePath(scopeAnswer.scope, targetDir))}\n`));
|
|
491
|
+
console.log(chalk.yellow.bold("Next Steps:\n"));
|
|
492
|
+
console.log(chalk.white("1. š Read AGENTS.md for workflow guidelines"));
|
|
493
|
+
console.log(chalk.white("2. š§ Configure MCP servers if needed"));
|
|
494
|
+
console.log(chalk.white("3. š Start using: super-opencode --help\n"));
|
|
392
495
|
if (scopeAnswer.scope === "global") {
|
|
393
|
-
console.log(chalk.
|
|
394
|
-
console.log(chalk.
|
|
496
|
+
console.log(chalk.gray("š” The framework is now available globally"));
|
|
497
|
+
console.log(chalk.gray(" Use 'super-opencode' command from any project\n"));
|
|
395
498
|
}
|
|
396
499
|
else {
|
|
397
|
-
console.log(chalk.
|
|
398
|
-
console.log(chalk.white("2. Configuration updated in ./opencode.json"));
|
|
500
|
+
console.log(chalk.gray("š” The framework is installed in the current project only\n"));
|
|
399
501
|
}
|
|
400
502
|
}
|
|
401
503
|
catch (error) {
|
package/package.json
CHANGED
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "super-opencode",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Multi-language package manager detection and OpenCode agent framework. Auto-detects npm, yarn, pnpm, poetry, cargo, and 40+ package managers across 16 programming languages.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cli.js",
|
|
7
7
|
"bin": {
|
|
8
|
-
"super-opencode": "./dist/cli.js"
|
|
8
|
+
"super-opencode": "./dist/cli.js",
|
|
9
|
+
"detect-pm": "./.opencode/skills/package-manager/scripts/detect-package-manager.sh"
|
|
9
10
|
},
|
|
10
11
|
"files": [
|
|
11
12
|
"dist",
|
|
12
13
|
"AGENTS.md",
|
|
13
14
|
".opencode",
|
|
14
15
|
"README.md",
|
|
15
|
-
"LICENSE"
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"!.opencode/skills/package-manager/scripts/test*"
|
|
16
18
|
],
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
19
|
-
"lint": "biome check src/",
|
|
20
|
-
"format": "biome check --write src/",
|
|
21
|
-
"prepublishOnly": "npm run build",
|
|
22
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
23
|
-
},
|
|
24
19
|
"keywords": [
|
|
25
20
|
"opencode",
|
|
26
21
|
"agent",
|
|
@@ -29,6 +24,17 @@
|
|
|
29
24
|
],
|
|
30
25
|
"author": "lst97",
|
|
31
26
|
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/lst97/super-opencode.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/lst97/super-opencode/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/lst97/super-opencode#readme",
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
32
38
|
"dependencies": {
|
|
33
39
|
"chalk": "^5.6.2",
|
|
34
40
|
"fs-extra": "^11.3.3",
|
|
@@ -41,5 +47,14 @@
|
|
|
41
47
|
"@types/node": "^25.0.10",
|
|
42
48
|
"ts-node": "^10.9.2",
|
|
43
49
|
"typescript": "^5.9.3"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc",
|
|
53
|
+
"lint": "biome check src/",
|
|
54
|
+
"format": "biome check --write src/",
|
|
55
|
+
"validate": "npm run check-files && npm run check-scripts",
|
|
56
|
+
"check-files": "node -e \"console.log('Package files:', require('fs').readdirSync('.'))\"",
|
|
57
|
+
"check-scripts": "bash .opencode/skills/package-manager/scripts/detect-package-manager.sh --help > /dev/null && echo 'ā Package manager detection script works'",
|
|
58
|
+
"test": "echo 'Tests not implemented - validation only' && npm run validate"
|
|
44
59
|
}
|
|
45
|
-
}
|
|
60
|
+
}
|
package/.opencode/settings.json
DELETED