@vibecodetown/mcp-server 2.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 +269 -0
- package/build/auth/gate.js +225 -0
- package/build/auth/index.js +55 -0
- package/build/auth/public_key.js +27 -0
- package/build/auth/token_cache.js +122 -0
- package/build/auth/token_verifier.js +103 -0
- package/build/bootstrap/doctor.js +115 -0
- package/build/bootstrap/installer.js +673 -0
- package/build/bootstrap/lock.js +37 -0
- package/build/bootstrap/platform.js +26 -0
- package/build/bootstrap/registry.js +37 -0
- package/build/cache/index.js +147 -0
- package/build/cli.js +101 -0
- package/build/contracts.js +22 -0
- package/build/control_plane/gate.js +161 -0
- package/build/control_plane/index.js +6 -0
- package/build/dx/activity.js +139 -0
- package/build/engine.js +106 -0
- package/build/errors.js +171 -0
- package/build/generated/activate_input.js +2 -0
- package/build/generated/activate_output.js +57 -0
- package/build/generated/advisory_review_input.js +2 -0
- package/build/generated/advisory_review_output.js +35 -0
- package/build/generated/auth_token_file.js +2 -0
- package/build/generated/briefing_input.js +2 -0
- package/build/generated/briefing_output.js +2 -0
- package/build/generated/clinic_bridge_file.js +13 -0
- package/build/generated/contracts_bundle_info.js +5 -0
- package/build/generated/create_work_order_input.js +2 -0
- package/build/generated/create_work_order_output.js +2 -0
- package/build/generated/current_work_order_file.js +2 -0
- package/build/generated/doctor_input.js +2 -0
- package/build/generated/doctor_output.js +24 -0
- package/build/generated/execution_result.js +2 -0
- package/build/generated/execution_task.js +2 -0
- package/build/generated/export_output_input.js +2 -0
- package/build/generated/export_output_output.js +2 -0
- package/build/generated/finalize_work_input.js +2 -0
- package/build/generated/finalize_work_output.js +2 -0
- package/build/generated/gate_input.js +2 -0
- package/build/generated/gate_output.js +2 -0
- package/build/generated/gate_result_v1.js +2 -0
- package/build/generated/get_decision_input.js +2 -0
- package/build/generated/get_decision_output.js +13 -0
- package/build/generated/handoff_to_clinic.js +2 -0
- package/build/generated/index.js +75 -0
- package/build/generated/inspect_code_input.js +2 -0
- package/build/generated/inspect_code_output.js +13 -0
- package/build/generated/memory_retrieve_output.js +2 -0
- package/build/generated/memory_state_file.js +2 -0
- package/build/generated/memory_status_input.js +2 -0
- package/build/generated/memory_status_output.js +13 -0
- package/build/generated/memory_sync_input.js +2 -0
- package/build/generated/memory_sync_output.js +13 -0
- package/build/generated/plugin_result.js +2 -0
- package/build/generated/react_perf_check_patterns_input.js +2 -0
- package/build/generated/react_perf_check_patterns_output.js +2 -0
- package/build/generated/react_perf_generate_report_input.js +2 -0
- package/build/generated/react_perf_generate_report_output.js +2 -0
- package/build/generated/repair_plan_input.js +2 -0
- package/build/generated/repair_plan_output.js +2 -0
- package/build/generated/run_app_input.js +2 -0
- package/build/generated/run_app_output.js +2 -0
- package/build/generated/run_state_file.js +13 -0
- package/build/generated/scaffold_input.js +2 -0
- package/build/generated/scaffold_output.js +2 -0
- package/build/generated/search_oss_input.js +2 -0
- package/build/generated/search_oss_output.js +2 -0
- package/build/generated/selection_validation_result.js +2 -0
- package/build/generated/signal_agent_input.js +2 -0
- package/build/generated/spec_high_ask_queue_items_file.js +2 -0
- package/build/generated/spec_high_clinic_bridge_output.js +2 -0
- package/build/generated/spec_high_decision_draft_output.js +2 -0
- package/build/generated/spec_high_validate_output.js +2 -0
- package/build/generated/status_input.js +2 -0
- package/build/generated/status_output.js +2 -0
- package/build/generated/submit_decision_input.js +2 -0
- package/build/generated/submit_decision_output.js +2 -0
- package/build/generated/tool_error_output.js +2 -0
- package/build/generated/undo_last_task_input.js +2 -0
- package/build/generated/undo_last_task_output.js +2 -0
- package/build/generated/update_input.js +2 -0
- package/build/generated/update_output.js +2 -0
- package/build/generated/vibe_pm_inspection_result.js +2 -0
- package/build/generated/vibe_pm_report_markdown.js +2 -0
- package/build/generated/vibe_pm_verdict.js +2 -0
- package/build/generated/vibe_repo_config.js +2 -0
- package/build/generated/vibecoding_helper_answer_output.js +2 -0
- package/build/generated/vibecoding_helper_one_loop_selection_output.js +2 -0
- package/build/generated/vibecoding_helper_show_ask_queue_output.js +2 -0
- package/build/generated/work_order_v1.js +2 -0
- package/build/generated/zoekt_evidence_input.js +2 -0
- package/build/generated/zoekt_evidence_output.js +2 -0
- package/build/index.js +111 -0
- package/build/legacy_alias.js +65 -0
- package/build/local-mode/bash.js +61 -0
- package/build/local-mode/config.js +171 -0
- package/build/local-mode/git.js +33 -0
- package/build/local-mode/init.js +110 -0
- package/build/local-mode/paths.js +24 -0
- package/build/local-mode/templates.js +856 -0
- package/build/local-mode/work-order.js +41 -0
- package/build/resources/index.js +246 -0
- package/build/security/input-validator.js +119 -0
- package/build/security/path-policy.js +289 -0
- package/build/security/sandbox.js +228 -0
- package/build/tools/react_perf/check_patterns.js +172 -0
- package/build/tools/react_perf/generate_report.js +337 -0
- package/build/tools/react_perf/index.js +119 -0
- package/build/tools/react_perf/rules/advanced.js +325 -0
- package/build/tools/react_perf/rules/async.js +104 -0
- package/build/tools/react_perf/rules/bundle.js +101 -0
- package/build/tools/react_perf/rules/client.js +186 -0
- package/build/tools/react_perf/rules/index.js +74 -0
- package/build/tools/react_perf/rules/js.js +148 -0
- package/build/tools/react_perf/rules/rendering.js +166 -0
- package/build/tools/react_perf/rules/rerender.js +161 -0
- package/build/tools/react_perf/rules/server.js +141 -0
- package/build/tools/react_perf/types.js +127 -0
- package/build/tools/vibe_pm/activate.js +102 -0
- package/build/tools/vibe_pm/advisory_review.js +77 -0
- package/build/tools/vibe_pm/briefing.js +178 -0
- package/build/tools/vibe_pm/context.js +439 -0
- package/build/tools/vibe_pm/create_work_order.js +271 -0
- package/build/tools/vibe_pm/doc_status_gate.js +370 -0
- package/build/tools/vibe_pm/doctor.js +262 -0
- package/build/tools/vibe_pm/entity_gate/preflight.js +78 -0
- package/build/tools/vibe_pm/export_output.js +135 -0
- package/build/tools/vibe_pm/finalize_work.js +393 -0
- package/build/tools/vibe_pm/gate.js +33 -0
- package/build/tools/vibe_pm/get_decision.js +281 -0
- package/build/tools/vibe_pm/index.js +593 -0
- package/build/tools/vibe_pm/inspect_code.js +828 -0
- package/build/tools/vibe_pm/intent/generator.js +294 -0
- package/build/tools/vibe_pm/intent/index.js +5 -0
- package/build/tools/vibe_pm/intent/prompt_density.js +227 -0
- package/build/tools/vibe_pm/intent/types.js +70 -0
- package/build/tools/vibe_pm/intent/verifier.js +237 -0
- package/build/tools/vibe_pm/kce/doc_usage.js +51 -0
- package/build/tools/vibe_pm/kce/on_finalize.js +11 -0
- package/build/tools/vibe_pm/kce/preflight.js +232 -0
- package/build/tools/vibe_pm/local_memory.js +26 -0
- package/build/tools/vibe_pm/memory_status.js +82 -0
- package/build/tools/vibe_pm/memory_sync.js +134 -0
- package/build/tools/vibe_pm/modules/decision_snapshot.js +29 -0
- package/build/tools/vibe_pm/modules/ensure.js +100 -0
- package/build/tools/vibe_pm/modules/fingerprint.js +30 -0
- package/build/tools/vibe_pm/modules/fix_dependencies.js +394 -0
- package/build/tools/vibe_pm/modules/planning_v1.js +110 -0
- package/build/tools/vibe_pm/modules/repo_context.js +56 -0
- package/build/tools/vibe_pm/modules/research_v1.js +114 -0
- package/build/tools/vibe_pm/modules/skills_v1.js +100 -0
- package/build/tools/vibe_pm/pm_language.js +222 -0
- package/build/tools/vibe_pm/repair_plan.js +199 -0
- package/build/tools/vibe_pm/run_app.js +597 -0
- package/build/tools/vibe_pm/run_app_podman.js +64 -0
- package/build/tools/vibe_pm/scaffold.js +550 -0
- package/build/tools/vibe_pm/search_oss.js +124 -0
- package/build/tools/vibe_pm/status.js +153 -0
- package/build/tools/vibe_pm/submit_decision.js +87 -0
- package/build/tools/vibe_pm/system_design/issue_mapping.js +47 -0
- package/build/tools/vibe_pm/system_design/rulebook.js +112 -0
- package/build/tools/vibe_pm/system_design/semgrep.js +132 -0
- package/build/tools/vibe_pm/types.js +229 -0
- package/build/tools/vibe_pm/undo_last_task.js +163 -0
- package/build/tools/vibe_pm/update.js +146 -0
- package/build/tools/vibe_pm/zoekt_evidence.js +96 -0
- package/build/tools.js +269 -0
- package/build/version-check.js +239 -0
- package/build/vibe-cli.js +631 -0
- package/package.json +76 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Auto-generated from JSON Schema SSOT
|
|
2
|
+
// DO NOT EDIT MANUALLY - run scripts/generate-contracts.sh
|
|
3
|
+
export * from "./selection_validation_result.js";
|
|
4
|
+
export * from "./finalize_work_input.js";
|
|
5
|
+
export * from "./briefing_input.js";
|
|
6
|
+
export * from "./get_decision_input.js";
|
|
7
|
+
export * from "./submit_decision_input.js";
|
|
8
|
+
export * from "./create_work_order_input.js";
|
|
9
|
+
export * from "./inspect_code_input.js";
|
|
10
|
+
export * from "./status_input.js";
|
|
11
|
+
export * from "./memory_status_input.js";
|
|
12
|
+
export * from "./memory_sync_input.js";
|
|
13
|
+
export * from "./advisory_review_input.js";
|
|
14
|
+
export * from "./repair_plan_input.js";
|
|
15
|
+
export * from "./scaffold_input.js";
|
|
16
|
+
export * from "./undo_last_task_input.js";
|
|
17
|
+
export * from "./run_app_input.js";
|
|
18
|
+
export * from "./export_output_input.js";
|
|
19
|
+
export * from "./search_oss_input.js";
|
|
20
|
+
export * from "./zoekt_evidence_input.js";
|
|
21
|
+
export * from "./doctor_input.js";
|
|
22
|
+
export * from "./update_input.js";
|
|
23
|
+
export * from "./activate_input.js";
|
|
24
|
+
export * from "./gate_input.js";
|
|
25
|
+
export * from "./react_perf_check_patterns_input.js";
|
|
26
|
+
export * from "./react_perf_generate_report_input.js";
|
|
27
|
+
export * from "./inspect_code_output.js";
|
|
28
|
+
export * from "./vibe_pm_inspection_result.js";
|
|
29
|
+
export * from "./vibe_pm_report_markdown.js";
|
|
30
|
+
export * from "./vibe_pm_verdict.js";
|
|
31
|
+
export * from "./create_work_order_output.js";
|
|
32
|
+
export * from "./repair_plan_output.js";
|
|
33
|
+
export * from "./briefing_output.js";
|
|
34
|
+
export * from "./get_decision_output.js";
|
|
35
|
+
export * from "./submit_decision_output.js";
|
|
36
|
+
export * from "./status_output.js";
|
|
37
|
+
export * from "./memory_status_output.js";
|
|
38
|
+
export * from "./memory_sync_output.js";
|
|
39
|
+
export * from "./memory_retrieve_output.js";
|
|
40
|
+
export * from "./memory_state_file.js";
|
|
41
|
+
export * from "./vibe_repo_config.js";
|
|
42
|
+
export * from "./current_work_order_file.js";
|
|
43
|
+
export * from "./advisory_review_output.js";
|
|
44
|
+
export * from "./scaffold_output.js";
|
|
45
|
+
export * from "./finalize_work_output.js";
|
|
46
|
+
export * from "./undo_last_task_output.js";
|
|
47
|
+
export * from "./run_app_output.js";
|
|
48
|
+
export * from "./export_output_output.js";
|
|
49
|
+
export * from "./search_oss_output.js";
|
|
50
|
+
export * from "./zoekt_evidence_output.js";
|
|
51
|
+
export * from "./doctor_output.js";
|
|
52
|
+
export * from "./update_output.js";
|
|
53
|
+
export * from "./activate_output.js";
|
|
54
|
+
export * from "./gate_output.js";
|
|
55
|
+
export * from "./react_perf_check_patterns_output.js";
|
|
56
|
+
export * from "./react_perf_generate_report_output.js";
|
|
57
|
+
export * from "./tool_error_output.js";
|
|
58
|
+
export * from "./signal_agent_input.js";
|
|
59
|
+
export * from "./spec_high_decision_draft_output.js";
|
|
60
|
+
export * from "./spec_high_validate_output.js";
|
|
61
|
+
export * from "./spec_high_clinic_bridge_output.js";
|
|
62
|
+
export * from "./vibecoding_helper_show_ask_queue_output.js";
|
|
63
|
+
export * from "./vibecoding_helper_answer_output.js";
|
|
64
|
+
export * from "./vibecoding_helper_one_loop_selection_output.js";
|
|
65
|
+
export * from "./spec_high_ask_queue_items_file.js";
|
|
66
|
+
export * from "./run_state_file.js";
|
|
67
|
+
export * from "./clinic_bridge_file.js";
|
|
68
|
+
export * from "./auth_token_file.js";
|
|
69
|
+
export * from "./execution_task.js";
|
|
70
|
+
export * from "./plugin_result.js";
|
|
71
|
+
export * from "./execution_result.js";
|
|
72
|
+
export * from "./handoff_to_clinic.js";
|
|
73
|
+
export * from "./work_order_v1.js";
|
|
74
|
+
export * from "./gate_result_v1.js";
|
|
75
|
+
export * from "./contracts_bundle_info.js";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const InspectCodeInputSchema = z.object({ "project_id": z.string().min(1).optional(), "target_paths": z.array(z.string().min(1)).describe("검사할 대상 경로 (생략 시 전체)").optional(), "bridge_path": z.string().min(1).describe("브릿지 파일 경로 (생략 시 자동 탐색)").optional(), "mode": z.enum(["quick", "thorough"]).describe("검사 모드: quick(빠른), thorough(상세)").default("thorough"), "auto_fix": z.boolean().describe("안전한 문제 자동 수정 여부 (의존성 누락 등)").default(true) }).strict().describe("SSOT schema for vibe_pm.inspect_code MCP tool input");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const InspectCodeOutputSchema = z.object({ "project_id": z.string().min(1), "review_summary": z.object({ "decision_context": z.string(), "review_result": z.enum(["GO", "FIX", "BLOCK"]), "one_line_verdict": z.string().min(1) }).strict(), "issues_found": z.array(z.object({ "type": z.enum(["RULE_VIOLATION", "VERIFY_FAIL", "SCOPE_MISMATCH", "RISK_SPIKE"]), "business_risk": z.string().min(1), "plain_explanation": z.string().min(1), "technical_detail": z.object({ "file_path": z.string().min(1), "line_range": z.array(z.number().int()).min(2).max(2).optional(), "rule_violated": z.string().optional(), "principle_id": z.enum(["STRATEGY_ENFORCEMENT", "ADAPTER_ENFORCEMENT", "OBSERVER_ENFORCEMENT", "BUILDER_ENFORCEMENT", "SINGLETON_GUARD", "UNMAPPED_RULE"]).optional(), "pattern": z.enum(["Strategy", "Adapter", "Observer", "Builder", "Singleton"]).optional(), "rule_engine": z.literal("semgrep").optional(), "rule_id": z.string().optional(), "severity": z.enum(["ERROR", "WARNING", "INFO", "CRITICAL"]).optional(), "evidence_ref": z.string().optional() }).strict().optional() }).strict()), "fixed_issues": z.array(z.object({ "type": z.string().min(1), "description": z.string().min(1), "file": z.string().min(1).optional(), "status": z.literal("FIXED") }).strict()).optional(), "next_action": z.any().superRefine((x, ctx) => {
|
|
3
|
+
const schemas = [z.object({ "action_type": z.literal("DONE"), "message": z.string().min(1) }).strict(), z.object({ "action_type": z.literal("COPY_PASTE_TO_AGENT"), "label": z.string().min(1), "prompt_block": z.string().min(1) }).strict(), z.object({ "action_type": z.literal("ASK_DECISION"), "tool": z.literal("vibe_pm.get_decision"), "reason": z.string().min(1) }).strict(), z.object({ "action_type": z.literal("CONTINUE"), "tool": z.literal("vibe_pm.create_work_order"), "reason": z.string().min(1) }).strict()];
|
|
4
|
+
const errors = schemas.reduce((errors, schema) => ((result) => result.error ? [...errors, result.error] : errors)(schema.safeParse(x)), []);
|
|
5
|
+
if (schemas.length - errors.length !== 1) {
|
|
6
|
+
ctx.addIssue({
|
|
7
|
+
path: ctx.path,
|
|
8
|
+
code: "invalid_union",
|
|
9
|
+
unionErrors: errors,
|
|
10
|
+
message: "Invalid input: Should pass single schema",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}), "message_template_id": z.enum(["GO-01", "GO-02", "FIX-01", "FIX-02", "BLOCK-01", "BLOCK-02"]) }).strict().describe("SSOT schema for vibe_pm.inspect_code MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MemoryStateFileSchema = z.object({ "version": z.literal("1.0"), "last_sync_at": z.string().min(1), "docs_root": z.string().min(1), "collection": z.string().min(1), "files": z.record(z.object({ "mtime": z.number(), "sha256": z.string().min(1), "category": z.string(), "chunk_count": z.number().int().gte(0) }).strict()) }).strict();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MemoryStatusInputSchema = z.object({ "project_id": z.string().min(1).describe("프로젝트 ID (생략 시 현재 폴더 사용)").optional(), "docs_root": z.string().min(1).describe("문서 루트 디렉토리 (기본: docs)").default("docs"), "persist_dir": z.string().min(1).describe("인덱스 영속 저장 경로 override (선택)").optional() }).strict().describe("SSOT schema for vibe_pm.memory_status MCP tool input");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MemoryStatusOutputSchema = z.object({ "project_id": z.string().min(1), "status": z.enum(["READY", "NEEDS_SYNC", "OFFLINE_NO_INDEX", "ERROR"]), "summary": z.string().min(1), "docs_root": z.string().min(1), "persist_dir": z.string().min(1), "collection": z.string().min(1), "stats": z.object({ "document_count": z.number().int().gte(0), "chunk_count": z.number().int().gte(0), "last_sync_at": z.union([z.string(), z.null()]).optional() }).strict(), "embedding": z.object({ "backend": z.string().min(1), "model": z.union([z.string(), z.null()]).optional(), "ready": z.boolean() }).strict().optional(), "offline_mode": z.boolean(), "issues": z.array(z.string()), "next_action": z.any().superRefine((x, ctx) => {
|
|
3
|
+
const schemas = [z.object({ "tool": z.enum(["vibe_pm.memory_sync", "vibe_pm.doctor"]), "reason": z.string().min(1) }).strict(), z.null()];
|
|
4
|
+
const errors = schemas.reduce((errors, schema) => ((result) => result.error ? [...errors, result.error] : errors)(schema.safeParse(x)), []);
|
|
5
|
+
if (schemas.length - errors.length !== 1) {
|
|
6
|
+
ctx.addIssue({
|
|
7
|
+
path: ctx.path,
|
|
8
|
+
code: "invalid_union",
|
|
9
|
+
unionErrors: errors,
|
|
10
|
+
message: "Invalid input: Should pass single schema",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}) }).strict().describe("SSOT schema for vibe_pm.memory_status MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MemorySyncInputSchema = z.object({ "project_id": z.string().min(1).describe("프로젝트 ID (생략 시 현재 폴더 사용)").optional(), "docs_root": z.string().min(1).describe("문서 루트 디렉토리 (기본: docs)").default("docs"), "mode": z.enum(["on_demand", "pre_finalize"]).describe("운영 힌트(온디맨드/마감 전 자동)").default("on_demand"), "force_full": z.boolean().describe("전체 재인덱싱(복구/디버깅용)").default(false) }).strict().describe("SSOT schema for vibe_pm.memory_sync MCP tool input");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const MemorySyncOutputSchema = z.object({ "project_id": z.string().min(1), "status": z.enum(["OK", "NO_CHANGES", "ERROR"]), "summary": z.string().min(1), "docs_root": z.string().min(1), "persist_dir": z.string().min(1), "collection": z.string().min(1), "result": z.object({ "scanned_files": z.number().int().gte(0), "ingested_files": z.number().int().gte(0), "updated_files": z.number().int().gte(0), "skipped_files": z.number().int().gte(0), "duration_ms": z.number().int().gte(0) }).strict(), "offline_mode": z.boolean(), "issues": z.array(z.string()), "next_action": z.any().superRefine((x, ctx) => {
|
|
3
|
+
const schemas = [z.object({ "tool": z.enum(["vibe_pm.memory_status", "vibe_pm.doctor"]), "reason": z.string().min(1) }).strict(), z.null()];
|
|
4
|
+
const errors = schemas.reduce((errors, schema) => ((result) => result.error ? [...errors, result.error] : errors)(schema.safeParse(x)), []);
|
|
5
|
+
if (schemas.length - errors.length !== 1) {
|
|
6
|
+
ctx.addIssue({
|
|
7
|
+
path: ctx.path,
|
|
8
|
+
code: "invalid_union",
|
|
9
|
+
unionErrors: errors,
|
|
10
|
+
message: "Invalid input: Should pass single schema",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}) }).strict().describe("SSOT schema for vibe_pm.memory_sync MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const PluginResultSchema = z.object({ "status": z.enum(["SUCCESS", "RETRYABLE_FAIL", "FATAL_FAIL"]), "summary": z.string().min(1), "artifacts_written": z.array(z.object({ "type": z.enum(["extracted_text", "json", "log", "diff"]), "path": z.string().min(1) }).strict()).min(0).max(100), "exit_hint": z.object({ "retry_after_ms": z.number().int().gte(0).lte(86400000) }).strict().optional() }).strict().describe("SSOT schema for Execution Engine subprocess plugin stdout (v2.x).");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ReactPerfCheckPatternsInputSchema = z.object({ "target_paths": z.array(z.string().min(1)).describe("Specific file or directory paths to scan. If not provided, scans current project.").optional(), "rules": z.array(z.enum(["async", "bundle", "server", "client", "rerender", "rendering", "js", "advanced"])).describe("Rule categories to check. If not provided, checks all categories.").optional(), "min_impact": z.enum(["CRITICAL", "HIGH", "MEDIUM-HIGH", "MEDIUM", "LOW-MEDIUM", "LOW"]).describe("Minimum impact level to report. Default: MEDIUM").default("MEDIUM") }).strict().describe("SSOT schema for react_perf.check_patterns MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ReactPerfCheckPatternsOutputSchema = z.object({ "status": z.enum(["OK", "VIOLATIONS_FOUND"]), "total_files_scanned": z.number().int().gte(0), "total_violations": z.number().int().gte(0), "violations": z.array(z.object({ "rule_id": z.string().min(1), "category": z.enum(["async", "bundle", "server", "client", "rerender", "rendering", "js", "advanced"]), "file": z.string().min(1), "line": z.number().int().gte(1), "column": z.number().int().gte(1).optional(), "impact": z.enum(["CRITICAL", "HIGH", "MEDIUM-HIGH", "MEDIUM", "LOW-MEDIUM", "LOW"]), "message": z.string().min(1), "suggestion": z.string().min(1), "code_snippet": z.string().optional() }).strict()), "summary": z.object({ "critical": z.number().int().gte(0), "high": z.number().int().gte(0), "medium": z.number().int().gte(0), "low": z.number().int().gte(0) }).strict(), "top_suggestions": z.array(z.string()), "scan_time_ms": z.number().int().gte(0) }).strict().describe("SSOT schema for react_perf.check_patterns MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ReactPerfGenerateReportInputSchema = z.object({ "format": z.enum(["markdown", "html", "json"]).describe("Output format: markdown, html, or json. Default: markdown").default("markdown"), "output_path": z.string().min(1).describe("Optional path to save the report file").optional(), "include_recommendations": z.boolean().describe("Include detailed recommendations in report. Default: true").default(true), "target_paths": z.array(z.string().min(1)).describe("Specific file or directory paths to scan. If not provided, scans current project.").optional() }).strict().describe("SSOT schema for react_perf.generate_report MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ReactPerfGenerateReportOutputSchema = z.object({ "status": z.enum(["OK", "ERROR"]), "summary": z.object({ "total_files_scanned": z.number().int().gte(0), "total_issues": z.number().int().gte(0), "by_severity": z.object({ "error": z.number().int().gte(0), "warning": z.number().int().gte(0), "info": z.number().int().gte(0) }).strict(), "by_category": z.record(z.number().int().gte(0)), "score": z.number().int().gte(0).lte(100) }).strict(), "report_content": z.string(), "saved_to": z.string().optional() }).strict().describe("SSOT schema for react_perf.generate_report MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const RepairPlanInputSchema = z.object({ "project_id": z.string().min(1).describe("프로젝트 ID (생략 시 현재 폴더 사용)").optional(), "use_latest_result": z.boolean().describe("최신 검사 결과 사용 여부 (기본값: true)").default(true) }).strict().describe("SSOT schema for vibe_pm.repair_plan MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const RepairPlanOutputSchema = z.object({ "project_id": z.string().min(1), "problem_summary": z.object({ "what_failed": z.string().min(1), "why_it_matters": z.string().min(1) }).strict(), "repair_prompt": z.string().min(1), "next_action": z.object({ "type": z.literal("COPY_PASTE_TO_AGENT"), "label": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.repair_plan MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const RunAppInputSchema = z.object({ "mode": z.enum(["dev", "prod", "test"]).describe("실행 모드").default("dev"), "port": z.number().int().gte(1).lte(65535).describe("포트 번호 (선택사항)").optional(), "container": z.enum(["none", "podman"]).describe("실행 런타임 선택. 기본값은 기존 호스트 실행을 유지합니다.").default("none"), "container_image": z.string().regex(new RegExp("^[a-z0-9][a-z0-9./:_-]{0,199}$")).min(1).max(200).describe("컨테이너 이미지. 재현성을 위해 ':latest' 사용은 경고/차단 대상입니다(정책은 코드에서 강제).").optional(), "container_ports": z.array(z.number().int().gte(1).lte(65535)).max(32).refine((xs) => new Set(xs).size === xs.length, { message: "items must be unique" }).describe("컨테이너 포트 목록(선택). 생략 시 port(또는 프로젝트 디폴트 포트) 기반으로 자동 선택합니다.").optional(), "container_env": z.record(z.string().max(4096)).describe("컨테이너 환경변수(선택). allowlist 정책은 코드에서 강제합니다.").optional(), "container_mounts": z.array(z.object({ "host": z.string().min(1).max(512).describe("호스트 경로(상대/절대). repoRoot 밖 경로는 코드에서 차단합니다."), "container": z.string().regex(new RegExp("^/.*")).min(1).max(256).describe("컨테이너 내부 경로(절대 경로)"), "mode": z.enum(["ro", "rw"]).describe("마운트 모드") }).strict()).max(16).describe("컨테이너 마운트 목록(선택). 생략 시 repoRoot -> /work:rw 를 기본으로 사용합니다.").optional() }).strict().describe("SSOT schema for vibe_pm.run_app MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const RunAppOutputSchema = z.object({ "success": z.boolean(), "process_id": z.number().int().gte(0).optional(), "url": z.string().optional(), "command_executed": z.string().min(1), "message": z.string().min(1), "runtime": z.enum(["host", "podman"]).describe("실행 런타임(선택). legacy 클라이언트는 무시할 수 있습니다.").optional(), "container_id": z.string().min(1).max(200).describe("runtime=podman 일 때 컨테이너 ID(선택).").optional() }).strict().describe("SSOT schema for vibe_pm.run_app MCP tool output");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const RunStateFileSchema = z.any().superRefine((x, ctx) => {
|
|
3
|
+
const schemas = [z.object({ "run_id": z.string().min(1), "phase": z.string().min(1), "open_cards": z.array(z.string()), "required_slots": z.record(z.enum(["missing", "filled"])), "next_action": z.string().min(1), "ask_queue": z.array(z.string()) }).strict(), z.object({ "phase": z.string().min(1), "mode": z.enum(["mvp_fast", "balanced", "quality_first"]), "created_at": z.string().min(1), "decisions_made": z.number().int().gte(0), "decisions_pending": z.number().int().gte(0), "last_review_status": z.string().optional() }).strict()];
|
|
4
|
+
const errors = schemas.reduce((errors, schema) => ((result) => result.error ? [...errors, result.error] : errors)(schema.safeParse(x)), []);
|
|
5
|
+
if (schemas.length - errors.length !== 1) {
|
|
6
|
+
ctx.addIssue({
|
|
7
|
+
path: ctx.path,
|
|
8
|
+
code: "invalid_union",
|
|
9
|
+
unionErrors: errors,
|
|
10
|
+
message: "Invalid input: Should pass single schema",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}).describe("SSOT schema for run artifact state.json (Spec-High and legacy variants)");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ScaffoldInputSchema = z.object({ "project_id": z.string().min(1).describe("프로젝트 ID (생략 시 현재 폴더 사용)").optional(), "template": z.enum(["minimal", "standard", "python_cli", "node_api"]).describe("생성할 프로젝트 구조 템플릿").default("standard"), "force": z.boolean().describe("비어있지 않은 디렉토리에 강제로 구조 생성 (기존 파일 보존)").default(false) }).strict().describe("SSOT schema for vibe_pm.scaffold MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ScaffoldOutputSchema = z.object({ "success": z.boolean(), "created_paths": z.array(z.string()), "skipped_paths": z.array(z.string()), "structure_tree": z.string(), "next_action": z.object({ "tool": z.enum(["vibe_pm.briefing", "vibe_pm.scaffold"]), "reason": z.string().min(1) }).strict(), "error": z.string().optional() }).strict().describe("SSOT schema for vibe_pm.scaffold MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SearchOssInputSchema = z.object({ "project_id": z.string().min(1), "run_id": z.string().min(1).optional(), "intent": z.string().min(1).max(200), "keywords": z.array(z.string().min(1)).min(1).max(30), "constraints": z.object({ "license_allowlist": z.array(z.string().min(1)).max(50).optional(), "min_stars": z.number().int().gte(0).optional(), "updated_within_days": z.number().int().gte(0).optional(), "language": z.string().min(1).max(80).optional(), "limit": z.number().int().gte(1).lte(200).default(10), "sort": z.enum(["stars", "updated", "best-match"]).default("stars") }).strict().optional(), "write_evidence": z.boolean().default(true) }).strict().describe("SSOT schema for vibe_pm.search_oss MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SearchOssOutputSchema = z.object({ "success": z.boolean(), "project_id": z.string().min(1), "run_id": z.string().min(1), "intent": z.string().min(1), "query": z.string().min(1), "evidence_path": z.string().min(1).optional(), "candidates": z.array(z.object({ "repo": z.string().min(1), "url": z.string().min(1), "description": z.string(), "license": z.string(), "stars": z.number().int().gte(0), "updated_at": z.string(), "ref_candidates": z.array(z.string().min(1)) }).strict()), "warnings": z.array(z.string()), "next_action": z.object({ "tool": z.literal("vibe_pm.export_output"), "reason": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.search_oss MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SelectionValidationResultSchema = z.object({ "type": z.literal("SELECTION_VALIDATION_RESULT"), "signal_level": z.enum(["LEVEL_1", "LEVEL_2", "LEVEL_3"]), "headline": z.string().min(1).max(180), "details": z.object({ "what_happened": z.string().min(1).max(500), "why_it_happened": z.string().min(1).max(500), "linked_decision": z.string().min(1).max(500) }).strict(), "next_action": z.object({ "label": z.string().min(1).max(200), "action": z.enum(["CONTINUE", "RETRY", "ADJUST", "REVISIT_SELECTION", "RESTART", "FORCE_OVERRIDE"]), "payload": z.object({ "reopen_decision_ids": z.array(z.string()).optional(), "reason": z.string().optional(), "block_reason": z.object({ "code": z.string(), "title": z.string().max(100), "explanation": z.string().max(500), "suggested_decision_point": z.string().optional(), "recovery_hints": z.array(z.string()).optional(), "failure_fingerprint": z.string().optional() }).optional() }).catchall(z.any()).optional() }).catchall(z.any()), "paths": z.object({ "bridge_path": z.string().optional(), "result_path": z.string().optional() }).strict().optional() }).strict().describe("SSOT schema for MCP output / Action rendering input / one-loop output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SignalAgentInputSchema = z.object({ "clinic_raw_result": z.object({ "exit_code": z.number().int().gte(0), "status": z.enum(["PASS", "WARN", "FAIL"]), "failure_category": z.enum(["dependency", "env", "code", "test", "unknown"]), "fingerprint": z.string().min(3).max(128), "evidence": z.array(z.object({ "type": z.enum(["command_output", "test_result", "log_excerpt", "preview_url"]), "content": z.string().min(0).max(20000) }).strict()).min(0).max(50) }).strict(), "recent_history": z.array(z.object({ "fingerprint": z.string().min(3).max(128), "count": z.number().int().gte(1).lte(999), "last_status": z.enum(["PASS", "WARN", "FAIL"]) }).strict()).min(0).max(50), "decision_snapshot": z.array(z.object({ "decision_id": z.string().min(3).max(128), "summary": z.string().min(1).max(500) }).strict()).min(0).max(25) }).strict();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SpecHighAskQueueItemsFileSchema = z.object({ "schema_version": z.literal("1.0"), "run_id": z.string().min(1), "generated_at": z.string().min(1), "items": z.array(z.object({ "id": z.string().min(1), "kind": z.string().min(1), "phase": z.string().min(1).optional(), "internal": z.object({ "category": z.string().min(1).optional(), "card_id": z.string().min(1).optional(), "strict_question": z.string().min(1).optional() }).strict().optional(), "research": z.object({ "confidence": z.number().optional(), "sources": z.array(z.object({ "type": z.string().min(1).optional(), "ref": z.string().min(1).optional() }).strict()).optional(), "unverified": z.boolean().optional() }).strict().optional(), "ui": z.object({ "user_said": z.array(z.string()).optional(), "ai_summary_label": z.string().min(1).optional(), "summary_bullets": z.array(z.string()).optional(), "why_this_question": z.string().optional(), "question": z.string().min(1).optional(), "options": z.array(z.object({ "key": z.string().min(1).optional(), "label": z.string().min(1).optional(), "next_action_hint": z.string().optional() }).strict()).optional(), "default": z.string().min(1).optional() }).strict().optional(), "resolution": z.object({ "answer_command": z.string().min(1).optional() }).strict().optional() }).strict()) }).strict().describe("SSOT schema for Spec-High run artifact ask_queue_items.json");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SpecHighClinicBridgeOutputSchema = z.object({ "status": z.string().min(1), "bridge_path": z.string().min(1).optional(), "message": z.string().min(1).optional() }).strict().describe("SSOT schema for spec-high clinic-bridge command JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SpecHighDecisionDraftOutputSchema = z.object({ "status": z.string().min(1), "summary": z.object({ "goal": z.string().min(1).optional(), "target_user": z.string().min(1).optional(), "first_milestone": z.string().min(1).optional(), "top_risk": z.string().min(1).optional() }).strict().optional(), "ask_queue_count": z.number().int().gte(0).optional() }).strict().describe("SSOT schema for spec-high decision-draft command JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SpecHighValidateOutputSchema = z.object({ "status": z.string().min(1), "signal_level": z.enum(["LEVEL_1", "LEVEL_2", "LEVEL_3"]).optional(), "decisions_pending": z.number().int().gte(0).optional(), "decisions_made": z.number().int().gte(0).optional(), "risks": z.array(z.string()).optional(), "phase": z.string().min(1).optional() }).strict().describe("SSOT schema for spec-high validate command JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const StatusOutputSchema = z.object({ "project_id": z.string().min(1), "project": z.object({ "name": z.string().min(1), "mode": z.string().min(1), "started_at": z.string().min(1) }).strict(), "current_state": z.object({ "phase": z.string().min(1), "decisions_made": z.number().int().gte(0), "decisions_pending": z.number().int().gte(0), "last_review_status": z.enum(["GO", "FIX", "BLOCK"]).optional() }).strict(), "risks": z.array(z.string()), "next_action": z.object({ "tool": z.string().min(1), "label": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.status MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SubmitDecisionInputSchema = z.object({ "project_id": z.string().min(1).describe("프로젝트 ID (생략 시 현재 폴더 사용)").optional(), "decision_id": z.string().min(1).describe("결재할 항목의 ID"), "choice": z.enum(["A", "B", "C", "U"]).describe("선택한 옵션 (A/B/C/U 중 하나)"), "note": z.string().min(1).describe("추가 메모 (선택사항)").optional() }).strict().describe("SSOT schema for vibe_pm.submit_decision MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const SubmitDecisionOutputSchema = z.object({ "project_id": z.string().min(1), "result": z.object({ "decision_id": z.string().min(1), "chosen": z.enum(["A", "B", "C", "U"]), "summary": z.string().min(1) }).strict(), "remaining_decisions": z.number().int().gte(0), "next_action": z.object({ "tool": z.enum(["vibe_pm.create_work_order", "vibe_pm.get_decision"]), "reason": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.submit_decision MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ToolErrorOutputSchema = z.object({ "status": z.literal("ERROR"), "reason": z.string().min(1), "message": z.string().min(1), "recovery": z.string().min(1).optional(), "is_retryable": z.boolean().optional(), "details": z.record(z.any()).optional(), "debug": z.record(z.any()).optional() }).strict();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UndoLastTaskInputSchema = z.object({ "steps": z.number().int().gte(1).describe("되돌릴 단계 수").default(1), "reason": z.string().min(1).describe("취소 이유").optional() }).strict().describe("SSOT schema for vibe_pm.undo_last_task MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UndoLastTaskOutputSchema = z.object({ "success": z.boolean(), "reverted_tasks": z.array(z.object({ "commit_hash": z.string().min(1), "task_summary": z.string().min(1), "timestamp": z.string().min(1) }).strict()), "current_commit": z.string().min(1), "message": z.string().min(1) }).strict().describe("SSOT schema for vibe_pm.undo_last_task MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UpdateInputSchema = z.object({ "force": z.boolean().describe("캐시를 무시하고 강제로 재설치할지 여부 (기본: false)").default(false), "engines": z.array(z.string().min(1)).describe("업데이트할 엔진 목록 (미지정 시 전체)").optional() }).strict().describe("SSOT schema for vibe_pm.update MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const UpdateOutputSchema = z.object({ "status": z.enum(["OK", "PARTIAL", "ERROR"]), "summary": z.string().min(1), "results": z.array(z.object({ "name": z.string().min(1), "action": z.enum(["updated", "skipped", "failed"]), "from_version": z.union([z.string(), z.null()]), "to_version": z.string().min(1), "message": z.string().min(1) }).strict()), "next_action": z.object({ "type": z.enum(["NONE", "RETRY", "CONTACT_SUPPORT"]), "message": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.update MCP tool output");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibePmInspectionResultSchema = z.object({ "review_result": z.enum(["GO", "FIX", "BLOCK"]), "message_template_id": z.enum(["GO-01", "GO-02", "FIX-01", "FIX-02", "BLOCK-01", "BLOCK-02"]), "issues_found": z.array(z.object({ "type": z.enum(["RULE_VIOLATION", "VERIFY_FAIL", "SCOPE_MISMATCH", "RISK_SPIKE"]), "business_risk": z.string().min(1), "plain_explanation": z.string().min(1), "technical_detail": z.object({ "file_path": z.string().min(1), "line_range": z.array(z.number().int()).min(2).max(2).optional(), "rule_violated": z.string().optional() }).strict().optional() }).strict()) }).strict().describe("Derived subset of InspectCodeOutput (SSOT). Core logic result before formatting.");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibePmReportMarkdownSchema = z.object({ "title": z.string().min(1).optional(), "markdown": z.string().min(1), "format": z.literal("markdown").default("markdown") }).strict().describe("Final rendered markdown content for Adapters (VS Code Webview / GitHub Comment / Check).");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibePmVerdictSchema = z.object({ "status": z.enum(["success", "neutral", "failure"]), "should_block_merge": z.boolean(), "exit_code": z.union([z.literal(0), z.literal(1), z.literal(2)]) }).strict().describe("Translation of InspectionResult into platform statuses (GitHub/CLI).");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibeRepoConfigSchema = z.object({ "$schema": z.string().describe("Optional JSON Schema reference for editors.").optional(), "version": z.string().regex(new RegExp("^\\d+\\.\\d+\\.\\d+$")).describe("Config schema version (semver)."), "mode": z.enum(["local-first", "server-required"]).describe("Operation mode. server-required is an explicit policy opt-in (not a paywall).").default("local-first"), "project": z.object({ "name": z.string().min(1), "description": z.string().optional(), "managed_since": z.string().datetime({ offset: true }).describe("ISO8601 timestamp when Vibe PM management started.") }).strict(), "policy": z.object({ "no_ticket_no_work": z.boolean().describe("Require work order for non-green changes.").default(true), "enforcement": z.enum(["warn", "block"]).describe("Global enforcement level (default warn).").default("warn"), "stale_hours": z.number().int().gte(1).lte(168).describe("Warn if current work order is older than this threshold (hours).").default(24), "auto_update_on_start": z.enum(["off", "prompt", "silent"]).describe("CLI start hook behavior (vibe). off=disable checks; prompt=ask before updating; silent=attempt update without prompt. Never blocks command execution.").default("prompt"), "safety_zones": z.object({ "green": z.array(z.string().min(1)).default([]), "yellow": z.array(z.string().min(1)).default([]), "red": z.array(z.string().min(1)).default([]), "black": z.array(z.string().min(1)).default([]) }).strict().optional() }).strict().optional(), "hooks": z.object({ "pre_commit": z.object({ "enabled": z.boolean().default(false), "enforcement": z.enum(["warn", "block"]).default("warn") }).strict().optional(), "pre_push": z.object({ "enabled": z.boolean().default(true), "enforcement": z.enum(["warn", "block"]).default("warn"), "gitleaks_required": z.boolean().describe("Fail pre-push if gitleaks is missing (fail-closed).").default(false) }).strict().optional() }).strict().optional(), "mcp": z.object({ "server_url": z.string().min(1).default("http://localhost:3000"), "auto_connect": z.boolean().default(true), "timeout_ms": z.number().int().gte(1000).lte(30000).default(5000) }).strict().optional(), "ai_agents": z.object({ "require_entrypoint_read": z.boolean().default(true), "require_briefing_before_work": z.boolean().default(true) }).strict().optional() }).strict().describe("SSOT schema for Vibe PM Local Mode repo config (.vibe/config.json).");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibecodingHelperAnswerOutputSchema = z.object({ "status": z.string().min(1), "message": z.string().optional(), "remaining": z.number().int().gte(0).optional(), "ask_queue_remaining": z.number().int().gte(0).optional() }).strict().describe("SSOT schema for vibecoding-helper answer command JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibecodingHelperOneLoopSelectionOutputSchema = z.object({ "status": z.string().min(1), "signal_level": z.enum(["LEVEL_1", "LEVEL_2", "LEVEL_3"]).optional(), "signal": z.string().optional(), "modified_files": z.array(z.string()).optional(), "features": z.array(z.string()).optional(), "issues": z.array(z.object({ "type": z.string().optional(), "issue_type": z.string().optional(), "message": z.string().optional(), "description": z.string().optional(), "business_risk": z.string().optional(), "file_path": z.string().optional(), "line_range": z.array(z.number().int()).min(2).max(2).optional(), "rule_violated": z.string().optional() }).strict()).optional(), "verification_results": z.array(z.object({ "criterion": z.string().optional(), "passed": z.boolean().optional(), "message": z.string().optional() }).strict()).optional(), "scope_violations": z.array(z.object({ "type": z.string().optional(), "description": z.string().optional(), "file_path": z.string().optional() }).strict()).optional() }).strict().describe("SSOT schema for vibecoding-helper one-loop --output selection JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const VibecodingHelperShowAskQueueOutputSchema = z.object({ "status": z.string().min(1), "items": z.array(z.object({ "id": z.string().min(1).optional(), "card_id": z.string().min(1).optional(), "question": z.string().min(1).optional(), "title": z.string().min(1).optional(), "context": z.string().optional(), "description": z.string().optional(), "options": z.array(z.object({ "key": z.string().min(1).optional(), "label": z.string().min(1).optional(), "description": z.string().optional() }).strict()).optional(), "choices": z.array(z.object({ "key": z.string().min(1).optional(), "label": z.string().min(1).optional(), "description": z.string().optional() }).strict()).optional(), "text": z.string().optional() }).strict()).optional(), "ask_queue": z.array(z.object({ "id": z.string().min(1).optional(), "card_id": z.string().min(1).optional(), "question": z.string().min(1).optional(), "title": z.string().min(1).optional(), "context": z.string().optional(), "description": z.string().optional(), "options": z.array(z.object({ "key": z.string().min(1).optional(), "label": z.string().min(1).optional(), "description": z.string().optional() }).strict()).optional(), "choices": z.array(z.object({ "key": z.string().min(1).optional(), "label": z.string().min(1).optional(), "description": z.string().optional() }).strict()).optional(), "text": z.string().optional() }).strict()).optional(), "text": z.string().optional() }).strict().describe("SSOT schema for vibecoding-helper show-ask-queue command JSON stdout");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const WorkOrderV1Schema = z.object({ "intent": z.string().min(10).describe("작업 의도 설명 (최소 10자)"), "scope": z.object({ "include": z.array(z.string()).min(1).describe("포함할 경로 패턴 (glob)"), "exclude": z.array(z.string()).describe("제외할 경로 패턴 (glob)").default([]) }).strict().describe("작업 범위 정의"), "tool_style": z.enum(["CRUD", "QUERY", "EXEC"]).describe("도구 스타일: CRUD(상태변경), QUERY(조회), EXEC(실행)"), "limits": z.object({ "max_depth": z.number().int().gte(1).lte(100).describe("최대 탐색 깊이").optional(), "max_files": z.number().int().gte(1).lte(10000).describe("최대 파일 수").optional(), "max_cost": z.number().gte(0).lte(100).describe("최대 비용 (토큰 기준 USD)").optional(), "max_tokens": z.number().int().gte(1).lte(1000000).describe("최대 토큰 수").optional(), "max_seconds": z.number().int().gte(1).lte(3600).describe("최대 실행 시간 (초)").optional() }).strict().describe("리소스 제한 (QUERY 스타일 필수)").optional(), "idempotency_key": z.string().regex(new RegExp("^[a-zA-Z0-9_-]{8,64}$")).describe("멱등성 키 (EXEC 스타일 필수)").optional(), "metadata": z.object({ "requester": z.string().optional(), "project_id": z.string().optional(), "correlation_id": z.string().optional() }).catchall(z.any()).describe("추가 메타데이터").optional() }).strict().and(z.intersection(z.any().describe("QUERY 스타일은 limits 필수 (폭주 방지)"), z.any().describe("EXEC 스타일은 idempotency_key 필수 (멱등성 보장)"))).describe("Vibe PM 실행 요청 (통제 대상). Gate 통과 후에만 실행 가능.");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ZoektEvidenceInputSchema = z.object({ "project_id": z.string().min(1), "run_id": z.string().min(1).optional(), "roots": z.array(z.string().min(1)).min(1).max(50), "queries": z.array(z.string().min(1)).min(1).max(50), "sample_paths": z.number().int().gte(1).lte(200).default(20), "max_file_bytes": z.number().int().gte(1).default(2097152), "write_evidence": z.boolean().default(true) }).strict().describe("SSOT schema for vibe_pm.zoekt_evidence MCP tool input");
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ZoektEvidenceOutputSchema = z.object({ "success": z.boolean(), "project_id": z.string().min(1), "run_id": z.string().min(1), "engine": z.enum(["zoekt", "rg", "python_scan"]), "evidence_path": z.string().min(1).optional(), "queries": z.array(z.object({ "q": z.string().min(1), "repos_scanned": z.number().int().gte(0), "match_count": z.number().int().gte(0), "sample_paths": z.array(z.string().min(1)) }).strict()), "warnings": z.array(z.string()), "next_action": z.object({ "tool": z.literal("vibe_pm.export_output"), "reason": z.string().min(1) }).strict() }).strict().describe("SSOT schema for vibe_pm.zoekt_evidence MCP tool output");
|
package/build/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// adapters/mcp-ts/src/index.ts
|
|
2
|
+
// VibeCoding MCP Server (One-click Bootstrap)
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
import { defineTools } from "./tools.js";
|
|
9
|
+
import { defineVibePmTools, VIBE_PM_TOOL_DESCRIPTIONS } from "./tools/vibe_pm/index.js";
|
|
10
|
+
import { defineReactPerfTools, REACT_PERF_TOOL_DESCRIPTIONS } from "./tools/react_perf/index.js";
|
|
11
|
+
import { makeLegacyDescription } from "./legacy_alias.js";
|
|
12
|
+
import { registerVibeResources, registerVibeResourceTemplates } from "./resources/index.js";
|
|
13
|
+
/**
|
|
14
|
+
* VibeCoding MCP Server (stdio)
|
|
15
|
+
*
|
|
16
|
+
* One-click bootstrap: automatically downloads and caches engine binaries
|
|
17
|
+
* on first tool call. No PATH dependency.
|
|
18
|
+
*
|
|
19
|
+
* Tool Namespaces:
|
|
20
|
+
* - vibe_pm.*: New PM-focused tools (recommended)
|
|
21
|
+
* - react_perf.*: React/Next.js performance analysis (optional)
|
|
22
|
+
* - vibecode.*: Legacy tools (deprecated)
|
|
23
|
+
* - spec_high.*: Legacy Spec-High tools (deprecated)
|
|
24
|
+
* - clinic.*: Legacy Clinic tools (deprecated)
|
|
25
|
+
*/
|
|
26
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
const SERVER_VERSION = (() => {
|
|
28
|
+
try {
|
|
29
|
+
const pkgPath = path.join(__dirname, "..", "package.json");
|
|
30
|
+
const raw = fs.readFileSync(pkgPath, "utf-8");
|
|
31
|
+
const parsed = JSON.parse(raw);
|
|
32
|
+
const v = (parsed.version ?? "").trim();
|
|
33
|
+
return v || "0.0.0";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return "0.0.0";
|
|
37
|
+
}
|
|
38
|
+
})();
|
|
39
|
+
const server = new McpServer({
|
|
40
|
+
name: "vibecode",
|
|
41
|
+
version: SERVER_VERSION
|
|
42
|
+
});
|
|
43
|
+
// Legacy tools
|
|
44
|
+
const t = defineTools();
|
|
45
|
+
// New vibe_pm.* tools
|
|
46
|
+
const pm = defineVibePmTools();
|
|
47
|
+
// Optional react_perf.* tools
|
|
48
|
+
const rp = defineReactPerfTools();
|
|
49
|
+
// ============================================================
|
|
50
|
+
// NEW: vibe_pm.* Tools (Recommended)
|
|
51
|
+
// ============================================================
|
|
52
|
+
server.tool("vibe_pm.briefing", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.briefing"], pm.briefingInputSchema.shape, async (input) => pm.vibePmBriefing(pm.briefingInputSchema.parse(input)));
|
|
53
|
+
server.tool("vibe_pm.get_decision", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.get_decision"], pm.getDecisionInputSchema.shape, async (input) => pm.vibePmGetDecision(pm.getDecisionInputSchema.parse(input)));
|
|
54
|
+
server.tool("vibe_pm.submit_decision", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.submit_decision"], pm.submitDecisionInputSchema.shape, async (input) => pm.vibePmSubmitDecision(pm.submitDecisionInputSchema.parse(input)));
|
|
55
|
+
server.tool("vibe_pm.create_work_order", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.create_work_order"], pm.createWorkOrderInputSchema.shape, async (input) => pm.vibePmCreateWorkOrder(pm.createWorkOrderInputSchema.parse(input)));
|
|
56
|
+
server.tool("vibe_pm.inspect_code", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.inspect_code"], pm.inspectCodeInputSchema.shape, async (input) => pm.vibePmInspectCode(pm.inspectCodeInputSchema.parse(input)));
|
|
57
|
+
server.tool("vibe_pm.status", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.status"], pm.statusInputSchema.shape, async (input) => pm.vibePmStatus(pm.statusInputSchema.parse(input)));
|
|
58
|
+
server.tool("vibe_pm.activate", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.activate"], pm.activateInputSchema.shape, async (input) => pm.vibePmActivate(pm.activateInputSchema.parse(input)));
|
|
59
|
+
server.tool("vibe_pm.memory_status", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.memory_status"], pm.memoryStatusInputSchema.shape, async (input) => pm.vibePmMemoryStatus(pm.memoryStatusInputSchema.parse(input)));
|
|
60
|
+
server.tool("vibe_pm.memory_sync", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.memory_sync"], pm.memorySyncInputSchema.shape, async (input) => pm.vibePmMemorySync(pm.memorySyncInputSchema.parse(input)));
|
|
61
|
+
server.tool("vibe_pm.advisory_review", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.advisory_review"], pm.advisoryReviewInputSchema.shape, async (input) => pm.vibePmAdvisoryReview(pm.advisoryReviewInputSchema.parse(input)));
|
|
62
|
+
server.tool("vibe_pm.repair_plan", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.repair_plan"], pm.repairPlanInputSchema.shape, async (input) => pm.vibePmRepairPlan(pm.repairPlanInputSchema.parse(input)));
|
|
63
|
+
server.tool("vibe_pm.doctor", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.doctor"], pm.doctorInputSchema.shape, async (input) => pm.vibePmDoctor(pm.doctorInputSchema.parse(input)));
|
|
64
|
+
server.tool("vibe_pm.update", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.update"], pm.updateInputSchema.shape, async (input) => pm.vibePmUpdate(pm.updateInputSchema.parse(input)));
|
|
65
|
+
server.tool("vibe_pm.scaffold", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.scaffold"], pm.scaffoldInputSchema.shape, async (input) => pm.vibePmScaffold(pm.scaffoldInputSchema.parse(input)));
|
|
66
|
+
server.tool("vibe_pm.finalize_work", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.finalize_work"], pm.finalizeWorkInputSchema.shape, async (input) => pm.vibePmFinalizeWork(pm.finalizeWorkInputSchema.parse(input)));
|
|
67
|
+
server.tool("vibe_pm.undo_last_task", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.undo_last_task"], pm.undoLastTaskInputSchema.shape, async (input) => pm.vibePmUndoLastTask(pm.undoLastTaskInputSchema.parse(input)));
|
|
68
|
+
server.tool("vibe_pm.run_app", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.run_app"], pm.runAppInputSchema.shape, async (input) => pm.vibePmRunApp(pm.runAppInputSchema.parse(input)));
|
|
69
|
+
server.tool("vibe_pm.export_output", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.export_output"], pm.exportOutputInputSchema.shape, async (input) => pm.vibePmExportOutput(pm.exportOutputInputSchema.parse(input)));
|
|
70
|
+
server.tool("vibe_pm.search_oss", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.search_oss"], pm.searchOssInputSchema.shape, async (input) => pm.vibePmSearchOss(pm.searchOssInputSchema.parse(input)));
|
|
71
|
+
server.tool("vibe_pm.zoekt_evidence", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.zoekt_evidence"], pm.zoektEvidenceInputSchema.shape, async (input) => pm.vibePmZoektEvidence(pm.zoektEvidenceInputSchema.parse(input)));
|
|
72
|
+
server.tool("vibe_pm.gate", VIBE_PM_TOOL_DESCRIPTIONS["vibe_pm.gate"], pm.gateInputSchema.shape, async (input) => pm.vibePmGate(pm.gateInputSchema.parse(input)));
|
|
73
|
+
// ============================================================
|
|
74
|
+
// OPTIONAL: react_perf.* Tools (Performance Analysis)
|
|
75
|
+
// ============================================================
|
|
76
|
+
server.tool("react_perf.check_patterns", REACT_PERF_TOOL_DESCRIPTIONS["react_perf.check_patterns"], rp.checkPatternsInputSchema.shape, async (input) => rp.reactPerfCheckPatterns(rp.checkPatternsInputSchema.parse(input)));
|
|
77
|
+
server.tool("react_perf.generate_report", REACT_PERF_TOOL_DESCRIPTIONS["react_perf.generate_report"], rp.generateReportInputSchema.shape, async (input) => rp.reactPerfGenerateReport(rp.generateReportInputSchema.parse(input)));
|
|
78
|
+
// ============================================================
|
|
79
|
+
// LEGACY: vibecode.* Tools (Deprecated)
|
|
80
|
+
// ============================================================
|
|
81
|
+
// Health check / bootstrap trigger
|
|
82
|
+
server.tool("vibecode.doctor", "Check engine installation status and paths. Triggers one-click bootstrap if engines are missing.", t.doctorInput.shape, async (input) => t.vibecodeDoctor(t.doctorInput.parse(input)));
|
|
83
|
+
// Primary tool → maps to vibe_pm.inspect_code
|
|
84
|
+
server.tool("vibecode.one_loop", makeLegacyDescription("Run the canonical VibeCoding one-loop and return SELECTION_VALIDATION_RESULT (JSON).", "vibecode.one_loop"), t.oneLoopInput.shape, async (input) => t.vibecodeOneLoop(t.oneLoopInput.parse(input)));
|
|
85
|
+
// Ask queue → maps to vibe_pm.get_decision
|
|
86
|
+
server.tool("vibecode.show_ask_queue", makeLegacyDescription("Show pending ask_queue for a run_id (human readable text, wrapped in JSON).", "vibecode.show_ask_queue"), t.askQueueInput.shape, async (input) => t.vibecodeShowAskQueue(t.askQueueInput.parse(input)));
|
|
87
|
+
// Decisions → maps to vibe_pm.status
|
|
88
|
+
server.tool("vibecode.show_decisions", makeLegacyDescription("Show decision summary for a run_id (markdown, wrapped in JSON).", "vibecode.show_decisions"), t.showDecisionsInput.shape, async (input) => t.vibecodeShowDecisions(t.showDecisionsInput.parse(input)));
|
|
89
|
+
// Answer → maps to vibe_pm.submit_decision
|
|
90
|
+
server.tool("vibecode.answer", makeLegacyDescription("Answer Spec-High ask_queue with a text input and update run artifacts.", "vibecode.answer"), t.answerInput.shape, async (input) => t.vibecodeAnswer(t.answerInput.parse(input)));
|
|
91
|
+
// ============================================================
|
|
92
|
+
// LEGACY: spec_high.* Tools (Deprecated)
|
|
93
|
+
// ============================================================
|
|
94
|
+
server.tool("spec_high.validate", makeLegacyDescription("Validate Spec-High artifacts for a run_id (schema/gates).", "spec_high.validate"), t.validateInput.shape, async (input) => t.specHighValidate(t.validateInput.parse(input)));
|
|
95
|
+
server.tool("spec_high.clinic_bridge", makeLegacyDescription("Generate clinic_bridge (yaml|json) under runs/<run_id>/handoff/.", "spec_high.clinic_bridge"), t.bridgeInput.shape, async (input) => t.specHighClinicBridge(t.bridgeInput.parse(input)));
|
|
96
|
+
server.tool("spec_high.quality_eval", "Run Spec-High quality-eval and write quality_report.json.", t.qualityInput.shape, async (input) => t.specHighQualityEval(t.qualityInput.parse(input)));
|
|
97
|
+
// ============================================================
|
|
98
|
+
// LEGACY: clinic.* Tools (Deprecated)
|
|
99
|
+
// ============================================================
|
|
100
|
+
server.tool("clinic.verify", makeLegacyDescription("Run Code Clinic verify with a clinic_bridge path.", "clinic.verify"), t.clinicVerifyInput.shape, async (input) => t.clinicVerify(t.clinicVerifyInput.parse(input)));
|
|
101
|
+
server.tool("clinic.report_latest", "Show latest clinic report output (human text wrapped in JSON).", t.clinicReportInput.shape, async (input) => t.clinicReportLatest(t.clinicReportInput.parse(input)));
|
|
102
|
+
// ============================================================
|
|
103
|
+
// RESOURCES: vibe:// URI scheme
|
|
104
|
+
// ============================================================
|
|
105
|
+
registerVibeResources(server);
|
|
106
|
+
registerVibeResourceTemplates(server);
|
|
107
|
+
// ============================================================
|
|
108
|
+
// Start stdio transport
|
|
109
|
+
// ============================================================
|
|
110
|
+
const transport = new StdioServerTransport();
|
|
111
|
+
await server.connect(transport);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// adapters/mcp-ts/src/legacy_alias.ts
|
|
2
|
+
// Legacy tool name aliases for backward compatibility
|
|
3
|
+
/**
|
|
4
|
+
* Mapping from legacy tool names to new vibe_pm.* tools
|
|
5
|
+
*
|
|
6
|
+
* Legacy tools are maintained for backward compatibility but marked as deprecated.
|
|
7
|
+
* New integrations should use the vibe_pm.* namespace.
|
|
8
|
+
*/
|
|
9
|
+
export const LEGACY_MAPPING = {
|
|
10
|
+
"vibecode.one_loop": "vibe_pm.inspect_code",
|
|
11
|
+
"vibecode.show_ask_queue": "vibe_pm.get_decision",
|
|
12
|
+
"vibecode.answer": "vibe_pm.submit_decision",
|
|
13
|
+
"vibecode.show_decisions": "vibe_pm.status",
|
|
14
|
+
"spec_high.clinic_bridge": "vibe_pm.create_work_order",
|
|
15
|
+
"spec_high.validate": "vibe_pm.inspect_code",
|
|
16
|
+
"clinic.verify": "vibe_pm.inspect_code"
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Get the new tool name for a legacy tool
|
|
20
|
+
*/
|
|
21
|
+
export function getNewToolName(legacyName) {
|
|
22
|
+
return LEGACY_MAPPING[legacyName] ?? null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if a tool name is a legacy alias
|
|
26
|
+
*/
|
|
27
|
+
export function isLegacyTool(toolName) {
|
|
28
|
+
return toolName in LEGACY_MAPPING;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get deprecation notice for a legacy tool
|
|
32
|
+
*/
|
|
33
|
+
export function getDeprecationNotice(legacyName) {
|
|
34
|
+
const newName = LEGACY_MAPPING[legacyName];
|
|
35
|
+
if (!newName) {
|
|
36
|
+
return "";
|
|
37
|
+
}
|
|
38
|
+
return `[DEPRECATED] Use "${newName}" instead. This alias will be removed in a future version.`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generate deprecated description for legacy tool registration
|
|
42
|
+
*/
|
|
43
|
+
export function makeLegacyDescription(originalDescription, legacyName) {
|
|
44
|
+
const newName = LEGACY_MAPPING[legacyName];
|
|
45
|
+
if (!newName) {
|
|
46
|
+
return originalDescription;
|
|
47
|
+
}
|
|
48
|
+
return `[DEPRECATED: Use ${newName}] ${originalDescription}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* List of all legacy tool names
|
|
52
|
+
*/
|
|
53
|
+
export const LEGACY_TOOL_NAMES = Object.keys(LEGACY_MAPPING);
|
|
54
|
+
/**
|
|
55
|
+
* List of all new tool names
|
|
56
|
+
*/
|
|
57
|
+
export const NEW_TOOL_NAMES = [
|
|
58
|
+
"vibe_pm.briefing",
|
|
59
|
+
"vibe_pm.get_decision",
|
|
60
|
+
"vibe_pm.submit_decision",
|
|
61
|
+
"vibe_pm.create_work_order",
|
|
62
|
+
"vibe_pm.inspect_code",
|
|
63
|
+
"vibe_pm.status",
|
|
64
|
+
"vibe_pm.repair_plan"
|
|
65
|
+
];
|