vibe-coding-master 0.7.43 → 0.7.45
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 +64 -39
- package/dist/backend/adapters/claude-adapter.js +2 -2
- package/dist/backend/adapters/codex-bridge-adapter.js +213 -0
- package/dist/backend/api/app-settings-routes.js +6 -6
- package/dist/backend/api/artifact-routes.js +3 -0
- package/dist/backend/api/harness-routes.js +16 -0
- package/dist/backend/api/task-routes.js +1 -0
- package/dist/backend/api/workflow-control-routes.js +12 -0
- package/dist/backend/cli/install-vcm-harness.js +21 -0
- package/dist/backend/server.js +11 -9
- package/dist/backend/services/app-settings-service.js +11 -11
- package/dist/backend/services/artifact-service.js +7 -30
- package/dist/backend/services/auto-memory-service.js +640 -12
- package/dist/backend/services/claude-hook-service.js +80 -2
- package/dist/backend/services/{ccr-integration-service.js → codex-bridge-integration-service.js} +71 -71
- package/dist/backend/services/gate-review-service.js +173 -74
- package/dist/backend/services/harness-feedback-service.js +76 -78
- package/dist/backend/services/harness-service.js +27 -3
- package/dist/backend/services/runtime-coordinator-service.js +2 -1
- package/dist/backend/services/session-service.js +16 -16
- package/dist/backend/services/status-service.js +1 -0
- package/dist/backend/services/translation-worker-service.js +19 -4
- package/dist/backend/services/usage-analytics-service.js +3 -3
- package/dist/backend/services/workflow-control-service.js +96 -12
- package/dist/backend/templates/handoff.js +44 -2
- package/dist/backend/templates/harness/architect-agent.js +13 -7
- package/dist/backend/templates/harness/architect-scaffold-worker-agent.js +1 -1
- package/dist/backend/templates/harness/check-scaffold-ledger.js +234 -10
- package/dist/backend/templates/harness/claude-root.js +3 -2
- package/dist/backend/templates/harness/coder-agent.js +8 -0
- package/dist/backend/templates/harness/gate-review.js +144 -49
- package/dist/backend/templates/harness/harness-engineer-agent.js +25 -10
- package/dist/backend/templates/harness/project-manager-agent.js +16 -10
- package/dist/backend/templates/harness/resolve-durable-doc-assignment.js +60 -0
- package/dist/backend/templates/harness/tester-agent.js +13 -0
- package/dist/backend/templates/harness/vcm-ask-user-skill.js +82 -0
- package/dist/backend/templates/harness/vcm-code-navigation-skill.js +7 -5
- package/dist/backend/templates/harness/vcm-task-state-skill.js +2 -2
- package/dist/backend/templates/harness/vcm-workflow-review-skill.js +1 -1
- package/dist/shared/types/session.js +28 -22
- package/dist/shared/types/workflow.js +1 -0
- package/dist/shared/validation/artifact-check.js +3 -3
- package/dist/shared/validation/artifact-contract.js +1 -1
- package/dist/shared/validation/artifact-registry.js +16 -0
- package/dist-frontend/assets/index-DDmygnV6.css +32 -0
- package/dist-frontend/assets/{index-VW9tYPP5.js → index-nAV6toi8.js} +47 -47
- package/dist-frontend/index.html +2 -2
- package/package.json +1 -1
- package/scripts/claude-plugins/vcm-lsp-bridge/.claude-plugin/plugin.json +21 -6
- package/scripts/{ccr-api-key-helper.mjs → codex-bridge-api-key-helper.mjs} +1 -1
- package/scripts/harness-tools/vcm-artifact +1 -2
- package/scripts/harness-tools/vcm-bash-guard +1 -1
- package/dist/backend/adapters/ccr-gateway-adapter.js +0 -172
- package/dist-frontend/assets/index-B0d4Z6ny.css +0 -32
|
@@ -3,7 +3,7 @@ import { createHash } from "node:crypto";
|
|
|
3
3
|
import { VCM_ROLE_NAMES } from "../../shared/constants.js";
|
|
4
4
|
import { GATE_REVIEW_GATES } from "../../shared/types/gate-review.js";
|
|
5
5
|
import { createDefaultLaunchTemplate, createDefaultToolSessionDefaults, DEFAULT_TRANSLATION_OUTPUT_MODE, DEFAULT_TRANSLATION_TARGET_LANGUAGE, TRANSLATION_OUTPUT_MODE_OPTIONS, TRANSLATION_TARGET_LANGUAGE_OPTIONS } from "../../shared/types/app-settings.js";
|
|
6
|
-
import { CLAUDE_MODEL_OPTIONS,
|
|
6
|
+
import { CLAUDE_MODEL_OPTIONS, isCodexBridgeSessionModel, SESSION_EFFORT_OPTIONS } from "../../shared/types/session.js";
|
|
7
7
|
import { resolveVcmDataDir } from "../vcm-data-dir.js";
|
|
8
8
|
const MAX_RECENT_REPOSITORIES = 5;
|
|
9
9
|
export function createAppSettingsService(deps) {
|
|
@@ -161,20 +161,20 @@ export function createAppSettingsService(deps) {
|
|
|
161
161
|
requiredGates: normalizedRequiredGates
|
|
162
162
|
};
|
|
163
163
|
},
|
|
164
|
-
async
|
|
165
|
-
return
|
|
164
|
+
async getCodexBridgeIntegrationSettings() {
|
|
165
|
+
return normalizeCodexBridgeIntegrationSettings((await loadSettings()).codexBridge);
|
|
166
166
|
},
|
|
167
|
-
async
|
|
167
|
+
async updateCodexBridgeIntegrationSettings(input) {
|
|
168
168
|
const current = await loadSettings();
|
|
169
|
-
const
|
|
170
|
-
...current.
|
|
169
|
+
const codexBridge = normalizeCodexBridgeIntegrationSettings({
|
|
170
|
+
...current.codexBridge,
|
|
171
171
|
...input
|
|
172
172
|
});
|
|
173
173
|
await saveSettings({
|
|
174
174
|
...current,
|
|
175
|
-
|
|
175
|
+
codexBridge
|
|
176
176
|
});
|
|
177
|
-
return
|
|
177
|
+
return codexBridge;
|
|
178
178
|
},
|
|
179
179
|
getSettingsPath() {
|
|
180
180
|
return settingsPath;
|
|
@@ -261,10 +261,10 @@ function normalizeSettingsFile(input) {
|
|
|
261
261
|
if (gateReview) {
|
|
262
262
|
settings.gateReview = gateReview;
|
|
263
263
|
}
|
|
264
|
-
settings.
|
|
264
|
+
settings.codexBridge = normalizeCodexBridgeIntegrationSettings(input.codexBridge);
|
|
265
265
|
return settings;
|
|
266
266
|
}
|
|
267
|
-
function
|
|
267
|
+
function normalizeCodexBridgeIntegrationSettings(input) {
|
|
268
268
|
const candidate = isObject(input) ? input : {};
|
|
269
269
|
const apiKey = typeof candidate.apiKey === "string" ? candidate.apiKey.trim() : "";
|
|
270
270
|
return {
|
|
@@ -355,7 +355,7 @@ function normalizeClaudeModel(input, fallback) {
|
|
|
355
355
|
if (typeof input !== "string") {
|
|
356
356
|
return fallback;
|
|
357
357
|
}
|
|
358
|
-
if (input
|
|
358
|
+
if (isCodexBridgeSessionModel(input)) {
|
|
359
359
|
return input;
|
|
360
360
|
}
|
|
361
361
|
const model = CLAUDE_MODEL_OPTIONS.find((option) => option.value === input);
|
|
@@ -4,7 +4,7 @@ import { checkMarkdownArtifact } from "../../shared/validation/artifact-check.js
|
|
|
4
4
|
import { getArtifactDefinition, isArtifactKind } from "../../shared/validation/artifact-registry.js";
|
|
5
5
|
import { VcmError } from "../errors.js";
|
|
6
6
|
import { resolveRepoPath } from "../adapters/filesystem.js";
|
|
7
|
-
import { renderArchitectureBriefTemplate, renderArchitectureDiagnosisTemplate, renderArchitectureEvidenceTemplate, renderArchitecturePlanTemplate, renderArchitectDebugTemplate, renderCoderCompletionTemplate, renderDocsSyncReportTemplate, renderFinalAcceptanceTemplate, renderKnownIssuesTemplate, renderPlanningProgressTemplate, renderMessageRouteTemplate, renderTestReportTemplate, renderWorkflowProgressTemplate } from "../templates/handoff.js";
|
|
7
|
+
import { renderArchitectureBriefTemplate, renderArchitectureDiagnosisTemplate, renderArchitectureEvidenceTemplate, renderArchitecturePlanTemplate, renderArchitectDebugTemplate, renderCoderCompletionTemplate, renderDocsUpdateReportTemplate, renderDocsSyncReportTemplate, renderFinalAcceptanceTemplate, renderKnownIssuesTemplate, renderPlanningProgressTemplate, renderMessageRouteTemplate, renderTestReportTemplate, renderWorkflowProgressTemplate } from "../templates/handoff.js";
|
|
8
8
|
import { renderRoleCommandTemplate } from "../templates/role-command.js";
|
|
9
9
|
import { validateMemoryProposal } from "./memory-proposal-validation.js";
|
|
10
10
|
import { isMemoryProposalSubmissionPath } from "./memory-review-paths.js";
|
|
@@ -18,6 +18,7 @@ const ARTIFACT_PATH_KEYS = [
|
|
|
18
18
|
["architect-debug", "architectDebugPath"],
|
|
19
19
|
["architecture-diagnosis", "architectureDiagnosisPath"],
|
|
20
20
|
["test-report", "testReportPath"],
|
|
21
|
+
["docs-update-report", "docsUpdateReportPath"],
|
|
21
22
|
["docs-sync-report", "docsSyncReportPath"],
|
|
22
23
|
["workflow-progress", "workflowProgressPath"],
|
|
23
24
|
["final-acceptance", "finalAcceptancePath"]
|
|
@@ -55,6 +56,7 @@ export function createArtifactService(fs, deps = {}) {
|
|
|
55
56
|
architectDebugPath: path.posix.join(handoffDir, "architect-debug.md"),
|
|
56
57
|
architectureDiagnosisPath: path.posix.join(handoffDir, "architecture-diagnosis.md"),
|
|
57
58
|
testReportPath: path.posix.join(handoffDir, "test-report.md"),
|
|
59
|
+
docsUpdateReportPath: path.posix.join(handoffDir, "docs-update-report.md"),
|
|
58
60
|
docsSyncReportPath: path.posix.join(handoffDir, "docs-sync-report.md"),
|
|
59
61
|
workflowProgressPath: path.posix.join(handoffDir, "workflow-progress.md"),
|
|
60
62
|
finalAcceptancePath: path.posix.join(handoffDir, "final-acceptance.md")
|
|
@@ -85,6 +87,7 @@ export function createArtifactService(fs, deps = {}) {
|
|
|
85
87
|
[paths.architectDebugPath, renderArchitectDebugTemplate(input.taskSlug)],
|
|
86
88
|
[paths.architectureDiagnosisPath, renderArchitectureDiagnosisTemplate(input.taskSlug)],
|
|
87
89
|
[paths.testReportPath, renderTestReportTemplate(input.taskSlug)],
|
|
90
|
+
[paths.docsUpdateReportPath, renderDocsUpdateReportTemplate(input.taskSlug)],
|
|
88
91
|
[paths.docsSyncReportPath, renderDocsSyncReportTemplate(input.taskSlug)],
|
|
89
92
|
[paths.workflowProgressPath, renderWorkflowProgressTemplate(input.taskSlug)],
|
|
90
93
|
[paths.finalAcceptancePath, renderFinalAcceptanceTemplate(input.taskSlug)],
|
|
@@ -190,10 +193,11 @@ export function createArtifactService(fs, deps = {}) {
|
|
|
190
193
|
}
|
|
191
194
|
if (isArtifactKind(input.kind)) {
|
|
192
195
|
const definition = getArtifactDefinition(input.kind);
|
|
193
|
-
|
|
196
|
+
const owners = Array.isArray(definition.owner) ? definition.owner : [definition.owner];
|
|
197
|
+
if (!owners.includes(input.role)) {
|
|
194
198
|
throw new VcmError({
|
|
195
199
|
code: "ARTIFACT_OWNER_MISMATCH",
|
|
196
|
-
message: `${input.kind} is owned by ${
|
|
200
|
+
message: `${input.kind} is owned by ${owners.join("|")}, not ${input.role}.`,
|
|
197
201
|
statusCode: 403
|
|
198
202
|
});
|
|
199
203
|
}
|
|
@@ -334,39 +338,12 @@ async function validateDynamicArtifact(fs, input, content, workflowControlServic
|
|
|
334
338
|
validateHarnessFeedback(content);
|
|
335
339
|
return { kind: input.kind, root: input.baseRepoRoot, path: artifactPath };
|
|
336
340
|
}
|
|
337
|
-
if (input.kind === "retrospective-report") {
|
|
338
|
-
if (input.role !== "harness-engineer") {
|
|
339
|
-
throw artifactRejected(input.kind, ["Only Harness Engineer may submit a retrospective report."]);
|
|
340
|
-
}
|
|
341
|
-
if (!/^\.ai\/vcm\/harness-feedback\/task-retrospectives\/[A-Za-z0-9._-]+\.md$/.test(artifactPath)) {
|
|
342
|
-
throw artifactRejected(input.kind, ["Retrospective report path must be under .ai/vcm/harness-feedback/task-retrospectives/."]);
|
|
343
|
-
}
|
|
344
|
-
validateRetrospectiveReport(content);
|
|
345
|
-
return { kind: input.kind, root: input.baseRepoRoot, path: artifactPath };
|
|
346
|
-
}
|
|
347
341
|
throw new VcmError({
|
|
348
342
|
code: "ARTIFACT_KIND_INVALID",
|
|
349
343
|
message: `Unknown managed artifact kind: ${input.kind}`,
|
|
350
344
|
statusCode: 400
|
|
351
345
|
});
|
|
352
346
|
}
|
|
353
|
-
function validateRetrospectiveReport(content) {
|
|
354
|
-
const errors = getRetrospectiveReportErrors(content);
|
|
355
|
-
if (errors.length > 0)
|
|
356
|
-
throw artifactRejected("retrospective-report", errors);
|
|
357
|
-
}
|
|
358
|
-
export function getRetrospectiveReportErrors(content) {
|
|
359
|
-
const errors = [];
|
|
360
|
-
if (!/^# Task Harness Retrospective(?::\s*.+)?\s*$/m.test(content)) {
|
|
361
|
-
errors.push("Retrospective report requires '# Task Harness Retrospective: <task>'.");
|
|
362
|
-
}
|
|
363
|
-
for (const heading of ["Findings", "Feedback Dispositions", "Recommended Harness Changes", "VCM Issue Drafts"]) {
|
|
364
|
-
if (!new RegExp(`^## ${escapeRegExp(heading)}\\s*$`, "m").test(content)) {
|
|
365
|
-
errors.push(`Missing required section: ${heading}.`);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return errors;
|
|
369
|
-
}
|
|
370
347
|
function validateCoderWorkerReport(content) {
|
|
371
348
|
const errors = [];
|
|
372
349
|
if (!/^# Coder Worker Report:\s*\S.+$/m.test(content)) {
|