theslopmachine 0.3.0 → 0.3.2
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/MANUAL.md +5 -5
- package/README.md +4 -4
- package/RELEASE.md +4 -4
- package/package.json +23 -23
- package/src/cli.js +3 -3
- package/src/init.js +8 -3
- package/src/install.js +40 -8
package/MANUAL.md
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
#
|
|
1
|
+
# theslopmachine manual
|
|
2
2
|
|
|
3
3
|
## What it is
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
theslopmachine installs a workflow-owner agent, a developer agent, and the supporting skills/templates needed to run the delivery workflow inside OpenCode.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
9
|
Run:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
slopmachine
|
|
12
|
+
slopmachine setup
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
This installs:
|
|
16
16
|
|
|
17
17
|
- agents into `~/.config/opencode/agents/`
|
|
18
18
|
- skills into `~/.agents/skills/`
|
|
19
|
-
-
|
|
19
|
+
- theslopmachine-owned files into `~/slopmachine/`
|
|
20
20
|
- merged plugin/MCP config into `~/.config/opencode/opencode.json`
|
|
21
21
|
|
|
22
22
|
## Start a project
|
|
@@ -58,6 +58,6 @@ slopmachine init -o
|
|
|
58
58
|
|
|
59
59
|
## Important notes
|
|
60
60
|
|
|
61
|
-
-
|
|
61
|
+
- theslopmachine depends on OpenCode, Beads, git, python3, and Docker being available.
|
|
62
62
|
- The workflow-owner agent uses mandatory skills for specific phases; skipping them is considered a workflow failure.
|
|
63
63
|
- Submission packaging collects the final docs, reports, screenshots, session export, trajectory, and cleaned repo into the required final structure.
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# theslopmachine 0.3
|
|
2
2
|
|
|
3
|
-
Installer package for the
|
|
3
|
+
Installer package for the theslopmachine workflow owner, developer agent, required skills, templates, and local support files.
|
|
4
4
|
|
|
5
5
|
## Planned commands
|
|
6
6
|
|
|
7
|
-
- `slopmachine
|
|
7
|
+
- `slopmachine setup`
|
|
8
8
|
- `slopmachine init`
|
|
9
9
|
- `slopmachine init -o` to bootstrap the project and immediately open OpenCode inside `repo/`
|
|
10
10
|
|
|
@@ -20,4 +20,4 @@ See `MANUAL.md` for a short usage guide and workflow summary.
|
|
|
20
20
|
|
|
21
21
|
## Status
|
|
22
22
|
|
|
23
|
-
This package workspace is being built from the current local
|
|
23
|
+
This package workspace is being built from the current local theslopmachine setup without modifying the live installation on this machine.
|
package/RELEASE.md
CHANGED
|
@@ -11,7 +11,7 @@ node ./bin/slopmachine.js --help
|
|
|
11
11
|
2. Test install into an isolated fake home:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
SLOPMACHINE_HOME="$(pwd)/.tmp-home" SLOPMACHINE_NONINTERACTIVE=1 SLOPMACHINE_PLUGIN_BOOTSTRAP=0 node ./bin/slopmachine.js
|
|
14
|
+
SLOPMACHINE_HOME="$(pwd)/.tmp-home" SLOPMACHINE_NONINTERACTIVE=1 SLOPMACHINE_PLUGIN_BOOTSTRAP=0 node ./bin/slopmachine.js setup
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
3. Test init into an isolated temp project:
|
|
@@ -41,13 +41,13 @@ npm pack
|
|
|
41
41
|
This should produce a tarball such as:
|
|
42
42
|
|
|
43
43
|
```bash
|
|
44
|
-
|
|
44
|
+
theslopmachine-0.3.0.tgz
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
## Inspect package contents
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
tar -tzf
|
|
50
|
+
tar -tzf theslopmachine-0.3.0.tgz
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Check that the tarball includes:
|
|
@@ -77,5 +77,5 @@ npm publish --dry-run
|
|
|
77
77
|
## Versioning
|
|
78
78
|
|
|
79
79
|
- bump `package.json` version before each release
|
|
80
|
-
- keep the
|
|
80
|
+
- keep the CLI command as `slopmachine`
|
|
81
81
|
- keep the npm package name as `slopmachine`
|
package/package.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
2
|
+
"name": "theslopmachine",
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"description": "SlopMachine installer and project bootstrap CLI",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"slopmachine": "bin/slopmachine.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"start": "node ./bin/slopmachine.js",
|
|
12
|
+
"check": "node ./bin/slopmachine.js --help"
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=18"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"bin",
|
|
19
|
+
"src",
|
|
20
|
+
"assets",
|
|
21
|
+
"README.md",
|
|
22
|
+
"RELEASE.md",
|
|
23
|
+
"MANUAL.md"
|
|
24
|
+
]
|
|
25
25
|
}
|
package/src/cli.js
CHANGED
|
@@ -2,10 +2,10 @@ import { runInit } from './init.js'
|
|
|
2
2
|
import { runInstall } from './install.js'
|
|
3
3
|
|
|
4
4
|
function printHelp() {
|
|
5
|
-
console.log(`
|
|
5
|
+
console.log(`theslopmachine 0.3
|
|
6
6
|
|
|
7
7
|
Commands:
|
|
8
|
-
|
|
8
|
+
setup Configure theslopmachine in the local user environment
|
|
9
9
|
init Run the packaged init script in the current directory (-o opens OpenCode in repo/)
|
|
10
10
|
help Show this help text`)
|
|
11
11
|
}
|
|
@@ -18,7 +18,7 @@ export async function runCli(args) {
|
|
|
18
18
|
return
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
if (command === 'install') {
|
|
21
|
+
if (command === 'setup' || command === 'install') {
|
|
22
22
|
await runInstall()
|
|
23
23
|
return
|
|
24
24
|
}
|
package/src/init.js
CHANGED
|
@@ -2,7 +2,7 @@ import fs from 'node:fs/promises'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
import { buildPaths } from './constants.js'
|
|
5
|
-
import { ensureDir, log, pathExists, runCommand } from './utils.js'
|
|
5
|
+
import { commandExists, ensureDir, log, pathExists, runCommand, warn } from './utils.js'
|
|
6
6
|
|
|
7
7
|
const GITIGNORE_ENTRIES = [
|
|
8
8
|
'.DS_Store',
|
|
@@ -46,11 +46,11 @@ async function assertRequiredFiles(paths) {
|
|
|
46
46
|
const agentsTemplate = path.join(paths.slopmachineDir, 'templates', 'AGENTS.md')
|
|
47
47
|
|
|
48
48
|
if (!(await pathExists(beadsScript))) {
|
|
49
|
-
throw new Error(`Missing packaged Beads init script at ${beadsScript}. Run slopmachine
|
|
49
|
+
throw new Error(`Missing packaged Beads init script at ${beadsScript}. Run slopmachine setup first.`)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
if (!(await pathExists(agentsTemplate))) {
|
|
53
|
-
throw new Error(`Missing packaged AGENTS template at ${agentsTemplate}. Run slopmachine
|
|
53
|
+
throw new Error(`Missing packaged AGENTS template at ${agentsTemplate}. Run slopmachine setup first.`)
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
return { beadsScript, agentsTemplate }
|
|
@@ -145,6 +145,11 @@ async function maybeOpenOpencode(targetPath, openAfterInit) {
|
|
|
145
145
|
return
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
+
if (!(await commandExists('opencode'))) {
|
|
149
|
+
warn('OpenCode is not available in PATH, so the project was initialized but could not be opened automatically. Launch OpenCode manually inside repo/.')
|
|
150
|
+
return
|
|
151
|
+
}
|
|
152
|
+
|
|
148
153
|
log('Opening OpenCode in repo/')
|
|
149
154
|
const result = await runCommand('opencode', [], {
|
|
150
155
|
stdio: 'inherit',
|
package/src/install.js
CHANGED
|
@@ -39,6 +39,27 @@ async function getCommandVersion(command, args = ['--version']) {
|
|
|
39
39
|
return (result.stdout || result.stderr).trim()
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
async function getPythonVersion() {
|
|
43
|
+
const python3Version = await getCommandVersion('python3')
|
|
44
|
+
if (python3Version) {
|
|
45
|
+
return { command: 'python3', version: python3Version }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const pythonVersion = await getCommandVersion('python')
|
|
49
|
+
if (pythonVersion) {
|
|
50
|
+
return { command: 'python', version: pythonVersion }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (process.platform === 'win32' && await commandExists('py')) {
|
|
54
|
+
const result = await runCommand('py', ['-3', '--version'])
|
|
55
|
+
if (result.code === 0) {
|
|
56
|
+
return { command: 'py -3', version: (result.stdout || result.stderr).trim() }
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return null
|
|
61
|
+
}
|
|
62
|
+
|
|
42
63
|
async function detectPackageManagers() {
|
|
43
64
|
return {
|
|
44
65
|
brew: await commandExists('brew'),
|
|
@@ -102,6 +123,17 @@ async function tryInstallCoreDependency(name) {
|
|
|
102
123
|
}
|
|
103
124
|
|
|
104
125
|
async function ensureDependency({ name, checkCommand, requiredVersion, installable }) {
|
|
126
|
+
if (name === 'python3') {
|
|
127
|
+
const python = await getPythonVersion()
|
|
128
|
+
if (python) {
|
|
129
|
+
log(`${name} detected via ${python.command}: ${python.version}`)
|
|
130
|
+
if (requiredVersion && !python.version.includes(requiredVersion)) {
|
|
131
|
+
warn(`${name} version differs from tested reference ${requiredVersion}`)
|
|
132
|
+
}
|
|
133
|
+
return
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
105
137
|
const version = await getCommandVersion(checkCommand)
|
|
106
138
|
if (version) {
|
|
107
139
|
log(`${name} detected: ${version}`)
|
|
@@ -119,7 +151,7 @@ async function ensureDependency({ name, checkCommand, requiredVersion, installab
|
|
|
119
151
|
|
|
120
152
|
const shouldInstall = await promptYesNo(`Attempt to install ${name} automatically?`, true)
|
|
121
153
|
if (!shouldInstall) {
|
|
122
|
-
|
|
154
|
+
warn(`Skipping ${name} installation. Please install it manually before using theslopmachine.`)
|
|
123
155
|
return
|
|
124
156
|
}
|
|
125
157
|
|
|
@@ -133,7 +165,7 @@ async function checkDocker() {
|
|
|
133
165
|
const dockerVersion = await getCommandVersion('docker')
|
|
134
166
|
const composeVersion = await getCommandVersion('docker', ['compose', 'version'])
|
|
135
167
|
if (!dockerVersion || !composeVersion) {
|
|
136
|
-
warn('Docker and Docker Compose are required for
|
|
168
|
+
warn('Docker and Docker Compose are required for theslopmachine workflows. Please install Docker Desktop or the Docker Engine + Compose plugin and start Docker.')
|
|
137
169
|
return
|
|
138
170
|
}
|
|
139
171
|
log(`docker detected: ${dockerVersion}`)
|
|
@@ -141,7 +173,7 @@ async function checkDocker() {
|
|
|
141
173
|
|
|
142
174
|
const info = await runCommand('docker', ['info'])
|
|
143
175
|
if (info.code !== 0) {
|
|
144
|
-
warn('Docker is installed but does not appear to be running. Start Docker before using
|
|
176
|
+
warn('Docker is installed but does not appear to be running. Start Docker before using theslopmachine.')
|
|
145
177
|
}
|
|
146
178
|
}
|
|
147
179
|
|
|
@@ -294,7 +326,7 @@ async function collectApiKeys() {
|
|
|
294
326
|
|
|
295
327
|
export async function runInstall() {
|
|
296
328
|
const paths = buildPaths()
|
|
297
|
-
log(`
|
|
329
|
+
log(`Configuring theslopmachine in ${paths.home}`)
|
|
298
330
|
|
|
299
331
|
await ensureDependency({ name: 'git', checkCommand: 'git', installable: true })
|
|
300
332
|
await ensureDependency({ name: 'python3', checkCommand: 'python3', installable: true })
|
|
@@ -311,8 +343,8 @@ export async function runInstall() {
|
|
|
311
343
|
const keys = await collectApiKeys()
|
|
312
344
|
await mergeOpencodeConfig(paths, keys)
|
|
313
345
|
|
|
314
|
-
log('
|
|
315
|
-
console.log('\
|
|
346
|
+
log('Setup phase completed.')
|
|
347
|
+
console.log('\ntheslopmachine setup summary')
|
|
316
348
|
console.log(`- Agents installed: ${agentSummary.installed.length}`)
|
|
317
349
|
console.log(`- Agents skipped: ${agentSummary.skipped.length}`)
|
|
318
350
|
console.log(`- Skills installed: ${skillSummary.installed.length}`)
|
|
@@ -325,6 +357,6 @@ export async function runInstall() {
|
|
|
325
357
|
console.log(`- OpenCode config: ${paths.opencodeConfigPath}`)
|
|
326
358
|
console.log('\nNext steps')
|
|
327
359
|
console.log('- Review any warnings above for skipped files or missing external dependencies.')
|
|
328
|
-
console.log('- If Docker was reported as stopped, start Docker before using
|
|
329
|
-
console.log('- Run `slopmachine init` inside a project directory to bootstrap a new
|
|
360
|
+
console.log('- If Docker was reported as stopped, start Docker before using theslopmachine on a real project.')
|
|
361
|
+
console.log('- Run `slopmachine init` inside a project directory to bootstrap a new theslopmachine workspace.')
|
|
330
362
|
}
|