@goodandready/dsh-goal 0.1.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/LICENSE +21 -0
- package/README.md +47 -0
- package/README.ru.md +51 -0
- package/cordis.patch.yml +4 -0
- package/docs/design/DESIGN.md +72 -0
- package/lib/client.js +694 -0
- package/lib/goal-engine.js +353 -0
- package/lib/index.js +223 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 goodandready
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# @goodandready/dsh-goal
|
|
2
|
+
|
|
3
|
+
> **Goal Mode & Autonomous Execution Plugin for DeepSeek Harness (DSH)**
|
|
4
|
+
|
|
5
|
+
`dsh-goal` adds an autonomous goal-tracking loop with a sticky top status banner, milestone decomposition, live timer, and interactive controls (pause, resume, cancel, modal details).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- π― **Sticky Top Goal Banner**: Minimalist header pinned above the chat showing the active goal, elapsed timer (`β’ 2s`, `β’ 1m 45s`), and controls.
|
|
12
|
+
- βΈοΈ **Play / Pause / Cancel**: Instantly halt autonomous multi-turn loops or resume whenever ready.
|
|
13
|
+
- βΆ **Milestone Modal Drawer**: Interactive checklist of sub-tasks with progress bar and execution logs.
|
|
14
|
+
- π€ **Agent Tools**:
|
|
15
|
+
- `goal_set_milestones`: Autonomous breakdown of high-level goals into step-by-step tasks.
|
|
16
|
+
- `goal_update_progress`: Step-by-step milestone completion tracking.
|
|
17
|
+
- `goal_finish`: Goal completion with deliverable summary.
|
|
18
|
+
- βοΈ **Safety Limit & Settings**: Max iterations guardrail to prevent infinite agent loops.
|
|
19
|
+
- π **Bilingual**: Full English and Russian localization.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
dsh plugin add @goodandready/dsh-goal
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
1. Start a goal in chat:
|
|
32
|
+
```text
|
|
33
|
+
/goal Refactor auth tokens and write integration tests
|
|
34
|
+
```
|
|
35
|
+
2. Or use the REST API:
|
|
36
|
+
```bash
|
|
37
|
+
curl -X POST http://localhost:3080/dsh-goal/action \
|
|
38
|
+
-H "Content-Type: application/json" \
|
|
39
|
+
-d '{"action":"start","title":"Optimize database queries"}'
|
|
40
|
+
```
|
|
41
|
+
3. Watch the sticky top banner update with live timer and milestones in real-time.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## License
|
|
46
|
+
|
|
47
|
+
MIT Β© [goodandready](https://goodandready.app)
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# @goodandready/dsh-goal
|
|
2
|
+
|
|
3
|
+
> **ΠΠ»Π°Π³ΠΈΠ½ ΡΠ΅Π»Π΅ΠΏΠΎΠ»Π°Π³Π°Π½ΠΈΡ ΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ (Goal Mode) Π΄Π»Ρ DeepSeek Harness**
|
|
4
|
+
|
|
5
|
+
`dsh-goal` Π²Π½Π΅Π΄ΡΡΠ΅Ρ Π² DeepSeek Harness Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ΅Π»Π΅ΠΏΠΎΠ»Π°Π³Π°Π½ΠΈΡ Ρ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½ΠΎΠΉ Π²Π΅ΡΡ
Π½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΡΡ (Sticky Top Banner), Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠ΅ΠΉ ΡΠ°Π³ΠΎΠ² Π½Π° Π²Π΅Ρ
ΠΈ (milestones), ΠΆΠΈΠ²ΡΠΌ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠΌ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ (ΠΏΠ°ΡΠ·Π°, ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡΠΌΠ΅Π½Π°, ΠΎΠΊΠ½ΠΎ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΠ»ΠΈΡΡΠ°).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
|
|
10
|
+
|
|
11
|
+
- π― **ΠΠ°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ ΡΠ΅Π»ΠΈ (Top Banner)**: ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π°Ρ ΠΏΠ»Π°ΡΠΊΠ° Π½Π°Π΄ ΡΠ°ΡΠΎΠΌ Π² ΡΡΠΈΠ»Π΅ Π½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ UI DSH:
|
|
12
|
+
- ΠΠΊΠΎΠ½ΠΊΠ° ΠΌΠΈΡΠ΅Π½ΠΈ π―;
|
|
13
|
+
- ΠΠ΅ΠΉΠ±Π» Β«Π’Π΅ΠΊΡΡΠ°Ρ ΡΠ΅Π»ΡΒ» ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ;
|
|
14
|
+
- ΠΠΈΠ²ΠΎΠΉ ΡΠ΅ΠΊΡΠ½Π΄ΠΎΠΌΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (`β’ 2s`, `β’ 14s`, `β’ 2m 10s`);
|
|
15
|
+
- ΠΡΡΡΡΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ: π (ΡΠ±ΡΠΎΡΠΈΡΡ/ΠΎΡΠΌΠ΅Π½ΠΈΡΡ), βΈ / βΆ (ΠΏΠ°ΡΠ·Π°/Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅), βΆ (ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π΄Π΅ΡΠ°Π»ΠΈ).
|
|
16
|
+
- βΆ **ΠΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΡΠ΅ΠΊΠ»ΠΈΡΡΠ° Π²Π΅Ρ
**: ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ, ΠΏΡΠΎΠ³ΡΠ΅ΡΡ-Π±Π°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (0β100%) ΠΈ Π»ΠΎΠ³ ΡΠ°Π³ΠΎΠ².
|
|
17
|
+
- π€ **ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ**:
|
|
18
|
+
- `goal_set_milestones` β ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠ°ΠΏΡ;
|
|
19
|
+
- `goal_update_progress` β ΡΠΈΠΊΡΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ°;
|
|
20
|
+
- `goal_finish` β Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈ Ρ ΠΈΡΠΎΠ³ΠΎΠ²ΡΠΌ ΡΠ΅Π·ΡΠΌΠ΅.
|
|
21
|
+
- π‘οΈ **Safety Guardrails**: Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ Π»ΠΈΠΌΠΈΡ ΡΠ°Π³ΠΎΠ² (maxIterations) Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ Π·Π°ΡΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΡ.
|
|
22
|
+
- βοΈ **ΠΠ°ΡΡΠΎΡΠΊΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ**: ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β ΠΠ»Π°Π³ΠΈΠ½ΡΒ».
|
|
23
|
+
- π **ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ**: ΠΏΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΡΡΠΊΠΎΠ³ΠΎ ΠΈ Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠΎΠ².
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
dsh plugin add @goodandready/dsh-goal
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
|
|
34
|
+
|
|
35
|
+
1. ΠΠΎΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΡΠ°ΡΠ΅:
|
|
36
|
+
```text
|
|
37
|
+
/goal ΠΡΠΏΡΠ°Π²ΠΈΡΡ Π±Π°Π³ Π² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅ΡΡΡ
|
|
38
|
+
```
|
|
39
|
+
2. ΠΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅ΡΠ΅Π· REST API:
|
|
40
|
+
```bash
|
|
41
|
+
curl -X POST http://localhost:3080/dsh-goal/action \
|
|
42
|
+
-H "Content-Type: application/json" \
|
|
43
|
+
-d '{"action":"start","title":"ΠΡΠΈΠ²Π΅Ρ"}'
|
|
44
|
+
```
|
|
45
|
+
3. Π‘Π²Π΅ΡΡ
Ρ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΠ°Π½Π΅Π»Ρ Ρ ΡΠ°ΠΉΠΌΠ΅ΡΠΎΠΌ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## ΠΠΈΡΠ΅Π½Π·ΠΈΡ
|
|
50
|
+
|
|
51
|
+
MIT Β© [goodandready](https://goodandready.app)
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# DESIGN.md β ΠΠΈΠ·Π°ΠΉΠ½-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ `dsh-goal`
|
|
2
|
+
|
|
3
|
+
## 1. ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ
|
|
4
|
+
|
|
5
|
+
ΠΠ»Π°Π³ΠΈΠ½ `dsh-goal` ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΠ΅Π»Π΅ΠΉ (Goal Mode) Π΄Π»Ρ **DeepSeek Harness** (DSH).
|
|
6
|
+
ΠΠΈΠ·ΡΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΌΠΈΠ½Π°Π½ΡΠ° β ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½Π°Ρ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½Π°Ρ Π²Π΅ΡΡ
Π½ΡΡ ΠΏΠ°Π½Π΅Π»Ρ (Sticky Top Banner), ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠ°Ρ ΡΠ΅ΠΊΡΡΡΡ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΡΠ΅Π»Ρ, ΡΠ΅ΠΊΡΠ½Π΄ΠΎΠΌΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (π ΡΠ±ΡΠΎΡ, βΈ ΠΏΠ°ΡΠ·Π°/Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, βΆ Π΄Π΅ΡΠ°Π»ΠΈ/ΠΌΠΎΠ΄Π°Π»ΠΊΠ°).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 2. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠΈ (User Surfaces)
|
|
11
|
+
|
|
12
|
+
### 2.1 Sticky Top Banner (ΠΠ΅ΡΡ
Π½ΡΡ Π·Π°ΠΊΡΠ΅ΠΏΠ»ΡΠ½Π½Π°Ρ ΠΏΠ°Π½Π΅Π»Ρ ΡΠ΅Π»ΠΈ)
|
|
13
|
+
- **Π Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅**: ΠΠ΅ΡΡ
Π½ΡΡ ΡΠ°ΡΡΡ ΠΎΠΊΠ½Π° ΡΠ°ΡΠ°/ΡΠ΅ΡΡΠΈΠΈ Π½Π°Π΄ Π»Π΅Π½ΡΠΎΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
|
|
14
|
+
- **ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ**:
|
|
15
|
+
1. `IconTarget` (π― SVG 16x16, ΠΎΠ±Π²ΠΎΠ΄ΠΊΠ° `currentColor`);
|
|
16
|
+
2. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ **Β«Π’Π΅ΠΊΡΡΠ°Ρ ΡΠ΅Π»ΡΒ»** (Π²Π΅Ρ 600, `var(--dsw-alias-label-primary)`);
|
|
17
|
+
3. Π’Π΅ΠΊΡΡ ΡΠ΅Π»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Β«ΠΏΡΠΈΠ²Π΅ΡΒ» ΠΈΠ»ΠΈ Β«ΠΡΠΏΡΠ°Π²ΠΈΡΡ Π±Π°Π³ Π² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΒ», ΡΠ²Π΅Ρ `var(--dsw-alias-label-secondary)`, `text-overflow: ellipsis`);
|
|
18
|
+
4. Π Π°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ ΠΈ ΡΠ°ΠΉΠΌΠ΅Ρ: `β’ 2s` (Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΡΡΡΠΈΠΊ `β’ 14s`, `β’ 2m 15s`, ΡΡΠΈΡΡ `monospace`);
|
|
19
|
+
5. ΠΠ°Π½Π΅Π»Ρ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΡΠΏΡΠ°Π²Π°:
|
|
20
|
+
- ΠΠ½ΠΎΠΏΠΊΠ° **π (ΠΡΠΈΡΡΠΈΡΡ / ΠΡΠΌΠ΅Π½ΠΈΡΡ)**: Π΄ΠΈΠ°Π»ΠΎΠ³ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡΠΌΠ΅Π½Ρ/ΡΠ±ΡΠΎΡΠ° ΡΠ΅Π»ΠΈ;
|
|
21
|
+
- ΠΠ½ΠΎΠΏΠΊΠ° **βΈ / βΆ (ΠΠ°ΡΠ·Π° / ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ)**: ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ (`RUNNING`) ΠΈ ΠΏΠ°ΡΠ·ΠΎΠΉ (`PAUSED`);
|
|
22
|
+
- ΠΠ½ΠΎΠΏΠΊΠ° **βΆ (Π Π°Π·Π²Π΅ΡΠ½ΡΡΡ Π΄Π΅ΡΠ°Π»ΠΈ)**: ΠΎΡΠΊΡΡΡΠΈΠ΅ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π²Π΅Ρ
ΠΈ Π»ΠΎΠ³ΠΎΠΌ.
|
|
23
|
+
|
|
24
|
+
### 2.2 Modal Details Dialog (ΠΠΊΠ½ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠ° βΆ)
|
|
25
|
+
- **Π¨Π°ΠΏΠΊΠ°**: ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈ, ΡΡΠ°ΡΡΡ-Π±Π΅ΠΉΠ΄ΠΆ (`Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅`, `ΠΠ° ΠΏΠ°ΡΠ·Π΅`, `ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΎ`), ΠΎΠ±ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
|
|
26
|
+
- **Π’Π΅Π»ΠΎ**:
|
|
27
|
+
- Π§Π΅ΠΊΠ»ΠΈΡΡ Π²Π΅Ρ
(Milestones): ΡΡΠ°ΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ
ΠΈ (`pending` β³, `in_progress` π, `completed` β
, `failed` β);
|
|
28
|
+
- ΠΠΎΠ³ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΡΡ
Π²ΡΠ²ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ;
|
|
29
|
+
- ΠΠ΅ΡΡΠΈΠΊΠΈ: ΠΎΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ (turns), ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π»ΠΈΠΌΠΈΡ.
|
|
30
|
+
- **Π€ΡΡΠ΅Ρ**: ΠΠ½ΠΎΠΏΠΊΠΈ ΡΡΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π³Π°, ΠΏΠ°ΡΠ·Ρ ΠΈ Π·Π°ΠΊΡΡΡΠΈΡ.
|
|
31
|
+
|
|
32
|
+
### 2.3 Settings Card (`settings.plugin.item`)
|
|
33
|
+
- Π Π°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Β«ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ β ΠΠ»Π°Π³ΠΈΠ½ΡΒ».
|
|
34
|
+
- ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
|
|
35
|
+
- `maxIterations`: ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ
ΡΠ°Π³ΠΎΠ² Π΄ΠΎ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (Π΄Π΅ΡΠΎΠ»Ρ: 25);
|
|
36
|
+
- `autoDrive`: Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ ΠΌΠΎΠ΄Π΅Π»ΠΈ (Π΄Π΅ΡΠΎΠ»Ρ: true);
|
|
37
|
+
- `enableSound`: Π·Π²ΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΈΠ³Π½Π°Π» ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ΅Π»ΠΈ (Π΄Π΅ΡΠΎΠ»Ρ: true);
|
|
38
|
+
- `promptTemplate`: ΡΠ°Π±Π»ΠΎΠ½ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΠΆΠ΅ΠΊΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 3. Π¦Π²Π΅ΡΠΎΠ²Π°Ρ ΠΏΠ°Π»ΠΈΡΡΠ° ΠΈ ΡΠΎΠΊΠ΅Π½Ρ DSH
|
|
43
|
+
|
|
44
|
+
ΠΠ»Π°Π³ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ DSH:
|
|
45
|
+
- Π€ΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ»ΠΎΠΉ: `var(--dsw-alias-bg-layer-3)` ΠΈ `var(--dsw-alias-bg-layer-2)`
|
|
46
|
+
- ΠΡΠ°Π½ΠΈΡΡ: `var(--dsw-alias-border-l2)`
|
|
47
|
+
- Π’Π΅ΠΊΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ: `var(--dsw-alias-label-primary)`
|
|
48
|
+
- Π’Π΅ΠΊΡΡ Π²ΡΠΎΡΠΈΡΠ½ΡΠΉ: `var(--dsw-alias-label-secondary)`
|
|
49
|
+
- Π’Π΅ΠΊΡΡ ΡΡΠ΅ΡΠΈΡΠ½ΡΠΉ / ΠΌΠ΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ: `var(--dsw-alias-label-tertiary)`
|
|
50
|
+
- ΠΠΊΡΠ΅Π½Ρ/ΡΡΠΏΠ΅Ρ
: `var(--dsw-alias-status-success)`
|
|
51
|
+
- ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅/ΠΏΠ°ΡΠ·Π°: `var(--dsw-alias-status-warning)`
|
|
52
|
+
- ΠΡΠΈΠ±ΠΊΠ°/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅: `var(--dsw-alias-status-danger)`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 4. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ (State Machine)
|
|
57
|
+
|
|
58
|
+
| Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ | ΠΠ°Π½Π½Π΅Ρ | ΠΠ΅ΠΉΡΡΠ²ΠΈΡ |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `IDLE` | Π‘ΠΊΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ΠΉΡΡΠ°Π»ΡΠ½ΡΠΉ placeholder | ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ΅Π»ΡΒ» |
|
|
61
|
+
| `RUNNING` | ΠΠΊΡΠΈΠ²Π΅Π½, ΡΠ°ΠΉΠΌΠ΅Ρ ΡΠΈΠΊΠ°Π΅Ρ, ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ ΠΌΠΈΡΠ΅Π½ΠΈ | π ΠΡΠΌΠ΅Π½Π°, βΈ ΠΠ°ΡΠ·Π°, βΆ ΠΠ΅ΡΠ°Π»ΠΈ |
|
|
62
|
+
| `PAUSED` | ΠΠΊΡΠΈΠ²Π΅Π½, ΡΠ°ΠΉΠΌΠ΅Ρ Π·Π°ΡΡΡΠ», ΠΈΠΊΠΎΠ½ΠΊΠ° βΆ Π²ΠΌΠ΅ΡΡΠΎ βΈ | π ΠΡΠΌΠ΅Π½Π°, βΆ ΠΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ, βΆ ΠΠ΅ΡΠ°Π»ΠΈ |
|
|
63
|
+
| `COMPLETED` | ΠΠΊΡΠΈΠ²Π΅Π½, Π·Π΅Π»ΡΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° ΡΡΠΏΠ΅Ρ
Π°, ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ | π ΠΡΠΈΡΡΠΈΡΡ, βΆ ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΎΡΡΡΡ |
|
|
64
|
+
| `FAILED` | ΠΠΊΡΠΈΠ²Π΅Π½, ΠΊΡΠ°ΡΠ½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° ΠΎΡΠΈΠ±ΠΊΠΈ/Π»ΠΈΠΌΠΈΡΠ° | π ΠΡΠΈΡΡΠΈΡΡ, βΆ ΠΠΎΠ³ΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 5. Locked Design Decisions
|
|
69
|
+
|
|
70
|
+
1. **ΠΠ΄ΠΈΠ½ΡΠΉ ΠΏΡΠ΅ΡΠΈΠΊΡ ΠΊΠ»Π°ΡΡΠΎΠ²**: `.dsh-goal-*` Π²ΠΎ Π²ΡΠ΅Ρ
CSS-ΠΏΡΠ°Π²ΠΈΠ»Π°Ρ
Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΡΡΠΈΠ»Π΅ΠΉ.
|
|
71
|
+
2. **Π’ΠΎΡΠ½ΡΠΉ ΠΌΠ°ΠΊΠ΅Ρ Π±Π°Π½Π½Π΅ΡΠ°**: ΡΠΊΡΡΠ³Π»Π΅Π½ΠΈΠ΅ ΡΠ³Π»ΠΎΠ² 8β10px, ΡΠ°ΠΏΠΊΠ° Ρ ΠΎΡΡΡΡΠΏΠ°ΠΌΠΈ `8px 16px`, Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠ΅Π½ΡΡΡ, ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠΏΡΠ°Π²Π° Ρ `gap: 10px`.
|
|
72
|
+
3. **ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈΠΌΠΏΠΎΡΡΠΎΠ²**: Π²ΡΠ΅ `require('@deepseek-ai/dsh-client-ui-primitives')` ΠΎΠ±ΡΡΠ½ΡΡΡ Π² `try/catch` Ρ SVG-ΡΠΎΠ»Π»Π±Π΅ΠΊΠ°ΠΌΠΈ.
|