vibe-coding-master 0.2.3 → 0.2.4
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/README.md +6 -2
- package/dist/backend/services/round-service.js +0 -1
- package/dist/backend/templates/harness/claude-root.js +10 -0
- package/dist/backend/templates/harness/vcm-long-running-validation-skill.js +7 -2
- package/dist-frontend/assets/{index-DaVjpyA9.js → index-CfZ3VYXY.js} +41 -41
- package/dist-frontend/index.html +1 -1
- package/docs/full-harness-baseline.md +4 -4
- package/docs/product-design.md +4 -1
- package/docs/vcm-cc-best-practices.md +5 -0
- package/package.json +1 -1
- package/scripts/install-vcm-harness.mjs +41 -5
package/dist-frontend/index.html
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>VibeCodingMaster</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-CfZ3VYXY.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-CfqduxVB.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -91,13 +91,13 @@ These entries match the current `example/rust-layered/.ai/vcm-harness-manifest.j
|
|
|
91
91
|
| Skill directory | `.claude/skills/vcm-harness-bootstrap/` | VCM-created directory | Conditional long-term | Claude Code registration directory for the harness-bootstrap skill. |
|
|
92
92
|
| Skill | `.claude/skills/vcm-route-message/SKILL.md` | whole-file | Conditional long-term | Route-file authoring protocol. |
|
|
93
93
|
| Skill | `.claude/skills/vcm-final-acceptance/SKILL.md` | whole-file | Conditional long-term | PM final evidence audit. |
|
|
94
|
-
| Skill | `.claude/skills/vcm-long-running-validation/SKILL.md` | whole-file | Conditional long-term | Role-independent long-running command protocol. |
|
|
94
|
+
| Skill | `.claude/skills/vcm-long-running-validation/SKILL.md` | whole-file | Conditional long-term | Role-independent long-running command protocol with 60 minute maximum timeout. |
|
|
95
95
|
| Skill | `.claude/skills/vcm-harness-bootstrap/SKILL.md` | whole-file | Conditional long-term | AI-assisted project understanding procedure. |
|
|
96
96
|
| Harness tool directory | `.ai/tools/` | VCM-created directory | Long-term | Repo-local harness tools. |
|
|
97
97
|
| Generated-context tool | `.ai/tools/generate-module-index` | whole-file | Long-term | Generates `.ai/generated/module-index.json`. |
|
|
98
98
|
| Generated-context tool | `.ai/tools/generate-public-surface` | whole-file | Long-term | Generates `.ai/generated/public-surface.json`. |
|
|
99
|
-
| Runtime tool | `.ai/tools/run-long-check` | whole-file | Conditional long-term | Starts file-backed long-running
|
|
100
|
-
| Runtime tool | `.ai/tools/watch-job` | whole-file | Conditional long-term | Bounded watcher for long-running command jobs. |
|
|
99
|
+
| Runtime tool | `.ai/tools/run-long-check` | whole-file | Conditional long-term | Starts the only VCM-allowed file-backed background job for long-running validation. |
|
|
100
|
+
| Runtime tool | `.ai/tools/watch-job` | whole-file | Conditional long-term | Bounded watcher for long-running command jobs; rejects timeouts over 60 minutes. |
|
|
101
101
|
| Generated context directory | `.ai/generated/` | VCM-created directory | Long-term | Derived context artifacts. |
|
|
102
102
|
| Generated context | `.ai/generated/module-index.json` | derived artifact | Derived | Regenerated by `generate-module-index`; do not hand-edit as source truth. |
|
|
103
103
|
| Generated context | `.ai/generated/public-surface.json` | derived artifact | Derived | Regenerated by `generate-public-surface`; do not hand-edit as source truth. |
|
|
@@ -167,7 +167,7 @@ The current example installs these skills:
|
|
|
167
167
|
|
|
168
168
|
- `vcm-route-message`: route-file write protocol.
|
|
169
169
|
- `vcm-final-acceptance`: final PM evidence audit.
|
|
170
|
-
- `vcm-long-running-validation`: role-independent long-running command protocol.
|
|
170
|
+
- `vcm-long-running-validation`: role-independent long-running command protocol with a 60 minute maximum timeout.
|
|
171
171
|
- `vcm-harness-bootstrap`: one-time or occasional project-understanding, generated-context refresh, and durable-doc bootstrap procedure.
|
|
172
172
|
|
|
173
173
|
The current example does not install a separate `vcm-docs-sync` skill. Docs sync
|
package/docs/product-design.md
CHANGED
|
@@ -253,6 +253,7 @@ The default theme mode is `System`, which follows the OS/browser color-scheme pr
|
|
|
253
253
|
|
|
254
254
|
When `Flow pause alert` is on, VCM plays a short, soft, two-note local chime after a role flow stops advancing. If the flow lasted less than 10 minutes, the chime plays 3 times, 1.4 seconds apart, and stops. If the flow lasted 10 minutes or longer, VCM shows an in-app alert dialog and repeats the chime until the user confirms the dialog. The alert sound must reuse one browser audio context after user activation instead of creating a fresh context for each repeat, because Safari can block repeated timer-driven playback when every repeat looks like a new autoplay attempt.
|
|
255
255
|
`Try alert` must work even when no flow has just paused so the user can verify browser sound and notification behavior.
|
|
256
|
+
Safari may still require the user to manually set `Safari > Website Settings > Auto-Play > Allow All Auto-Play`; Chrome is the recommended browser for reliable repeated alert sound.
|
|
256
257
|
|
|
257
258
|
There is no separate `Pause orchestration` or `Resume orchestration` control in the GUI. The current product model is one on/off toggle in the role console toolbar.
|
|
258
259
|
|
|
@@ -337,7 +338,7 @@ Task-level round state:
|
|
|
337
338
|
- The normal pause transition is timer-driven from the `Stop` event. Round-state reads also settle expired deadlines as a recovery fallback after restarts, sleep, or missed timers.
|
|
338
339
|
- The same round state stores total round count, prompt-submit count, stop count, and Claude Code active runtime. Active runtime is measured only between `UserPromptSubmit` and `Stop`, not during the settling window.
|
|
339
340
|
|
|
340
|
-
The frontend polls this task-level round state and deduplicates
|
|
341
|
+
The frontend polls this task-level round state and deduplicates each paused round so the same paused state does not alert on every poll. Flow duration is measured from the first `UserPromptSubmit` to `pausedAt`, falling back to the last `Stop` when needed. Pauses under 10 minutes trigger the weak 3-chime reminder at 1.4 second intervals. Pauses at or above 10 minutes trigger the strong alert dialog and repeating sound until confirmation.
|
|
341
342
|
|
|
342
343
|
## 9. Session Lifecycle
|
|
343
344
|
|
|
@@ -516,6 +517,8 @@ VCM uses `UserPromptSubmit` as the Claude Code acceptance signal. A successful P
|
|
|
516
517
|
|
|
517
518
|
The injected role rules require asynchronous file messaging: after writing or updating a route file, the role must end the current Claude Code turn and wait for VCM to deliver a later reply. Roles should use `.claude/skills/vcm-route-message/SKILL.md` to author route files. Roles must not poll files, start shell loops, keep the turn open waiting for another role to answer, paste directly into another role terminal, or use Claude Code Task/Subagent for VCM role delegation.
|
|
518
519
|
|
|
520
|
+
Roles must not start background jobs. The only allowed background job is `.ai/tools/run-long-check` when used through `vcm-long-running-validation`; `watch-job` rejects timeouts over 60 minutes.
|
|
521
|
+
|
|
519
522
|
There is no `vcmctl` in the target design. Hook entrypoints are direct HTTP from Claude Code hooks to the local VCM backend.
|
|
520
523
|
|
|
521
524
|
## 13. Translation
|
|
@@ -280,6 +280,11 @@ This skill is role-independent. It only handles long-running command execution,
|
|
|
280
280
|
bounded waiting, file-backed status, timeout, and log summaries. The caller
|
|
281
281
|
decides where to record command evidence.
|
|
282
282
|
|
|
283
|
+
VCM roles must not start background jobs. The only allowed background job is
|
|
284
|
+
`.ai/tools/run-long-check` when used through `vcm-long-running-validation`.
|
|
285
|
+
`vcm-long-running-validation` has a hard maximum timeout of 60 minutes; split
|
|
286
|
+
larger validation/build work or ask the user before suggesting anything longer.
|
|
287
|
+
|
|
283
288
|
## 10. Generated Context
|
|
284
289
|
|
|
285
290
|
The current example has two generated artifacts:
|
package/package.json
CHANGED
|
@@ -39,7 +39,16 @@ const MANAGED_FILES = [
|
|
|
39
39
|
- Use the durable project docs below as role-relevant project truth.
|
|
40
40
|
- Read module-local \`CLAUDE.md\` before editing a subdirectory if one exists.
|
|
41
41
|
- Use \`vcm-route-message\` whenever a VCM role hands off work, asks another role a question, reports a result, reports a blocker, or raises a finding. Follow its write-then-stop rule.
|
|
42
|
-
- Use \`vcm-long-running-validation\` for
|
|
42
|
+
- Use \`vcm-long-running-validation\` for long-running validation. Follow the background job limits below.
|
|
43
|
+
|
|
44
|
+
## VCM Background Jobs
|
|
45
|
+
|
|
46
|
+
- Do not start background jobs.
|
|
47
|
+
- The only allowed background job is \`.ai/tools/run-long-check\` when used through the \`vcm-long-running-validation\` skill.
|
|
48
|
+
- \`vcm-long-running-validation\` has a hard maximum timeout of 60 minutes.
|
|
49
|
+
- Do not run or suggest operations expected to exceed 60 minutes without user approval.
|
|
50
|
+
- Design every single validation/build operation to complete within 60 minutes; split anything larger before running it.
|
|
51
|
+
- Do not end the current turn only to wait for a long-running shell callback.
|
|
43
52
|
|
|
44
53
|
## VCM Durable Project Docs
|
|
45
54
|
|
|
@@ -613,9 +622,11 @@ Use this skill for builds, browser checks, E2E tests, release suites, or any com
|
|
|
613
622
|
|
|
614
623
|
## Rule
|
|
615
624
|
|
|
616
|
-
Do not
|
|
625
|
+
Do not start background jobs.
|
|
617
626
|
|
|
618
|
-
|
|
627
|
+
The only allowed background job is \`.ai/tools/run-long-check\` when used through this skill.
|
|
628
|
+
|
|
629
|
+
This skill has a hard maximum timeout of 60 minutes. Do not run or suggest operations expected to exceed 60 minutes without user approval.
|
|
619
630
|
|
|
620
631
|
## Protocol
|
|
621
632
|
|
|
@@ -646,12 +657,15 @@ Example:
|
|
|
646
657
|
|
|
647
658
|
Timeout is not "unknown". It is a command result.
|
|
648
659
|
|
|
660
|
+
\`watch-job\` rejects timeouts over 60 minutes.
|
|
661
|
+
|
|
649
662
|
On timeout:
|
|
650
663
|
|
|
651
664
|
- summarize the latest log tail
|
|
652
665
|
- record the timeout in \`status.json\`
|
|
653
666
|
- report whether the timed-out process was stopped
|
|
654
667
|
- do not mark the command as passed
|
|
668
|
+
- do not continue the job in the background
|
|
655
669
|
|
|
656
670
|
\`watch-job\` should attempt to stop the timed-out command process group. If termination cannot be confirmed, say so in the summary.
|
|
657
671
|
|
|
@@ -916,11 +930,15 @@ import argparse
|
|
|
916
930
|
import json
|
|
917
931
|
import os
|
|
918
932
|
import signal
|
|
933
|
+
import sys
|
|
919
934
|
import time
|
|
920
935
|
from datetime import datetime, timezone
|
|
921
936
|
from pathlib import Path
|
|
922
937
|
|
|
923
938
|
|
|
939
|
+
MAX_TIMEOUT_SECONDS = 60 * 60
|
|
940
|
+
|
|
941
|
+
|
|
924
942
|
def root_dir() -> Path:
|
|
925
943
|
return Path(__file__).resolve().parents[2]
|
|
926
944
|
|
|
@@ -938,6 +956,16 @@ def parse_duration(value: str) -> float:
|
|
|
938
956
|
return float(value)
|
|
939
957
|
|
|
940
958
|
|
|
959
|
+
def validate_duration(name: str, value: float, maximum: float | None = None) -> bool:
|
|
960
|
+
if value <= 0:
|
|
961
|
+
print(f"error: {name} must be positive", file=sys.stderr)
|
|
962
|
+
return False
|
|
963
|
+
if maximum is not None and value > maximum:
|
|
964
|
+
print(f"error: {name} exceeds maximum 60m", file=sys.stderr)
|
|
965
|
+
return False
|
|
966
|
+
return True
|
|
967
|
+
|
|
968
|
+
|
|
941
969
|
def read_status(path: Path) -> dict:
|
|
942
970
|
return json.loads(path.read_text())
|
|
943
971
|
|
|
@@ -1056,8 +1084,16 @@ def main() -> int:
|
|
|
1056
1084
|
parser.add_argument("--interval", default="1s")
|
|
1057
1085
|
args = parser.parse_args()
|
|
1058
1086
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1087
|
+
try:
|
|
1088
|
+
timeout = parse_duration(args.timeout)
|
|
1089
|
+
interval = parse_duration(args.interval)
|
|
1090
|
+
except ValueError as exc:
|
|
1091
|
+
print(f"error: invalid duration: {exc}", file=sys.stderr)
|
|
1092
|
+
return 2
|
|
1093
|
+
if not validate_duration("timeout", timeout, MAX_TIMEOUT_SECONDS):
|
|
1094
|
+
return 2
|
|
1095
|
+
if not validate_duration("interval", interval):
|
|
1096
|
+
return 2
|
|
1061
1097
|
directory = root_dir() / ".ai/vcm/jobs" / args.job_id
|
|
1062
1098
|
status_path = directory / "status.json"
|
|
1063
1099
|
|