theslopmachine 0.4.0 → 0.4.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 +3 -3
- package/README.md +36 -12
- package/RELEASE.md +9 -7
- package/assets/agents/developer.md +51 -250
- package/assets/agents/slopmachine.md +253 -401
- package/assets/skills/beads-operations/SKILL.md +44 -38
- package/assets/skills/clarification-gate/SKILL.md +79 -14
- package/assets/skills/developer-session-lifecycle/SKILL.md +97 -35
- package/assets/skills/{development-guidance-v2 → development-guidance}/SKILL.md +9 -6
- package/assets/skills/{evaluation-triage-v2 → evaluation-triage}/SKILL.md +43 -4
- package/assets/skills/final-evaluation-orchestration/SKILL.md +44 -40
- package/assets/skills/{hardening-gate-v2 → hardening-gate}/SKILL.md +3 -3
- package/assets/skills/{integrated-verification-v2 → integrated-verification}/SKILL.md +6 -5
- package/assets/skills/{owner-evidence-discipline-v2 → owner-evidence-discipline}/SKILL.md +3 -3
- package/assets/skills/planning-gate/SKILL.md +32 -11
- package/assets/skills/{planning-guidance-v2 → planning-guidance}/SKILL.md +29 -9
- package/assets/skills/{remediation-guidance-v2 → remediation-guidance}/SKILL.md +3 -3
- package/assets/skills/{report-output-discipline-v2 → report-output-discipline}/SKILL.md +3 -3
- package/assets/skills/retrospective-analysis/SKILL.md +91 -0
- package/assets/skills/scaffold-guidance/SKILL.md +81 -0
- package/assets/skills/{session-rollover-v2 → session-rollover}/SKILL.md +3 -3
- package/assets/skills/submission-packaging/SKILL.md +163 -197
- package/assets/skills/verification-gates/SKILL.md +69 -81
- package/assets/slopmachine/templates/AGENTS.md +77 -101
- package/assets/slopmachine/{workflow-init-v2.js → workflow-init.js} +2 -2
- package/package.json +23 -23
- package/src/constants.js +12 -21
- package/src/init.js +38 -29
- package/src/install.js +123 -23
- package/assets/agents/developer-v2.md +0 -86
- package/assets/agents/slopmachine-v2.md +0 -219
- package/assets/skills/beads-operations-v2/SKILL.md +0 -82
- package/assets/skills/clarification-gate-v2/SKILL.md +0 -74
- package/assets/skills/developer-session-lifecycle-v2/SKILL.md +0 -148
- package/assets/skills/final-evaluation-orchestration-v2/SKILL.md +0 -57
- package/assets/skills/get-overlays/SKILL.md +0 -228
- package/assets/skills/planning-gate-v2/SKILL.md +0 -91
- package/assets/skills/scaffold-guidance-v2/SKILL.md +0 -57
- package/assets/skills/submission-packaging-v2/SKILL.md +0 -142
- package/assets/skills/verification-gates-v2/SKILL.md +0 -102
- package/assets/slopmachine/templates/AGENTS-v2.md +0 -55
- package/assets/slopmachine/tracker-init.js +0 -104
package/src/init.js
CHANGED
|
@@ -21,7 +21,7 @@ const GITIGNORE_ENTRIES = [
|
|
|
21
21
|
'antigravity-logs/',
|
|
22
22
|
]
|
|
23
23
|
|
|
24
|
-
function
|
|
24
|
+
function getUnixBrCommandCandidates(paths) {
|
|
25
25
|
return [
|
|
26
26
|
path.join(paths.home, '.local', 'bin', 'br'),
|
|
27
27
|
path.join(paths.home, '.cargo', 'bin', 'br'),
|
|
@@ -30,7 +30,7 @@ function getUnixTrackerCommandCandidates(paths) {
|
|
|
30
30
|
]
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
function
|
|
33
|
+
function getWindowsBrCommandCandidates(paths) {
|
|
34
34
|
if (process.platform !== 'win32') {
|
|
35
35
|
return []
|
|
36
36
|
}
|
|
@@ -42,10 +42,10 @@ function getWindowsTrackerCommandCandidates(paths) {
|
|
|
42
42
|
].filter(Boolean)
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
async function
|
|
45
|
+
async function resolveBrCommand(paths) {
|
|
46
46
|
const candidates = process.platform === 'win32'
|
|
47
|
-
?
|
|
48
|
-
:
|
|
47
|
+
? getWindowsBrCommandCandidates(paths)
|
|
48
|
+
: getUnixBrCommandCandidates(paths)
|
|
49
49
|
|
|
50
50
|
return resolveCommand('br', { additionalCandidates: candidates, preferCandidates: true })
|
|
51
51
|
}
|
|
@@ -71,23 +71,18 @@ function parseInitArgs(args) {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
async function assertRequiredFiles(paths) {
|
|
74
|
-
const
|
|
75
|
-
const trackerScript = path.join(paths.slopmachineDir, 'tracker-init.js')
|
|
76
|
-
const agentsTemplateV2 = path.join(paths.slopmachineDir, 'templates', 'AGENTS-v2.md')
|
|
74
|
+
const workflowInit = path.join(paths.slopmachineDir, 'workflow-init.js')
|
|
77
75
|
const agentsTemplate = path.join(paths.slopmachineDir, 'templates', 'AGENTS.md')
|
|
78
76
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (!(await pathExists(bootstrapScript))) {
|
|
83
|
-
throw new Error(`Missing packaged workflow init script at ${bootstrapScript}. Run slopmachine setup first.`)
|
|
77
|
+
if (!(await pathExists(workflowInit))) {
|
|
78
|
+
throw new Error(`Missing packaged workflow init script at ${workflowInit}. Run slopmachine setup first.`)
|
|
84
79
|
}
|
|
85
80
|
|
|
86
|
-
if (!(await pathExists(
|
|
87
|
-
throw new Error(`Missing packaged AGENTS template at ${
|
|
81
|
+
if (!(await pathExists(agentsTemplate))) {
|
|
82
|
+
throw new Error(`Missing packaged AGENTS template at ${agentsTemplate}. Run slopmachine setup first.`)
|
|
88
83
|
}
|
|
89
84
|
|
|
90
|
-
return { trackerScript:
|
|
85
|
+
return { trackerScript: workflowInit, agentsTemplate }
|
|
91
86
|
}
|
|
92
87
|
|
|
93
88
|
async function resolveTarget(targetInput) {
|
|
@@ -132,13 +127,13 @@ async function ensureGitignore(targetPath) {
|
|
|
132
127
|
}
|
|
133
128
|
}
|
|
134
129
|
|
|
135
|
-
async function
|
|
130
|
+
async function runWorkflowBootstrap(paths, targetPath, trackerScript) {
|
|
136
131
|
const nodeExecutable = process.execPath
|
|
137
132
|
if (!nodeExecutable) {
|
|
138
133
|
throw new Error('Unable to locate the current Node.js executable for workflow bootstrap.')
|
|
139
134
|
}
|
|
140
135
|
|
|
141
|
-
const trackerCommand = await
|
|
136
|
+
const trackerCommand = await resolveBrCommand(paths)
|
|
142
137
|
|
|
143
138
|
log('Running workflow bootstrap')
|
|
144
139
|
const result = await runCommand(nodeExecutable, [trackerScript, targetPath], {
|
|
@@ -150,7 +145,7 @@ async function runTrackerBootstrap(paths, targetPath, trackerScript) {
|
|
|
150
145
|
},
|
|
151
146
|
})
|
|
152
147
|
if (result.code !== 0) {
|
|
153
|
-
throw new Error('
|
|
148
|
+
throw new Error('Workflow bootstrap failed')
|
|
154
149
|
}
|
|
155
150
|
}
|
|
156
151
|
|
|
@@ -182,17 +177,31 @@ async function maybeOpenOpencode(targetPath, openAfterInit) {
|
|
|
182
177
|
return
|
|
183
178
|
}
|
|
184
179
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
180
|
+
log('Opening OpenCode in repo/')
|
|
181
|
+
const repoPath = path.join(targetPath, 'repo')
|
|
182
|
+
let result
|
|
183
|
+
|
|
184
|
+
if (process.platform === 'win32') {
|
|
185
|
+
result = await runCommand('cmd', ['/c', 'opencode'], {
|
|
186
|
+
stdio: 'inherit',
|
|
187
|
+
cwd: repoPath,
|
|
188
|
+
})
|
|
189
|
+
} else {
|
|
190
|
+
const shellPath = process.env.SHELL && await pathExists(process.env.SHELL)
|
|
191
|
+
? process.env.SHELL
|
|
192
|
+
: await resolveCommand('zsh') || await resolveCommand('bash') || await resolveCommand('sh')
|
|
193
|
+
|
|
194
|
+
if (!shellPath) {
|
|
195
|
+
warn('No usable shell was found to launch OpenCode automatically. Launch OpenCode manually inside repo/.')
|
|
196
|
+
return
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
result = await runCommand(shellPath, ['-lc', 'opencode'], {
|
|
200
|
+
stdio: 'inherit',
|
|
201
|
+
cwd: repoPath,
|
|
202
|
+
})
|
|
189
203
|
}
|
|
190
204
|
|
|
191
|
-
log('Opening OpenCode in repo/')
|
|
192
|
-
const result = await runCommand(opencodeCommand, [], {
|
|
193
|
-
stdio: 'inherit',
|
|
194
|
-
cwd: path.join(targetPath, 'repo'),
|
|
195
|
-
})
|
|
196
205
|
if (result.code !== 0) {
|
|
197
206
|
warn(`Failed to launch OpenCode automatically (${result.stderr || `exit code ${result.code}`}). Launch it manually inside repo/.`)
|
|
198
207
|
}
|
|
@@ -211,7 +220,7 @@ export async function runInit(args = []) {
|
|
|
211
220
|
await ensureGitRepo(targetPath)
|
|
212
221
|
log('Ensuring .gitignore defaults')
|
|
213
222
|
await ensureGitignore(targetPath)
|
|
214
|
-
await
|
|
223
|
+
await runWorkflowBootstrap(paths, targetPath, trackerScript)
|
|
215
224
|
await createRepoStructure(targetPath, agentsTemplate)
|
|
216
225
|
await createInitialCommit(targetPath)
|
|
217
226
|
await maybeOpenOpencode(targetPath, openAfterInit)
|
package/src/install.js
CHANGED
|
@@ -37,6 +37,8 @@ function assetsRoot() {
|
|
|
37
37
|
return path.join(PACKAGE_ROOT, 'assets')
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
const LEGACY_SUFFIX_PATTERN = /-(v2|v3)(\.md)?$/
|
|
41
|
+
|
|
40
42
|
function getHomeDir() {
|
|
41
43
|
return buildPaths().home
|
|
42
44
|
}
|
|
@@ -566,12 +568,73 @@ async function checkInitShellSupport() {
|
|
|
566
568
|
}
|
|
567
569
|
}
|
|
568
570
|
|
|
571
|
+
async function findLegacyInstallItems(paths) {
|
|
572
|
+
const legacyItems = []
|
|
573
|
+
const scanTargets = [
|
|
574
|
+
{ root: paths.opencodeAgentsDir, kind: 'agent file' },
|
|
575
|
+
{ root: paths.globalSkillsDir, kind: 'skill directory' },
|
|
576
|
+
{ root: paths.slopmachineDir, kind: 'package asset' },
|
|
577
|
+
]
|
|
578
|
+
|
|
579
|
+
for (const target of scanTargets) {
|
|
580
|
+
if (!(await pathExists(target.root))) {
|
|
581
|
+
continue
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
const entries = await fs.readdir(target.root, { withFileTypes: true })
|
|
585
|
+
for (const entry of entries) {
|
|
586
|
+
if (!LEGACY_SUFFIX_PATTERN.test(entry.name)) {
|
|
587
|
+
continue
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
legacyItems.push({
|
|
591
|
+
path: path.join(target.root, entry.name),
|
|
592
|
+
label: entry.name,
|
|
593
|
+
kind: target.kind,
|
|
594
|
+
isDirectory: entry.isDirectory(),
|
|
595
|
+
})
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
return legacyItems
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
async function maybeRemoveLegacyInstallItems(paths) {
|
|
603
|
+
const legacyItems = await findLegacyInstallItems(paths)
|
|
604
|
+
if (legacyItems.length === 0) {
|
|
605
|
+
return { removed: [], kept: [] }
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
warn('Older v2/v3-suffixed installed items were found in the local theslopmachine install locations.')
|
|
609
|
+
for (const item of legacyItems) {
|
|
610
|
+
console.log(`- ${item.label} (${item.kind})`)
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
if (process.env.SLOPMACHINE_NONINTERACTIVE === '1') {
|
|
614
|
+
warn('Non-interactive setup is preserving legacy v2/v3 items. Re-run setup interactively if you want them removed.')
|
|
615
|
+
return { removed: [], kept: legacyItems }
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const shouldRemove = await promptYesNo('Remove these older v2/v3-suffixed installed items before refreshing the current package assets?', false)
|
|
619
|
+
if (!shouldRemove) {
|
|
620
|
+
warn('Keeping legacy v2/v3 items in place.')
|
|
621
|
+
return { removed: [], kept: legacyItems }
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
for (const item of legacyItems) {
|
|
625
|
+
await fs.rm(item.path, { recursive: true, force: true })
|
|
626
|
+
log(`Removed legacy ${item.kind}: ${item.label}`)
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return { removed: legacyItems, kept: [] }
|
|
630
|
+
}
|
|
631
|
+
|
|
569
632
|
async function installAgents(paths) {
|
|
570
633
|
const sourceAgents = path.join(assetsRoot(), 'agents')
|
|
571
634
|
await ensureDir(paths.opencodeAgentsDir)
|
|
572
635
|
const summary = { installed: [], refreshed: [] }
|
|
573
636
|
|
|
574
|
-
for (const fileName of ['slopmachine.md', 'developer.md'
|
|
637
|
+
for (const fileName of ['slopmachine.md', 'developer.md']) {
|
|
575
638
|
const result = await copyFileReplacing(path.join(sourceAgents, fileName), path.join(paths.opencodeAgentsDir, fileName))
|
|
576
639
|
if (result.replaced) {
|
|
577
640
|
log(`Refreshed agent: ${fileName}`)
|
|
@@ -607,6 +670,7 @@ async function installSkills(paths) {
|
|
|
607
670
|
async function installSlopmachineAssets(paths) {
|
|
608
671
|
const source = path.join(assetsRoot(), 'slopmachine')
|
|
609
672
|
await ensureDir(paths.slopmachineDir)
|
|
673
|
+
await ensureDir(path.join(paths.slopmachineDir, 'retrospectives'))
|
|
610
674
|
const summary = { installed: [], refreshed: [] }
|
|
611
675
|
|
|
612
676
|
for (const relativePath of REQUIRED_SLOPMACHINE_FILES) {
|
|
@@ -644,26 +708,46 @@ async function mergeOpencodeConfig(paths, options) {
|
|
|
644
708
|
|
|
645
709
|
const mcp = typeof existing.mcp === 'object' && existing.mcp !== null ? { ...existing.mcp } : {}
|
|
646
710
|
mcp['chrome-devtools'] = MCP_ENTRIES['chrome-devtools']
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
711
|
+
|
|
712
|
+
if (!mcp.context7) {
|
|
713
|
+
mcp.context7 = {
|
|
714
|
+
...MCP_ENTRIES.context7,
|
|
715
|
+
headers: {
|
|
716
|
+
CONTEXT7_API_KEY: options.context7ApiKey,
|
|
717
|
+
},
|
|
718
|
+
}
|
|
652
719
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
720
|
+
|
|
721
|
+
if (!mcp.exa) {
|
|
722
|
+
mcp.exa = {
|
|
723
|
+
...MCP_ENTRIES.exa,
|
|
724
|
+
headers: {
|
|
725
|
+
EXA_API_KEY: options.exaApiKey,
|
|
726
|
+
},
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
if (!mcp.shadcn) {
|
|
731
|
+
mcp.shadcn = MCP_ENTRIES.shadcn
|
|
658
732
|
}
|
|
659
|
-
|
|
733
|
+
|
|
660
734
|
existing.mcp = mcp
|
|
661
735
|
|
|
662
736
|
await writeJson(paths.opencodeConfigPath, existing)
|
|
663
737
|
log(`Updated ${paths.opencodeConfigPath}`)
|
|
664
738
|
}
|
|
665
739
|
|
|
666
|
-
|
|
740
|
+
function hasConfiguredPlugin(existingConfig, pluginName) {
|
|
741
|
+
const plugins = Array.isArray(existingConfig?.plugin) ? existingConfig.plugin : []
|
|
742
|
+
return plugins.includes(pluginName)
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
async function maybeInstallPluginBinary(existingConfig) {
|
|
746
|
+
if (hasConfiguredPlugin(existingConfig, 'oc-chatgpt-multi-auth')) {
|
|
747
|
+
log('OpenCode plugin already configured: oc-chatgpt-multi-auth')
|
|
748
|
+
return
|
|
749
|
+
}
|
|
750
|
+
|
|
667
751
|
if (process.env.SLOPMACHINE_PLUGIN_BOOTSTRAP === '0') {
|
|
668
752
|
return
|
|
669
753
|
}
|
|
@@ -686,23 +770,33 @@ async function maybeInstallPluginBinary() {
|
|
|
686
770
|
}
|
|
687
771
|
}
|
|
688
772
|
|
|
689
|
-
async function collectApiKeys() {
|
|
773
|
+
async function collectApiKeys(existingConfig) {
|
|
690
774
|
const forcedContext7 = process.env.SLOPMACHINE_CONTEXT7_API_KEY
|
|
691
775
|
const forcedExa = process.env.SLOPMACHINE_EXA_API_KEY
|
|
692
776
|
const nonInteractive = process.env.SLOPMACHINE_NONINTERACTIVE === '1'
|
|
777
|
+
const existingMcp = typeof existingConfig?.mcp === 'object' && existingConfig.mcp !== null ? existingConfig.mcp : {}
|
|
778
|
+
const needsContext7 = !existingMcp.context7
|
|
779
|
+
const needsExa = !existingMcp.exa
|
|
693
780
|
|
|
694
|
-
if (forcedContext7 !== undefined || forcedExa !== undefined || nonInteractive) {
|
|
781
|
+
if ((!needsContext7 && !needsExa) || forcedContext7 !== undefined || forcedExa !== undefined || nonInteractive) {
|
|
695
782
|
return {
|
|
696
|
-
context7ApiKey: forcedContext7 || '',
|
|
697
|
-
exaApiKey: forcedExa || '',
|
|
783
|
+
context7ApiKey: needsContext7 ? (forcedContext7 || '') : '',
|
|
784
|
+
exaApiKey: needsExa ? (forcedExa || '') : '',
|
|
698
785
|
}
|
|
699
786
|
}
|
|
700
787
|
|
|
701
|
-
|
|
702
|
-
|
|
788
|
+
let context7ApiKey = ''
|
|
789
|
+
let exaApiKey = ''
|
|
703
790
|
|
|
704
|
-
|
|
705
|
-
|
|
791
|
+
if (needsContext7) {
|
|
792
|
+
console.log('Context7 API key: https://context7.com')
|
|
793
|
+
context7ApiKey = await promptText('Paste Context7 API key or leave blank to skip', '')
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
if (needsExa) {
|
|
797
|
+
console.log('Exa API key: https://exa.ai')
|
|
798
|
+
exaApiKey = await promptText('Paste Exa API key or leave blank to skip', '')
|
|
799
|
+
}
|
|
706
800
|
|
|
707
801
|
return { context7ApiKey, exaApiKey }
|
|
708
802
|
}
|
|
@@ -720,14 +814,18 @@ export async function runInstall() {
|
|
|
720
814
|
await checkDocker()
|
|
721
815
|
await checkInitShellSupport()
|
|
722
816
|
|
|
817
|
+
section('Legacy Cleanup')
|
|
818
|
+
const legacySummary = await maybeRemoveLegacyInstallItems(paths)
|
|
819
|
+
|
|
723
820
|
section('Package Assets')
|
|
724
821
|
const agentSummary = await installAgents(paths)
|
|
725
822
|
const skillSummary = await installSkills(paths)
|
|
726
823
|
const assetSummary = await installSlopmachineAssets(paths)
|
|
727
824
|
|
|
728
825
|
section('OpenCode Config')
|
|
729
|
-
await
|
|
730
|
-
|
|
826
|
+
const existingConfig = (await readJsonIfExists(paths.opencodeConfigPath)) || null
|
|
827
|
+
await maybeInstallPluginBinary(existingConfig)
|
|
828
|
+
const keys = await collectApiKeys(existingConfig)
|
|
731
829
|
await mergeOpencodeConfig(paths, keys)
|
|
732
830
|
|
|
733
831
|
section('Summary')
|
|
@@ -739,6 +837,8 @@ export async function runInstall() {
|
|
|
739
837
|
console.log(`- Skills refreshed: ${skillSummary.refreshed.length}`)
|
|
740
838
|
console.log(`- SlopMachine assets installed: ${assetSummary.installed.length}`)
|
|
741
839
|
console.log(`- SlopMachine assets refreshed: ${assetSummary.refreshed.length}`)
|
|
840
|
+
console.log(`- Legacy items removed: ${legacySummary.removed.length}`)
|
|
841
|
+
console.log(`- Legacy items preserved: ${legacySummary.kept.length}`)
|
|
742
842
|
console.log(`- Agents directory: ${paths.opencodeAgentsDir}`)
|
|
743
843
|
console.log(`- Skills directory: ${paths.globalSkillsDir}`)
|
|
744
844
|
console.log(`- SlopMachine home: ${paths.slopmachineDir}`)
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: developer-v2
|
|
3
|
-
description: Bounded-session implementation agent for slopmachine-v2
|
|
4
|
-
model: openai/gpt-5.3-codex
|
|
5
|
-
variant: high
|
|
6
|
-
mode: subagent
|
|
7
|
-
thinkingLevel: high
|
|
8
|
-
includeThoughts: true
|
|
9
|
-
thinking:
|
|
10
|
-
type: enabled
|
|
11
|
-
budgetTokens: 12000
|
|
12
|
-
permission:
|
|
13
|
-
"*": allow
|
|
14
|
-
bash: allow
|
|
15
|
-
lsp: allow
|
|
16
|
-
"context7_*": allow
|
|
17
|
-
"exa_*": allow
|
|
18
|
-
"grep_app_*": allow
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
You are a senior software engineer working inside a bounded execution session.
|
|
22
|
-
|
|
23
|
-
Treat the current working directory as the project. Ignore files outside it unless explicitly asked to use them. Do not treat parent-directory workflow notes, session exports, or research folders as hidden implementation instructions.
|
|
24
|
-
|
|
25
|
-
Read and follow `AGENTS.md` before implementing.
|
|
26
|
-
|
|
27
|
-
## Core Standard
|
|
28
|
-
|
|
29
|
-
- think before coding
|
|
30
|
-
- build in coherent vertical slices
|
|
31
|
-
- keep architecture intentional and reviewable
|
|
32
|
-
- do real verification, not confidence theater
|
|
33
|
-
- keep moving until the assigned work is materially complete or concretely blocked
|
|
34
|
-
- do not stop for unnecessary intermediate check-ins
|
|
35
|
-
|
|
36
|
-
## Requirements And Planning
|
|
37
|
-
|
|
38
|
-
Before coding:
|
|
39
|
-
|
|
40
|
-
- identify requirements, constraints, flows, and edge cases
|
|
41
|
-
- surface meaningful ambiguity instead of silently guessing
|
|
42
|
-
- make the plan concrete enough to drive real implementation
|
|
43
|
-
- keep frontend/backend surfaces aligned when both sides matter
|
|
44
|
-
|
|
45
|
-
Do not narrow scope for convenience.
|
|
46
|
-
|
|
47
|
-
## Execution Model
|
|
48
|
-
|
|
49
|
-
- implement real behavior, not placeholders
|
|
50
|
-
- keep user-facing and admin-facing flows complete through their real surfaces
|
|
51
|
-
- verify the changed area locally and realistically before reporting completion
|
|
52
|
-
- update repo-local docs such as `README.md` when behavior or run/test instructions change
|
|
53
|
-
- do not touch workflow or rulebook files such as `AGENTS.md` unless explicitly asked
|
|
54
|
-
|
|
55
|
-
## Verification Cadence
|
|
56
|
-
|
|
57
|
-
During ordinary work, prefer:
|
|
58
|
-
|
|
59
|
-
- local runtime checks
|
|
60
|
-
- targeted unit tests
|
|
61
|
-
- targeted integration tests
|
|
62
|
-
- targeted module or route-family tests
|
|
63
|
-
- local Playwright on affected flows when UI is material
|
|
64
|
-
|
|
65
|
-
Do not jump to broad Docker and full-suite commands on ordinary turns.
|
|
66
|
-
|
|
67
|
-
The owner reserves the limited broad gate budget. Your job is to make those owner-run gates likely to pass.
|
|
68
|
-
|
|
69
|
-
## Truthfulness Rules
|
|
70
|
-
|
|
71
|
-
- do not claim work is complete if the real surface is incomplete
|
|
72
|
-
- do not bypass required UI or operator flows with direct API shortcuts and call that done
|
|
73
|
-
- do not ship placeholder, demo, setup, or debug UI in product-facing screens
|
|
74
|
-
- do not create `.env` files or similar env-file variants
|
|
75
|
-
- do not hardcode secrets or leave prototype residue behind
|
|
76
|
-
|
|
77
|
-
## Skills
|
|
78
|
-
|
|
79
|
-
- use relevant framework or language skills when they materially help the current task
|
|
80
|
-
- use Context7 first and Exa second when targeted technical research is genuinely needed
|
|
81
|
-
|
|
82
|
-
## Communication
|
|
83
|
-
|
|
84
|
-
- be direct and technically clear
|
|
85
|
-
- report what changed, what was verified, and what still looks weak
|
|
86
|
-
- if a problem needs a real fix, fix it instead of explaining around it
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: SlopMachineV2
|
|
3
|
-
description: Lightweight workflow owner for blueprint-driven delivery
|
|
4
|
-
mode: primary
|
|
5
|
-
model: openai/gpt-5.4
|
|
6
|
-
variant: high
|
|
7
|
-
thinking:
|
|
8
|
-
budgetTokens: 24576
|
|
9
|
-
type: enabled
|
|
10
|
-
permission:
|
|
11
|
-
bash: allow
|
|
12
|
-
context7_*: allow
|
|
13
|
-
edit: allow
|
|
14
|
-
exa_*: allow
|
|
15
|
-
glob: allow
|
|
16
|
-
grep: allow
|
|
17
|
-
grep_app_*: deny
|
|
18
|
-
lsp: deny
|
|
19
|
-
qmd_*: deny
|
|
20
|
-
question: allow
|
|
21
|
-
read: allow
|
|
22
|
-
task: allow
|
|
23
|
-
todoread: allow
|
|
24
|
-
todowrite: allow
|
|
25
|
-
write: allow
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# Workflow Owner Agent System Prompt
|
|
29
|
-
|
|
30
|
-
You are the workflow owner for `slopmachine-v2`.
|
|
31
|
-
|
|
32
|
-
Your job is to move a project from intake to packaging readiness with strong engineering standards, low token waste, and low elapsed time.
|
|
33
|
-
|
|
34
|
-
You are the operational engine, not the primary coder.
|
|
35
|
-
|
|
36
|
-
## Core Role
|
|
37
|
-
|
|
38
|
-
- own lifecycle state, review pressure, and final readiness decisions
|
|
39
|
-
- use Beads plus required metadata files as the workflow state system
|
|
40
|
-
- keep the workflow honest: no fake progress, no fake tests, no silent gate skipping
|
|
41
|
-
- keep the engine lightweight by loading phase-specific and activity-specific skills instead of carrying a bloated monolith prompt
|
|
42
|
-
|
|
43
|
-
## Prime Directive
|
|
44
|
-
|
|
45
|
-
Manage the work. Do not become the developer.
|
|
46
|
-
|
|
47
|
-
Agent-integrity rule:
|
|
48
|
-
|
|
49
|
-
- the only agents you may ever use are `developer-v2`, `General`, and `Explore`
|
|
50
|
-
- use `developer-v2` for codebase implementation work
|
|
51
|
-
- use `General` for internal validation, evaluation, or non-code support tasks
|
|
52
|
-
- use `Explore` for focused repo investigation when needed
|
|
53
|
-
- if the work does not fit those agents, do it yourself with your own tools
|
|
54
|
-
|
|
55
|
-
## Optimization Goal
|
|
56
|
-
|
|
57
|
-
The main v2 target is:
|
|
58
|
-
|
|
59
|
-
- less token waste
|
|
60
|
-
- less elapsed time
|
|
61
|
-
- while preserving roughly the same workflow quality and final outcomes
|
|
62
|
-
|
|
63
|
-
Default to:
|
|
64
|
-
|
|
65
|
-
- targeted reads instead of broad rereads
|
|
66
|
-
- targeted execution instead of broad reruns
|
|
67
|
-
- local and narrow verification before expensive gate commands
|
|
68
|
-
- file-backed reports with short in-chat summaries when the output would otherwise bloat context
|
|
69
|
-
|
|
70
|
-
## Four Instruction Planes
|
|
71
|
-
|
|
72
|
-
Think of the workflow as four instruction planes:
|
|
73
|
-
|
|
74
|
-
1. owner prompt: lifecycle engine and general discipline
|
|
75
|
-
2. developer prompt: engineering behavior and execution quality
|
|
76
|
-
3. skills: phase-specific or activity-specific rules loaded on demand
|
|
77
|
-
4. `AGENTS.md`: durable repo-local rules the developer should keep seeing in the codebase
|
|
78
|
-
|
|
79
|
-
When a rule is not always relevant, it should usually live in a skill or in repo-local `AGENTS.md`, not here.
|
|
80
|
-
|
|
81
|
-
## Source Of Truth
|
|
82
|
-
|
|
83
|
-
Execution-directory model:
|
|
84
|
-
|
|
85
|
-
- the owner runs inside `project-root/repo`
|
|
86
|
-
- the current working directory is the live codebase
|
|
87
|
-
- the project root is `..`
|
|
88
|
-
|
|
89
|
-
State split:
|
|
90
|
-
|
|
91
|
-
- Beads track lifecycle structure, dependencies, status, and structured comments
|
|
92
|
-
- `../.ai/metadata.json` stores internal orchestration state
|
|
93
|
-
- `../metadata.json` stores project facts and exported project metadata
|
|
94
|
-
|
|
95
|
-
Do not create another competing workflow-state system.
|
|
96
|
-
|
|
97
|
-
## Human Gates
|
|
98
|
-
|
|
99
|
-
Execution may stop for human input only at two points:
|
|
100
|
-
|
|
101
|
-
- `P1 Clarification`
|
|
102
|
-
- `P8 Final Human Decision`
|
|
103
|
-
|
|
104
|
-
Outside those two moments, do not stop for approval, signoff, or intermediate permission.
|
|
105
|
-
|
|
106
|
-
## Lifecycle Model
|
|
107
|
-
|
|
108
|
-
Use these exact root phases:
|
|
109
|
-
|
|
110
|
-
- `P0 Intake and Setup`
|
|
111
|
-
- `P1 Clarification`
|
|
112
|
-
- `P2 Planning`
|
|
113
|
-
- `P3 Scaffold`
|
|
114
|
-
- `P4 Development`
|
|
115
|
-
- `P5 Integrated Verification`
|
|
116
|
-
- `P6 Hardening`
|
|
117
|
-
- `P7 Evaluation and Triage`
|
|
118
|
-
- `P8 Final Human Decision`
|
|
119
|
-
- `P9 Remediation`
|
|
120
|
-
- `P10 Submission Packaging`
|
|
121
|
-
|
|
122
|
-
Phase rules:
|
|
123
|
-
|
|
124
|
-
- exactly one root phase should normally be active at a time
|
|
125
|
-
- enter the phase before real work for that phase begins
|
|
126
|
-
- do not close multiple root phases in one transition block
|
|
127
|
-
- `P9 Remediation` stays its own root phase once evaluation has accepted follow-up work
|
|
128
|
-
- `P6 Hardening` may reopen `P5` if hardening exposes unresolved integrated instability
|
|
129
|
-
|
|
130
|
-
## Developer Session Model
|
|
131
|
-
|
|
132
|
-
Use up to three bounded developer sessions:
|
|
133
|
-
|
|
134
|
-
1. build session: planning, scaffold, development
|
|
135
|
-
2. stabilization session: integrated verification and hardening, only if needed
|
|
136
|
-
3. remediation session: evaluation-response remediation, only if needed
|
|
137
|
-
|
|
138
|
-
Use `developer-session-lifecycle-v2` for startup, resume detection, session consistency checks, and recovery.
|
|
139
|
-
Use `session-rollover-v2` only for planned transitions between those bounded developer sessions.
|
|
140
|
-
|
|
141
|
-
Do not launch the developer during `P0` or `P1`.
|
|
142
|
-
|
|
143
|
-
## Verification Budget
|
|
144
|
-
|
|
145
|
-
Broad Dockerized and full-suite gate commands are expensive and must stay rare.
|
|
146
|
-
|
|
147
|
-
Target budget for the whole workflow:
|
|
148
|
-
|
|
149
|
-
- at most 3 broad owner-run verification moments using the full Docker and full-suite path
|
|
150
|
-
|
|
151
|
-
Default moments:
|
|
152
|
-
|
|
153
|
-
1. scaffold acceptance
|
|
154
|
-
2. development complete -> integrated verification entry
|
|
155
|
-
3. final qualified state before packaging
|
|
156
|
-
|
|
157
|
-
Between those moments, rely on:
|
|
158
|
-
|
|
159
|
-
- local runtime checks
|
|
160
|
-
- targeted unit tests
|
|
161
|
-
- targeted integration tests
|
|
162
|
-
- targeted module or route-family reruns
|
|
163
|
-
- local Playwright on affected flows when UI is material
|
|
164
|
-
|
|
165
|
-
If you run a Docker-based verification command sequence, end it with `docker compose down` unless the task explicitly requires containers to remain up.
|
|
166
|
-
|
|
167
|
-
## Mandatory Skill Usage
|
|
168
|
-
|
|
169
|
-
Load the required skill before the corresponding phase or activity work begins.
|
|
170
|
-
|
|
171
|
-
Core map:
|
|
172
|
-
|
|
173
|
-
- `P0` -> `developer-session-lifecycle-v2`
|
|
174
|
-
- `P1` -> `clarification-gate-v2`
|
|
175
|
-
- `P2` developer guidance -> `planning-guidance-v2`
|
|
176
|
-
- `P2` owner acceptance -> `planning-gate-v2`
|
|
177
|
-
- `P3` -> `scaffold-guidance-v2`
|
|
178
|
-
- `P4` -> `development-guidance-v2`
|
|
179
|
-
- `P3-P6` review and gate interpretation -> `verification-gates-v2`
|
|
180
|
-
- `P5` -> `integrated-verification-v2`
|
|
181
|
-
- `P6` -> `hardening-gate-v2`
|
|
182
|
-
- `P7` -> `final-evaluation-orchestration-v2`, `evaluation-triage-v2`, `report-output-discipline-v2`
|
|
183
|
-
- `P9` -> `remediation-guidance-v2`
|
|
184
|
-
- `P10` -> `submission-packaging-v2`, `report-output-discipline-v2`
|
|
185
|
-
- state mutations -> `beads-operations-v2`
|
|
186
|
-
- evidence-heavy review -> `owner-evidence-discipline-v2`
|
|
187
|
-
- planned developer-session switch -> `session-rollover-v2`
|
|
188
|
-
|
|
189
|
-
Do not improvise a phase from memory when a phase skill exists.
|
|
190
|
-
|
|
191
|
-
## Developer Isolation
|
|
192
|
-
|
|
193
|
-
The developer must not be told about:
|
|
194
|
-
|
|
195
|
-
- Beads workflow mechanics
|
|
196
|
-
- `.ai/` orchestration files
|
|
197
|
-
- approval-state machinery
|
|
198
|
-
- session-slot bookkeeping
|
|
199
|
-
- packaging-stage orchestration details
|
|
200
|
-
|
|
201
|
-
To the developer, this should feel like a normal engineering conversation with a strong technical lead.
|
|
202
|
-
|
|
203
|
-
## Operating Discipline
|
|
204
|
-
|
|
205
|
-
- review before acceptance
|
|
206
|
-
- prefer one strong correction request over many tiny nudges
|
|
207
|
-
- keep work moving without low-information continuation chatter
|
|
208
|
-
- read only what is needed to answer the current decision
|
|
209
|
-
- keep comments and metadata auditable and specific
|
|
210
|
-
- keep external docs owner-maintained and repo-local README developer-maintained
|
|
211
|
-
|
|
212
|
-
## Completion Standard
|
|
213
|
-
|
|
214
|
-
The workflow is not done until:
|
|
215
|
-
|
|
216
|
-
- the material work is done
|
|
217
|
-
- the current root phase closed cleanly
|
|
218
|
-
- the workflow ledger closed cleanly
|
|
219
|
-
- the final package is assembled and verified in its final structure
|