theslopmachine 0.4.2 → 0.4.5
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 +2 -2
- package/README.md +151 -122
- package/RELEASE.md +5 -4
- package/assets/agents/developer.md +8 -1
- package/assets/agents/slopmachine.md +33 -9
- package/assets/skills/beads-operations/SKILL.md +1 -1
- package/assets/skills/clarification-gate/SKILL.md +4 -3
- package/assets/skills/developer-session-lifecycle/SKILL.md +35 -19
- package/assets/skills/development-guidance/SKILL.md +2 -1
- package/assets/skills/final-evaluation-orchestration/SKILL.md +3 -2
- package/assets/skills/integrated-verification/SKILL.md +2 -0
- package/assets/skills/planning-guidance/SKILL.md +4 -1
- package/assets/skills/remediation-guidance/SKILL.md +1 -1
- package/assets/skills/retrospective-analysis/SKILL.md +5 -3
- package/assets/skills/scaffold-guidance/SKILL.md +7 -0
- package/assets/skills/session-rollover/SKILL.md +20 -6
- package/assets/skills/submission-packaging/SKILL.md +37 -19
- package/assets/skills/verification-gates/SKILL.md +9 -2
- package/assets/slopmachine/document-completeness.md +46 -32
- package/assets/slopmachine/engineering-results.md +43 -39
- package/assets/slopmachine/implementation-comparison.md +40 -33
- package/assets/slopmachine/quality-document.md +45 -86
- package/assets/slopmachine/templates/AGENTS.md +7 -1
- package/assets/slopmachine/utils/strip_session_parent.py +40 -1
- package/package.json +1 -1
- package/src/constants.js +61 -58
- package/src/init.js +48 -0
|
@@ -1,59 +1,63 @@
|
|
|
1
|
-
|
|
1
|
+
## Engineering Details and Professionalism Template
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
* **Error Handling**
|
|
5
|
-
* **Input Validation and Message Prompts**
|
|
6
|
-
* **Error Handling**
|
|
7
|
-
* **File Upload Security**
|
|
3
|
+
Use this file as the structure reference for the engineering-details-and-professionalism submission output.
|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
Do not copy stack-specific example code or project-specific security claims into the final document.
|
|
6
|
+
Replace every placeholder with current-project evidence.
|
|
10
7
|
|
|
11
|
-
|
|
8
|
+
## Core checklist
|
|
12
9
|
|
|
13
|
-
|
|
10
|
+
Cover these areas explicitly using project-type equivalents when the exact surface changes:
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
1. coding standards and consistency
|
|
13
|
+
2. error handling and user-safe failures
|
|
14
|
+
3. input validation
|
|
15
|
+
4. logging or diagnostics
|
|
16
|
+
5. security-sensitive implementation details
|
|
17
|
+
6. test integrity
|
|
18
|
+
7. cleanup and professionalism
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
## Engineering details review
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
### Coding standards
|
|
23
|
+
- `<what standards/patterns are followed>`
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
### Error handling
|
|
26
|
+
- `<how errors are handled and surfaced safely>`
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* ✅ **Integration Testing**: 8 test cases (End-to-end process, Chinese language support)
|
|
30
|
-
* ✅ **Total**: 41 test cases all passed
|
|
28
|
+
### Input validation
|
|
29
|
+
- `<how important inputs are validated>`
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
### Logging / diagnostics
|
|
32
|
+
- `<what logging or diagnostics exist>`
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
* ✅ Test data does not pollute the production database (db.sqlite3)
|
|
37
|
-
* ✅ Automatic data initialization scripts in startup scripts are disabled
|
|
34
|
+
### Security details
|
|
35
|
+
- `<security mechanisms actually present>`
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
### Test integrity
|
|
38
|
+
- `<test types present, isolation model, and major coverage notes>`
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
### Cleanup and professionalism
|
|
41
|
+
- `<absence of secrets, debug leftovers, committed dependency trees, etc.>`
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
## Checklist table
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
| Check | Status | Evidence |
|
|
46
|
+
| :---- | :---- | :---- |
|
|
47
|
+
| Error handling is credible | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
48
|
+
| Important inputs are validated | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
49
|
+
| Logging/diagnostics are useful | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
50
|
+
| No secrets/keys are committed | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
51
|
+
| No committed dependency directories | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
52
|
+
| No obvious leftover debug statements | `<Pass/Partial/Fail>` | `<evidence>` |
|
|
46
53
|
|
|
47
|
-
|
|
48
|
-
* **Error Handling**: Layered processing, user-friendly prompts, comprehensive exception capturing
|
|
49
|
-
* **Security**: Django built-in security features, CSRF/XSS/SQL injection protection
|
|
50
|
-
* **Test Integrity**: 41 test cases, completely isolated test environment
|
|
51
|
-
* **Maintainability**: Modular design, clear responsibilities, easy to extend
|
|
54
|
+
## Professionalism summary
|
|
52
55
|
|
|
53
|
-
**
|
|
56
|
+
**Strengths:**
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
- `<strength 1>`
|
|
59
|
+
- `<strength 2>`
|
|
57
60
|
|
|
58
|
-
|
|
61
|
+
**Remaining concerns:**
|
|
59
62
|
|
|
63
|
+
- `<concern 1 or 'None material'>`
|
|
@@ -1,36 +1,43 @@
|
|
|
1
|
-
|
|
1
|
+
## Prompt Understanding and Adaptability Template
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Use this file as the structure reference for the prompt-understanding-and-adaptability submission output.
|
|
4
|
+
|
|
5
|
+
Do not copy example requirements or project-specific features into the final document.
|
|
6
|
+
Replace every placeholder with current-project evidence.
|
|
7
|
+
|
|
8
|
+
## Actual implementation vs requirements comparison
|
|
9
|
+
|
|
10
|
+
| Requirement Item | Original Requirement | Actual Implementation | Exceeding Portion / Notes |
|
|
4
11
|
| :---- | :---- | :---- | :---- |
|
|
5
|
-
|
|
|
6
|
-
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* **Add Suggestion**
|
|
12
|
+
| `<requirement>` | `<what the prompt asked for>` | `<what was delivered>` | `<extra or note>` |
|
|
13
|
+
| `<requirement>` | `<what the prompt asked for>` | `<what was delivered>` | `<extra or note>` |
|
|
14
|
+
|
|
15
|
+
## Depth of requirement understanding
|
|
16
|
+
|
|
17
|
+
Explain whether the delivered project shows real understanding of:
|
|
18
|
+
|
|
19
|
+
- business objectives
|
|
20
|
+
- user and operator flows
|
|
21
|
+
- implicit constraints
|
|
22
|
+
- runnability and maintainability expectations
|
|
23
|
+
- why the chosen implementation fits the actual problem
|
|
24
|
+
|
|
25
|
+
Use project-specific evidence only.
|
|
26
|
+
|
|
27
|
+
## Prompt-fit summary
|
|
28
|
+
|
|
29
|
+
Answer explicitly:
|
|
30
|
+
|
|
31
|
+
1. Did the implementation stay aligned with the actual prompt?
|
|
32
|
+
2. Did it cover the core required flows completely?
|
|
33
|
+
3. Did it understand the business goal rather than only surface technical tasks?
|
|
34
|
+
4. Where did it exceed, refine, or interpret the prompt, and was that prompt-faithful?
|
|
35
|
+
|
|
36
|
+
## Over-delivery / adaptability notes
|
|
37
|
+
|
|
38
|
+
- `<meaningful improvement or adaptation>`
|
|
39
|
+
- `<meaningful improvement or adaptation>`
|
|
40
|
+
|
|
41
|
+
## Risks or caveats
|
|
36
42
|
|
|
43
|
+
- `<any remaining prompt-fit caveat or 'None material'>`
|
|
@@ -1,108 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
**Project Positioning**
|
|
1
|
+
## Engineering and Architecture Quality Template
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
Use this file as the structure reference for the engineering-and-architecture self-assessment output.
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
Do not copy stack-specific or project-specific example content into the final document.
|
|
6
|
+
Replace every placeholder with current-project evidence.
|
|
8
7
|
|
|
9
|
-
|
|
8
|
+
## Project positioning
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* **Testing Framework**: pytest 8.3.4 \+ pytest-django 4.9.0
|
|
17
|
-
* **Deployment**: Docker Compose one-click startup
|
|
10
|
+
- **Project Type:** `<web/mobile/desktop/cli/library/etc.>`
|
|
11
|
+
- **Primary problem solved:** `<short summary>`
|
|
12
|
+
- **Major user or operator surfaces:**
|
|
13
|
+
- `<surface 1>`
|
|
14
|
+
- `<surface 2>`
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
## Technology stack selection
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
- **Primary runtime stack:** `<actual stack>`
|
|
19
|
+
- **Primary language(s):** `<actual language(s)>`
|
|
20
|
+
- **Persistence / data layer:** `<actual persistence>`
|
|
21
|
+
- **Testing stack:** `<actual test stack>`
|
|
22
|
+
- **Deployment / runtime model:** `<actual runtime model>`
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
## Architecture description
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
* **Template Layer**: Renders HTML pages to return to the client.
|
|
30
|
-
* **Backend Management**: Management interface provided by Django Admin.
|
|
31
|
-
* **Data Layer**: SQLite3 database for data storage.
|
|
26
|
+
- **High-level structure:** `<major layers/modules>`
|
|
27
|
+
- **Runtime boundaries:** `<how runtime pieces fit together>`
|
|
28
|
+
- **Data or state boundaries:** `<where state lives and how it flows>`
|
|
29
|
+
- **Key contracts:** `<critical interfaces or shared contracts>`
|
|
32
30
|
|
|
33
|
-
|
|
31
|
+
## Module division
|
|
34
32
|
|
|
35
|
-
| Module | Responsibility | File |
|
|
33
|
+
| Module | Responsibility | File / Area |
|
|
36
34
|
| :---- | :---- | :---- |
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
| **Data Models** | ORM model definitions, database table structures | main/models.py |
|
|
40
|
-
| **View Functions** | Business logic processing, request/response handling | main/views.py |
|
|
41
|
-
| **Backend Management** | Django Admin configuration | main/admin.py |
|
|
42
|
-
| **Templates** | HTML page rendering | main/templates/ |
|
|
43
|
-
| **Testing** | Unit testing, integration testing | tests/ |
|
|
35
|
+
| `<module>` | `<responsibility>` | `<path>` |
|
|
36
|
+
| `<module>` | `<responsibility>` | `<path>` |
|
|
44
37
|
|
|
45
|
-
|
|
38
|
+
## Architecture quality assessment
|
|
46
39
|
|
|
47
|
-
|
|
40
|
+
**Score / Rating:** `<score or qualitative result>`
|
|
48
41
|
|
|
49
|
-
**
|
|
42
|
+
**Strengths:**
|
|
50
43
|
|
|
51
|
-
|
|
44
|
+
- `<strength 1>`
|
|
45
|
+
- `<strength 2>`
|
|
46
|
+
- `<strength 3>`
|
|
52
47
|
|
|
53
|
-
**
|
|
48
|
+
**Areas for improvement:**
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
* **Django Best Practices**: Utilizes built-in functions such as Django ORM, Admin, and Messages.
|
|
58
|
-
* **Centralized Configuration**: All configurations are managed centrally in settings.py.
|
|
59
|
-
* **Scalability**: The database can be easily replaced with PostgreSQL or MySQL.
|
|
50
|
+
- `<improvement 1 or 'None material'>`
|
|
51
|
+
- `<improvement 2 if needed>`
|
|
60
52
|
|
|
61
|
-
|
|
53
|
+
## Maintainability review
|
|
62
54
|
|
|
63
|
-
|
|
64
|
-
* Consider using the Django REST Framework to provide API interfaces.
|
|
55
|
+
Address explicitly:
|
|
65
56
|
|
|
66
|
-
|
|
57
|
+
1. Is the structure modular and reviewable?
|
|
58
|
+
2. Are cross-cutting concerns handled consistently?
|
|
59
|
+
3. Are there major coupling or extension risks?
|
|
60
|
+
4. Does the project look like a credible maintained system rather than a stacked prototype?
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
| Field | Type | Description |
|
|
71
|
-
| :---- | :---- | :---- |
|
|
72
|
-
| id | INTEGER PK | Primary Key |
|
|
73
|
-
| name | VARCHAR(100) | Food Name |
|
|
74
|
-
| meal\_type | VARCHAR(20) | Meal Type (breakfast/lunch/dinner) |
|
|
75
|
-
| vote\_count | INTEGER | Vote Count |
|
|
76
|
-
| created\_at | DATETIME | Creation Time |
|
|
77
|
-
| updated\_at | DATETIME | Update Time |
|
|
78
|
-
|
|
79
|
-
**Table Structure: Suggestion (Opinions and Suggestions)**
|
|
80
|
-
|
|
81
|
-
| Field | Type | Description |
|
|
82
|
-
| :---- | :---- | :---- |
|
|
83
|
-
| id | INTEGER PK | Primary Key |
|
|
84
|
-
| title | VARCHAR(200) | Title |
|
|
85
|
-
| content | TEXT | Content |
|
|
86
|
-
| category | VARCHAR(20) | Category (food/service/environment/price/other) |
|
|
87
|
-
| status | VARCHAR(20) | Status (pending/processing/resolved/closed) |
|
|
88
|
-
| submitter\_name | VARCHAR(50) | Submitter Name (Optional) |
|
|
89
|
-
| submitter\_contact | VARCHAR(100) | Contact Info (Optional) |
|
|
90
|
-
| image | VARCHAR(100) | Image Path (Optional) |
|
|
91
|
-
| admin\_reply | TEXT | Admin Reply (Optional) |
|
|
92
|
-
| created\_at | DATETIME | Creation Time |
|
|
93
|
-
| updated\_at | DATETIME | Update Time |
|
|
94
|
-
|
|
95
|
-
**Index Design**
|
|
96
|
-
|
|
97
|
-
* **FoodVote Table Index**: Composite index to support queries by meal type and vote count: models.Index(fields=\['meal\_type', '-vote\_count'\]).
|
|
98
|
-
* **Suggestion Table Index**:
|
|
99
|
-
* Composite index for status and creation time: models.Index(fields=\['status', '-created\_at'\]).
|
|
100
|
-
* Composite index for category and creation time: models.Index(fields=\['category', '-created\_at'\]).
|
|
101
|
-
|
|
102
|
-
**Design Evaluation:**
|
|
103
|
-
|
|
104
|
-
* ✅ Index design is reasonable and covers main query scenarios.
|
|
105
|
-
* ✅ Field types are chosen appropriately, using TextChoices enumeration types.
|
|
106
|
-
* ✅ Uses Django ORM for easy migration to other databases.
|
|
107
|
-
* ✅ Timestamp fields are automatically managed using auto\_now\_add and auto\_now.
|
|
62
|
+
## Evidence to include
|
|
108
63
|
|
|
64
|
+
- brief architecture explanation
|
|
65
|
+
- major module map
|
|
66
|
+
- any key diagrams or screenshots when useful
|
|
67
|
+
- repo structure screenshot reference when used in the final generated file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Developer Rulebook
|
|
1
|
+
# Developer Rulebook
|
|
2
2
|
|
|
3
3
|
This file is the repo-local engineering rulebook for `slopmachine` projects.
|
|
4
4
|
|
|
@@ -41,6 +41,10 @@ For Dockerized web backend/fullstack projects:
|
|
|
41
41
|
- `./run_tests.sh` must run the broad full-test path through Docker
|
|
42
42
|
- local non-Docker tests should still exist for normal development work
|
|
43
43
|
- final broad verification should use the Dockerized `./run_tests.sh` path, not only local test commands
|
|
44
|
+
- keep Compose isolation safe for shared machines: no unnecessary `container_name`, unique `COMPOSE_PROJECT_NAME`, and Compose-scoped image/network/volume naming
|
|
45
|
+
- expose only the primary app-facing port to host by default, bind it to `127.0.0.1`, and keep databases/cache/internal services off host ports unless truly required
|
|
46
|
+
- prefer random host-port assignment by default so parallel local projects do not collide; if a fixed host port is truly required, support override plus free-port fallback in the runtime or test wrapper
|
|
47
|
+
- add healthchecks and wait for service readiness before tests or dependent startup steps proceed
|
|
44
48
|
|
|
45
49
|
When `docker compose up --build` is not the runtime contract, provide `./run_app.sh` as the single primary runtime wrapper.
|
|
46
50
|
|
|
@@ -74,6 +78,8 @@ Selected-stack defaults:
|
|
|
74
78
|
- Do not rely on `.env`, `.env.local`, `.env.example`, or similar files for project startup.
|
|
75
79
|
- Do not hardcode secrets.
|
|
76
80
|
- If runtime env-file format is required, generate it ephemerally and do not commit or package it.
|
|
81
|
+
- If Dockerized dev/test startup or tests require credentials, provide deterministic non-secret local-only default values through Docker runtime configuration so `docker compose up --build` and `./run_tests.sh` do not fail on missing credentials.
|
|
82
|
+
- Keep those Dockerized dev/test default credentials out of Dockerfile image layers.
|
|
77
83
|
|
|
78
84
|
Selected-stack secret/config defaults:
|
|
79
85
|
|
|
@@ -2,10 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
4
|
import json
|
|
5
|
+
import re
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from typing import Any
|
|
7
8
|
|
|
8
9
|
|
|
10
|
+
SUBAGENT_TITLE_SUFFIX = re.compile(r"\s+\(@[^)]*subagent\)\s*$")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def clean_title(title: Any) -> Any:
|
|
14
|
+
if not isinstance(title, str):
|
|
15
|
+
return title
|
|
16
|
+
return SUBAGENT_TITLE_SUFFIX.sub("", title)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def clean_message_info(info: Any) -> Any:
|
|
20
|
+
if not isinstance(info, dict):
|
|
21
|
+
return info
|
|
22
|
+
|
|
23
|
+
cleaned = dict(info)
|
|
24
|
+
tools = cleaned.get("tools")
|
|
25
|
+
if isinstance(tools, dict) and tools and all(value is False for value in tools.values()):
|
|
26
|
+
cleaned.pop("tools", None)
|
|
27
|
+
|
|
28
|
+
return cleaned
|
|
29
|
+
|
|
30
|
+
|
|
9
31
|
def strip_parent_id(data: Any) -> Any:
|
|
10
32
|
if not isinstance(data, dict):
|
|
11
33
|
raise ValueError("Expected top-level JSON object")
|
|
@@ -20,13 +42,30 @@ def strip_parent_id(data: Any) -> Any:
|
|
|
20
42
|
# Remove only the session-level parent marker. Message-level parentIDs
|
|
21
43
|
# are preserved so the conversation structure remains intact.
|
|
22
44
|
cleaned_info.pop("parentID", None)
|
|
45
|
+
cleaned_info.pop("permission", None)
|
|
46
|
+
cleaned_info["title"] = clean_title(cleaned_info.get("title"))
|
|
23
47
|
cleaned["info"] = cleaned_info
|
|
48
|
+
|
|
49
|
+
messages = cleaned.get("messages")
|
|
50
|
+
if isinstance(messages, list):
|
|
51
|
+
cleaned_messages = []
|
|
52
|
+
for message in messages:
|
|
53
|
+
if not isinstance(message, dict):
|
|
54
|
+
cleaned_messages.append(message)
|
|
55
|
+
continue
|
|
56
|
+
|
|
57
|
+
cleaned_message = dict(message)
|
|
58
|
+
cleaned_message["info"] = clean_message_info(message.get("info"))
|
|
59
|
+
cleaned_messages.append(cleaned_message)
|
|
60
|
+
|
|
61
|
+
cleaned["messages"] = cleaned_messages
|
|
62
|
+
|
|
24
63
|
return cleaned
|
|
25
64
|
|
|
26
65
|
|
|
27
66
|
def parse_args() -> argparse.Namespace:
|
|
28
67
|
parser = argparse.ArgumentParser(
|
|
29
|
-
description="Remove
|
|
68
|
+
description="Remove subagent-only top-level metadata from an OpenCode session export."
|
|
30
69
|
)
|
|
31
70
|
parser.add_argument("input", type=Path, help="Path to the source session JSON file")
|
|
32
71
|
parser.add_argument(
|
package/package.json
CHANGED
package/src/constants.js
CHANGED
|
@@ -1,87 +1,90 @@
|
|
|
1
|
-
import os from
|
|
2
|
-
import path from
|
|
3
|
-
import { fileURLToPath } from
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
4
|
|
|
5
|
-
export const PACKAGE_VERSION =
|
|
6
|
-
export const OPCODE_VERSION =
|
|
7
|
-
export const BR_VERSION =
|
|
8
|
-
export const PACKAGE_ROOT = path.resolve(
|
|
5
|
+
export const PACKAGE_VERSION = "0.4.5";
|
|
6
|
+
export const OPCODE_VERSION = "1.3.5";
|
|
7
|
+
export const BR_VERSION = "0.1.34";
|
|
8
|
+
export const PACKAGE_ROOT = path.resolve(
|
|
9
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
10
|
+
"..",
|
|
11
|
+
);
|
|
9
12
|
|
|
10
13
|
export function resolveHomeDir() {
|
|
11
|
-
return process.env.SLOPMACHINE_HOME || os.homedir()
|
|
14
|
+
return process.env.SLOPMACHINE_HOME || os.homedir();
|
|
12
15
|
}
|
|
13
16
|
|
|
14
17
|
export function buildPaths() {
|
|
15
|
-
const home = resolveHomeDir()
|
|
18
|
+
const home = resolveHomeDir();
|
|
16
19
|
return {
|
|
17
20
|
home,
|
|
18
|
-
slopmachineDir: path.join(home,
|
|
19
|
-
opencodeDir: path.join(home,
|
|
20
|
-
opencodeAgentsDir: path.join(home,
|
|
21
|
-
opencodeConfigPath: path.join(home,
|
|
22
|
-
globalSkillsDir: path.join(home,
|
|
23
|
-
}
|
|
21
|
+
slopmachineDir: path.join(home, "slopmachine"),
|
|
22
|
+
opencodeDir: path.join(home, ".config", "opencode"),
|
|
23
|
+
opencodeAgentsDir: path.join(home, ".config", "opencode", "agents"),
|
|
24
|
+
opencodeConfigPath: path.join(home, ".config", "opencode", "opencode.json"),
|
|
25
|
+
globalSkillsDir: path.join(home, ".agents", "skills"),
|
|
26
|
+
};
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
export const REQUIRED_SKILL_DIRS = [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
]
|
|
30
|
+
"clarification-gate",
|
|
31
|
+
"developer-session-lifecycle",
|
|
32
|
+
"session-rollover",
|
|
33
|
+
"final-evaluation-orchestration",
|
|
34
|
+
"beads-operations",
|
|
35
|
+
"planning-guidance",
|
|
36
|
+
"planning-gate",
|
|
37
|
+
"scaffold-guidance",
|
|
38
|
+
"development-guidance",
|
|
39
|
+
"verification-gates",
|
|
40
|
+
"integrated-verification",
|
|
41
|
+
"hardening-gate",
|
|
42
|
+
"evaluation-triage",
|
|
43
|
+
"remediation-guidance",
|
|
44
|
+
"submission-packaging",
|
|
45
|
+
"retrospective-analysis",
|
|
46
|
+
"owner-evidence-discipline",
|
|
47
|
+
"report-output-discipline",
|
|
48
|
+
"frontend-design",
|
|
49
|
+
];
|
|
47
50
|
|
|
48
51
|
export const REQUIRED_SLOPMACHINE_FILES = [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
]
|
|
52
|
+
"backend-evaluation-prompt.md",
|
|
53
|
+
"frontend-evaluation-prompt.md",
|
|
54
|
+
"document-completeness.md",
|
|
55
|
+
"quality-document.md",
|
|
56
|
+
"engineering-results.md",
|
|
57
|
+
"implementation-comparison.md",
|
|
58
|
+
"workflow-init.js",
|
|
59
|
+
"templates/AGENTS.md",
|
|
60
|
+
"utils/strip_session_parent.py",
|
|
61
|
+
"utils/convert_ai_session.py",
|
|
62
|
+
];
|
|
60
63
|
|
|
61
64
|
export const MCP_ENTRIES = {
|
|
62
|
-
|
|
63
|
-
type:
|
|
64
|
-
command: [
|
|
65
|
+
"chrome-devtools": {
|
|
66
|
+
type: "local",
|
|
67
|
+
command: ["npx", "-y", "chrome-devtools-mcp@latest"],
|
|
65
68
|
},
|
|
66
69
|
context7: {
|
|
67
70
|
enabled: true,
|
|
68
|
-
type:
|
|
69
|
-
url:
|
|
71
|
+
type: "remote",
|
|
72
|
+
url: "https://mcp.context7.com/mcp",
|
|
70
73
|
headers: {
|
|
71
|
-
CONTEXT7_API_KEY:
|
|
74
|
+
CONTEXT7_API_KEY: "",
|
|
72
75
|
},
|
|
73
76
|
},
|
|
74
77
|
exa: {
|
|
75
78
|
enabled: true,
|
|
76
|
-
type:
|
|
77
|
-
url:
|
|
79
|
+
type: "remote",
|
|
80
|
+
url: "https://mcp.exa.ai/mcp",
|
|
78
81
|
headers: {
|
|
79
|
-
EXA_API_KEY:
|
|
82
|
+
EXA_API_KEY: "",
|
|
80
83
|
},
|
|
81
84
|
},
|
|
82
85
|
shadcn: {
|
|
83
|
-
command: [
|
|
86
|
+
command: ["npx", "shadcn@latest", "mcp"],
|
|
84
87
|
enabled: false,
|
|
85
|
-
type:
|
|
88
|
+
type: "local",
|
|
86
89
|
},
|
|
87
|
-
}
|
|
90
|
+
};
|