sneakoscope 0.7.6 → 0.7.13
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 +31 -27
- package/package.json +2 -2
- package/src/cli/context7-command.mjs +163 -0
- package/src/cli/install-helpers.mjs +325 -0
- package/src/cli/main.mjs +245 -509
- package/src/cli/maintenance-commands.mjs +31 -31
- package/src/core/artifact-schemas.mjs +6 -6
- package/src/core/codex-app.mjs +1 -1
- package/src/core/db-safety.mjs +1 -1
- package/src/core/evaluation.mjs +3 -3
- package/src/core/fsx.mjs +1 -1
- package/src/core/init.mjs +20 -14
- package/src/core/pipeline.mjs +14 -3
- package/src/core/ppt.mjs +694 -0
- package/src/core/questions.mjs +51 -7
- package/src/core/routes.mjs +60 -10
- package/src/core/team-live.mjs +8 -8
- package/src/core/tmux-ui.mjs +447 -0
- package/src/core/warp-ui.mjs +0 -557
package/src/core/questions.mjs
CHANGED
|
@@ -66,6 +66,15 @@ function addInferred(out, notes, id, value, note) {
|
|
|
66
66
|
notes[id] = note;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
function looksLikePresentationArtifactPrompt(lower) {
|
|
70
|
+
const presentationCue = /^\s*\$ppt\b/.test(lower)
|
|
71
|
+
|| /\b(ppt|presentation|deck|slide|slides|pitch\s*deck|proposal\s*deck)\b/.test(lower)
|
|
72
|
+
|| /발표자료|발표\s*자료|소개자료|제안서|피치덱|슬라이드|pdf\s*자료/.test(lower);
|
|
73
|
+
if (!presentationCue) return false;
|
|
74
|
+
const pipelineMeta = /커맨드|command|route|routing|파이프라인|pipeline|schema|스키마|모호성|ambiguity|질문|게이트|gate/.test(lower);
|
|
75
|
+
return !pipelineMeta || /^\s*\$ppt\b/.test(lower);
|
|
76
|
+
}
|
|
77
|
+
|
|
69
78
|
export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
70
79
|
const text = `${prompt || ''}\n${explicitAnswers.GOAL_PRECISE || ''}`;
|
|
71
80
|
const lower = text.toLowerCase();
|
|
@@ -78,8 +87,10 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
78
87
|
.trim();
|
|
79
88
|
const version = String(text || '').match(/\bv?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)\b/)?.[1] || null;
|
|
80
89
|
const versionWork = /버전|version|bump|release|publish:dry|npm\s+pack/.test(lower);
|
|
81
|
-
const installWork = /bootstrap|postinstall|doctor|deps|
|
|
90
|
+
const installWork = /bootstrap|postinstall|doctor|deps|tmux|homebrew|first install|최초\s*설치|설치\s*ux|셋업|setup/.test(lower);
|
|
82
91
|
const questionGateWork = /모호|ambiguity|clarification|질문|triwiki|추론|infer|predict|예측|answers?\.json|decision-contract/.test(lower);
|
|
92
|
+
const uiuxWork = /\b(ui|modal|screen|button|visual|design|layout|component|prototype|frontend)\b|화면|버튼|모달|디자인|레이아웃|컴포넌트|프론트|시각|발표자료|디자인\s*시스템/.test(lower);
|
|
93
|
+
const presentationWork = looksLikePresentationArtifactPrompt(lower);
|
|
83
94
|
const dbWork = new RegExp(["\\bdb\\b", "database", "schema", "migration", "tab" + "le", "col" + "umn", "rls", "supabase", "postgres", "sql", "테이블", "마이그레이션", "스키마", "컬럼", "열", "행", "데이터베이스"].join("|")).test(lower);
|
|
84
95
|
const dbSchemaWork = new RegExp(["schema", "migration", "migrate", "tab" + "le", "col" + "umn", "rls", "policy", "alt" + "er", "cre" + "ate\\s+tab" + "le", "add\\s+col" + "umn", "remove\\s+col" + "umn", "마이그레이션", "스키마", "테이블", "컬럼", "열", "정책"].join("|")).test(lower);
|
|
85
96
|
const dbReadOnlyTargetWork = /(production|prod|live|운영|프로덕션).*(read|inspect|query|조회|확인)|((read|inspect|query|조회|확인).*(production|prod|live|운영|프로덕션))/.test(lower);
|
|
@@ -98,6 +109,7 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
98
109
|
chat_capture: 'From-Chat-IMG로 채팅 요구사항과 첨부 원본 이미지를 매칭해 고객사 작업 지시서를 만들고 반영한다',
|
|
99
110
|
priority: '강한 불만과 반복 요청을 TriWiki 우선순위 신호로 기록한다',
|
|
100
111
|
questions: '예측 가능한 답은 추론하고 실제 모호한 항목만 질문한다',
|
|
112
|
+
presentation: '청중과 STP 전략에 맞는 HTML 기반 발표자료/PDF 산출물을 만든다',
|
|
101
113
|
install: 'SKS 최초 설치와 bootstrap을 한 번에 준비 상태까지 연결한다'
|
|
102
114
|
};
|
|
103
115
|
const criteria = {
|
|
@@ -105,6 +117,7 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
105
117
|
chat_capture: ['From-Chat-IMG activates chat-image intake only here', 'all visible chat requirements are listed before implementation', `${FROM_CHAT_IMG_COVERAGE_ARTIFACT} maps every customer request, screenshot region, and attachment to work-order item(s)`, `${FROM_CHAT_IMG_CHECKLIST_ARTIFACT} is updated as each request, image match, work item, scoped QA-LOOP, and verification step is completed`, `${FROM_CHAT_IMG_TEMP_TRIWIKI_ARTIFACT} records temporary TriWiki-backed session context with retention metadata`, `${FROM_CHAT_IMG_QA_LOOP_ARTIFACT} proves QA-LOOP ran over the exact customer-request work-order range after implementation`, 'unresolved_items is empty before Team completion', 'scoped_qa_loop_completed is true with zero unresolved QA findings', 'Codex Computer Use visual inspection strengthens matches when available; no Playwright or browser automation substitute is allowed', CODEX_COMPUTER_USE_ONLY_POLICY, 'client requests follow normal SKS gates and verification'],
|
|
106
118
|
priority: ['strong feedback raises required_weight', 'request topics are counted in wiki packs', 'future inference uses priority signals'],
|
|
107
119
|
questions: ['predictable answers are inferred', 'partial answers can seal contracts', 'only unresolved changing slots remain visible'],
|
|
120
|
+
presentation: ['audience profile and STP strategy are explicit before artifact creation', 'target pain points map to proposed solution moments', 'decision context and likely objections are sealed before storyboarding', 'presentation format, device, and delivery context are fixed before design work'],
|
|
108
121
|
install: ['bootstrap/deps initialize readiness', 'missing runtime deps show repair actions', 'readiness output is concrete']
|
|
109
122
|
};
|
|
110
123
|
if (!hasAnswer(explicitAnswers.GOAL_PRECISE)) {
|
|
@@ -112,8 +125,8 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
112
125
|
inferred,
|
|
113
126
|
notes,
|
|
114
127
|
'GOAL_PRECISE',
|
|
115
|
-
kind ? goals[kind] : (normalizedPrompt ? `사용자 요청을 현재 코드 기준으로 구현한다: ${normalizedPrompt}` : '사용자 요청을 현재 코드 기준으로 구현한다'),
|
|
116
|
-
kind || 'prompt-derived-goal'
|
|
128
|
+
presentationWork ? goals.presentation : (kind ? goals[kind] : (normalizedPrompt ? `사용자 요청을 현재 코드 기준으로 구현한다: ${normalizedPrompt}` : '사용자 요청을 현재 코드 기준으로 구현한다')),
|
|
129
|
+
presentationWork ? 'presentation' : (kind || 'prompt-derived-goal')
|
|
117
130
|
);
|
|
118
131
|
}
|
|
119
132
|
if (!hasAnswer(explicitAnswers.ACCEPTANCE_CRITERIA)) {
|
|
@@ -121,12 +134,12 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
121
134
|
inferred,
|
|
122
135
|
notes,
|
|
123
136
|
'ACCEPTANCE_CRITERIA',
|
|
124
|
-
kind ? criteria[kind] : [
|
|
137
|
+
presentationWork ? criteria.presentation : (kind ? criteria[kind] : [
|
|
125
138
|
'requested behavior is implemented in the relevant code path',
|
|
126
139
|
'relevant tests/checks pass or any unavailable check is explicitly justified',
|
|
127
140
|
'final response states what was changed, verified, and left unverified'
|
|
128
|
-
],
|
|
129
|
-
kind || 'default-implementation-criteria'
|
|
141
|
+
]),
|
|
142
|
+
presentationWork ? 'presentation' : (kind || 'default-implementation-criteria')
|
|
130
143
|
);
|
|
131
144
|
}
|
|
132
145
|
|
|
@@ -148,6 +161,27 @@ export function inferAnswersForPrompt(prompt, explicitAnswers = {}) {
|
|
|
148
161
|
'no unrequested fallback implementation code'
|
|
149
162
|
], 'safety');
|
|
150
163
|
}
|
|
164
|
+
if (uiuxWork) {
|
|
165
|
+
if (!hasAnswer(explicitAnswers.UI_STATE_BEHAVIOR)) {
|
|
166
|
+
addInferred(
|
|
167
|
+
inferred,
|
|
168
|
+
notes,
|
|
169
|
+
'UI_STATE_BEHAVIOR',
|
|
170
|
+
'infer_from_task_context_and_existing_design_system; preserve existing loading/error/empty/retry behavior unless explicitly requested; add only standard states required by the touched surface',
|
|
171
|
+
'uiux-inferred-default'
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
if (!hasAnswer(explicitAnswers.VISUAL_REGRESSION_REQUIRED)) {
|
|
175
|
+
const visualRequired = /스크린샷\s*필수|시각\s*검증\s*필수|visual\s*regression\s*required|screenshot\s*required/.test(lower);
|
|
176
|
+
addInferred(
|
|
177
|
+
inferred,
|
|
178
|
+
notes,
|
|
179
|
+
'VISUAL_REGRESSION_REQUIRED',
|
|
180
|
+
visualRequired ? 'yes' : 'yes_if_available',
|
|
181
|
+
'uiux-inferred-default'
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
151
185
|
if (dbWork) {
|
|
152
186
|
const schemaChangeAllowed = questionGateWork ? 'no' : (dbSchemaWork ? 'yes_if_needed' : 'no');
|
|
153
187
|
const targetEnvironment = dbReadOnlyTargetWork
|
|
@@ -178,7 +212,8 @@ export function buildQuestionSchema(prompt) {
|
|
|
178
212
|
const domainHints = [];
|
|
179
213
|
if (/결제|payment|billing|invoice|checkout|order/.test(lower)) domainHints.push('payment');
|
|
180
214
|
if (/로그인|auth|session|token|인증/.test(lower)) domainHints.push('auth');
|
|
181
|
-
if (/\b(ui|modal|screen|button|visual|design)\b
|
|
215
|
+
if (/\b(ui|modal|screen|button|visual|design|layout|component|prototype|frontend)\b|화면|버튼|모달|디자인|레이아웃|컴포넌트|프론트|시각|발표자료|디자인\s*시스템/.test(lower)) domainHints.push('uiux');
|
|
216
|
+
if (looksLikePresentationArtifactPrompt(lower)) domainHints.push('presentation');
|
|
182
217
|
if (/db|database|schema|migration|테이블|마이그레이션|supabase|postgres|sql/.test(lower)) domainHints.push('db');
|
|
183
218
|
const slots = [
|
|
184
219
|
{ id: 'GOAL_PRECISE', question: '이번 작업의 최종 목표를 한 문장으로 정확히 정의해주세요.', required: true, type: 'string' },
|
|
@@ -216,6 +251,15 @@ export function buildQuestionSchema(prompt) {
|
|
|
216
251
|
{ id: 'VISUAL_REGRESSION_REQUIRED', question: '스크린샷/시각 검증이 필요한가요?', required: true, type: 'enum', options: ['no', 'yes_if_available', 'yes'] }
|
|
217
252
|
);
|
|
218
253
|
}
|
|
254
|
+
if (domainHints.includes('presentation')) {
|
|
255
|
+
slots.push(
|
|
256
|
+
{ id: 'PRESENTATION_DELIVERY_CONTEXT', question: '발표자료 사용 환경을 지정해주세요: 세로형 발표자료/모바일 문서/대형 화면 발표/인쇄 PDF 중 무엇인지, 발표 시간과 언어/톤은 무엇인가요?', required: true, type: 'string' },
|
|
257
|
+
{ id: 'PRESENTATION_AUDIENCE_PROFILE', question: '누구에게 발표하나요? 의사결정자/실무자/투자자/고객 등 역할, 평균 연령대, 직업/직무/산업, 주제 이해도와 관심도를 적어주세요.', required: true, type: 'string' },
|
|
258
|
+
{ id: 'PRESENTATION_STP_STRATEGY', question: 'STP 전략을 적어주세요: Segmentation(청중 세그먼트), Targeting(핵심 타깃), Positioning(그들에게 각인시킬 한 문장 포지션)은 무엇인가요?', required: true, type: 'string' },
|
|
259
|
+
{ id: 'PRESENTATION_PAINPOINT_SOLUTION_MAP', question: '타깃의 핵심 페인포인트와 이를 어떻게 해결해 줄 수 있는지 3개 이상 연결해 주세요. 가능하면 각 항목마다 기대되는 아하모먼트도 함께 적어주세요.', required: true, type: 'array_or_string' },
|
|
260
|
+
{ id: 'PRESENTATION_DECISION_CONTEXT', question: '발표 후 청중이 승인/구매/이해/실행해야 하는 다음 행동은 무엇이고, 그 결정을 막을 반대논리나 리스크는 무엇인가요?', required: true, type: 'string' }
|
|
261
|
+
);
|
|
262
|
+
}
|
|
219
263
|
if (domainHints.includes('db')) {
|
|
220
264
|
slots.push(
|
|
221
265
|
{ id: 'DB_MIGRATION_APPLY_ALLOWED', question: 'migration 적용이 필요할 경우 어디까지 허용하나요?', required: true, type: 'enum', options: ['no', 'local_only', 'preview_branch_only'] },
|
package/src/core/routes.mjs
CHANGED
|
@@ -7,8 +7,9 @@ export const FROM_CHAT_IMG_CHECKLIST_ARTIFACT = 'from-chat-img-checklist.md';
|
|
|
7
7
|
export const FROM_CHAT_IMG_TEMP_TRIWIKI_ARTIFACT = 'from-chat-img-temp-triwiki.json';
|
|
8
8
|
export const FROM_CHAT_IMG_QA_LOOP_ARTIFACT = 'from-chat-img-qa-loop.json';
|
|
9
9
|
export const FROM_CHAT_IMG_TEMP_TRIWIKI_SESSIONS = 5;
|
|
10
|
-
export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|
|
|
10
|
+
export const USAGE_TOPICS = 'install|setup|bootstrap|root|deps|tmux|auto-review|team|qa-loop|ppt|goal|research|db|codex-app|dfix|design|imagegen|dollar|context7|pipeline|reasoning|guard|conflicts|versioning|eval|harness|hproof|gx|wiki|code-structure|proof-field|skill-dream';
|
|
11
11
|
export const CODEX_COMPUTER_USE_EVIDENCE_SOURCE = 'codex_computer_use';
|
|
12
|
+
export const CODEX_APP_IMAGE_GENERATION_DOC_URL = 'https://developers.openai.com/codex/app/features#image-generation';
|
|
12
13
|
export const CODEX_COMPUTER_USE_ONLY_POLICY = 'Pipeline UI/browser verification and visual inspection must use Codex Computer Use only. Do not use Playwright, Chrome MCP, Browser Use, Selenium, Puppeteer, or any other browser automation substitute; if Codex Computer Use is unavailable, mark the UI/browser evidence unverified instead of substituting another tool.';
|
|
13
14
|
export const FORBIDDEN_BROWSER_AUTOMATION_RE = /\b(playwright|chrome\s+mcp|browser\s+use|selenium|puppeteer)\b/i;
|
|
14
15
|
|
|
@@ -34,6 +35,27 @@ export const RECOMMENDED_MCP_SERVERS = [
|
|
|
34
35
|
}
|
|
35
36
|
];
|
|
36
37
|
|
|
38
|
+
export const GETDESIGN_REFERENCE = {
|
|
39
|
+
id: 'getdesign',
|
|
40
|
+
url: 'https://getdesign.md/',
|
|
41
|
+
docs_url: 'https://docs.getdesign.app/',
|
|
42
|
+
official_urls_url: 'https://docs.getdesign.app/resources/official-urls/',
|
|
43
|
+
codex_guide_url: 'https://docs.getdesign.app/guides/use-with-codex/',
|
|
44
|
+
codex_skill: 'MohtashamMurshid/getdesign',
|
|
45
|
+
codex_skill_install: 'skills add MohtashamMurshid/getdesign',
|
|
46
|
+
npm_cli: '@getdesign/cli',
|
|
47
|
+
npm_sdk: '@getdesign/sdk',
|
|
48
|
+
official_mcp_available: false,
|
|
49
|
+
surfaces: ['web', 'api', 'cli', 'sdk', 'skill'],
|
|
50
|
+
purpose: 'Ground DESIGN.md, UI/UX design systems, and presentation-like HTML/PDF artifacts in current design references.'
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const RECOMMENDED_DESIGN_REFERENCES = [GETDESIGN_REFERENCE];
|
|
54
|
+
|
|
55
|
+
export function getdesignReferencePolicyText() {
|
|
56
|
+
return `Getdesign reference policy: when creating or improving design.md, UI/UX design systems, or presentation-like HTML/PDF artifacts, consult getdesign.md (${GETDESIGN_REFERENCE.url}) and its official docs. Prefer the official Codex skill when available (${GETDESIGN_REFERENCE.codex_skill_install}); otherwise use the generated getdesign-reference skill plus official Web/API/CLI/SDK docs. Do not claim an official getdesign MCP server is configured unless a current official MCP surface is actually available.`;
|
|
57
|
+
}
|
|
58
|
+
|
|
37
59
|
export const RECOMMENDED_SKILLS = [
|
|
38
60
|
'reasoning-router',
|
|
39
61
|
'pipeline-runner',
|
|
@@ -44,6 +66,7 @@ export const RECOMMENDED_SKILLS = [
|
|
|
44
66
|
'design-artifact-expert',
|
|
45
67
|
'design-system-builder',
|
|
46
68
|
'design-ui-editor',
|
|
69
|
+
'getdesign-reference',
|
|
47
70
|
'imagegen',
|
|
48
71
|
'computer-use',
|
|
49
72
|
'computer-use-fast',
|
|
@@ -208,7 +231,7 @@ export const ROUTES = [
|
|
|
208
231
|
context7Policy: 'optional',
|
|
209
232
|
reasoningPolicy: 'high',
|
|
210
233
|
stopGate: 'team-gate.json',
|
|
211
|
-
cliEntrypoint: 'sks team "task" [executor:5 reviewer:2 user:1] | sks team log|tail|watch|lane|status|event|message|cleanup-
|
|
234
|
+
cliEntrypoint: 'sks team "task" [executor:5 reviewer:2 user:1] | sks team log|tail|watch|lane|status|event|message|cleanup-tmux',
|
|
212
235
|
examples: ['$Team executor:5 agree on the best plan and implement it', '$From-Chat-IMG 채팅+첨부 이미지 작업 지시서']
|
|
213
236
|
},
|
|
214
237
|
{
|
|
@@ -225,6 +248,20 @@ export const ROUTES = [
|
|
|
225
248
|
cliEntrypoint: 'sks qa-loop prepare|answer|run|status',
|
|
226
249
|
examples: ['$QA-LOOP dogfood UI and API against local dev', '$QA-LOOP deployed smoke only']
|
|
227
250
|
},
|
|
251
|
+
{
|
|
252
|
+
id: 'PPT',
|
|
253
|
+
command: '$PPT',
|
|
254
|
+
mode: 'PPT',
|
|
255
|
+
route: 'HTML/PDF presentation pipeline',
|
|
256
|
+
description: 'Create restrained, information-first HTML/PDF presentation artifacts after delivery context, audience profile, STP, decision context, pain-point, research, design-system, and verification questions are sealed.',
|
|
257
|
+
requiredSkills: ['ppt', 'design-artifact-expert', 'getdesign-reference', 'imagegen', 'prompt-pipeline', REFLECTION_SKILL_NAME, 'honest-mode'],
|
|
258
|
+
lifecycle: ['stp_audience_questions', 'audience_strategy_artifact', 'contract_sealed', 'source_ledger', 'storyboard_aha_moments', 'design_system', 'html_artifact', 'pdf_export', 'render_qa', 'post_route_reflection', 'honest_mode'],
|
|
259
|
+
context7Policy: 'if_external_docs',
|
|
260
|
+
reasoningPolicy: 'high',
|
|
261
|
+
stopGate: 'ppt-gate.json',
|
|
262
|
+
cliEntrypoint: 'Codex App prompt route only: $PPT <topic>',
|
|
263
|
+
examples: ['$PPT 우리 SaaS 소개자료를 HTML 기반 PDF로 만들어줘', '$PPT 투자자용 피치덱 만들어줘']
|
|
264
|
+
},
|
|
228
265
|
{
|
|
229
266
|
id: 'ComputerUse',
|
|
230
267
|
command: '$Computer-Use',
|
|
@@ -376,16 +413,17 @@ export const COMMAND_CATALOG = [
|
|
|
376
413
|
{ name: 'commands', usage: 'sks commands [--json]', description: 'List every user-facing command with a short description.' },
|
|
377
414
|
{ name: 'usage', usage: `sks usage [${USAGE_TOPICS}]`, description: 'Print copy-ready workflows for common tasks.' },
|
|
378
415
|
{ name: 'quickstart', usage: 'sks quickstart', description: 'Show the shortest safe setup and verification flow.' },
|
|
379
|
-
{ name: 'bootstrap', usage: 'sks bootstrap [--install-scope global|project] [--local-only] [--json]', description: 'Initialize the current project, install SKS Codex App files/skills, check Context7/Codex App/
|
|
416
|
+
{ name: 'bootstrap', usage: 'sks bootstrap [--install-scope global|project] [--local-only] [--json]', description: 'Initialize the current project, install SKS Codex App files/skills, check Context7/Codex App/tmux, and print ready true/false.' },
|
|
380
417
|
{ name: 'root', usage: 'sks root [--json]', description: 'Show whether SKS is using a project root or the per-user global SKS runtime root.' },
|
|
381
|
-
{ name: 'deps', usage: 'sks deps check|install [
|
|
418
|
+
{ name: 'deps', usage: 'sks deps check|install [tmux|codex|context7|all] [--yes]', description: 'Check or guided-install Node/npm PATH, Codex CLI/App, Context7, Browser Use, Computer Use, tmux, and Homebrew on macOS.' },
|
|
382
419
|
{ name: 'codex-app', usage: 'sks codex-app [check|open]', description: 'Check Codex App install and first-party MCP/plugin readiness, then show app setup files and examples.' },
|
|
383
|
-
{ name: '
|
|
384
|
-
{ name: 'mad', usage: 'sks --mad [--high]', description: 'Open a one-shot
|
|
385
|
-
{ name: 'auto-review', usage: 'sks auto-review status|enable|start [--high] | sks --Auto-review --high', description: 'Enable Codex automatic approval review and launch SKS
|
|
420
|
+
{ name: 'tmux', usage: 'sks tmux open|check|status [--workspace name]', description: 'Explicitly open the SKS tmux runtime, or check/status without launching tmux.' },
|
|
421
|
+
{ name: 'mad', usage: 'sks --mad [--high]', description: 'Open a one-shot tmux Codex CLI workspace with the SKS MAD full-access auto-review profile.' },
|
|
422
|
+
{ name: 'auto-review', usage: 'sks auto-review status|enable|start [--high] | sks --Auto-review --high', description: 'Enable Codex automatic approval review and launch SKS tmux with the auto-review profile.' },
|
|
386
423
|
{ name: 'dollar-commands', usage: 'sks dollar-commands [--json]', description: 'List Codex App $ commands such as $DFix and $Team.' },
|
|
387
424
|
{ name: 'dfix', usage: 'sks dfix', description: 'Explain $DFix ultralight design/content fix mode.' },
|
|
388
425
|
{ name: 'qa-loop', usage: 'sks qa-loop prepare|answer|run|status ...', description: 'Dogfood UI/API as human proxy with safety gates, safe fixes, rechecks, Codex Computer Use-only UI evidence, report.' },
|
|
426
|
+
{ name: 'ppt', usage: 'sks ppt build|status <mission-id|latest> [--json]', description: 'Build or inspect $PPT HTML/PDF artifacts from a sealed presentation decision contract.' },
|
|
389
427
|
{ name: 'context7', usage: 'sks context7 check|setup|tools|resolve|docs|evidence ...', description: 'Check, configure, and call the local Context7 MCP requirement.' },
|
|
390
428
|
{ name: 'pipeline', usage: 'sks pipeline status|resume|plan|answer ...', description: 'Inspect the active skill-first route, materialized execution plan, ambiguity gates, and completion gates.' },
|
|
391
429
|
{ name: 'guard', usage: 'sks guard check [--json]', description: 'Check SKS harness self-protection lock, fingerprints, and source-repo exception state.' },
|
|
@@ -401,7 +439,7 @@ export const COMMAND_CATALOG = [
|
|
|
401
439
|
{ name: 'research', usage: 'sks research prepare|run|status ...', description: 'Run frontier-style research missions with novelty and falsification gates.' },
|
|
402
440
|
{ name: 'db', usage: 'sks db policy|scan|mcp-config|classify|check ...', description: 'Inspect and enforce database/Supabase safety policy.' },
|
|
403
441
|
{ name: 'eval', usage: 'sks eval run|compare|thresholds ...', description: 'Run deterministic context-quality and performance evidence checks.' },
|
|
404
|
-
{ name: 'harness', usage: 'sks harness fixture|review [--json]', description: 'Run Harness Growth Factory fixtures for forgetting, skills, experiments, tool taxonomy, permissions, MultiAgentV2, and
|
|
442
|
+
{ name: 'harness', usage: 'sks harness fixture|review [--json]', description: 'Run Harness Growth Factory fixtures for forgetting, skills, experiments, tool taxonomy, permissions, MultiAgentV2, and tmux views.' },
|
|
405
443
|
{ name: 'perf', usage: 'sks perf run|workflow [--json] [--iterations N] [--intent "task"] [--changed file1,file2]', description: 'Measure structured GPT-5.5/SKS performance budgets, including Proof Field workflow decisions and fast-lane evidence.' },
|
|
406
444
|
{ name: 'proof-field', usage: 'sks proof-field scan [--json] [--intent "task"] [--changed file1,file2]', description: 'Analyze Potential Proof Field cones, negative-work cache, and fast-lane eligibility for a change set.' },
|
|
407
445
|
{ name: 'skill-dream', usage: 'sks skill-dream status|run|record [--json]', description: 'Track generated-skill usage in lightweight JSON and periodically report keep, merge, prune, and improvement candidates without deleting skills automatically.' },
|
|
@@ -409,7 +447,7 @@ export const COMMAND_CATALOG = [
|
|
|
409
447
|
{ name: 'validate-artifacts', usage: 'sks validate-artifacts [mission-id|latest] [--json]', description: 'Validate schema-backed mission artifacts for work orders, effort decisions, visual maps, dogfood reports, skills, mistake memory, Team dashboard state, and Honest Mode.' },
|
|
410
448
|
{ name: 'wiki', usage: 'sks wiki coords|pack|refresh|prune|validate ...', description: 'Build, refresh, prune, and validate RGBA/trig LLM Wiki context packs with attention.use_first and attention.hydrate_first for compact recall plus source hydration.' },
|
|
411
449
|
{ name: 'hproof', usage: 'sks hproof check [mission-id|latest]', description: 'Evaluate the H-Proof done gate for a mission.' },
|
|
412
|
-
{ name: 'team', usage: 'sks team "task" [executor:5 reviewer:2 user:1]|log|tail|watch|lane|status|dashboard|event|message|cleanup-
|
|
450
|
+
{ name: 'team', usage: 'sks team "task" [executor:5 reviewer:2 user:1]|log|tail|watch|lane|status|dashboard|event|message|cleanup-tmux ...', description: 'Create and observe a scout-first Team mission with color-coded tmux lanes, transcript messages, and cleanup-aware follow panes.' },
|
|
413
451
|
{ name: 'reasoning', usage: 'sks reasoning ["prompt"] [--json]', description: 'Show SKS temporary reasoning-effort routing: medium for simple tasks, high for logic, xhigh for research.' },
|
|
414
452
|
{ name: 'gx', usage: 'sks gx init|render|validate|drift|snapshot [name]', description: 'Create and verify deterministic SVG/HTML visual context cartridges.' },
|
|
415
453
|
{ name: 'profile', usage: 'sks profile show|set <model>', description: 'Inspect or set the current SKS model profile metadata.' },
|
|
@@ -464,6 +502,16 @@ export function looksLikeFastDesignFix(prompt) {
|
|
|
464
502
|
return designCue && changeCue && (!looksLikeAnswerOnlyRequest(text) || looksLikeDirectWorkRequest(text));
|
|
465
503
|
}
|
|
466
504
|
|
|
505
|
+
export function looksLikePresentationArtifactRequest(prompt = '') {
|
|
506
|
+
const text = String(prompt || '');
|
|
507
|
+
const lower = text.toLowerCase();
|
|
508
|
+
const cue = /\b(ppt|presentation|deck|slide|slides|pitch\s*deck|proposal\s*deck)\b|발표자료|발표\s*자료|소개자료|제안서|피치덱|슬라이드|pdf\s*자료/i.test(text);
|
|
509
|
+
if (!cue) return false;
|
|
510
|
+
const meta = /커맨드|command|route|routing|파이프라인|pipeline|schema|스키마|모호성|ambiguity|질문|게이트|gate/i.test(text);
|
|
511
|
+
if (meta) return false;
|
|
512
|
+
return /만들|작성|생성|제작|디자인|export|pdf|html|create|generate|build|write|make/i.test(text) || /\b(ppt|presentation|deck|slides?)\b/.test(lower);
|
|
513
|
+
}
|
|
514
|
+
|
|
467
515
|
export function routePrompt(prompt) {
|
|
468
516
|
const command = dollarCommand(prompt);
|
|
469
517
|
const text = String(prompt || '');
|
|
@@ -482,6 +530,7 @@ export function routePrompt(prompt) {
|
|
|
482
530
|
return route;
|
|
483
531
|
}
|
|
484
532
|
if (hasFromChatImgSignal(text)) return routeById('Team');
|
|
533
|
+
if (looksLikePresentationArtifactRequest(text)) return routeById('PPT');
|
|
485
534
|
if (looksLikeComputerUseFastLane(text)) return routeById('ComputerUse');
|
|
486
535
|
if (looksLikeFastDesignFix(text)) return routeById('DFix');
|
|
487
536
|
if (looksLikeQuestionShapedDirective(text)) return routeById('Team');
|
|
@@ -551,6 +600,7 @@ export function routeRequiresSubagents(route, prompt = '') {
|
|
|
551
600
|
if (route.id === 'Team') return true;
|
|
552
601
|
if (route.id === 'SKS') return looksLikeTeamDefaultWork(prompt);
|
|
553
602
|
if (route.id === 'Help' || route.id === 'Answer' || route.id === 'Wiki' || route.id === 'ComputerUse') return false;
|
|
603
|
+
if (route.id === 'PPT') return false;
|
|
554
604
|
if (route.id === 'Research' || route.id === 'AutoResearch') return true;
|
|
555
605
|
if (route.id === 'Goal') return looksLikeExecutionWork(prompt) || looksLikeTeamDefaultWork(stripDollarCommand(prompt));
|
|
556
606
|
if (route.id === 'DB' || route.id === 'GX') return looksLikeExecutionWork(prompt);
|
|
@@ -560,7 +610,7 @@ export function routeRequiresSubagents(route, prompt = '') {
|
|
|
560
610
|
|
|
561
611
|
export function reflectionRequiredForRoute(route) {
|
|
562
612
|
const id = String(route?.id || route?.mode || route?.route || route || '').replace(/^\$/, '');
|
|
563
|
-
return /^(team|qaloop|qa-loop|research|autoresearch|db|database|madsks|mad-sks|gx)$/i.test(id);
|
|
613
|
+
return /^(team|qaloop|qa-loop|ppt|research|autoresearch|db|database|madsks|mad-sks|gx)$/i.test(id);
|
|
564
614
|
}
|
|
565
615
|
|
|
566
616
|
export function looksLikeCodeChangingWork(prompt = '') {
|
package/src/core/team-live.mjs
CHANGED
|
@@ -72,7 +72,7 @@ export function defaultTeamDashboard(id, prompt, opts = {}) {
|
|
|
72
72
|
lane: `sks team lane ${id} --agent <agent> --follow`,
|
|
73
73
|
event: `sks team event ${id} --agent <agent> --phase <phase> --message "..."`,
|
|
74
74
|
message: `sks team message ${id} --from <agent> --to <agent|all> --message "..."`,
|
|
75
|
-
cleanup: `sks team cleanup-
|
|
75
|
+
cleanup: `sks team cleanup-tmux ${id}`
|
|
76
76
|
},
|
|
77
77
|
agents: Object.fromEntries([...new Set([...DEFAULT_AGENTS, ...spec.roster.all_agents.map((agent) => agent.id)])].map((name) => [name, { status: 'pending', phase: null, last_seen: null }])),
|
|
78
78
|
phases: ['parallel_analysis_scouting', 'triwiki_refresh', 'debate_team', 'triwiki_refresh_after_consensus', 'parallel_development_team', 'triwiki_refresh_after_implementation', 'strict_review_and_user_acceptance', 'session_cleanup'],
|
|
@@ -98,7 +98,7 @@ ${prompt}
|
|
|
98
98
|
|
|
99
99
|
## How to Read
|
|
100
100
|
|
|
101
|
-
- This file is the Codex App-visible replacement for
|
|
101
|
+
- This file is the Codex App-visible replacement for tmux-style team panes.
|
|
102
102
|
- Use at most ${spec.agentSessions} subagent sessions at a time unless the mission is recreated with a different budget.
|
|
103
103
|
- Team mode has three bundles: parallel analysis scouts first, debate team second, then fresh parallel development team.
|
|
104
104
|
- Use relevant TriWiki context before every stage, hydrate low-trust claims from source during the stage, refresh after findings/artifact changes, and validate before handoffs or final claims.
|
|
@@ -124,7 +124,7 @@ sks team watch ${id}
|
|
|
124
124
|
sks team lane ${id} --agent analysis_scout_1 --follow
|
|
125
125
|
sks team event ${id} --agent analysis_scout_1 --phase parallel_analysis_scouting --message "mapped repo slice"
|
|
126
126
|
sks team message ${id} --from analysis_scout_1 --to executor_1 --message "handoff note"
|
|
127
|
-
sks team cleanup-
|
|
127
|
+
sks team cleanup-tmux ${id}
|
|
128
128
|
\`\`\`
|
|
129
129
|
|
|
130
130
|
## Roster
|
|
@@ -220,7 +220,7 @@ export function parseTeamSpecArgs(args = []) {
|
|
|
220
220
|
i++;
|
|
221
221
|
continue;
|
|
222
222
|
}
|
|
223
|
-
if (arg === '--json' || arg === '--open-
|
|
223
|
+
if (arg === '--json' || arg === '--open-tmux' || arg === '--tmux-open') continue;
|
|
224
224
|
cleanArgs.push(args[i]);
|
|
225
225
|
}
|
|
226
226
|
return { cleanArgs, ...normalizeTeamSpec({ roleCounts, agentSessions: explicitSession }) };
|
|
@@ -363,7 +363,7 @@ export async function requestTeamSessionCleanup(dir, opts = {}) {
|
|
|
363
363
|
cleanup_requested_at: opts.ts || nowIso(),
|
|
364
364
|
cleanup_requested_by: opts.agent || 'parent_orchestrator',
|
|
365
365
|
cleanup_reason: opts.reason || 'Team session cleanup requested.',
|
|
366
|
-
final_message: opts.finalMessage || 'Team session ended. Lane follow loops may stop;
|
|
366
|
+
final_message: opts.finalMessage || 'Team session ended. Lane follow loops may stop; tmux panes remain user-controlled.'
|
|
367
367
|
};
|
|
368
368
|
await writeJsonAtomic(files.control, next);
|
|
369
369
|
return next;
|
|
@@ -383,7 +383,7 @@ export function renderTeamCleanupSummary(control = {}) {
|
|
|
383
383
|
`Requested by: ${control.cleanup_requested_by || 'unknown'}`,
|
|
384
384
|
`Reason: ${control.cleanup_reason || 'Team session cleanup requested.'}`,
|
|
385
385
|
'',
|
|
386
|
-
control.final_message || 'Team session ended.
|
|
386
|
+
control.final_message || 'Team session ended. tmux panes remain user-controlled.'
|
|
387
387
|
].join('\n');
|
|
388
388
|
}
|
|
389
389
|
|
|
@@ -469,10 +469,10 @@ export async function renderTeamWatch(dir, opts = {}) {
|
|
|
469
469
|
'',
|
|
470
470
|
'## Split-Screen Map',
|
|
471
471
|
'- This overview pane follows the whole mission transcript.',
|
|
472
|
-
'- Neighbor
|
|
472
|
+
'- Neighbor tmux panes follow individual `sks team lane ... --agent <name>` views.',
|
|
473
473
|
'- Use `sks team event ...` to mirror scout, debate, executor, review, and verification status into the live panes.',
|
|
474
474
|
'- Use `sks team message ... --from <agent> --to <agent|all>` for bounded inter-agent communication in transcript/lane views.',
|
|
475
|
-
'- Use `sks team cleanup-
|
|
475
|
+
'- Use `sks team cleanup-tmux ...` at session end; follow loops show cleanup and exit while tmux panes remain user-controlled.',
|
|
476
476
|
'',
|
|
477
477
|
'## Cockpit Views',
|
|
478
478
|
'- Mission / Goal | Agents | MultiAgentV2 | Work Orders | Skills | Memory Health | Forget Queue',
|