tycono 0.1.94 → 0.1.95-beta.1
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/package.json +1 -1
- package/src/api/src/engine/runners/claude-cli.ts +2 -2
- package/src/api/src/services/supervisor-heartbeat.ts +8 -5
- package/src/web/dist/assets/{index-DuB5baFp.js → index-Cqe9ybb5.js} +1 -1
- package/src/web/dist/assets/index-M48dx91a.js +138 -0
- package/src/web/dist/assets/{preview-app-QWV7zpb0.js → preview-app-BEtVZd8o.js} +1 -1
- package/src/web/dist/index.html +1 -1
- package/templates/teams/agency.json +8 -0
- package/templates/teams/research.json +8 -0
- package/templates/teams/startup.json +8 -0
- package/src/web/dist/assets/index-C9U34tT1.js +0 -138
- package/src/web/dist/tyconoforge.js +0 -1
package/package.json
CHANGED
|
@@ -477,7 +477,7 @@ export class ClaudeCliRunner implements ExecutionRunner {
|
|
|
477
477
|
'--output-format', 'stream-json',
|
|
478
478
|
'--verbose',
|
|
479
479
|
'--dangerously-skip-permissions',
|
|
480
|
-
'--model', config.model ?? 'claude-
|
|
480
|
+
'--model', config.model ?? 'claude-opus-4-6',
|
|
481
481
|
'--max-turns', String(maxTurns),
|
|
482
482
|
'--mcp-config', mcpConfig,
|
|
483
483
|
'--strict-mcp-config',
|
|
@@ -516,7 +516,7 @@ export class ClaudeCliRunner implements ExecutionRunner {
|
|
|
516
516
|
cleanEnv.SUPERVISION_CMD = supervisionScript;
|
|
517
517
|
}
|
|
518
518
|
|
|
519
|
-
const modelName = config.model ?? 'claude-
|
|
519
|
+
const modelName = config.model ?? 'claude-opus-4-6';
|
|
520
520
|
// Use codeRoot as cwd — auto-creates ../{name}-code/ if not configured
|
|
521
521
|
const codeRoot = resolveCodeRoot(companyRoot);
|
|
522
522
|
const cwd = codeRoot;
|
|
@@ -296,15 +296,18 @@ ${recoveryContext}
|
|
|
296
296
|
|
|
297
297
|
## Quality Gate (CRITICAL — G-09)
|
|
298
298
|
⛔ **"Subordinate said done" ≠ "Work is actually done."**
|
|
299
|
-
⛔ **"Code exists" ≠ "Code works."**
|
|
299
|
+
⛔ **"Code exists" ≠ "Code works."**
|
|
300
|
+
|
|
301
|
+
⛔ **You are a SUPERVISOR. You do NOT run code, servers, npm install, or builds yourself.**
|
|
302
|
+
⛔ **Dispatch QA (Tester) to run and test. Read QA's report to judge quality.**
|
|
300
303
|
|
|
301
304
|
Before declaring yourself done, you MUST:
|
|
302
305
|
|
|
303
306
|
1. **Read the actual output files** — don't trust status reports. Check the code yourself.
|
|
304
|
-
2. **
|
|
305
|
-
-
|
|
306
|
-
-
|
|
307
|
-
-
|
|
307
|
+
2. **Dispatch QA to test it** — QA runs the server, opens browser, clicks buttons, reports bugs.
|
|
308
|
+
- Do NOT run \`npm install\`, \`npm run build\`, \`python3 -m http.server\` yourself.
|
|
309
|
+
- Do NOT run \`agent-browser\` yourself. That is QA's job.
|
|
310
|
+
- Your job: read QA's report, decide if it passes, re-dispatch if not.
|
|
308
311
|
3. **Count against requirements** — if the directive says "15 monsters, 7 maps", count them.
|
|
309
312
|
4. **Check the directive's specific tech requirements** — if it mentions a specific library/engine, verify it's actually used in the code (grep for it).
|
|
310
313
|
5. **If quality is insufficient → re-dispatch** with specific, actionable feedback:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,c as v,j as e,d as g,O as C,A as b}from"./index-
|
|
1
|
+
import{r as i,c as v,j as e,d as g,O as C,A as b}from"./index-M48dx91a.js";const x=["#FFE0BD","#F1C27D","#E0AC69","#C68642","#8D5524","#6B4423"],y=["#2C1B18","#724133","#C68642","#E6BE8A","#D4AF37","#B94E48"];function j(){return"#"+Math.floor(Math.random()*16777215).toString(16).padStart(6,"0")}function h(r){return r[Math.floor(Math.random()*r.length)]}function A({onComplete:r}){const t=i.useRef(null),[a,c]=i.useState("플레이어"),[n,o]=i.useState({skinColor:x[0],hairColor:y[0],shirtColor:"#3498db",pantsColor:"#2C3E50",shoeColor:"#34495E",hairStyle:"short",outfitStyle:"tshirt",accessory:"none"});i.useEffect(()=>{if(!t.current)return;t.current.innerHTML="";const s=v(n,{scale:6});t.current.appendChild(s)},[n]);const l=()=>{o({skinColor:h(x),hairColor:h(y),shirtColor:j(),pantsColor:j(),shoeColor:j(),hairStyle:h(g),outfitStyle:h(C),accessory:h(b)})},p=()=>{r({appearance:n,stats:{name:a,level:1,hp:100,maxHp:100,mp:80,maxMp:80,attack:20,defense:10}})};return e.jsxs("div",{className:"character-creator",children:[e.jsx("h1",{children:"캐릭터 생성"}),e.jsxs("div",{className:"creator-layout",children:[e.jsx("div",{className:"preview-section",children:e.jsx("div",{className:"preview-canvas",ref:t})}),e.jsxs("div",{className:"customization-section",children:[e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"이름"}),e.jsx("input",{type:"text",value:a,onChange:s=>c(s.target.value),maxLength:10})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"피부색"}),e.jsx("div",{className:"color-palette",children:x.map(s=>e.jsx("button",{className:`color-btn ${n.skinColor===s?"active":""}`,style:{backgroundColor:s},onClick:()=>o({...n,skinColor:s})},s))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"헤어스타일"}),e.jsx("select",{value:n.hairStyle,onChange:s=>o({...n,hairStyle:s.target.value}),children:g.map(s=>e.jsx("option",{value:s,children:s},s))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"헤어 색상"}),e.jsx("div",{className:"color-palette",children:y.map(s=>e.jsx("button",{className:`color-btn ${n.hairColor===s?"active":""}`,style:{backgroundColor:s},onClick:()=>o({...n,hairColor:s})},s))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"의상"}),e.jsx("select",{value:n.outfitStyle,onChange:s=>o({...n,outfitStyle:s.target.value}),children:C.map(s=>e.jsx("option",{value:s,children:s},s))})]}),e.jsxs("div",{className:"form-group",children:[e.jsx("label",{children:"액세서리"}),e.jsx("select",{value:n.accessory,onChange:s=>o({...n,accessory:s.target.value}),children:b.slice(0,15).map(s=>e.jsx("option",{value:s,children:s},s))})]}),e.jsxs("div",{className:"button-group",children:[e.jsx("button",{onClick:l,className:"btn-secondary",children:"🎲 랜덤 생성"}),e.jsx("button",{onClick:p,className:"btn-primary",children:"⚔️ 게임 시작!"})]})]})]})]})}const m={attack:{name:"공격",emoji:"⚔️"},defend:{name:"방어",emoji:"🛡️"},heal:{name:"회복",mpCost:20,emoji:"💚"},flee:{name:"도망",emoji:"🏃"}};function H(){const r=[{name:"슬라임",hp:50,attack:8,defense:3},{name:"고블린",hp:70,attack:12,defense:5},{name:"해골",hp:60,attack:15,defense:2},{name:"오크",hp:100,attack:18,defense:8}],t=r[Math.floor(Math.random()*r.length)];return{name:t.name,level:1,hp:t.hp,maxHp:t.hp,mp:0,maxMp:0,attack:t.attack,defense:t.defense}}function N(r,t,a){const c=r.attack-t.defense/2,n=Math.max(1,Math.floor(c));return a?Math.floor(n*.5):n}function T(r,t){const a={...r};if(t==="heal"&&a.player.mp<m.heal.mpCost)return{newState:a,continueToEnemyTurn:!1};let c;switch(t){case"attack":{const n=N(a.player,a.enemy,!1);a.enemy.hp=Math.max(0,a.enemy.hp-n),c={actorName:a.player.name,skill:"attack",damage:n,message:`${a.player.name}의 공격! ${n} 데미지!`},a.defendActive=!1;break}case"defend":{a.defendActive=!0,c={actorName:a.player.name,skill:"defend",message:`${a.player.name}이(가) 방어 태세를 취했다!`};break}case"heal":{const o=Math.min(30,a.player.maxHp-a.player.hp);a.player.hp=Math.min(a.player.maxHp,a.player.hp+30),a.player.mp-=m.heal.mpCost,c={actorName:a.player.name,skill:"heal",heal:o,message:`${a.player.name}이(가) 회복! HP +${o}`},a.defendActive=!1;break}case"flee":{Math.random()<.5?(a.status="fled",c={actorName:a.player.name,skill:"flee",message:`${a.player.name}이(가) 도망쳤다!`}):c={actorName:a.player.name,skill:"flee",message:"도망에 실패했다!"},a.defendActive=!1;break}}return a.log=[...a.log,c],a.enemy.hp<=0?(a.status="victory",{newState:a,continueToEnemyTurn:!1}):a.status==="fled"?{newState:a,continueToEnemyTurn:!1}:{newState:a,continueToEnemyTurn:!0}}function R(r){const t={...r},a=N(t.enemy,t.player,t.defendActive);t.player.hp=Math.max(0,t.player.hp-a);const c={actorName:t.enemy.name,skill:"attack",damage:a,message:`${t.enemy.name}의 공격! ${a} 데미지!`};return t.log=[...t.log,c],t.defendActive=!1,t.player.hp<=0&&(t.status="defeat"),t}function $(r,t){return{player:r,enemy:t,turn:"player",log:[],defendActive:!1,status:"ongoing"}}function P(){return{skinColor:"#6B8E23",hairColor:"#2F4F2F",shirtColor:"#8B4513",pantsColor:"#654321",shoeColor:"#3E2723",hairStyle:"messy",outfitStyle:"vest",accessory:"horns"}}function B({player:r,onRestart:t}){const a=i.useRef(null),c=i.useRef(null),n=i.useRef(null),[o]=i.useState(P()),[l,p]=i.useState(()=>$(r.stats,H()));i.useEffect(()=>{if(a.current){a.current.innerHTML="";const d=v(r.appearance,{scale:6});a.current.appendChild(d)}if(c.current){c.current.innerHTML="";const d=v(o,{scale:6});c.current.appendChild(d)}},[r.appearance,o]),i.useEffect(()=>{n.current&&(n.current.scrollTop=n.current.scrollHeight)},[l.log]);const s=d=>{if(l.status!=="ongoing")return;const{newState:u,continueToEnemyTurn:M}=T(l,d);p(u),M&&u.status==="ongoing"&&setTimeout(()=>{p(f=>f.status!=="ongoing"?f:R(f))},800)},k=l.player.hp/l.player.maxHp*100,S=l.enemy.hp/l.enemy.maxHp*100,E=l.player.mp/l.player.maxMp*100;return e.jsxs("div",{className:"battle-screen",children:[e.jsx("h1",{children:"⚔️ 배틀!"}),e.jsxs("div",{className:"battle-characters",children:[e.jsxs("div",{className:"character-box",children:[e.jsx("div",{className:"character-canvas",ref:a}),e.jsx("div",{className:"character-name",children:l.player.name}),e.jsxs("div",{className:"stat-bar",children:[e.jsxs("div",{className:"stat-label",children:["HP: ",l.player.hp,"/",l.player.maxHp]}),e.jsx("div",{className:"stat-bar-bg",children:e.jsx("div",{className:"stat-bar-fill hp",style:{width:`${k}%`}})})]}),e.jsxs("div",{className:"stat-bar",children:[e.jsxs("div",{className:"stat-label",children:["MP: ",l.player.mp,"/",l.player.maxMp]}),e.jsx("div",{className:"stat-bar-bg",children:e.jsx("div",{className:"stat-bar-fill mp",style:{width:`${E}%`}})})]})]}),e.jsx("div",{className:"vs-text",children:"VS"}),e.jsxs("div",{className:"character-box",children:[e.jsx("div",{className:"character-canvas",ref:c}),e.jsx("div",{className:"character-name",children:l.enemy.name}),e.jsxs("div",{className:"stat-bar",children:[e.jsxs("div",{className:"stat-label",children:["HP: ",l.enemy.hp,"/",l.enemy.maxHp]}),e.jsx("div",{className:"stat-bar-bg",children:e.jsx("div",{className:"stat-bar-fill hp",style:{width:`${S}%`}})})]})]})]}),e.jsxs("div",{className:"battle-log",ref:n,children:[l.log.length===0&&e.jsx("div",{className:"log-entry",children:"배틀 시작!"}),l.log.map((d,u)=>e.jsxs("div",{className:"log-entry",children:["> ",d.message]},u))]}),l.status!=="ongoing"&&e.jsxs("div",{className:"battle-result",children:[l.status==="victory"&&e.jsx("h2",{children:"🎉 승리!"}),l.status==="defeat"&&e.jsx("h2",{children:"💀 패배..."}),l.status==="fled"&&e.jsx("h2",{children:"🏃 도망쳤다!"}),e.jsx("button",{onClick:t,className:"btn-primary",children:"다시 시작"})]}),l.status==="ongoing"&&e.jsxs("div",{className:"skill-buttons",children:[e.jsxs("button",{onClick:()=>s("attack"),className:"skill-btn",children:[m.attack.emoji," ",m.attack.name]}),e.jsxs("button",{onClick:()=>s("defend"),className:"skill-btn",children:[m.defend.emoji," ",m.defend.name]}),e.jsxs("button",{onClick:()=>s("heal"),className:"skill-btn",disabled:l.player.mp<m.heal.mpCost,children:[m.heal.emoji," ",m.heal.name,e.jsxs("span",{className:"mp-cost",children:["(MP ",m.heal.mpCost,")"]})]}),e.jsxs("button",{onClick:()=>s("flee"),className:"skill-btn",children:[m.flee.emoji," ",m.flee.name]})]})]})}function L(){const[r,t]=i.useState("create"),[a,c]=i.useState(null),n=l=>{c(l),t("battle")},o=()=>{c(null),t("create")};return e.jsxs("div",{className:"rpg-game",children:[r==="create"&&e.jsx(A,{onComplete:n}),r==="battle"&&a&&e.jsx(B,{player:a,onRestart:o})]})}export{L as default};
|