@autocode-cli/autocode 0.24.2 → 0.26.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.
Files changed (74) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CxCUB-jw.js → B5lFKq3G.js} +1 -1
  3. package/.output/public/_nuxt/{BB7mNyvB.js → BBMcfTGy.js} +1 -1
  4. package/.output/public/_nuxt/{vfCqvZ7p.js → BcawioR3.js} +1 -1
  5. package/.output/public/_nuxt/{DPY45j3g.js → Br7Y24-t.js} +1 -1
  6. package/.output/public/_nuxt/{BfvaD8zq.js → Btwtsr_u.js} +6 -6
  7. package/.output/public/_nuxt/{p0o0xQ7S.js → BvE9NWMw.js} +1 -1
  8. package/.output/public/_nuxt/{aL-hwrDv.js → C4itadaD.js} +1 -1
  9. package/.output/public/_nuxt/{C2zPiS0N.js → C4ybMJ7Z.js} +1 -1
  10. package/.output/public/_nuxt/{DerTgqhZ.js → C7Lp5NPF.js} +1 -1
  11. package/.output/public/_nuxt/{D3gHSFO1.js → CMcAFpoK.js} +1 -1
  12. package/.output/public/_nuxt/{C5qkUISE.js → CWZ6WSwr.js} +1 -1
  13. package/.output/public/_nuxt/{C9Z_Mjdv.js → CYH4f4uY.js} +1 -1
  14. package/.output/public/_nuxt/{BhrZFGnk.js → CuwYCM4v.js} +1 -1
  15. package/.output/public/_nuxt/{CG6fFX4R.js → CvcfIZU-.js} +1 -1
  16. package/.output/public/_nuxt/{DZQLsTee.js → CvmJj3tc.js} +1 -1
  17. package/.output/public/_nuxt/{aMXqd-8n.js → D-DgzaOC.js} +1 -1
  18. package/.output/public/_nuxt/{D44BzzMg.js → D2qvqRWP.js} +1 -1
  19. package/.output/public/_nuxt/{DrnWNKxr.js → D5ZS_G-Z.js} +1 -1
  20. package/.output/public/_nuxt/{CP8dHttY.js → D8M2gN6n.js} +1 -1
  21. package/.output/public/_nuxt/{jYOQFUDH.js → D90sdSc5.js} +1 -1
  22. package/.output/public/_nuxt/{Bz9WwRWr.js → DGmZExaA.js} +1 -1
  23. package/.output/public/_nuxt/{BbEo0CFB.js → DJIybA4c.js} +1 -1
  24. package/.output/public/_nuxt/{CQWl6TIZ.js → DXwIM0gJ.js} +1 -1
  25. package/.output/public/_nuxt/{CeVGNobe.js → DhNKaVRN.js} +1 -1
  26. package/.output/public/_nuxt/{Cu-0JJ8B.js → DkN85EyM.js} +1 -1
  27. package/.output/public/_nuxt/{BMvB5hkX.js → DmYbhlFa.js} +1 -1
  28. package/.output/public/_nuxt/{BcQFK3DA.js → DnOmfKyh.js} +1 -1
  29. package/.output/public/_nuxt/{BarhsfnG.js → DuqIS0qR.js} +1 -1
  30. package/.output/public/_nuxt/{DABo4_10.js → I-u8LDqX.js} +1 -1
  31. package/.output/public/_nuxt/builds/latest.json +1 -1
  32. package/.output/public/_nuxt/builds/meta/234711bd-452d-42ba-9430-4d79ebc81813.json +1 -0
  33. package/.output/public/_nuxt/{Bu1-IDNY.js → nnCcRJrE.js} +1 -1
  34. package/.output/public/_nuxt/{8PJti6tf.js → oH1B3N8m.js} +1 -1
  35. package/.output/public/_payload.json +1 -1
  36. package/.output/public/index.html +1 -1
  37. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  38. package/.output/server/chunks/build/nuxt-link-Cq8xZgFP.mjs +1 -1
  39. package/.output/server/chunks/build/server.mjs +3 -3
  40. package/.output/server/chunks/build/styles.mjs +15 -15
  41. package/.output/server/chunks/nitro/nitro.mjs +244 -231
  42. package/.output/server/chunks/routes/_ws.mjs +1 -1
  43. package/.output/server/chunks/routes/api/index.get4.mjs +1 -1
  44. package/.output/server/chunks/routes/api/index.post2.mjs +3 -1
  45. package/.output/server/chunks/routes/api/index.post2.mjs.map +1 -1
  46. package/.output/server/chunks/routes/api/index.post3.mjs +1 -1
  47. package/.output/server/chunks/routes/api/pipelines/_name/activate.put.mjs +1 -1
  48. package/.output/server/chunks/routes/api/pipelines/_name/versions/_version/activate.put.mjs +1 -1
  49. package/.output/server/chunks/routes/api/pipelines/_name/versions/_version/finalize.post.mjs +1 -1
  50. package/.output/server/chunks/routes/api/pipelines/_name/versions/_version_.delete.mjs +1 -1
  51. package/.output/server/chunks/routes/api/pipelines/_name/versions/_version_.get.mjs +1 -1
  52. package/.output/server/chunks/routes/api/pipelines/_name/versions/_version_.put.mjs +1 -1
  53. package/.output/server/chunks/routes/api/pipelines/_name/versions.get.mjs +1 -1
  54. package/.output/server/chunks/routes/api/pipelines/_name/versions.post.mjs +1 -1
  55. package/.output/server/chunks/routes/api/pipelines/_name_.delete.mjs +1 -1
  56. package/.output/server/chunks/routes/api/pipelines/_name_.get.mjs +1 -1
  57. package/.output/server/chunks/routes/api/pipelines/_name_.put.mjs +1 -1
  58. package/.output/server/chunks/routes/api/stats.get.mjs +1 -1
  59. package/.output/server/chunks/routes/api/workflow/health.get.mjs +1 -1
  60. package/.output/server/chunks/routes/api/ws/status.get.mjs +1 -1
  61. package/.output/server/chunks/routes/renderer.mjs +1 -1
  62. package/.output/server/node_modules/.prisma/client/index.js +3 -2
  63. package/.output/server/node_modules/.prisma/client/package.json +1 -1
  64. package/.output/server/package.json +1 -1
  65. package/package.json +3 -3
  66. package/templates/prompts/_transition-decision.en.md +2 -1
  67. package/templates/prompts/_transition-decision.fr.md +18 -18
  68. package/templates/prompts/retest-cypress.en.md +15 -0
  69. package/templates/prompts/retest-cypress.fr.md +15 -0
  70. package/templates/prompts/testing-cypress.en.md +15 -0
  71. package/templates/prompts/testing-cypress.fr.md +15 -0
  72. package/.output/public/_nuxt/builds/meta/fda5642b-b71a-476c-9e0f-eb15a462e2fe.json +0 -1
  73. /package/.output/public/_i18n/{fC3ee0mv → JmX-ZbAb}/en/messages.json +0 -0
  74. /package/.output/public/_i18n/{fC3ee0mv → JmX-ZbAb}/fr/messages.json +0 -0
@@ -1 +1 @@
1
- import{_ as it}from"./BhrZFGnk.js";import{d as st,x as ot,r as g,u as rt,B as N,v as at,l as U,s as nt,c as l,e,f as X,w as E,t as r,j as $,g as h,C as v,D as k,h as o,q as V,E as lt,F as D,p as S,z as T,b as c,_ as ct}from"./BfvaD8zq.js";import{u as pt}from"./BarhsfnG.js";import{u as dt}from"./Bz9WwRWr.js";import{u as ut}from"./p0o0xQ7S.js";const mt=()=>({validateTitle:p=>p.trim()?p.length>200?"Title too long (max 200 characters)":null:"Title is required",validateDescription:p=>p.trim()?null:"Description is required",validateKey:p=>/^AC-\d{6}$/.test(p)?null:"Invalid issue key format (AC-XXXXXX)",validateFile:p=>{const F=["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain","text/markdown","application/json","application/xml"];return p.size>10485760?"File too large (max 10MB)":F.includes(p.type)?null:"File type not allowed"}}),ft={class:"new-issue-page"},ht={class:"page-header"},vt={class:"form-group"},_t={class:"form-label",for:"title"},yt={class:"title-row"},bt=["disabled","title"],gt={key:0,class:"spinner"},$t={key:1,class:"sparkle"},kt={key:0,class:"error-text"},Ct={class:"form-group"},wt={class:"form-label",for:"description"},Ft={class:"form-hint"},It={key:0,class:"error-text"},Vt={class:"form-row"},Dt={class:"form-group"},St={class:"form-label",for:"priority"},Tt={value:""},At={value:"low"},Bt={value:"medium"},zt={value:"high"},Pt={value:"critical"},qt={class:"form-group"},Mt={class:"form-label",for:"parent"},Nt=["placeholder"],Ut={id:"parent-suggestions"},Xt=["value"],Et={class:"form-group"},jt={class:"form-label"},Kt={class:"criteria-list"},Lt=["onUpdate:modelValue","placeholder"],Ot=["onClick"],Rt={class:"form-group"},Ht={class:"form-label"},Gt={key:0,class:"attachments-list"},Jt={class:"file-name"},Qt={class:"file-size"},Wt=["onClick"],Yt={key:1,class:"error-text"},Zt={class:"form-actions"},xt=["disabled"],te=st({__name:"new",async setup(j){let f,C;const A=ot(),{success:p,error:w}=pt(),{validateTitle:F,validateDescription:K,validateFile:L}=mt(),{getErrorMessage:B}=dt(),z=g(null),_=g(!1),y=g(!1),m=g(!1),{locale:O,t:P}=rt(),s=N({title:"",description:"",priority:"",parent:"",acceptanceCriteria:[""],attachments:[]}),n=N({title:"",description:"",attachments:""}),{data:R}=([f,C]=at(()=>ut("/api/issues","$PR1V20I2qI")),f=await f,C(),f),H=U(()=>(R.value||[]).slice(0,10)),q=U(()=>s.title.trim()&&s.description.trim()&&!n.attachments),b=t=>{t==="title"?n.title=F(s.title)||"":t==="description"&&(n.description=K(s.description)||"")},G=async()=>{if(!(!s.title.trim()||m.value)){m.value=!0;try{const t=s.acceptanceCriteria.filter(d=>d.trim()),i=await $fetch("/api/issues/autocomplete",{method:"POST",body:{title:s.title,lang:O.value,description:s.description||void 0,priority:s.priority||void 0,acceptance_criteria:t.length>0?t:void 0,parent_key:s.parent||void 0}});if(i.description&&(s.description=i.description),i.priority){const d={P0:"critical",P1:"high",P2:"medium",P3:"low"};s.priority=d[i.priority]||i.priority}i.acceptance_criteria&&Array.isArray(i.acceptance_criteria)&&(s.acceptanceCriteria=i.acceptance_criteria.length>0?i.acceptance_criteria:[""]),p(P("autocomplete.rememberSave"))}catch(t){w(B(t,P("autocomplete.error")))}finally{m.value=!1}}},J=()=>{s.acceptanceCriteria.push("")},Q=t=>{s.acceptanceCriteria.splice(t,1)},W=()=>{z.value?.click()},Y=t=>{const i=t.target;i.files&&M(Array.from(i.files))},Z=t=>{_.value=!1,t.dataTransfer?.files&&M(Array.from(t.dataTransfer.files))},M=t=>{n.attachments="";for(const i of t){const d=L(i);if(d){n.attachments=d;return}s.attachments.push(i)}},x=t=>{s.attachments.splice(t,1),n.attachments=""},tt=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,et=async()=>{if(q.value&&(b("title"),b("description"),!(n.title||n.description))){y.value=!0;try{const t=s.acceptanceCriteria.filter(d=>d.trim()),i=await $fetch("/api/issues",{method:"POST",body:{title:s.title,description:s.description,priority:s.priority||void 0,parent_key:s.parent||void 0,acceptance_criteria:t.length>0?t:void 0}});p("Issue created"),A.push(`/issue/${i.key}`)}catch(t){w(B(t,"Failed to create issue"))}finally{y.value=!1}}};return nt({title:"New Issue - AutoCode"}),(t,i)=>{const d=it;return c(),l("div",ft,[e("header",ht,[X(d,{to:"/kanban",class:"back-link"},{default:E(()=>[h(" ← "+r(t.$t("nav.kanban")),1)]),_:1}),e("h1",null,r(t.$t("nav.newIssue")),1)]),e("form",{class:"issue-form card",onSubmit:T(et,["prevent"])},[e("div",vt,[e("label",_t,[h(r(t.$t("issue.title"))+" ",1),i[8]||(i[8]=e("span",{class:"required"},"*",-1))]),e("div",yt,[v(e("input",{id:"title","onUpdate:modelValue":i[0]||(i[0]=a=>o(s).title=a),type:"text",class:V(["form-input",{"has-error":o(n).title}]),required:"",onBlur:i[1]||(i[1]=a=>b("title"))},null,34),[[k,o(s).title]]),e("button",{type:"button",class:"btn-autocomplete",disabled:o(m)||!o(s).title.trim(),title:t.$t("autocomplete.tooltip"),onClick:G},[o(m)?(c(),l("span",gt)):(c(),l("span",$t,"✨")),h(" "+r(o(m)?t.$t("autocomplete.loading"):t.$t("autocomplete.button")),1)],8,bt)]),o(n).title?(c(),l("span",kt,r(o(n).title),1)):$("",!0)]),e("div",Ct,[e("label",wt,[h(r(t.$t("issue.description"))+" ",1),i[9]||(i[9]=e("span",{class:"required"},"*",-1))]),v(e("textarea",{id:"description","onUpdate:modelValue":i[2]||(i[2]=a=>o(s).description=a),class:V(["form-input",{"has-error":o(n).description}]),rows:"8",required:"",onBlur:i[3]||(i[3]=a=>b("description"))},null,34),[[k,o(s).description]]),e("p",Ft,r(t.$t("form.markdownSupported")),1),o(n).description?(c(),l("span",It,r(o(n).description),1)):$("",!0)]),e("div",Vt,[e("div",Dt,[e("label",St,r(t.$t("issue.priority")),1),v(e("select",{id:"priority","onUpdate:modelValue":i[4]||(i[4]=a=>o(s).priority=a),class:"form-input"},[e("option",Tt,r(t.$t("form.select")),1),e("option",At,r(t.$t("priority.low")),1),e("option",Bt,r(t.$t("priority.medium")),1),e("option",zt,r(t.$t("priority.high")),1),e("option",Pt,r(t.$t("priority.critical")),1)],512),[[lt,o(s).priority]])]),e("div",qt,[e("label",Mt,r(t.$t("issue.parent")),1),v(e("input",{id:"parent","onUpdate:modelValue":i[5]||(i[5]=a=>o(s).parent=a),type:"text",class:"form-input",placeholder:t.$t("form.parentPlaceholder"),list:"parent-suggestions"},null,8,Nt),[[k,o(s).parent]]),e("datalist",Ut,[(c(!0),l(D,null,S(o(H),a=>(c(),l("option",{key:a.key,value:a.key},r(a.title),9,Xt))),128))])])]),e("div",Et,[e("label",jt,r(t.$t("issue.acceptanceCriteria")),1),e("div",Kt,[(c(!0),l(D,null,S(o(s).acceptanceCriteria,(a,u)=>(c(),l("div",{key:u,class:"criteria-item"},[v(e("input",{"onUpdate:modelValue":I=>o(s).acceptanceCriteria[u]=I,type:"text",class:"form-input",placeholder:t.$t("form.criteriaPlaceholder")},null,8,Lt),[[k,o(s).acceptanceCriteria[u]]]),e("button",{type:"button",class:"btn-icon",onClick:I=>Q(u)},"×",8,Ot)]))),128)),e("button",{type:"button",class:"btn btn-secondary btn-sm",onClick:J}," + "+r(t.$t("form.addCriteria")),1)])]),e("div",Rt,[e("label",Ht,r(t.$t("issue.attachments")),1),e("div",{class:V(["dropzone",{dragover:o(_)}]),onDragover:i[6]||(i[6]=T(a=>_.value=!0,["prevent"])),onDragleave:i[7]||(i[7]=a=>_.value=!1),onDrop:T(Z,["prevent"])},[e("input",{ref_key:"fileInput",ref:z,type:"file",multiple:"",class:"file-input",onChange:Y},null,544),e("p",null,r(t.$t("form.dropFiles")),1),e("button",{type:"button",class:"btn btn-secondary btn-sm",onClick:W},r(t.$t("form.browse")),1)],34),o(s).attachments.length?(c(),l("ul",Gt,[(c(!0),l(D,null,S(o(s).attachments,(a,u)=>(c(),l("li",{key:u},[e("span",Jt,r(a.name),1),e("span",Qt,r(tt(a.size)),1),e("button",{type:"button",class:"btn-icon",onClick:I=>x(u)},"×",8,Wt)]))),128))])):$("",!0),o(n).attachments?(c(),l("span",Yt,r(o(n).attachments),1)):$("",!0)]),e("div",Zt,[X(d,{to:"/kanban",class:"btn btn-secondary"},{default:E(()=>[h(r(t.$t("form.cancel")),1)]),_:1}),e("button",{type:"submit",class:"btn btn-primary",disabled:o(y)||!o(q)},r(o(y)?t.$t("form.creating"):t.$t("form.create")),9,xt)])],32)])}}}),ae=ct(te,[["__scopeId","data-v-78563ddb"]]);export{ae as default};
1
+ import{_ as it}from"./CuwYCM4v.js";import{d as st,x as ot,r as g,u as rt,B as N,v as at,l as U,s as nt,c as l,e,f as X,w as E,t as r,j as $,g as h,C as v,D as k,h as o,q as V,E as lt,F as D,p as S,z as T,b as c,_ as ct}from"./Btwtsr_u.js";import{u as pt}from"./DuqIS0qR.js";import{u as dt}from"./DGmZExaA.js";import{u as ut}from"./BvE9NWMw.js";const mt=()=>({validateTitle:p=>p.trim()?p.length>200?"Title too long (max 200 characters)":null:"Title is required",validateDescription:p=>p.trim()?null:"Description is required",validateKey:p=>/^AC-\d{6}$/.test(p)?null:"Invalid issue key format (AC-XXXXXX)",validateFile:p=>{const F=["image/png","image/jpeg","image/gif","image/webp","application/pdf","text/plain","text/markdown","application/json","application/xml"];return p.size>10485760?"File too large (max 10MB)":F.includes(p.type)?null:"File type not allowed"}}),ft={class:"new-issue-page"},ht={class:"page-header"},vt={class:"form-group"},_t={class:"form-label",for:"title"},yt={class:"title-row"},bt=["disabled","title"],gt={key:0,class:"spinner"},$t={key:1,class:"sparkle"},kt={key:0,class:"error-text"},Ct={class:"form-group"},wt={class:"form-label",for:"description"},Ft={class:"form-hint"},It={key:0,class:"error-text"},Vt={class:"form-row"},Dt={class:"form-group"},St={class:"form-label",for:"priority"},Tt={value:""},At={value:"low"},Bt={value:"medium"},zt={value:"high"},Pt={value:"critical"},qt={class:"form-group"},Mt={class:"form-label",for:"parent"},Nt=["placeholder"],Ut={id:"parent-suggestions"},Xt=["value"],Et={class:"form-group"},jt={class:"form-label"},Kt={class:"criteria-list"},Lt=["onUpdate:modelValue","placeholder"],Ot=["onClick"],Rt={class:"form-group"},Ht={class:"form-label"},Gt={key:0,class:"attachments-list"},Jt={class:"file-name"},Qt={class:"file-size"},Wt=["onClick"],Yt={key:1,class:"error-text"},Zt={class:"form-actions"},xt=["disabled"],te=st({__name:"new",async setup(j){let f,C;const A=ot(),{success:p,error:w}=pt(),{validateTitle:F,validateDescription:K,validateFile:L}=mt(),{getErrorMessage:B}=dt(),z=g(null),_=g(!1),y=g(!1),m=g(!1),{locale:O,t:P}=rt(),s=N({title:"",description:"",priority:"",parent:"",acceptanceCriteria:[""],attachments:[]}),n=N({title:"",description:"",attachments:""}),{data:R}=([f,C]=at(()=>ut("/api/issues","$PR1V20I2qI")),f=await f,C(),f),H=U(()=>(R.value||[]).slice(0,10)),q=U(()=>s.title.trim()&&s.description.trim()&&!n.attachments),b=t=>{t==="title"?n.title=F(s.title)||"":t==="description"&&(n.description=K(s.description)||"")},G=async()=>{if(!(!s.title.trim()||m.value)){m.value=!0;try{const t=s.acceptanceCriteria.filter(d=>d.trim()),i=await $fetch("/api/issues/autocomplete",{method:"POST",body:{title:s.title,lang:O.value,description:s.description||void 0,priority:s.priority||void 0,acceptance_criteria:t.length>0?t:void 0,parent_key:s.parent||void 0}});if(i.description&&(s.description=i.description),i.priority){const d={P0:"critical",P1:"high",P2:"medium",P3:"low"};s.priority=d[i.priority]||i.priority}i.acceptance_criteria&&Array.isArray(i.acceptance_criteria)&&(s.acceptanceCriteria=i.acceptance_criteria.length>0?i.acceptance_criteria:[""]),p(P("autocomplete.rememberSave"))}catch(t){w(B(t,P("autocomplete.error")))}finally{m.value=!1}}},J=()=>{s.acceptanceCriteria.push("")},Q=t=>{s.acceptanceCriteria.splice(t,1)},W=()=>{z.value?.click()},Y=t=>{const i=t.target;i.files&&M(Array.from(i.files))},Z=t=>{_.value=!1,t.dataTransfer?.files&&M(Array.from(t.dataTransfer.files))},M=t=>{n.attachments="";for(const i of t){const d=L(i);if(d){n.attachments=d;return}s.attachments.push(i)}},x=t=>{s.attachments.splice(t,1),n.attachments=""},tt=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`,et=async()=>{if(q.value&&(b("title"),b("description"),!(n.title||n.description))){y.value=!0;try{const t=s.acceptanceCriteria.filter(d=>d.trim()),i=await $fetch("/api/issues",{method:"POST",body:{title:s.title,description:s.description,priority:s.priority||void 0,parent_key:s.parent||void 0,acceptance_criteria:t.length>0?t:void 0}});p("Issue created"),A.push(`/issue/${i.key}`)}catch(t){w(B(t,"Failed to create issue"))}finally{y.value=!1}}};return nt({title:"New Issue - AutoCode"}),(t,i)=>{const d=it;return c(),l("div",ft,[e("header",ht,[X(d,{to:"/kanban",class:"back-link"},{default:E(()=>[h(" ← "+r(t.$t("nav.kanban")),1)]),_:1}),e("h1",null,r(t.$t("nav.newIssue")),1)]),e("form",{class:"issue-form card",onSubmit:T(et,["prevent"])},[e("div",vt,[e("label",_t,[h(r(t.$t("issue.title"))+" ",1),i[8]||(i[8]=e("span",{class:"required"},"*",-1))]),e("div",yt,[v(e("input",{id:"title","onUpdate:modelValue":i[0]||(i[0]=a=>o(s).title=a),type:"text",class:V(["form-input",{"has-error":o(n).title}]),required:"",onBlur:i[1]||(i[1]=a=>b("title"))},null,34),[[k,o(s).title]]),e("button",{type:"button",class:"btn-autocomplete",disabled:o(m)||!o(s).title.trim(),title:t.$t("autocomplete.tooltip"),onClick:G},[o(m)?(c(),l("span",gt)):(c(),l("span",$t,"✨")),h(" "+r(o(m)?t.$t("autocomplete.loading"):t.$t("autocomplete.button")),1)],8,bt)]),o(n).title?(c(),l("span",kt,r(o(n).title),1)):$("",!0)]),e("div",Ct,[e("label",wt,[h(r(t.$t("issue.description"))+" ",1),i[9]||(i[9]=e("span",{class:"required"},"*",-1))]),v(e("textarea",{id:"description","onUpdate:modelValue":i[2]||(i[2]=a=>o(s).description=a),class:V(["form-input",{"has-error":o(n).description}]),rows:"8",required:"",onBlur:i[3]||(i[3]=a=>b("description"))},null,34),[[k,o(s).description]]),e("p",Ft,r(t.$t("form.markdownSupported")),1),o(n).description?(c(),l("span",It,r(o(n).description),1)):$("",!0)]),e("div",Vt,[e("div",Dt,[e("label",St,r(t.$t("issue.priority")),1),v(e("select",{id:"priority","onUpdate:modelValue":i[4]||(i[4]=a=>o(s).priority=a),class:"form-input"},[e("option",Tt,r(t.$t("form.select")),1),e("option",At,r(t.$t("priority.low")),1),e("option",Bt,r(t.$t("priority.medium")),1),e("option",zt,r(t.$t("priority.high")),1),e("option",Pt,r(t.$t("priority.critical")),1)],512),[[lt,o(s).priority]])]),e("div",qt,[e("label",Mt,r(t.$t("issue.parent")),1),v(e("input",{id:"parent","onUpdate:modelValue":i[5]||(i[5]=a=>o(s).parent=a),type:"text",class:"form-input",placeholder:t.$t("form.parentPlaceholder"),list:"parent-suggestions"},null,8,Nt),[[k,o(s).parent]]),e("datalist",Ut,[(c(!0),l(D,null,S(o(H),a=>(c(),l("option",{key:a.key,value:a.key},r(a.title),9,Xt))),128))])])]),e("div",Et,[e("label",jt,r(t.$t("issue.acceptanceCriteria")),1),e("div",Kt,[(c(!0),l(D,null,S(o(s).acceptanceCriteria,(a,u)=>(c(),l("div",{key:u,class:"criteria-item"},[v(e("input",{"onUpdate:modelValue":I=>o(s).acceptanceCriteria[u]=I,type:"text",class:"form-input",placeholder:t.$t("form.criteriaPlaceholder")},null,8,Lt),[[k,o(s).acceptanceCriteria[u]]]),e("button",{type:"button",class:"btn-icon",onClick:I=>Q(u)},"×",8,Ot)]))),128)),e("button",{type:"button",class:"btn btn-secondary btn-sm",onClick:J}," + "+r(t.$t("form.addCriteria")),1)])]),e("div",Rt,[e("label",Ht,r(t.$t("issue.attachments")),1),e("div",{class:V(["dropzone",{dragover:o(_)}]),onDragover:i[6]||(i[6]=T(a=>_.value=!0,["prevent"])),onDragleave:i[7]||(i[7]=a=>_.value=!1),onDrop:T(Z,["prevent"])},[e("input",{ref_key:"fileInput",ref:z,type:"file",multiple:"",class:"file-input",onChange:Y},null,544),e("p",null,r(t.$t("form.dropFiles")),1),e("button",{type:"button",class:"btn btn-secondary btn-sm",onClick:W},r(t.$t("form.browse")),1)],34),o(s).attachments.length?(c(),l("ul",Gt,[(c(!0),l(D,null,S(o(s).attachments,(a,u)=>(c(),l("li",{key:u},[e("span",Jt,r(a.name),1),e("span",Qt,r(tt(a.size)),1),e("button",{type:"button",class:"btn-icon",onClick:I=>x(u)},"×",8,Wt)]))),128))])):$("",!0),o(n).attachments?(c(),l("span",Yt,r(o(n).attachments),1)):$("",!0)]),e("div",Zt,[X(d,{to:"/kanban",class:"btn btn-secondary"},{default:E(()=>[h(r(t.$t("form.cancel")),1)]),_:1}),e("button",{type:"submit",class:"btn btn-primary",disabled:o(y)||!o(q)},r(o(y)?t.$t("form.creating"):t.$t("form.create")),9,xt)])],32)])}}}),ae=ct(te,[["__scopeId","data-v-78563ddb"]]);export{ae as default};
@@ -1 +1 @@
1
- import{A as f,r as u}from"./BfvaD8zq.js";const e=u([]);function v(){const t=n=>{const o=`notification-${Date.now()}-${Math.random().toString(36).slice(2)}`,i={id:o,duration:5e3,...n};e.value.push(i),i.duration&&i.duration>0&&setTimeout(()=>{s(o)},i.duration)},s=n=>{const o=e.value.findIndex(i=>i.id===n);o!==-1&&e.value.splice(o,1)},c=(n,o)=>{t({type:"success",message:n,...o!==void 0&&{duration:o}})},r=(n,o)=>{t({type:"error",message:n,duration:o??8e3})},a=(n,o)=>{t({type:"warning",message:n,...o!==void 0&&{duration:o}})},d=(n,o)=>{t({type:"info",message:n,...o!==void 0&&{duration:o}})};return{notifications:f(e),add:t,remove:s,success:c,error:r,warning:a,info:d}}export{v as u};
1
+ import{A as f,r as u}from"./Btwtsr_u.js";const e=u([]);function v(){const t=n=>{const o=`notification-${Date.now()}-${Math.random().toString(36).slice(2)}`,i={id:o,duration:5e3,...n};e.value.push(i),i.duration&&i.duration>0&&setTimeout(()=>{s(o)},i.duration)},s=n=>{const o=e.value.findIndex(i=>i.id===n);o!==-1&&e.value.splice(o,1)},c=(n,o)=>{t({type:"success",message:n,...o!==void 0&&{duration:o}})},r=(n,o)=>{t({type:"error",message:n,duration:o??8e3})},a=(n,o)=>{t({type:"warning",message:n,...o!==void 0&&{duration:o}})},d=(n,o)=>{t({type:"info",message:n,...o!==void 0&&{duration:o}})};return{notifications:f(e),add:t,remove:s,success:c,error:r,warning:a,info:d}}export{v as u};
@@ -1 +1 @@
1
- import{_ as d}from"./BhrZFGnk.js";import{u}from"./p0o0xQ7S.js";import{d as m,u as f,v as g,o as v,K as x,s as h,c as i,j as y,h as e,t as p,e as C,f as w,w as k,b as c,g as N,_ as V}from"./BfvaD8zq.js";const b={class:"pipeline-page"},B={key:0,class:"loading card"},I={key:1,class:"empty-state card"},$=m({__name:"index",async setup(A){let t,_;const{t:a}=f(),{data:n,pending:l}=([t,_]=g(()=>u("/api/pipelines","$p7t_x6yV7n")),t=await t,_(),t);return v(()=>{if(n.value?.length){const s=n.value.find(o=>o.active)||n.value[0];s&&x(`/settings/pipeline/${encodeURIComponent(s.name)}`,{replace:!0})}}),h({title:"Pipeline Configuration - AutoCode"}),(r,s)=>{const o=d;return c(),i("div",b,[e(l)?(c(),i("div",B,p(e(a)("app.loading")),1)):e(n)?.length?y("",!0):(c(),i("div",I,[C("p",null,p(e(a)("pipeline.noColumns")),1),w(o,{to:"/settings/pipeline/new",class:"btn btn-primary"},{default:k(()=>[N(" + "+p(e(a)("pipeline.new")),1)]),_:1})]))])}}}),E=V($,[["__scopeId","data-v-9f6aa041"]]);export{E as default};
1
+ import{_ as d}from"./CuwYCM4v.js";import{u}from"./BvE9NWMw.js";import{d as m,u as f,v as g,o as v,K as x,s as h,c as i,j as y,h as e,t as p,e as C,f as w,w as k,b as c,g as N,_ as V}from"./Btwtsr_u.js";const b={class:"pipeline-page"},B={key:0,class:"loading card"},I={key:1,class:"empty-state card"},$=m({__name:"index",async setup(A){let t,_;const{t:a}=f(),{data:n,pending:l}=([t,_]=g(()=>u("/api/pipelines","$p7t_x6yV7n")),t=await t,_(),t);return v(()=>{if(n.value?.length){const s=n.value.find(o=>o.active)||n.value[0];s&&x(`/settings/pipeline/${encodeURIComponent(s.name)}`,{replace:!0})}}),h({title:"Pipeline Configuration - AutoCode"}),(r,s)=>{const o=d;return c(),i("div",b,[e(l)?(c(),i("div",B,p(e(a)("app.loading")),1)):e(n)?.length?y("",!0):(c(),i("div",I,[C("p",null,p(e(a)("pipeline.noColumns")),1),w(o,{to:"/settings/pipeline/new",class:"btn btn-primary"},{default:k(()=>[N(" + "+p(e(a)("pipeline.new")),1)]),_:1})]))])}}}),E=V($,[["__scopeId","data-v-9f6aa041"]]);export{E as default};
@@ -1 +1 @@
1
- {"id":"fda5642b-b71a-476c-9e0f-eb15a462e2fe","timestamp":1767720235481}
1
+ {"id":"234711bd-452d-42ba-9430-4d79ebc81813","timestamp":1767767273310}
@@ -0,0 +1 @@
1
+ {"id":"234711bd-452d-42ba-9430-4d79ebc81813","timestamp":1767767273310,"matcher":{"static":{},"wildcard":{},"dynamic":{}},"prerendered":["/"]}
@@ -1 +1 @@
1
- import{_ as D}from"./jYOQFUDH.js";import{d as F,G as E,r as h,v,l as I,m as L,s as N,c as i,f as R,e as t,h as a,t as c,z as B,C as V,D as x,H as z,F as O,p as U,b as m,_ as W}from"./BfvaD8zq.js";import{d as j}from"./C0Rlrcoy.js";import{u as G}from"./BarhsfnG.js";import{u as J}from"./Bz9WwRWr.js";import{u as y}from"./p0o0xQ7S.js";import{u as P}from"./vfCqvZ7p.js";import"./BhrZFGnk.js";const Y={class:"issue-comments-page"},q={class:"comments-content card"},K=["placeholder"],Q=["disabled"],X={key:0,class:"loading"},Z={key:1,class:"empty"},ee={key:2,class:"comments-list"},te={class:"comment-header"},se={class:"comment-author"},oe={class:"comment-date"},ae=["innerHTML"],ne=F({__name:"comments",async setup(re){let s,l;const b=E(),{success:g,error:w}=G(),{getErrorMessage:C}=J(),u=b.params.id,o=h(""),d=h(!1),{data:n}=([s,l]=v(()=>y(`/api/issues/${u}`,"$sHdW2Rruhz")),s=await s,l(),s),$=I(()=>{if(!n.value)return null;const e={id:n.value.key,title:n.value.title,column:n.value.column_slug};return n.value.priority&&(e.priority=n.value.priority),e}),{data:p,status:k,refresh:_}=([s,l]=v(()=>y(`/api/issues/${u}/comments`,"$2TYRtwuSoA")),s=await s,l(),s),{lastMessage:S}=P();L(S,e=>{e?.type==="comment"&&e.issueId===u&&_()});const H=e=>new Date(e).toLocaleString(),M=e=>j(e),T=async()=>{if(o.value.trim()){d.value=!0;try{await fetch(`/api/issues/${u}/comments`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:o.value})}),o.value="",g("Comment added"),_()}catch(e){w(C(e,"Failed to add comment"))}finally{d.value=!1}}};return N({title:`Comments - ${u} - AutoCode`}),(e,f)=>{const A=D;return m(),i("div",Y,[R(A,{issue:a($),"active-tab":"comments"},null,8,["issue"]),t("div",q,[t("h2",null,c(e.$t("issue.comments")),1),t("form",{class:"comment-form",onSubmit:B(T,["prevent"])},[V(t("textarea",{"onUpdate:modelValue":f[0]||(f[0]=r=>z(o)?o.value=r:null),class:"form-input comment-input",placeholder:e.$t("issue.addComment"),rows:"3"},null,8,K),[[x,a(o)]]),t("button",{type:"submit",class:"btn btn-primary",disabled:!a(o).trim()||a(d)},c(e.$t("form.save")),9,Q)],32),a(k)==="pending"?(m(),i("div",X,c(e.$t("app.loading")),1)):a(p)?.length?(m(),i("ul",ee,[(m(!0),i(O,null,U(a(p),r=>(m(),i("li",{key:r.id,class:"comment"},[t("div",te,[t("span",se,c(r.author||"User"),1),t("time",oe,c(H(r.createdAt)),1)]),t("div",{class:"comment-body",innerHTML:M(r.content)},null,8,ae)]))),128))])):(m(),i("div",Z,c(e.$t("issue.noComments")),1))])])}}}),fe=W(ne,[["__scopeId","data-v-b988772a"]]);export{fe as default};
1
+ import{_ as D}from"./D90sdSc5.js";import{d as F,G as E,r as h,v,l as I,m as L,s as N,c as i,f as R,e as t,h as a,t as c,z as B,C as V,D as x,H as z,F as O,p as U,b as m,_ as W}from"./Btwtsr_u.js";import{d as j}from"./C0Rlrcoy.js";import{u as G}from"./DuqIS0qR.js";import{u as J}from"./DGmZExaA.js";import{u as y}from"./BvE9NWMw.js";import{u as P}from"./BcawioR3.js";import"./CuwYCM4v.js";const Y={class:"issue-comments-page"},q={class:"comments-content card"},K=["placeholder"],Q=["disabled"],X={key:0,class:"loading"},Z={key:1,class:"empty"},ee={key:2,class:"comments-list"},te={class:"comment-header"},se={class:"comment-author"},oe={class:"comment-date"},ae=["innerHTML"],ne=F({__name:"comments",async setup(re){let s,l;const b=E(),{success:g,error:w}=G(),{getErrorMessage:C}=J(),u=b.params.id,o=h(""),d=h(!1),{data:n}=([s,l]=v(()=>y(`/api/issues/${u}`,"$sHdW2Rruhz")),s=await s,l(),s),$=I(()=>{if(!n.value)return null;const e={id:n.value.key,title:n.value.title,column:n.value.column_slug};return n.value.priority&&(e.priority=n.value.priority),e}),{data:p,status:k,refresh:_}=([s,l]=v(()=>y(`/api/issues/${u}/comments`,"$2TYRtwuSoA")),s=await s,l(),s),{lastMessage:S}=P();L(S,e=>{e?.type==="comment"&&e.issueId===u&&_()});const H=e=>new Date(e).toLocaleString(),M=e=>j(e),T=async()=>{if(o.value.trim()){d.value=!0;try{await fetch(`/api/issues/${u}/comments`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:o.value})}),o.value="",g("Comment added"),_()}catch(e){w(C(e,"Failed to add comment"))}finally{d.value=!1}}};return N({title:`Comments - ${u} - AutoCode`}),(e,f)=>{const A=D;return m(),i("div",Y,[R(A,{issue:a($),"active-tab":"comments"},null,8,["issue"]),t("div",q,[t("h2",null,c(e.$t("issue.comments")),1),t("form",{class:"comment-form",onSubmit:B(T,["prevent"])},[V(t("textarea",{"onUpdate:modelValue":f[0]||(f[0]=r=>z(o)?o.value=r:null),class:"form-input comment-input",placeholder:e.$t("issue.addComment"),rows:"3"},null,8,K),[[x,a(o)]]),t("button",{type:"submit",class:"btn btn-primary",disabled:!a(o).trim()||a(d)},c(e.$t("form.save")),9,Q)],32),a(k)==="pending"?(m(),i("div",X,c(e.$t("app.loading")),1)):a(p)?.length?(m(),i("ul",ee,[(m(!0),i(O,null,U(a(p),r=>(m(),i("li",{key:r.id,class:"comment"},[t("div",te,[t("span",se,c(r.author||"User"),1),t("time",oe,c(H(r.createdAt)),1)]),t("div",{class:"comment-body",innerHTML:M(r.content)},null,8,ae)]))),128))])):(m(),i("div",Z,c(e.$t("issue.noComments")),1))])])}}}),fe=W(ne,[["__scopeId","data-v-b988772a"]]);export{fe as default};
@@ -1 +1 @@
1
- import{_ as _e}from"./jYOQFUDH.js";import{_ as he}from"./BhrZFGnk.js";import{d as fe,G as ye,x as ge,u as be,r as v,v as R,l as S,m as $e,s as ke,c as n,f as K,e as t,j as C,h as s,C as T,D as O,H as A,g as Q,t as a,E as W,F as L,p as H,q as Y,w as Ce,z as we,b as r,_ as Ee}from"./BfvaD8zq.js";import{d as De}from"./C0Rlrcoy.js";import{u as Me}from"./BarhsfnG.js";import{u as Pe}from"./Bz9WwRWr.js";import{u as q}from"./p0o0xQ7S.js";const Se={class:"issue-view-page"},Te={class:"issue-content"},Ve={class:"main-section"},Ne={class:"card title-card"},Ae={class:"title-row"},Le=["placeholder"],He=["disabled","title"],Ue={key:0,class:"spinner"},Oe={key:1,class:"sparkle"},Fe={class:"card"},Ie={class:"form-row"},Be={class:"form-group"},Je={class:"form-label",for:"edit-priority"},Re={value:""},qe={value:"low"},ze={value:"medium"},Xe={value:"high"},je={value:"critical"},Ge={class:"form-group"},Ke={class:"form-label",for:"edit-parent"},Qe=["placeholder"],We={id:"parent-suggestions"},Ye=["value"],Ze={class:"meta-badges"},xe={class:"meta-badge column-badge"},et={key:0,class:"meta-badge semver-badge"},tt={key:0,class:"card"},st={class:"labels-list"},at={class:"card"},it={class:"section-header"},ot=["innerHTML"],lt=["placeholder"],nt={class:"card"},rt={class:"section-header"},ct={key:0,class:"criteria-list"},ut={key:1,class:"empty-criteria"},dt={key:2,class:"criteria-edit"},vt=["onUpdate:modelValue","placeholder"],pt=["onClick"],mt={class:"actions-bar"},_t=["disabled"],ht=["disabled"],ft={key:2,class:"done-badge"},yt={class:"sidebar"},gt={class:"card"},bt={class:"action-buttons"},$t={class:"card"},kt={class:"metadata-list"},Ct={class:"metadata-item"},wt={class:"metadata-item"},Et={class:"metadata-item"},Dt={key:0,class:"card"},Mt={class:"modal"},Pt={class:"modal-header"},St={class:"modal-title"},Tt={class:"modal-body"},Vt=["value"],Nt={class:"modal-footer"},At=fe({__name:"index",async setup(Lt){let d,w;const Z=ye(),x=ge(),{t:_,locale:ee}=be(),{success:V,error:E}=Me(),{getErrorMessage:N}=Pe(),g=Z.params.id,D=v(!1),M=v(""),F=v(!1),U=v(!1),P=v(!1),h=v(!1),u=v(!1),c=v([]),{data:i,refresh:I}=([d,w]=R(()=>q(`/api/issues/${g}`,"$IXIJsCSqf0")),d=await d,w(),d),{data:b}=([d,w]=R(()=>q("/api/columns","$xdX8vE_27c")),d=await d,w(),d),{data:te}=([d,w]=R(()=>q("/api/issues","$81nxEVnLdN")),d=await d,w(),d),se=S(()=>(te.value||[]).filter(e=>e.key!==g).slice(0,10)),p=v(i.value?.title||""),f=v(i.value?.description||""),y=v(i.value?.priority||""),$=v(i.value?.parent_key||"");$e(i,e=>{e&&(p.value=e.title,f.value=e.description||"",y.value=e.priority||"",$.value=e.parent_key||"")});const z=S(()=>!i.value||!b.value?i.value?.column_slug||"":b.value.find(o=>o.slug===i.value?.column_slug)?.name||i.value.column_slug),B=S(()=>{if(!i.value||!b.value||b.value.length===0)return!1;const e=b.value[b.value.length-1];return i.value.column_slug===e?.slug}),ae=S(()=>{if(!i.value)return null;const e={id:i.value.key,title:p.value,column:i.value.column_slug};return i.value.priority&&(e.priority=i.value.priority),e}),X=S(()=>{if(!i.value)return!1;const e=p.value!==i.value.title,o=f.value!==(i.value.description||""),k=y.value!==(i.value.priority||""),J=$.value!==(i.value.parent_key||""),l=u.value&&JSON.stringify(c.value.filter(m=>m.trim()))!==JSON.stringify(i.value.acceptance_criteria||[]);return e||o||k||J||l}),ie=S(()=>{const e=h.value?f.value:i.value?.description||"";return e?De(e):`<span style="color: var(--text-muted)">${_("issue.noDescription")}</span>`}),j=e=>e?new Date(e).toLocaleDateString():"-",oe=()=>{h.value=!h.value},le=()=>{u.value||(c.value=[...i.value?.acceptance_criteria||[]],c.value.length===0&&(c.value=[""])),u.value=!u.value},ne=()=>{c.value.push("")},re=e=>{c.value.splice(e,1),c.value.length===0&&(c.value=[""])},ce=async()=>{if(!(!p.value.trim()||P.value)){P.value=!0;try{const e=u.value?c.value.filter(k=>k.trim()):i.value?.acceptance_criteria||[],o=await $fetch("/api/issues/autocomplete",{method:"POST",body:{title:p.value,lang:ee.value,description:f.value||void 0,priority:y.value||void 0,acceptance_criteria:e.length>0?e:void 0,parent_key:$.value||void 0}});if(o.description&&(f.value=o.description,h.value=!0),o.priority){const k={P0:"critical",P1:"high",P2:"medium",P3:"low"};y.value=k[o.priority]||o.priority}o.acceptance_criteria&&Array.isArray(o.acceptance_criteria)&&(c.value=o.acceptance_criteria.length>0?o.acceptance_criteria:[""],u.value=!0),V(_("autocomplete.rememberSave"))}catch(e){E(N(e,_("autocomplete.error")))}finally{P.value=!1}}},ue=async()=>{if(X.value){U.value=!0;try{const e={title:p.value,description:f.value,priority:y.value||void 0,parent_key:$.value||void 0};u.value&&(e.acceptance_criteria=c.value.filter(o=>o.trim())),await $fetch(`/api/issues/${g}`,{method:"PATCH",body:e}),V(_("notify.issueSaved")),h.value&&(h.value=!1),u.value&&(u.value=!1),I()}catch(e){E(N(e))}finally{U.value=!1}}},de=async()=>{F.value=!0;try{await $fetch(`/api/issues/${g}/next`,{method:"POST"}),V(_("notify.issueAdvanced")),I()}catch(e){E(N(e))}finally{F.value=!1}},ve=()=>{M.value=i.value?.column_slug||"",D.value=!0},pe=async()=>{if(!M.value){E(_("notify.error"));return}try{await $fetch(`/api/issues/${g}/move`,{method:"POST",body:{column:M.value,force:!0}}),V(_("notify.issueMoved")),D.value=!1,I()}catch(e){E(N(e))}},me=async()=>{if(confirm(_("issue.confirmArchive")))try{await $fetch(`/api/issues/${g}/archive`,{method:"DELETE"}),V(_("notify.issueArchived")),x.push("/")}catch(e){E(N(e))}};return ke({title:`${g} - AutoCode`}),(e,o)=>{const k=_e,J=he;return r(),n("div",Se,[K(k,{issue:s(ae),"active-tab":"details"},null,8,["issue"]),t("div",Te,[t("div",Ve,[t("div",Ne,[t("div",Ae,[T(t("input",{"onUpdate:modelValue":o[0]||(o[0]=l=>A(p)?p.value=l:null),type:"text",class:"title-input",placeholder:e.$t("issue.title")},null,8,Le),[[O,s(p)]]),t("button",{type:"button",class:"btn-autocomplete",disabled:s(P)||!s(p).trim(),title:e.$t("autocomplete.tooltip"),onClick:ce},[s(P)?(r(),n("span",Ue)):(r(),n("span",Oe,"✨")),Q(" "+a(s(P)?e.$t("autocomplete.loading"):e.$t("autocomplete.button")),1)],8,He)])]),t("div",Fe,[t("h2",null,a(e.$t("issue.metadata")),1),t("div",Ie,[t("div",Be,[t("label",Je,a(e.$t("issue.priority")),1),T(t("select",{id:"edit-priority","onUpdate:modelValue":o[1]||(o[1]=l=>A(y)?y.value=l:null),class:"form-input"},[t("option",Re,a(e.$t("form.select")),1),t("option",qe,a(e.$t("priority.low")),1),t("option",ze,a(e.$t("priority.medium")),1),t("option",Xe,a(e.$t("priority.high")),1),t("option",je,a(e.$t("priority.critical")),1)],512),[[W,s(y)]])]),t("div",Ge,[t("label",Ke,a(e.$t("issue.parent")),1),T(t("input",{id:"edit-parent","onUpdate:modelValue":o[2]||(o[2]=l=>A($)?$.value=l:null),type:"text",class:"form-input",placeholder:e.$t("form.parentPlaceholder"),list:"parent-suggestions"},null,8,Qe),[[O,s($)]]),t("datalist",We,[(r(!0),n(L,null,H(s(se),l=>(r(),n("option",{key:l.key,value:l.key},a(l.title),9,Ye))),128))])])]),t("div",Ze,[t("span",xe,a(s(z)),1),s(i)?.semver?(r(),n("span",et,a(s(i).semver),1)):C("",!0)])]),s(i)?.labels?.length?(r(),n("div",tt,[t("h2",null,a(e.$t("issue.labels")),1),t("div",st,[(r(!0),n(L,null,H(s(i).labels,(l,m)=>(r(),n("span",{key:m,class:"label-tag"},a(l),1))),128))])])):C("",!0),t("div",at,[t("div",it,[t("h2",null,a(e.$t("issue.description")),1),t("button",{class:Y(["btn-edit-toggle",{active:s(h)}]),onClick:oe},a(s(h)?"✓":"✏️"),3)]),s(h)?T((r(),n("textarea",{key:1,"onUpdate:modelValue":o[3]||(o[3]=l=>A(f)?f.value=l:null),class:"description-edit",placeholder:e.$t("issue.description"),rows:"10"},null,8,lt)),[[O,s(f)]]):(r(),n("div",{key:0,class:"description",innerHTML:s(ie)},null,8,ot))]),t("div",nt,[t("div",rt,[t("h2",null,a(e.$t("issue.acceptanceCriteria")),1),t("button",{class:Y(["btn-edit-toggle",{active:s(u)}]),onClick:le},a(s(u)?"✓":"✏️"),3)]),!s(u)&&s(i)?.acceptance_criteria?.length?(r(),n("ul",ct,[(r(!0),n(L,null,H(s(i).acceptance_criteria,(l,m)=>(r(),n("li",{key:m,class:"criteria-item"},a(l),1))),128))])):s(u)?(r(),n("div",dt,[(r(!0),n(L,null,H(s(c),(l,m)=>(r(),n("div",{key:m,class:"criteria-input-row"},[T(t("input",{"onUpdate:modelValue":G=>s(c)[m]=G,type:"text",class:"form-input",placeholder:e.$t("form.criteriaPlaceholder")},null,8,vt),[[O,s(c)[m]]]),t("button",{class:"btn-icon",type:"button",onClick:G=>re(m)},"×",8,pt)]))),128)),t("button",{class:"btn btn-secondary btn-sm",type:"button",onClick:ne}," + "+a(e.$t("form.addCriteria")),1)])):(r(),n("p",ut,a(e.$t("issue.noCriteria")),1))]),t("div",mt,[t("button",{class:"btn btn-primary",disabled:s(U)||!s(X),onClick:ue},a(s(U)?e.$t("form.saving"):e.$t("form.save")),9,_t),s(B)?C("",!0):(r(),n("button",{key:0,class:"btn btn-secondary",disabled:s(F),onClick:de},a(e.$t("issue.next"))+" → ",9,ht)),s(B)?C("",!0):(r(),n("button",{key:1,class:"btn btn-danger",onClick:me},a(e.$t("issue.archive")),1)),s(B)?(r(),n("span",ft," ✓ "+a(e.$t("issue.done")),1)):C("",!0)])]),t("aside",yt,[t("div",gt,[t("h3",null,a(e.$t("issue.actions")),1),t("div",bt,[t("button",{class:"btn btn-secondary",onClick:ve},a(e.$t("issue.move")),1)])]),t("div",$t,[t("h3",null,a(e.$t("issue.details")),1),t("dl",kt,[t("div",Ct,[t("dt",null,a(e.$t("issue.status")),1),t("dd",null,a(s(z)),1)]),t("div",wt,[t("dt",null,a(e.$t("issue.created")),1),t("dd",null,a(j(s(i)?.created_at)),1)]),t("div",Et,[t("dt",null,a(e.$t("issue.updated")),1),t("dd",null,a(j(s(i)?.updated_at)),1)])])]),s(i)?.parent_key?(r(),n("div",Dt,[t("h3",null,a(e.$t("issue.parent")),1),K(J,{to:`/issue/${s(i).parent_key}`,class:"parent-link"},{default:Ce(()=>[Q(a(s(i).parent_key),1)]),_:1},8,["to"])])):C("",!0)])]),s(D)?(r(),n("div",{key:0,class:"modal-overlay active",onClick:o[7]||(o[7]=we(l=>D.value=!1,["self"]))},[t("div",Mt,[t("div",Pt,[t("h3",St,a(e.$t("issue.move")),1),t("button",{class:"modal-close",onClick:o[4]||(o[4]=l=>D.value=!1)},"×")]),t("div",Tt,[T(t("select",{"onUpdate:modelValue":o[5]||(o[5]=l=>A(M)?M.value=l:null),class:"form-input"},[(r(!0),n(L,null,H(s(b),l=>(r(),n("option",{key:l.slug,value:l.slug},a(l.name),9,Vt))),128))],512),[[W,s(M)]])]),t("div",Nt,[t("button",{class:"btn btn-secondary",onClick:o[6]||(o[6]=l=>D.value=!1)},a(e.$t("modal.cancel")),1),t("button",{class:"btn btn-primary",onClick:pe},a(e.$t("modal.confirm")),1)])])])):C("",!0)])}}}),Rt=Ee(At,[["__scopeId","data-v-07b1c9a3"]]);export{Rt as default};
1
+ import{_ as _e}from"./D90sdSc5.js";import{_ as he}from"./CuwYCM4v.js";import{d as fe,G as ye,x as ge,u as be,r as v,v as R,l as S,m as $e,s as ke,c as n,f as K,e as t,j as C,h as s,C as T,D as O,H as A,g as Q,t as a,E as W,F as L,p as H,q as Y,w as Ce,z as we,b as r,_ as Ee}from"./Btwtsr_u.js";import{d as De}from"./C0Rlrcoy.js";import{u as Me}from"./DuqIS0qR.js";import{u as Pe}from"./DGmZExaA.js";import{u as q}from"./BvE9NWMw.js";const Se={class:"issue-view-page"},Te={class:"issue-content"},Ve={class:"main-section"},Ne={class:"card title-card"},Ae={class:"title-row"},Le=["placeholder"],He=["disabled","title"],Ue={key:0,class:"spinner"},Oe={key:1,class:"sparkle"},Fe={class:"card"},Ie={class:"form-row"},Be={class:"form-group"},Je={class:"form-label",for:"edit-priority"},Re={value:""},qe={value:"low"},ze={value:"medium"},Xe={value:"high"},je={value:"critical"},Ge={class:"form-group"},Ke={class:"form-label",for:"edit-parent"},Qe=["placeholder"],We={id:"parent-suggestions"},Ye=["value"],Ze={class:"meta-badges"},xe={class:"meta-badge column-badge"},et={key:0,class:"meta-badge semver-badge"},tt={key:0,class:"card"},st={class:"labels-list"},at={class:"card"},it={class:"section-header"},ot=["innerHTML"],lt=["placeholder"],nt={class:"card"},rt={class:"section-header"},ct={key:0,class:"criteria-list"},ut={key:1,class:"empty-criteria"},dt={key:2,class:"criteria-edit"},vt=["onUpdate:modelValue","placeholder"],pt=["onClick"],mt={class:"actions-bar"},_t=["disabled"],ht=["disabled"],ft={key:2,class:"done-badge"},yt={class:"sidebar"},gt={class:"card"},bt={class:"action-buttons"},$t={class:"card"},kt={class:"metadata-list"},Ct={class:"metadata-item"},wt={class:"metadata-item"},Et={class:"metadata-item"},Dt={key:0,class:"card"},Mt={class:"modal"},Pt={class:"modal-header"},St={class:"modal-title"},Tt={class:"modal-body"},Vt=["value"],Nt={class:"modal-footer"},At=fe({__name:"index",async setup(Lt){let d,w;const Z=ye(),x=ge(),{t:_,locale:ee}=be(),{success:V,error:E}=Me(),{getErrorMessage:N}=Pe(),g=Z.params.id,D=v(!1),M=v(""),F=v(!1),U=v(!1),P=v(!1),h=v(!1),u=v(!1),c=v([]),{data:i,refresh:I}=([d,w]=R(()=>q(`/api/issues/${g}`,"$IXIJsCSqf0")),d=await d,w(),d),{data:b}=([d,w]=R(()=>q("/api/columns","$xdX8vE_27c")),d=await d,w(),d),{data:te}=([d,w]=R(()=>q("/api/issues","$81nxEVnLdN")),d=await d,w(),d),se=S(()=>(te.value||[]).filter(e=>e.key!==g).slice(0,10)),p=v(i.value?.title||""),f=v(i.value?.description||""),y=v(i.value?.priority||""),$=v(i.value?.parent_key||"");$e(i,e=>{e&&(p.value=e.title,f.value=e.description||"",y.value=e.priority||"",$.value=e.parent_key||"")});const z=S(()=>!i.value||!b.value?i.value?.column_slug||"":b.value.find(o=>o.slug===i.value?.column_slug)?.name||i.value.column_slug),B=S(()=>{if(!i.value||!b.value||b.value.length===0)return!1;const e=b.value[b.value.length-1];return i.value.column_slug===e?.slug}),ae=S(()=>{if(!i.value)return null;const e={id:i.value.key,title:p.value,column:i.value.column_slug};return i.value.priority&&(e.priority=i.value.priority),e}),X=S(()=>{if(!i.value)return!1;const e=p.value!==i.value.title,o=f.value!==(i.value.description||""),k=y.value!==(i.value.priority||""),J=$.value!==(i.value.parent_key||""),l=u.value&&JSON.stringify(c.value.filter(m=>m.trim()))!==JSON.stringify(i.value.acceptance_criteria||[]);return e||o||k||J||l}),ie=S(()=>{const e=h.value?f.value:i.value?.description||"";return e?De(e):`<span style="color: var(--text-muted)">${_("issue.noDescription")}</span>`}),j=e=>e?new Date(e).toLocaleDateString():"-",oe=()=>{h.value=!h.value},le=()=>{u.value||(c.value=[...i.value?.acceptance_criteria||[]],c.value.length===0&&(c.value=[""])),u.value=!u.value},ne=()=>{c.value.push("")},re=e=>{c.value.splice(e,1),c.value.length===0&&(c.value=[""])},ce=async()=>{if(!(!p.value.trim()||P.value)){P.value=!0;try{const e=u.value?c.value.filter(k=>k.trim()):i.value?.acceptance_criteria||[],o=await $fetch("/api/issues/autocomplete",{method:"POST",body:{title:p.value,lang:ee.value,description:f.value||void 0,priority:y.value||void 0,acceptance_criteria:e.length>0?e:void 0,parent_key:$.value||void 0}});if(o.description&&(f.value=o.description,h.value=!0),o.priority){const k={P0:"critical",P1:"high",P2:"medium",P3:"low"};y.value=k[o.priority]||o.priority}o.acceptance_criteria&&Array.isArray(o.acceptance_criteria)&&(c.value=o.acceptance_criteria.length>0?o.acceptance_criteria:[""],u.value=!0),V(_("autocomplete.rememberSave"))}catch(e){E(N(e,_("autocomplete.error")))}finally{P.value=!1}}},ue=async()=>{if(X.value){U.value=!0;try{const e={title:p.value,description:f.value,priority:y.value||void 0,parent_key:$.value||void 0};u.value&&(e.acceptance_criteria=c.value.filter(o=>o.trim())),await $fetch(`/api/issues/${g}`,{method:"PATCH",body:e}),V(_("notify.issueSaved")),h.value&&(h.value=!1),u.value&&(u.value=!1),I()}catch(e){E(N(e))}finally{U.value=!1}}},de=async()=>{F.value=!0;try{await $fetch(`/api/issues/${g}/next`,{method:"POST"}),V(_("notify.issueAdvanced")),I()}catch(e){E(N(e))}finally{F.value=!1}},ve=()=>{M.value=i.value?.column_slug||"",D.value=!0},pe=async()=>{if(!M.value){E(_("notify.error"));return}try{await $fetch(`/api/issues/${g}/move`,{method:"POST",body:{column:M.value,force:!0}}),V(_("notify.issueMoved")),D.value=!1,I()}catch(e){E(N(e))}},me=async()=>{if(confirm(_("issue.confirmArchive")))try{await $fetch(`/api/issues/${g}/archive`,{method:"DELETE"}),V(_("notify.issueArchived")),x.push("/")}catch(e){E(N(e))}};return ke({title:`${g} - AutoCode`}),(e,o)=>{const k=_e,J=he;return r(),n("div",Se,[K(k,{issue:s(ae),"active-tab":"details"},null,8,["issue"]),t("div",Te,[t("div",Ve,[t("div",Ne,[t("div",Ae,[T(t("input",{"onUpdate:modelValue":o[0]||(o[0]=l=>A(p)?p.value=l:null),type:"text",class:"title-input",placeholder:e.$t("issue.title")},null,8,Le),[[O,s(p)]]),t("button",{type:"button",class:"btn-autocomplete",disabled:s(P)||!s(p).trim(),title:e.$t("autocomplete.tooltip"),onClick:ce},[s(P)?(r(),n("span",Ue)):(r(),n("span",Oe,"✨")),Q(" "+a(s(P)?e.$t("autocomplete.loading"):e.$t("autocomplete.button")),1)],8,He)])]),t("div",Fe,[t("h2",null,a(e.$t("issue.metadata")),1),t("div",Ie,[t("div",Be,[t("label",Je,a(e.$t("issue.priority")),1),T(t("select",{id:"edit-priority","onUpdate:modelValue":o[1]||(o[1]=l=>A(y)?y.value=l:null),class:"form-input"},[t("option",Re,a(e.$t("form.select")),1),t("option",qe,a(e.$t("priority.low")),1),t("option",ze,a(e.$t("priority.medium")),1),t("option",Xe,a(e.$t("priority.high")),1),t("option",je,a(e.$t("priority.critical")),1)],512),[[W,s(y)]])]),t("div",Ge,[t("label",Ke,a(e.$t("issue.parent")),1),T(t("input",{id:"edit-parent","onUpdate:modelValue":o[2]||(o[2]=l=>A($)?$.value=l:null),type:"text",class:"form-input",placeholder:e.$t("form.parentPlaceholder"),list:"parent-suggestions"},null,8,Qe),[[O,s($)]]),t("datalist",We,[(r(!0),n(L,null,H(s(se),l=>(r(),n("option",{key:l.key,value:l.key},a(l.title),9,Ye))),128))])])]),t("div",Ze,[t("span",xe,a(s(z)),1),s(i)?.semver?(r(),n("span",et,a(s(i).semver),1)):C("",!0)])]),s(i)?.labels?.length?(r(),n("div",tt,[t("h2",null,a(e.$t("issue.labels")),1),t("div",st,[(r(!0),n(L,null,H(s(i).labels,(l,m)=>(r(),n("span",{key:m,class:"label-tag"},a(l),1))),128))])])):C("",!0),t("div",at,[t("div",it,[t("h2",null,a(e.$t("issue.description")),1),t("button",{class:Y(["btn-edit-toggle",{active:s(h)}]),onClick:oe},a(s(h)?"✓":"✏️"),3)]),s(h)?T((r(),n("textarea",{key:1,"onUpdate:modelValue":o[3]||(o[3]=l=>A(f)?f.value=l:null),class:"description-edit",placeholder:e.$t("issue.description"),rows:"10"},null,8,lt)),[[O,s(f)]]):(r(),n("div",{key:0,class:"description",innerHTML:s(ie)},null,8,ot))]),t("div",nt,[t("div",rt,[t("h2",null,a(e.$t("issue.acceptanceCriteria")),1),t("button",{class:Y(["btn-edit-toggle",{active:s(u)}]),onClick:le},a(s(u)?"✓":"✏️"),3)]),!s(u)&&s(i)?.acceptance_criteria?.length?(r(),n("ul",ct,[(r(!0),n(L,null,H(s(i).acceptance_criteria,(l,m)=>(r(),n("li",{key:m,class:"criteria-item"},a(l),1))),128))])):s(u)?(r(),n("div",dt,[(r(!0),n(L,null,H(s(c),(l,m)=>(r(),n("div",{key:m,class:"criteria-input-row"},[T(t("input",{"onUpdate:modelValue":G=>s(c)[m]=G,type:"text",class:"form-input",placeholder:e.$t("form.criteriaPlaceholder")},null,8,vt),[[O,s(c)[m]]]),t("button",{class:"btn-icon",type:"button",onClick:G=>re(m)},"×",8,pt)]))),128)),t("button",{class:"btn btn-secondary btn-sm",type:"button",onClick:ne}," + "+a(e.$t("form.addCriteria")),1)])):(r(),n("p",ut,a(e.$t("issue.noCriteria")),1))]),t("div",mt,[t("button",{class:"btn btn-primary",disabled:s(U)||!s(X),onClick:ue},a(s(U)?e.$t("form.saving"):e.$t("form.save")),9,_t),s(B)?C("",!0):(r(),n("button",{key:0,class:"btn btn-secondary",disabled:s(F),onClick:de},a(e.$t("issue.next"))+" → ",9,ht)),s(B)?C("",!0):(r(),n("button",{key:1,class:"btn btn-danger",onClick:me},a(e.$t("issue.archive")),1)),s(B)?(r(),n("span",ft," ✓ "+a(e.$t("issue.done")),1)):C("",!0)])]),t("aside",yt,[t("div",gt,[t("h3",null,a(e.$t("issue.actions")),1),t("div",bt,[t("button",{class:"btn btn-secondary",onClick:ve},a(e.$t("issue.move")),1)])]),t("div",$t,[t("h3",null,a(e.$t("issue.details")),1),t("dl",kt,[t("div",Ct,[t("dt",null,a(e.$t("issue.status")),1),t("dd",null,a(s(z)),1)]),t("div",wt,[t("dt",null,a(e.$t("issue.created")),1),t("dd",null,a(j(s(i)?.created_at)),1)]),t("div",Et,[t("dt",null,a(e.$t("issue.updated")),1),t("dd",null,a(j(s(i)?.updated_at)),1)])])]),s(i)?.parent_key?(r(),n("div",Dt,[t("h3",null,a(e.$t("issue.parent")),1),K(J,{to:`/issue/${s(i).parent_key}`,class:"parent-link"},{default:Ce(()=>[Q(a(s(i).parent_key),1)]),_:1},8,["to"])])):C("",!0)])]),s(D)?(r(),n("div",{key:0,class:"modal-overlay active",onClick:o[7]||(o[7]=we(l=>D.value=!1,["self"]))},[t("div",Mt,[t("div",Pt,[t("h3",St,a(e.$t("issue.move")),1),t("button",{class:"modal-close",onClick:o[4]||(o[4]=l=>D.value=!1)},"×")]),t("div",Tt,[T(t("select",{"onUpdate:modelValue":o[5]||(o[5]=l=>A(M)?M.value=l:null),class:"form-input"},[(r(!0),n(L,null,H(s(b),l=>(r(),n("option",{key:l.slug,value:l.slug},a(l.name),9,Vt))),128))],512),[[W,s(M)]])]),t("div",Nt,[t("button",{class:"btn btn-secondary",onClick:o[6]||(o[6]=l=>D.value=!1)},a(e.$t("modal.cancel")),1),t("button",{class:"btn btn-primary",onClick:pe},a(e.$t("modal.confirm")),1)])])])):C("",!0)])}}}),Rt=Ee(At,[["__scopeId","data-v-07b1c9a3"]]);export{Rt as default};
@@ -1 +1 @@
1
- [{"data":1,"prerenderedAt":3},["ShallowReactive",2],{},1767720268372]
1
+ [{"data":1,"prerenderedAt":3},["ShallowReactive",2],{},1767767300895]
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AutoCode - Wrapper Claude Code</title><style>.landing-layout[data-v-7140fa30]{background:var(--landing-bg-primary);color:var(--landing-text-primary);min-height:100vh;overflow-x:hidden;position:relative}.bg-grid[data-v-7140fa30]{background-image:linear-gradient(rgba(99,102,241,.03) 1px,transparent 0),linear-gradient(90deg,rgba(99,102,241,.03) 1px,transparent 0);background-size:50px 50px;height:100%;left:0;top:0;width:100%}.bg-glow[data-v-7140fa30],.bg-grid[data-v-7140fa30]{pointer-events:none;position:fixed;z-index:0}.bg-glow[data-v-7140fa30]{animation:float-7140fa30 20s ease-in-out infinite;background:radial-gradient(circle,var(--landing-accent-glow) 0,transparent 70%);border-radius:50%;height:600px;width:600px}.bg-glow-1[data-v-7140fa30]{left:-200px;top:-200px}.bg-glow-2[data-v-7140fa30]{animation-delay:-10s;bottom:-200px;right:-200px}@keyframes float-7140fa30{0%,to{transform:translate(0) scale(1)}50%{transform:translate(50px,50px) scale(1.1)}}</style><style>.landing-matrix-bg[data-v-b5216f08]{height:100%;left:0;opacity:.35;pointer-events:none;position:fixed;top:0;width:100%;z-index:0}</style><style>.lang-switcher[data-v-2d84a2aa]{display:flex;gap:var(--spacing-xs)}.lang-btn[data-v-2d84a2aa]{background:var(--bg-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;font-size:var(--font-size-sm);font-weight:500;min-width:36px;padding:var(--spacing-xs) var(--spacing-sm);transition:all var(--transition-fast)}.lang-btn[data-v-2d84a2aa]:hover{color:var(--primary-color)}.lang-btn.active[data-v-2d84a2aa],.lang-btn[data-v-2d84a2aa]:hover{border-color:var(--primary-color)}.lang-btn.active[data-v-2d84a2aa]{background:var(--primary-color);color:#fff}.lang-btn[data-v-2d84a2aa]:focus{box-shadow:0 0 0 2px #3b82f64d;outline:none}</style><style>.landing-demo[data-v-5e25f58c]{background:linear-gradient(135deg,#6366f11a,#a855f71a);border-radius:var(--landing-radius-xl);margin:0 auto;max-width:900px;padding:var(--landing-spacing-xl) var(--landing-spacing-lg);text-align:center}.landing-demo-content h2[data-v-5e25f58c]{background:var(--landing-gradient-1);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.landing-demo-content p[data-v-5e25f58c]{color:var(--landing-text-secondary);font-size:1.25rem;margin-bottom:var(--landing-spacing-xl);margin-left:auto;margin-right:auto;max-width:600px}.landing-btn-large[data-v-5e25f58c]{font-size:1.125rem;padding:var(--landing-spacing-md) var(--landing-spacing-xl)}</style><style>.landing-podcast-player[data-v-5dee128b]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-xl);margin:0 auto;max-width:700px;padding:var(--landing-spacing-xl)}.podcast-info[data-v-5dee128b]{gap:var(--landing-spacing-md);margin-bottom:var(--landing-spacing-lg)}.podcast-artwork[data-v-5dee128b],.podcast-info[data-v-5dee128b]{align-items:center;display:flex}.podcast-artwork[data-v-5dee128b]{background:var(--landing-gradient-1);border-radius:var(--landing-radius-md);color:#fff;height:64px;justify-content:center;width:64px}.podcast-meta h3[data-v-5dee128b]{color:var(--landing-text-primary);font-size:1.125rem;margin:0 0 var(--landing-spacing-xs)}.podcast-lang-badge[data-v-5dee128b]{background:var(--landing-accent);border-radius:var(--landing-radius-sm);color:#fff;font-size:.75rem;font-weight:600;padding:2px 8px}.podcast-controls[data-v-5dee128b]{align-items:center;display:flex;gap:var(--landing-spacing-md)}.podcast-play-btn[data-v-5dee128b]{align-items:center;background:var(--landing-accent);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;flex-shrink:0;height:48px;justify-content:center;transition:all var(--landing-transition);width:48px}.podcast-play-btn[data-v-5dee128b]:hover:not(:disabled){background:var(--landing-accent-hover);transform:scale(1.05)}.podcast-play-btn[data-v-5dee128b]:disabled{cursor:not-allowed;opacity:.5}.podcast-progress-container[data-v-5dee128b]{cursor:pointer;flex:1}.podcast-progress-bar[data-v-5dee128b]{background:var(--landing-border-color);border-radius:4px;height:8px;overflow:hidden}.podcast-progress-fill[data-v-5dee128b]{background:var(--landing-gradient-1);height:100%;transition:width .1s linear}.podcast-time[data-v-5dee128b]{color:var(--landing-text-muted);display:flex;font-size:.75rem;justify-content:space-between;margin-top:var(--landing-spacing-xs)}.podcast-speed[data-v-5dee128b]{display:flex;gap:4px}.podcast-speed button[data-v-5dee128b]{background:transparent;border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-sm);color:var(--landing-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:all var(--landing-transition)}.podcast-speed button.active[data-v-5dee128b],.podcast-speed button[data-v-5dee128b]:hover{background:var(--landing-accent);border-color:var(--landing-accent);color:#fff}.podcast-volume[data-v-5dee128b]{align-items:center;display:flex;gap:var(--landing-spacing-xs)}.podcast-volume svg[data-v-5dee128b]{color:var(--landing-text-secondary)}.podcast-volume input[type=range][data-v-5dee128b]{-webkit-appearance:none;background:var(--landing-border-color);border-radius:4px;height:4px;width:80px}.podcast-volume input[type=range][data-v-5dee128b]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--landing-accent);border-radius:50%;cursor:pointer;height:14px;width:14px}@media(max-width:768px){.podcast-controls[data-v-5dee128b]{flex-wrap:wrap}.podcast-progress-container[data-v-5dee128b]{order:3;width:100%}.podcast-speed[data-v-5dee128b],.podcast-volume[data-v-5dee128b]{order:4}}</style><style>.landing-pipeline-flow[data-v-b084b36d]{align-items:stretch;display:flex;gap:var(--landing-spacing-md);justify-content:center;margin-bottom:var(--landing-spacing-xl)}.pipeline-phase[data-v-b084b36d]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);flex:1;max-width:250px;padding:var(--landing-spacing-lg);text-align:center;transition:all var(--landing-transition)}.pipeline-phase[data-v-b084b36d]:hover{transform:translateY(-4px)}.pipeline-phase-blue[data-v-b084b36d]{border-top:3px solid #3b82f6}.pipeline-phase-purple[data-v-b084b36d]{border-top:3px solid #8b5cf6}.pipeline-phase-orange[data-v-b084b36d]{border-top:3px solid #f59e0b}.pipeline-phase-green[data-v-b084b36d]{border-top:3px solid #22c55e}.phase-icon[data-v-b084b36d]{font-size:2rem;margin-bottom:var(--landing-spacing-sm)}.pipeline-phase h3[data-v-b084b36d]{color:var(--landing-text-primary);font-size:1rem;margin-bottom:var(--landing-spacing-xs)}.pipeline-phase>p[data-v-b084b36d]{color:var(--landing-text-secondary);font-size:.875rem;line-height:1.5;margin-bottom:var(--landing-spacing-sm)}.phase-items[data-v-b084b36d]{display:flex;flex-wrap:wrap;gap:4px;justify-content:center}.phase-item[data-v-b084b36d]{background:#8b5cf633;border-radius:var(--landing-radius-sm);color:#a78bfa;font-size:.7rem;padding:2px 6px}.pipeline-arrow[data-v-b084b36d]{align-items:center;color:var(--landing-text-muted);display:flex}.landing-pipeline-note[data-v-b084b36d]{align-items:center;background:#6366f11a;border-radius:var(--landing-radius-lg);display:flex;gap:var(--landing-spacing-md);justify-content:center;margin:0 auto;max-width:600px;padding:var(--landing-spacing-md) var(--landing-spacing-lg)}.note-icon[data-v-b084b36d]{font-size:1.5rem}.landing-pipeline-note p[data-v-b084b36d]{color:var(--landing-text-secondary);font-size:.9rem;margin:0}@media(max-width:900px){.landing-pipeline-flow[data-v-b084b36d]{align-items:center;flex-direction:column}.pipeline-phase[data-v-b084b36d]{max-width:100%;width:100%}.pipeline-arrow[data-v-b084b36d]{transform:rotate(90deg)}}</style><style>.landing-autonomy-grid[data-v-89440757]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(3,1fr);margin-bottom:var(--landing-spacing-2xl)}.landing-autonomy-card[data-v-89440757]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);text-align:center;transition:all var(--landing-transition)}.landing-autonomy-card[data-v-89440757]:hover{border-color:var(--landing-accent);transform:translateY(-4px)}.autonomy-icon[data-v-89440757]{font-size:3rem;margin-bottom:var(--landing-spacing-md)}.landing-autonomy-card h3[data-v-89440757]{color:var(--landing-text-primary);font-size:1.25rem;margin-bottom:var(--landing-spacing-sm)}.landing-autonomy-card p[data-v-89440757]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6}.landing-autonomy-workflow[data-v-89440757]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);margin:0 auto;max-width:800px;overflow:hidden}.workflow-header[data-v-89440757]{background:#ffffff0d;border-bottom:1px solid var(--landing-border-color);color:var(--landing-text-secondary);font-size:.875rem;font-weight:600;padding:var(--landing-spacing-sm) var(--landing-spacing-md);text-align:center}.workflow-content[data-v-89440757]{padding:var(--landing-spacing-xl)}.workflow-source[data-v-89440757]{display:flex;justify-content:center}.workflow-node[data-v-89440757]{align-items:center;background:var(--landing-code-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-md);display:flex;gap:var(--landing-spacing-sm);padding:var(--landing-spacing-md) var(--landing-spacing-lg)}.source-node[data-v-89440757]{background:#6366f11a;border-color:var(--landing-accent)}.node-icon[data-v-89440757]{font-size:1.25rem}.node-text[data-v-89440757]{color:var(--landing-text-primary);font-size:.9rem}.workflow-arrow-down[data-v-89440757]{color:var(--landing-text-muted);display:flex;justify-content:center;padding:var(--landing-spacing-sm) 0}.workflow-paths[data-v-89440757]{display:grid;gap:var(--landing-spacing-md);grid-template-columns:repeat(3,1fr)}.workflow-path[data-v-89440757]{align-items:center;display:flex;flex-direction:column;gap:var(--landing-spacing-sm)}.path-condition[data-v-89440757]{background:var(--landing-code-bg);border-radius:var(--landing-radius-sm);color:var(--landing-text-muted);font-size:.75rem;padding:4px 8px}.action-node[data-v-89440757]{flex-direction:column;text-align:center;width:100%}.path-1 .action-node[data-v-89440757]{background:#22c55e1a;border-color:#22c55e}.path-2 .action-node[data-v-89440757]{background:#f59e0b1a;border-color:#f59e0b}.path-3 .action-node[data-v-89440757]{background:#8b5cf61a;border-color:#8b5cf6}@media(max-width:768px){.landing-autonomy-grid[data-v-89440757],.workflow-paths[data-v-89440757]{grid-template-columns:1fr}}</style><style>.landing-commands-table-wrapper[data-v-dc1385aa]{margin:0 auto;max-width:800px;overflow-x:auto}.landing-commands-table[data-v-dc1385aa]{border-collapse:collapse;width:100%}.landing-commands-table td[data-v-dc1385aa],.landing-commands-table th[data-v-dc1385aa]{border:1px solid var(--landing-border-color);padding:var(--landing-spacing-md) var(--landing-spacing-lg);text-align:left}.landing-commands-table th[data-v-dc1385aa]{background:#6366f11a;color:var(--landing-text-primary);font-weight:600}.landing-commands-table td[data-v-dc1385aa]{background:var(--landing-card-bg);color:var(--landing-text-secondary)}.landing-commands-table code[data-v-dc1385aa]{background:var(--landing-code-bg);border-radius:var(--landing-radius-sm);color:var(--landing-accent);font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.875rem;padding:4px 8px}.landing-commands-table tr:hover td[data-v-dc1385aa]{background:#6366f10d}</style><style>.landing-architecture-flow[data-v-ab99f707]{align-items:center;display:flex;flex-wrap:wrap;gap:var(--landing-spacing-md);justify-content:center;margin-bottom:var(--landing-spacing-2xl)}.flow-step[data-v-ab99f707]{align-items:center;background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);display:flex;flex-direction:column;gap:var(--landing-spacing-sm);padding:var(--landing-spacing-lg) var(--landing-spacing-xl);transition:all var(--landing-transition)}.flow-step.highlight[data-v-ab99f707]{background:linear-gradient(135deg,#6366f133,#a855f733);border-color:var(--landing-accent)}.flow-step.success[data-v-ab99f707]{background:#22c55e1a;border-color:#22c55e}.flow-icon[data-v-ab99f707]{font-size:2rem}.flow-step span[data-v-ab99f707]{color:var(--landing-text-primary);font-weight:600}.flow-arrow[data-v-ab99f707]{color:var(--landing-text-muted);font-size:1.5rem}.landing-architecture-details[data-v-ab99f707]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(3,1fr)}.architecture-detail-card[data-v-ab99f707]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);text-align:center}.detail-icon[data-v-ab99f707]{font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.architecture-detail-card h3[data-v-ab99f707]{color:var(--landing-text-primary);font-size:1.125rem;margin-bottom:var(--landing-spacing-sm)}.architecture-detail-card p[data-v-ab99f707]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6}@media(max-width:768px){.landing-architecture-flow[data-v-ab99f707]{flex-direction:column}.flow-arrow[data-v-ab99f707]{transform:rotate(90deg)}.landing-architecture-details[data-v-ab99f707]{grid-template-columns:1fr}}</style><style>.landing-roadmap-grid[data-v-c498be6d]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(2,1fr);margin-bottom:var(--landing-spacing-xl);margin-left:auto;margin-right:auto;max-width:800px}.landing-roadmap-card[data-v-c498be6d]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);position:relative;text-align:center}.roadmap-icon[data-v-c498be6d]{font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.landing-roadmap-card h3[data-v-c498be6d]{color:var(--landing-text-primary);font-size:1.25rem;margin-bottom:var(--landing-spacing-sm)}.landing-roadmap-card p[data-v-c498be6d]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6;margin-bottom:var(--landing-spacing-md)}.roadmap-status[data-v-c498be6d]{background:#eab30833;border-radius:var(--landing-radius-sm);color:#eab308;font-size:.75rem;font-weight:600;padding:4px 12px;text-transform:uppercase}.landing-roadmap-cta[data-v-c498be6d]{text-align:center}@media(max-width:768px){.landing-roadmap-grid[data-v-c498be6d]{grid-template-columns:1fr}}</style><style>.landing-footer[data-v-63ea1028]{border-top:1px solid var(--landing-border);padding:3rem 2rem;position:relative;z-index:1}.landing-footer-content[data-v-63ea1028]{gap:1.5rem;margin:0 auto;max-width:800px;text-align:center}.landing-footer-brand[data-v-63ea1028],.landing-footer-content[data-v-63ea1028]{align-items:center;display:flex;flex-direction:column}.landing-footer-brand[data-v-63ea1028]{gap:.5rem}.landing-footer-logo[data-v-63ea1028]{background:var(--landing-gradient-1);-webkit-background-clip:text;font-size:1.75rem;font-weight:700;-webkit-text-fill-color:transparent;background-clip:text}.landing-footer-tagline[data-v-63ea1028]{color:var(--landing-text-muted);font-size:.875rem}.landing-footer-nav[data-v-63ea1028]{display:flex;flex-wrap:wrap;gap:1.5rem;justify-content:center}.landing-footer-nav a[data-v-63ea1028]{align-items:center;color:var(--landing-text-secondary);display:inline-flex;font-size:.9rem;gap:.5rem;text-decoration:none;transition:color .2s}.landing-footer-nav a[data-v-63ea1028]:hover{color:var(--landing-accent-light)}.landing-footer-nav svg[data-v-63ea1028]{opacity:.7}.landing-footer-nav a:hover svg[data-v-63ea1028]{opacity:1}.landing-footer-dashboard[data-v-63ea1028]{background:var(--landing-accent);border-radius:6px;color:#fff!important;font-weight:500;padding:.5rem 1rem}.landing-footer-dashboard[data-v-63ea1028]:hover{background:var(--landing-accent-light)}.landing-footer-bottom[data-v-63ea1028]{border-top:1px solid var(--landing-border);padding-top:1rem;width:100%}.landing-footer-copy[data-v-63ea1028]{color:var(--landing-text-muted);font-size:.8rem;margin:0}@media(max-width:768px){.landing-footer[data-v-63ea1028]{padding:2rem 1rem}.landing-footer-nav[data-v-63ea1028]{gap:1rem}}</style><link rel="stylesheet" href="/_nuxt/entry.CzscD3wg.css" crossorigin><link rel="stylesheet" href="/_nuxt/index.CDND7dpO.css" crossorigin><link rel="stylesheet" href="/_nuxt/LangSwitcher.DDTh1sNN.css" crossorigin><link rel="preload" as="fetch" crossorigin="anonymous" href="/_payload.json?fda5642b-b71a-476c-9e0f-eb15a462e2fe"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BfvaD8zq.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/aL-hwrDv.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CeVGNobe.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/BhrZFGnk.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DrnWNKxr.js"><link rel="preload" as="fetch" fetchpriority="low" crossorigin="anonymous" href="/_nuxt/builds/meta/fda5642b-b71a-476c-9e0f-eb15a462e2fe.json"><script type="module" src="/_nuxt/BfvaD8zq.js" crossorigin></script><meta name="description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><link rel="icon" type="image/x-icon" href="/favicon.ico"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://autocode.dev/"><meta name="keywords" content="AutoCode, Claude Code, validation code IA, revue de code automatique, tests automatises, audit securite, Nuxt, TypeScript"><meta property="og:type" content="website"><meta property="og:url" content="https://autocode.dev/"><meta property="og:title" content="AutoCode - Wrapper Claude Code"><meta property="og:description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><meta property="og:site_name" content="AutoCode"><meta property="og:image" content="https://autocode.dev/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="AutoCode - Wrapper Claude Code"><meta name="twitter:description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><meta name="twitter:image" content="https://autocode.dev/og-image.svg"></head><body><div id="__nuxt"><div class="landing-layout" data-v-7140fa30><div class="bg-grid" data-v-7140fa30></div><div class="bg-glow bg-glow-1" data-v-7140fa30></div><div class="bg-glow bg-glow-2" data-v-7140fa30></div><!--[--><div class="landing-page"><canvas class="landing-matrix-bg" aria-hidden="true" data-v-b5216f08></canvas><nav class="landing-nav"><div class="landing-nav-container"><a aria-current="page" href="/" class="router-link-active router-link-exact-active landing-logo"><span>⚡</span> AutoCode <span class="landing-beta-badge">BETA</span></a><ul class="landing-nav-links"><li><a href="#features">Fonctionnalites</a></li><li><a href="#workflow">Workflow</a></li><li><a href="#installation">Installation</a></li><li><a href="#faq">FAQ</a></li><li><a href="#api">API</a></li></ul><div class="landing-nav-right"><div class="lang-switcher" data-v-2d84a2aa><!--[--><button class="lang-btn" title="English" data-v-2d84a2aa>EN</button><button class="active lang-btn" title="Français" data-v-2d84a2aa>FR</button><!--]--></div><a href="/kanban" class="landing-nav-cta">Dashboard</a></div></div></nav><section class="landing-hero"><div class="landing-hero-content"><div class="landing-hero-badge"><span>Wrapper</span><span>Claude Code → Pipeline de fiabilite automatique</span></div><h1>Claude Code genere.<br><span class="gradient">AutoCode valide.</span></h1><p>Liberez votre temps : AutoCode fait passer automatiquement votre code genere par Claude Code a travers un pipeline de validation personnalisable — revues, bonnes pratiques, securite, tests — pour livrer du code fiable.</p><div class="landing-hero-buttons"><a href="#installation" class="landing-btn landing-btn-primary">Commencer maintenant <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path></svg></a><a href="https://gitlab.com/evkoh/autocode" class="landing-btn landing-btn-secondary" target="_blank"><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24"><path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z"></path></svg> GitLab </a><a href="https://www.npmjs.com/package/@autocode-cli/autocode" class="landing-btn landing-btn-secondary" target="_blank"><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24"><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331zM10.665 10H12v2.667h-1.335V10z"></path></svg> npm </a></div><div class="landing-terminal"><div class="landing-terminal-header"><span class="landing-terminal-dot red"></span><span class="landing-terminal-dot yellow"></span><span class="landing-terminal-dot green"></span></div><div class="landing-terminal-body"><div class="landing-terminal-line"><span class="landing-terminal-prompt">$</span><span class="landing-terminal-command">npm install -g @autocode-cli/autocode</span></div><div class="landing-terminal-output"><span style="color:#22c55e;">+ @autocode-cli/autocode installed</span></div><div class="landing-terminal-line"><span class="landing-terminal-prompt">$</span><span class="landing-terminal-command">autocode serve</span></div><div class="landing-terminal-output"> Dashboard available at <span class="landing-terminal-accent">http://localhost:3000</span></div></div></div></div></section><section id="demo" class="landing-section landing-demo" data-v-5e25f58c><div class="landing-demo-content" data-v-5e25f58c><h2 data-v-5e25f58c>Voyez-le en action</h2><p data-v-5e25f58c>Explorez le dashboard Kanban interactif avec glisser-deposer, mises a jour temps reel et visualisation complete du pipeline.</p><a href="https://gitlab.com/evkoh/autocode" target="_blank" class="landing-btn landing-btn-primary landing-btn-large" data-v-5e25f58c>Voir sur GitLab <svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-5e25f58c><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3" data-v-5e25f58c></path></svg></a></div></section><section id="podcast" class="landing-section" data-v-5dee128b><div class="landing-section-header" data-v-5dee128b><h2 data-v-5dee128b>Podcast</h2><p data-v-5dee128b>Decouvrez AutoCode en ecoutant notre presentation audio.</p></div><div class="landing-podcast-player" data-v-5dee128b><audio src="./media/podcast/fr.m4a" preload="metadata" data-v-5dee128b></audio><div class="podcast-info" data-v-5dee128b><div class="podcast-artwork" data-v-5dee128b><svg width="48" height="48" viewBox="0 0 24 24" fill="currentColor" data-v-5dee128b><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" data-v-5dee128b></path></svg></div><div class="podcast-meta" data-v-5dee128b><h3 data-v-5dee128b>Presentation AutoCode</h3><span class="podcast-lang-badge" data-v-5dee128b>FR</span></div></div><div class="podcast-controls" data-v-5dee128b><button class="podcast-play-btn" disabled data-v-5dee128b><svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24" data-v-5dee128b><path d="M8 5v14l11-7z" data-v-5dee128b></path></svg></button><div class="podcast-progress-container" data-v-5dee128b><div class="podcast-progress-bar" data-v-5dee128b><div class="podcast-progress-fill" style="width:0%;" data-v-5dee128b></div></div><div class="podcast-time" data-v-5dee128b><span data-v-5dee128b>0:00</span><span data-v-5dee128b>0:00</span></div></div><div class="podcast-speed" data-v-5dee128b><!--[--><button class="" data-v-5dee128b>0.5x </button><button class="active" data-v-5dee128b>1x </button><button class="" data-v-5dee128b>1.5x </button><button class="" data-v-5dee128b>2x </button><!--]--></div><div class="podcast-volume" data-v-5dee128b><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24" data-v-5dee128b><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z" data-v-5dee128b></path></svg><input type="range" min="0" max="1" step="0.1" value="1" data-v-5dee128b></div></div></div></section><section id="features" class="landing-section"><div class="landing-section-header"><h2>Pourquoi AutoCode ?</h2><p>Claude Code code vite, mais le code genere par IA a besoin de validation. AutoCode automatise cette validation pour vous.</p></div><div class="landing-features-grid"><!--[--><div class="landing-feature-card"><div class="landing-feature-icon">🎯</div><h3>Wrapper Claude Code</h3><p>AutoCode orchestre Claude Code pour traiter vos issues. Chaque colonne du pipeline execute des instructions specifiques via Claude.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🛡️</div><h3>Pipeline de fiabilite</h3><p>Colonnes de validation personnalisables : bonnes pratiques, detection de duplication, coherence du code, revue securite, tests Playwright/Cypress.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">⏱️</div><h3>Liberez votre temps</h3><p>Plus de revues manuelles fastidieuses. AutoCode fait passer chaque developpement dans le pipeline automatiquement pendant que vous travaillez.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🗄️</div><h3>SQLite local</h3><p>Base de donnees mono-fichier avec Prisma ORM. Zero config, portable, requetes rapides. Copiez le dossier = copiez la base.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">📊</div><h3>Dashboard Kanban</h3><p>Suivez vos issues traverser le pipeline. Interface web temps reel, glisser-deposer, suivi de progression.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🔧</div><h3>Personnalisable</h3><p>Ajoutez vos propres colonnes et instructions. Adaptez le pipeline a vos besoins : plus de revues, tests specifiques, validations custom.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">💰</div><h3>Suivi des couts</h3><p>Suivez vos couts API Claude en temps reel. Voyez les depenses par session et totales, economies de cache incluses.</p></div><div class="highlight landing-feature-card"><div class="landing-feature-icon">🪄</div><h3>Generateur de pipeline IA</h3><p>Un clic analyse votre projet et propose le pipeline parfait. Claude detecte votre stack et suggere les colonnes pertinentes.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🌐</div><h3>Partage public</h3><p>Partagez votre dashboard avec --expose. Cree un tunnel Cloudflare securise avec une URL HTTPS publique.</p></div><!--]--></div></section><section id="pipeline" class="landing-section" data-v-b084b36d><div class="landing-section-header" data-v-b084b36d><h2 data-v-b084b36d>Le pipeline de fiabilisation</h2><p data-v-b084b36d>Chaque issue passe par une validation automatisee avant d&#39;atteindre la production.</p></div><div class="landing-pipeline-flow" data-v-b084b36d><!--[--><!--[--><div class="pipeline-phase pipeline-phase-blue" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>📝</div><h3 data-v-b084b36d>Creer et implementer</h3><p data-v-b084b36d>Backlog → Ready → In Progress</p><!----></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-purple" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🔍</div><h3 data-v-b084b36d>4 revues automatiques</h3><p data-v-b084b36d>Analyse de code par IA</p><div class="phase-items" data-v-b084b36d><!--[--><span class="phase-item" data-v-b084b36d>Bonnes pratiques</span><span class="phase-item" data-v-b084b36d>Sans duplication</span><span class="phase-item" data-v-b084b36d>Coherence</span><span class="phase-item" data-v-b084b36d>Securite</span><!--]--></div></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-orange" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🧪</div><h3 data-v-b084b36d>Tests automatises</h3><p data-v-b084b36d>Boucle Echec → Correction → Retry jusqu&#39;a succes</p><!----></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-green" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🚀</div><h3 data-v-b084b36d>Deploiement</h3><p data-v-b084b36d>Git push → Done</p><!----></div><!----><!--]--><!--]--></div><div class="landing-pipeline-note" data-v-b084b36d><span class="note-icon" data-v-b084b36d>💡</span><p data-v-b084b36d>Claude peut sauter des etapes si non necessaires et reculer si les tests echouent.</p></div></section><section id="workflow" class="landing-section landing-workflow"><div class="landing-section-header"><h2>Demarrez en 4 etapes</h2><p>De l&#39;installation a votre premiere issue en moins de 5 minutes.</p></div><div class="landing-workflow-container"><div class="landing-workflow-steps"><!--[--><div class="landing-workflow-step"><div class="landing-step-number">1</div><div class="landing-step-content"><h4>Installer AutoCode</h4><p>npm install -g @autocode-cli/autocode</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">2</div><div class="landing-step-content"><h4>Initialiser votre projet</h4><p>Executez autocode init dans votre repertoire projet</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">3</div><div class="landing-step-content"><h4>Creer une issue</h4><p>autocode new &#39;Ma fonctionnalite&#39; &#39;Description&#39;</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">4</div><div class="landing-step-content"><h4>Lancer le dashboard</h4><p>autocode serve → http://localhost:3000</p></div></div><!--]--></div></div></section><section id="autonomy" class="landing-section" data-v-89440757><div class="landing-section-header" data-v-89440757><h2 data-v-89440757>Vraie autonomie IA</h2><p data-v-89440757>Claude ne fait pas qu&#39;executer — il reflechit, s&#39;adapte et cree.</p></div><div class="landing-autonomy-grid" data-v-89440757><!--[--><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>⏭️</div><h3 data-v-89440757>Saut intelligent</h3><p data-v-89440757>Claude saute intelligemment les etapes du pipeline quand elles ne s&#39;appliquent pas.</p></div><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>🔄</div><h3 data-v-89440757>Auto-correction</h3><p data-v-89440757>Quand les tests echouent, Claude recule pour corriger puis reessaie automatiquement.</p></div><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>🐣</div><h3 data-v-89440757>Creation d&#39;issues</h3><p data-v-89440757>Travail hors-scope decouvert ? Claude cree automatiquement de nouvelles issues.</p></div><!--]--></div><div class="landing-autonomy-workflow" data-v-89440757><div class="workflow-header" data-v-89440757><span data-v-89440757>Les trois chemins</span></div><div class="workflow-content" data-v-89440757><div class="workflow-source" data-v-89440757><div class="workflow-node source-node" data-v-89440757><span class="node-icon" data-v-89440757>🔍</span><span class="node-text" data-v-89440757>Quand Claude decouvre du travail supplementaire...</span></div></div><div class="workflow-arrow-down" data-v-89440757><svg width="24" height="40" viewBox="0 0 24 40" fill="none" stroke="currentColor" data-v-89440757><path stroke-width="2" d="M12 0v32m0 0l-6-6m6 6l6-6" data-v-89440757></path></svg></div><div class="workflow-paths" data-v-89440757><div class="workflow-path path-1" data-v-89440757><div class="path-condition" data-v-89440757>Hors scope ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>🐣</span><span class="node-text" data-v-89440757>Creer une issue separee, continuer le travail actuel</span></div></div><div class="workflow-path path-2" data-v-89440757><div class="path-condition" data-v-89440757>Dans le scope ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>⚡</span><span class="node-text" data-v-89440757>Traiter immediatement si dans le scope</span></div></div><div class="workflow-path path-3" data-v-89440757><div class="path-condition" data-v-89440757>Amélioration ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>📝</span><span class="node-text" data-v-89440757>Enregistrer comme amelioration pour plus tard</span></div></div></div></div></div></section><section id="installation" class="landing-section"><div class="landing-section-header"><h2>Installation</h2><p>Configuration rapide pour lancer AutoCode.</p></div><div class="landing-install-container"><div class="landing-code-block"><div class="landing-code-header"><span>Etape 1 : Installation globale</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Installation globale via npm</span><br><span class="landing-code-command">npm install -g @autocode-cli/autocode</span></code></div></div><div class="landing-code-block"><div class="landing-code-header"><span>Etape 2 : Initialisation</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Initialiser dans votre projet</span><br><span class="landing-code-command">autocode init</span></code></div></div><div class="landing-code-block"><div class="landing-code-header"><span>Etape 3 : Lancement</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Demarrer le dashboard</span><br><span class="landing-code-command">autocode serve</span></code></div></div></div></section><section id="commands" class="landing-section" data-v-dc1385aa><div class="landing-section-header" data-v-dc1385aa><h2 data-v-dc1385aa>Reference des commandes</h2><p data-v-dc1385aa>Liste complete des commandes CLI disponibles dans AutoCode.</p></div><div class="landing-commands-table-wrapper" data-v-dc1385aa><table class="landing-commands-table" data-v-dc1385aa><thead data-v-dc1385aa><tr data-v-dc1385aa><th data-v-dc1385aa>Commande</th><th data-v-dc1385aa>Description</th></tr></thead><tbody data-v-dc1385aa><!--[--><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode init</code></td><td data-v-dc1385aa>Initialiser AutoCode dans votre projet</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode serve</code></td><td data-v-dc1385aa>Lancer le dashboard web</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode serve --expose</code></td><td data-v-dc1385aa>Partager le dashboard via tunnel Cloudflare</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode new &lt;title&gt; [desc]</code></td><td data-v-dc1385aa>Creer une nouvelle issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode list</code></td><td data-v-dc1385aa>Lister toutes les issues</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode show &lt;key&gt;</code></td><td data-v-dc1385aa>Afficher les details d&#39;une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode next &lt;key&gt;</code></td><td data-v-dc1385aa>Avancer une issue vers la colonne suivante</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode move &lt;key&gt; &lt;column&gt;</code></td><td data-v-dc1385aa>Deplacer une issue vers une colonne specifique</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode start &lt;key&gt;</code></td><td data-v-dc1385aa>Demarrer une issue (depuis backlog uniquement)</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode comment &lt;key&gt; &lt;text&gt;</code></td><td data-v-dc1385aa>Ajouter un commentaire a une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode history &lt;key&gt;</code></td><td data-v-dc1385aa>Afficher l&#39;historique complet d&#39;une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode parent &lt;key&gt; [parent]</code></td><td data-v-dc1385aa>Gerer les relations parent/enfant</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode stats</code></td><td data-v-dc1385aa>Afficher les statistiques de couts Claude</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode health</code></td><td data-v-dc1385aa>Verifier la sante du workflow</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode pipeline &lt;action&gt;</code></td><td data-v-dc1385aa>Gerer les pipelines (list, show, create, delete...)</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode catalog</code></td><td data-v-dc1385aa>Gerer le catalogue de colonnes</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode help</code></td><td data-v-dc1385aa>Afficher l&#39;aide avec toutes les commandes</td></tr><!--]--></tbody></table></div></section><section id="architecture" class="landing-section" data-v-ab99f707><div class="landing-section-header" data-v-ab99f707><h2 data-v-ab99f707>Architecture</h2><p data-v-ab99f707>Comment AutoCode orchestre votre workflow de developpement.</p></div><div class="landing-architecture-flow" data-v-ab99f707><div class="flow-step" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>👤</div><span data-v-ab99f707>Vous</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step highlight" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>⚡</div><span data-v-ab99f707>AutoCode</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>🤖</div><span data-v-ab99f707>Claude Code</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step success" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>✅</div><span data-v-ab99f707>Code valide</span></div></div><div class="landing-architecture-details" data-v-ab99f707><!--[--><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>🗄️</div><h3 data-v-ab99f707>Stockage</h3><p data-v-ab99f707>SQLite local avec Prisma ORM. Zero config, portable.</p></div><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>🔌</div><h3 data-v-ab99f707>Interfaces</h3><p data-v-ab99f707>CLI + Dashboard Web + API REST</p></div><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>⚙️</div><h3 data-v-ab99f707>Stack technique</h3><p data-v-ab99f707>Nuxt 4, TypeScript, Prisma, WebSocket</p></div><!--]--></div></section><section id="api" class="landing-section"><div class="landing-section-header"><h2>API REST</h2><p>API complete pour integrations et automatisations.</p></div><div class="landing-api-grid"><!--[--><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues/:id</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues</span></div><div class="landing-api-card"><span class="patch landing-api-method">PATCH</span><span class="landing-api-endpoint">/api/issues/:id</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/move</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/next</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues/:id/comments</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/comments</span></div><div class="landing-api-card"><span class="delete landing-api-method">DELETE</span><span class="landing-api-endpoint">/api/issues/:id/archive</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/columns</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/pipelines</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/stats</span></div><!--]--></div></section><section id="roadmap" class="landing-section" data-v-c498be6d><div class="landing-section-header" data-v-c498be6d><h2 data-v-c498be6d>Et ensuite</h2><p data-v-c498be6d>Fonctionnalites a venir sur notre roadmap.</p></div><div class="landing-roadmap-grid" data-v-c498be6d><!--[--><div class="landing-roadmap-card" data-v-c498be6d><div class="roadmap-icon" data-v-c498be6d>🔗</div><h3 data-v-c498be6d>Serveur MCP</h3><p data-v-c498be6d>Utilisez AutoCode comme serveur MCP pour une integration transparente avec Claude Desktop.</p><span class="roadmap-status" data-v-c498be6d>Bientot</span></div><div class="landing-roadmap-card" data-v-c498be6d><div class="roadmap-icon" data-v-c498be6d>📚</div><h3 data-v-c498be6d>Catalogue de pipelines</h3><p data-v-c498be6d>Templates de pipelines pre-construits pour les workflows courants.</p><span class="roadmap-status" data-v-c498be6d>Bientot</span></div><!--]--></div><div class="landing-roadmap-cta" data-v-c498be6d><a href="https://gitlab.com/evkoh/autocode/-/issues" target="_blank" class="landing-btn landing-btn-secondary" data-v-c498be6d>Voir les issues et la roadmap <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-c498be6d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" data-v-c498be6d></path></svg></a></div></section><section id="faq" class="landing-section"><div class="landing-section-header"><h2>Questions frequentes</h2><p>Tout ce que vous devez savoir sur AutoCode.</p></div><div class="landing-faq-container"><!--[--><div class="landing-faq-item"><h3>Qu&#39;est-ce qu&#39;AutoCode ?</h3><p>AutoCode est un wrapper Claude Code qui valide automatiquement le code genere par IA via un pipeline personnalisable incluant revues de code, bonnes pratiques, audits securite et tests automatises.</p></div><div class="landing-faq-item"><h3>Comment installer AutoCode ?</h3><p>Installez globalement via npm : npm install -g @autocode-cli/autocode. Puis initialisez dans votre projet avec autocode init.</p></div><div class="landing-faq-item"><h3>AutoCode est-il gratuit ?</h3><p>AutoCode est source-available sous licence EvKoh Fair Company-Size Threshold License (FCTL). Gratuit pour les organisations de moins de 10 employes.</p></div><div class="landing-faq-item"><h3>Qu&#39;est-ce que le pipeline de validation ?</h3><p>Le pipeline inclut des colonnes personnalisables pour : bonnes pratiques, detection de duplication, coherence, revue securite, tests Playwright/Cypress, et plus.</p></div><div class="landing-faq-item"><h3>Comment AutoCode s&#39;integre avec Claude Code ?</h3><p>AutoCode orchestre Claude Code (claude -p) pour traiter les issues. Chaque colonne execute automatiquement des instructions Claude specifiques.</p></div><div class="landing-faq-item"><h3>Puis-je personnaliser le pipeline ?</h3><p>Oui ! Ajoutez vos propres colonnes, modifiez les instructions de validation, et adaptez le pipeline a vos besoins specifiques.</p></div><div class="landing-faq-item"><h3>AutoCode necessite-t-il une base de donnees ?</h3><p>AutoCode utilise une base SQLite locale avec Prisma ORM. Toutes les donnees sont dans un seul fichier : autocode/autocode.db.</p></div><div class="landing-faq-item"><h3>Quels frameworks de test sont supportes ?</h3><p>AutoCode a une integration native avec Playwright et Cypress pour les tests end-to-end.</p></div><!--]--></div></section><footer class="landing-footer" data-v-63ea1028><div class="landing-footer-content" data-v-63ea1028><div class="landing-footer-brand" data-v-63ea1028><span class="landing-footer-logo" data-v-63ea1028>AutoCode</span><span class="landing-footer-tagline" data-v-63ea1028>Fait avec amour pour les developpeurs</span></div><nav class="landing-footer-nav" data-v-63ea1028><a href="https://gitlab.com/evkoh/autocode" target="_blank" rel="noopener" data-v-63ea1028><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-v-63ea1028><path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z" data-v-63ea1028></path></svg> GitLab </a><a href="https://www.npmjs.com/package/@autocode-cli/autocode" target="_blank" rel="noopener" data-v-63ea1028><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-v-63ea1028><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331z" data-v-63ea1028></path></svg> npm </a><a href="#api" data-v-63ea1028>API</a><a href="/kanban" class="landing-footer-dashboard" data-v-63ea1028>Dashboard</a></nav><div class="landing-footer-bottom" data-v-63ea1028><p class="landing-footer-copy" data-v-63ea1028> © 2026 AutoCode · Source-available sous licence FCTL.</p></div></div></footer></div><!--]--></div></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{appName:"AutoCode Dashboard",wsUrl:"",wsPort:"3001",apiBase:"/api",i18n:{baseUrl:"",defaultLocale:"fr",rootRedirect:"",redirectStatusCode:302,skipSettingLocaleOnNavigate:false,locales:[{code:"en",name:"English",language:""},{code:"fr",name:"Français",language:""}],detectBrowserLanguage:{alwaysRedirect:false,cookieCrossOrigin:false,cookieDomain:"",cookieKey:"autocode-lang",cookieSecure:false,fallbackLocale:"fr",redirectOn:"root",useCookie:true},experimental:{localeDetector:"",typedPages:true,typedOptionsAndMessages:false,alternateLinkCanonicalQueries:true,devCache:false,cacheLifetime:"",stripMessagesPayload:false,preload:false,strictSeo:false,nitroContextDetection:true,httpCacheDuration:10},domainLocales:{en:{domain:""},fr:{domain:""}}}},app:{baseURL:"/",buildId:"fda5642b-b71a-476c-9e0f-eb15a462e2fe",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="true" id="__NUXT_DATA__" data-src="/_payload.json?fda5642b-b71a-476c-9e0f-eb15a462e2fe">[{"state":1,"once":10,"_errors":11,"serverRendered":6,"path":13,"prerenderedAt":14},["Reactive",2],{"$si18n:cached-locale-configs":3,"$si18n:resolved-locale":9},{"en":4,"fr":7},{"fallbacks":5,"cacheable":6},[],true,{"fallbacks":8,"cacheable":6},[],"",["Set"],["ShallowReactive",12],{},"/",1767720268372]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AutoCode - Wrapper Claude Code</title><style>.landing-layout[data-v-7140fa30]{background:var(--landing-bg-primary);color:var(--landing-text-primary);min-height:100vh;overflow-x:hidden;position:relative}.bg-grid[data-v-7140fa30]{background-image:linear-gradient(rgba(99,102,241,.03) 1px,transparent 0),linear-gradient(90deg,rgba(99,102,241,.03) 1px,transparent 0);background-size:50px 50px;height:100%;left:0;top:0;width:100%}.bg-glow[data-v-7140fa30],.bg-grid[data-v-7140fa30]{pointer-events:none;position:fixed;z-index:0}.bg-glow[data-v-7140fa30]{animation:float-7140fa30 20s ease-in-out infinite;background:radial-gradient(circle,var(--landing-accent-glow) 0,transparent 70%);border-radius:50%;height:600px;width:600px}.bg-glow-1[data-v-7140fa30]{left:-200px;top:-200px}.bg-glow-2[data-v-7140fa30]{animation-delay:-10s;bottom:-200px;right:-200px}@keyframes float-7140fa30{0%,to{transform:translate(0) scale(1)}50%{transform:translate(50px,50px) scale(1.1)}}</style><style>.landing-matrix-bg[data-v-b5216f08]{height:100%;left:0;opacity:.35;pointer-events:none;position:fixed;top:0;width:100%;z-index:0}</style><style>.lang-switcher[data-v-2d84a2aa]{display:flex;gap:var(--spacing-xs)}.lang-btn[data-v-2d84a2aa]{background:var(--bg-primary);border:1px solid var(--border-color);border-radius:var(--radius-sm);color:var(--text-secondary);cursor:pointer;font-size:var(--font-size-sm);font-weight:500;min-width:36px;padding:var(--spacing-xs) var(--spacing-sm);transition:all var(--transition-fast)}.lang-btn[data-v-2d84a2aa]:hover{color:var(--primary-color)}.lang-btn.active[data-v-2d84a2aa],.lang-btn[data-v-2d84a2aa]:hover{border-color:var(--primary-color)}.lang-btn.active[data-v-2d84a2aa]{background:var(--primary-color);color:#fff}.lang-btn[data-v-2d84a2aa]:focus{box-shadow:0 0 0 2px #3b82f64d;outline:none}</style><style>.landing-demo[data-v-5e25f58c]{background:linear-gradient(135deg,#6366f11a,#a855f71a);border-radius:var(--landing-radius-xl);margin:0 auto;max-width:900px;padding:var(--landing-spacing-xl) var(--landing-spacing-lg);text-align:center}.landing-demo-content h2[data-v-5e25f58c]{background:var(--landing-gradient-1);-webkit-background-clip:text;background-clip:text;color:transparent;font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.landing-demo-content p[data-v-5e25f58c]{color:var(--landing-text-secondary);font-size:1.25rem;margin-bottom:var(--landing-spacing-xl);margin-left:auto;margin-right:auto;max-width:600px}.landing-btn-large[data-v-5e25f58c]{font-size:1.125rem;padding:var(--landing-spacing-md) var(--landing-spacing-xl)}</style><style>.landing-podcast-player[data-v-5dee128b]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-xl);margin:0 auto;max-width:700px;padding:var(--landing-spacing-xl)}.podcast-info[data-v-5dee128b]{gap:var(--landing-spacing-md);margin-bottom:var(--landing-spacing-lg)}.podcast-artwork[data-v-5dee128b],.podcast-info[data-v-5dee128b]{align-items:center;display:flex}.podcast-artwork[data-v-5dee128b]{background:var(--landing-gradient-1);border-radius:var(--landing-radius-md);color:#fff;height:64px;justify-content:center;width:64px}.podcast-meta h3[data-v-5dee128b]{color:var(--landing-text-primary);font-size:1.125rem;margin:0 0 var(--landing-spacing-xs)}.podcast-lang-badge[data-v-5dee128b]{background:var(--landing-accent);border-radius:var(--landing-radius-sm);color:#fff;font-size:.75rem;font-weight:600;padding:2px 8px}.podcast-controls[data-v-5dee128b]{align-items:center;display:flex;gap:var(--landing-spacing-md)}.podcast-play-btn[data-v-5dee128b]{align-items:center;background:var(--landing-accent);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;flex-shrink:0;height:48px;justify-content:center;transition:all var(--landing-transition);width:48px}.podcast-play-btn[data-v-5dee128b]:hover:not(:disabled){background:var(--landing-accent-hover);transform:scale(1.05)}.podcast-play-btn[data-v-5dee128b]:disabled{cursor:not-allowed;opacity:.5}.podcast-progress-container[data-v-5dee128b]{cursor:pointer;flex:1}.podcast-progress-bar[data-v-5dee128b]{background:var(--landing-border-color);border-radius:4px;height:8px;overflow:hidden}.podcast-progress-fill[data-v-5dee128b]{background:var(--landing-gradient-1);height:100%;transition:width .1s linear}.podcast-time[data-v-5dee128b]{color:var(--landing-text-muted);display:flex;font-size:.75rem;justify-content:space-between;margin-top:var(--landing-spacing-xs)}.podcast-speed[data-v-5dee128b]{display:flex;gap:4px}.podcast-speed button[data-v-5dee128b]{background:transparent;border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-sm);color:var(--landing-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:all var(--landing-transition)}.podcast-speed button.active[data-v-5dee128b],.podcast-speed button[data-v-5dee128b]:hover{background:var(--landing-accent);border-color:var(--landing-accent);color:#fff}.podcast-volume[data-v-5dee128b]{align-items:center;display:flex;gap:var(--landing-spacing-xs)}.podcast-volume svg[data-v-5dee128b]{color:var(--landing-text-secondary)}.podcast-volume input[type=range][data-v-5dee128b]{-webkit-appearance:none;background:var(--landing-border-color);border-radius:4px;height:4px;width:80px}.podcast-volume input[type=range][data-v-5dee128b]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--landing-accent);border-radius:50%;cursor:pointer;height:14px;width:14px}@media(max-width:768px){.podcast-controls[data-v-5dee128b]{flex-wrap:wrap}.podcast-progress-container[data-v-5dee128b]{order:3;width:100%}.podcast-speed[data-v-5dee128b],.podcast-volume[data-v-5dee128b]{order:4}}</style><style>.landing-pipeline-flow[data-v-b084b36d]{align-items:stretch;display:flex;gap:var(--landing-spacing-md);justify-content:center;margin-bottom:var(--landing-spacing-xl)}.pipeline-phase[data-v-b084b36d]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);flex:1;max-width:250px;padding:var(--landing-spacing-lg);text-align:center;transition:all var(--landing-transition)}.pipeline-phase[data-v-b084b36d]:hover{transform:translateY(-4px)}.pipeline-phase-blue[data-v-b084b36d]{border-top:3px solid #3b82f6}.pipeline-phase-purple[data-v-b084b36d]{border-top:3px solid #8b5cf6}.pipeline-phase-orange[data-v-b084b36d]{border-top:3px solid #f59e0b}.pipeline-phase-green[data-v-b084b36d]{border-top:3px solid #22c55e}.phase-icon[data-v-b084b36d]{font-size:2rem;margin-bottom:var(--landing-spacing-sm)}.pipeline-phase h3[data-v-b084b36d]{color:var(--landing-text-primary);font-size:1rem;margin-bottom:var(--landing-spacing-xs)}.pipeline-phase>p[data-v-b084b36d]{color:var(--landing-text-secondary);font-size:.875rem;line-height:1.5;margin-bottom:var(--landing-spacing-sm)}.phase-items[data-v-b084b36d]{display:flex;flex-wrap:wrap;gap:4px;justify-content:center}.phase-item[data-v-b084b36d]{background:#8b5cf633;border-radius:var(--landing-radius-sm);color:#a78bfa;font-size:.7rem;padding:2px 6px}.pipeline-arrow[data-v-b084b36d]{align-items:center;color:var(--landing-text-muted);display:flex}.landing-pipeline-note[data-v-b084b36d]{align-items:center;background:#6366f11a;border-radius:var(--landing-radius-lg);display:flex;gap:var(--landing-spacing-md);justify-content:center;margin:0 auto;max-width:600px;padding:var(--landing-spacing-md) var(--landing-spacing-lg)}.note-icon[data-v-b084b36d]{font-size:1.5rem}.landing-pipeline-note p[data-v-b084b36d]{color:var(--landing-text-secondary);font-size:.9rem;margin:0}@media(max-width:900px){.landing-pipeline-flow[data-v-b084b36d]{align-items:center;flex-direction:column}.pipeline-phase[data-v-b084b36d]{max-width:100%;width:100%}.pipeline-arrow[data-v-b084b36d]{transform:rotate(90deg)}}</style><style>.landing-autonomy-grid[data-v-89440757]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(3,1fr);margin-bottom:var(--landing-spacing-2xl)}.landing-autonomy-card[data-v-89440757]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);text-align:center;transition:all var(--landing-transition)}.landing-autonomy-card[data-v-89440757]:hover{border-color:var(--landing-accent);transform:translateY(-4px)}.autonomy-icon[data-v-89440757]{font-size:3rem;margin-bottom:var(--landing-spacing-md)}.landing-autonomy-card h3[data-v-89440757]{color:var(--landing-text-primary);font-size:1.25rem;margin-bottom:var(--landing-spacing-sm)}.landing-autonomy-card p[data-v-89440757]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6}.landing-autonomy-workflow[data-v-89440757]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);margin:0 auto;max-width:800px;overflow:hidden}.workflow-header[data-v-89440757]{background:#ffffff0d;border-bottom:1px solid var(--landing-border-color);color:var(--landing-text-secondary);font-size:.875rem;font-weight:600;padding:var(--landing-spacing-sm) var(--landing-spacing-md);text-align:center}.workflow-content[data-v-89440757]{padding:var(--landing-spacing-xl)}.workflow-source[data-v-89440757]{display:flex;justify-content:center}.workflow-node[data-v-89440757]{align-items:center;background:var(--landing-code-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-md);display:flex;gap:var(--landing-spacing-sm);padding:var(--landing-spacing-md) var(--landing-spacing-lg)}.source-node[data-v-89440757]{background:#6366f11a;border-color:var(--landing-accent)}.node-icon[data-v-89440757]{font-size:1.25rem}.node-text[data-v-89440757]{color:var(--landing-text-primary);font-size:.9rem}.workflow-arrow-down[data-v-89440757]{color:var(--landing-text-muted);display:flex;justify-content:center;padding:var(--landing-spacing-sm) 0}.workflow-paths[data-v-89440757]{display:grid;gap:var(--landing-spacing-md);grid-template-columns:repeat(3,1fr)}.workflow-path[data-v-89440757]{align-items:center;display:flex;flex-direction:column;gap:var(--landing-spacing-sm)}.path-condition[data-v-89440757]{background:var(--landing-code-bg);border-radius:var(--landing-radius-sm);color:var(--landing-text-muted);font-size:.75rem;padding:4px 8px}.action-node[data-v-89440757]{flex-direction:column;text-align:center;width:100%}.path-1 .action-node[data-v-89440757]{background:#22c55e1a;border-color:#22c55e}.path-2 .action-node[data-v-89440757]{background:#f59e0b1a;border-color:#f59e0b}.path-3 .action-node[data-v-89440757]{background:#8b5cf61a;border-color:#8b5cf6}@media(max-width:768px){.landing-autonomy-grid[data-v-89440757],.workflow-paths[data-v-89440757]{grid-template-columns:1fr}}</style><style>.landing-commands-table-wrapper[data-v-dc1385aa]{margin:0 auto;max-width:800px;overflow-x:auto}.landing-commands-table[data-v-dc1385aa]{border-collapse:collapse;width:100%}.landing-commands-table td[data-v-dc1385aa],.landing-commands-table th[data-v-dc1385aa]{border:1px solid var(--landing-border-color);padding:var(--landing-spacing-md) var(--landing-spacing-lg);text-align:left}.landing-commands-table th[data-v-dc1385aa]{background:#6366f11a;color:var(--landing-text-primary);font-weight:600}.landing-commands-table td[data-v-dc1385aa]{background:var(--landing-card-bg);color:var(--landing-text-secondary)}.landing-commands-table code[data-v-dc1385aa]{background:var(--landing-code-bg);border-radius:var(--landing-radius-sm);color:var(--landing-accent);font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.875rem;padding:4px 8px}.landing-commands-table tr:hover td[data-v-dc1385aa]{background:#6366f10d}</style><style>.landing-architecture-flow[data-v-ab99f707]{align-items:center;display:flex;flex-wrap:wrap;gap:var(--landing-spacing-md);justify-content:center;margin-bottom:var(--landing-spacing-2xl)}.flow-step[data-v-ab99f707]{align-items:center;background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);display:flex;flex-direction:column;gap:var(--landing-spacing-sm);padding:var(--landing-spacing-lg) var(--landing-spacing-xl);transition:all var(--landing-transition)}.flow-step.highlight[data-v-ab99f707]{background:linear-gradient(135deg,#6366f133,#a855f733);border-color:var(--landing-accent)}.flow-step.success[data-v-ab99f707]{background:#22c55e1a;border-color:#22c55e}.flow-icon[data-v-ab99f707]{font-size:2rem}.flow-step span[data-v-ab99f707]{color:var(--landing-text-primary);font-weight:600}.flow-arrow[data-v-ab99f707]{color:var(--landing-text-muted);font-size:1.5rem}.landing-architecture-details[data-v-ab99f707]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(3,1fr)}.architecture-detail-card[data-v-ab99f707]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);text-align:center}.detail-icon[data-v-ab99f707]{font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.architecture-detail-card h3[data-v-ab99f707]{color:var(--landing-text-primary);font-size:1.125rem;margin-bottom:var(--landing-spacing-sm)}.architecture-detail-card p[data-v-ab99f707]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6}@media(max-width:768px){.landing-architecture-flow[data-v-ab99f707]{flex-direction:column}.flow-arrow[data-v-ab99f707]{transform:rotate(90deg)}.landing-architecture-details[data-v-ab99f707]{grid-template-columns:1fr}}</style><style>.landing-roadmap-grid[data-v-c498be6d]{display:grid;gap:var(--landing-spacing-lg);grid-template-columns:repeat(2,1fr);margin-bottom:var(--landing-spacing-xl);margin-left:auto;margin-right:auto;max-width:800px}.landing-roadmap-card[data-v-c498be6d]{background:var(--landing-card-bg);border:1px solid var(--landing-border-color);border-radius:var(--landing-radius-lg);padding:var(--landing-spacing-xl);position:relative;text-align:center}.roadmap-icon[data-v-c498be6d]{font-size:2.5rem;margin-bottom:var(--landing-spacing-md)}.landing-roadmap-card h3[data-v-c498be6d]{color:var(--landing-text-primary);font-size:1.25rem;margin-bottom:var(--landing-spacing-sm)}.landing-roadmap-card p[data-v-c498be6d]{color:var(--landing-text-secondary);font-size:.95rem;line-height:1.6;margin-bottom:var(--landing-spacing-md)}.roadmap-status[data-v-c498be6d]{background:#eab30833;border-radius:var(--landing-radius-sm);color:#eab308;font-size:.75rem;font-weight:600;padding:4px 12px;text-transform:uppercase}.landing-roadmap-cta[data-v-c498be6d]{text-align:center}@media(max-width:768px){.landing-roadmap-grid[data-v-c498be6d]{grid-template-columns:1fr}}</style><style>.landing-footer[data-v-63ea1028]{border-top:1px solid var(--landing-border);padding:3rem 2rem;position:relative;z-index:1}.landing-footer-content[data-v-63ea1028]{gap:1.5rem;margin:0 auto;max-width:800px;text-align:center}.landing-footer-brand[data-v-63ea1028],.landing-footer-content[data-v-63ea1028]{align-items:center;display:flex;flex-direction:column}.landing-footer-brand[data-v-63ea1028]{gap:.5rem}.landing-footer-logo[data-v-63ea1028]{background:var(--landing-gradient-1);-webkit-background-clip:text;font-size:1.75rem;font-weight:700;-webkit-text-fill-color:transparent;background-clip:text}.landing-footer-tagline[data-v-63ea1028]{color:var(--landing-text-muted);font-size:.875rem}.landing-footer-nav[data-v-63ea1028]{display:flex;flex-wrap:wrap;gap:1.5rem;justify-content:center}.landing-footer-nav a[data-v-63ea1028]{align-items:center;color:var(--landing-text-secondary);display:inline-flex;font-size:.9rem;gap:.5rem;text-decoration:none;transition:color .2s}.landing-footer-nav a[data-v-63ea1028]:hover{color:var(--landing-accent-light)}.landing-footer-nav svg[data-v-63ea1028]{opacity:.7}.landing-footer-nav a:hover svg[data-v-63ea1028]{opacity:1}.landing-footer-dashboard[data-v-63ea1028]{background:var(--landing-accent);border-radius:6px;color:#fff!important;font-weight:500;padding:.5rem 1rem}.landing-footer-dashboard[data-v-63ea1028]:hover{background:var(--landing-accent-light)}.landing-footer-bottom[data-v-63ea1028]{border-top:1px solid var(--landing-border);padding-top:1rem;width:100%}.landing-footer-copy[data-v-63ea1028]{color:var(--landing-text-muted);font-size:.8rem;margin:0}@media(max-width:768px){.landing-footer[data-v-63ea1028]{padding:2rem 1rem}.landing-footer-nav[data-v-63ea1028]{gap:1rem}}</style><link rel="stylesheet" href="/_nuxt/entry.CzscD3wg.css" crossorigin><link rel="stylesheet" href="/_nuxt/index.CDND7dpO.css" crossorigin><link rel="stylesheet" href="/_nuxt/LangSwitcher.DDTh1sNN.css" crossorigin><link rel="preload" as="fetch" crossorigin="anonymous" href="/_payload.json?234711bd-452d-42ba-9430-4d79ebc81813"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/Btwtsr_u.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/C4itadaD.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/DhNKaVRN.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/CuwYCM4v.js"><link rel="modulepreload" as="script" crossorigin href="/_nuxt/D5ZS_G-Z.js"><link rel="preload" as="fetch" fetchpriority="low" crossorigin="anonymous" href="/_nuxt/builds/meta/234711bd-452d-42ba-9430-4d79ebc81813.json"><script type="module" src="/_nuxt/Btwtsr_u.js" crossorigin></script><meta name="description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><link rel="icon" type="image/x-icon" href="/favicon.ico"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://autocode.dev/"><meta name="keywords" content="AutoCode, Claude Code, validation code IA, revue de code automatique, tests automatises, audit securite, Nuxt, TypeScript"><meta property="og:type" content="website"><meta property="og:url" content="https://autocode.dev/"><meta property="og:title" content="AutoCode - Wrapper Claude Code"><meta property="og:description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><meta property="og:site_name" content="AutoCode"><meta property="og:image" content="https://autocode.dev/og-image.svg"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="AutoCode - Wrapper Claude Code"><meta name="twitter:description" content="Validez automatiquement le code genere par IA via un pipeline personnalisable : revues, tests, securite."><meta name="twitter:image" content="https://autocode.dev/og-image.svg"></head><body><div id="__nuxt"><div class="landing-layout" data-v-7140fa30><div class="bg-grid" data-v-7140fa30></div><div class="bg-glow bg-glow-1" data-v-7140fa30></div><div class="bg-glow bg-glow-2" data-v-7140fa30></div><!--[--><div class="landing-page"><canvas class="landing-matrix-bg" aria-hidden="true" data-v-b5216f08></canvas><nav class="landing-nav"><div class="landing-nav-container"><a aria-current="page" href="/" class="router-link-active router-link-exact-active landing-logo"><span>⚡</span> AutoCode <span class="landing-beta-badge">BETA</span></a><ul class="landing-nav-links"><li><a href="#features">Fonctionnalites</a></li><li><a href="#workflow">Workflow</a></li><li><a href="#installation">Installation</a></li><li><a href="#faq">FAQ</a></li><li><a href="#api">API</a></li></ul><div class="landing-nav-right"><div class="lang-switcher" data-v-2d84a2aa><!--[--><button class="lang-btn" title="English" data-v-2d84a2aa>EN</button><button class="active lang-btn" title="Français" data-v-2d84a2aa>FR</button><!--]--></div><a href="/kanban" class="landing-nav-cta">Dashboard</a></div></div></nav><section class="landing-hero"><div class="landing-hero-content"><div class="landing-hero-badge"><span>Wrapper</span><span>Claude Code → Pipeline de fiabilite automatique</span></div><h1>Claude Code genere.<br><span class="gradient">AutoCode valide.</span></h1><p>Liberez votre temps : AutoCode fait passer automatiquement votre code genere par Claude Code a travers un pipeline de validation personnalisable — revues, bonnes pratiques, securite, tests — pour livrer du code fiable.</p><div class="landing-hero-buttons"><a href="#installation" class="landing-btn landing-btn-primary">Commencer maintenant <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"></path></svg></a><a href="https://gitlab.com/evkoh/autocode" class="landing-btn landing-btn-secondary" target="_blank"><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24"><path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z"></path></svg> GitLab </a><a href="https://www.npmjs.com/package/@autocode-cli/autocode" class="landing-btn landing-btn-secondary" target="_blank"><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24"><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331zM10.665 10H12v2.667h-1.335V10z"></path></svg> npm </a></div><div class="landing-terminal"><div class="landing-terminal-header"><span class="landing-terminal-dot red"></span><span class="landing-terminal-dot yellow"></span><span class="landing-terminal-dot green"></span></div><div class="landing-terminal-body"><div class="landing-terminal-line"><span class="landing-terminal-prompt">$</span><span class="landing-terminal-command">npm install -g @autocode-cli/autocode</span></div><div class="landing-terminal-output"><span style="color:#22c55e;">+ @autocode-cli/autocode installed</span></div><div class="landing-terminal-line"><span class="landing-terminal-prompt">$</span><span class="landing-terminal-command">autocode serve</span></div><div class="landing-terminal-output"> Dashboard available at <span class="landing-terminal-accent">http://localhost:3000</span></div></div></div></div></section><section id="demo" class="landing-section landing-demo" data-v-5e25f58c><div class="landing-demo-content" data-v-5e25f58c><h2 data-v-5e25f58c>Voyez-le en action</h2><p data-v-5e25f58c>Explorez le dashboard Kanban interactif avec glisser-deposer, mises a jour temps reel et visualisation complete du pipeline.</p><a href="https://gitlab.com/evkoh/autocode" target="_blank" class="landing-btn landing-btn-primary landing-btn-large" data-v-5e25f58c>Voir sur GitLab <svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-5e25f58c><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3" data-v-5e25f58c></path></svg></a></div></section><section id="podcast" class="landing-section" data-v-5dee128b><div class="landing-section-header" data-v-5dee128b><h2 data-v-5dee128b>Podcast</h2><p data-v-5dee128b>Decouvrez AutoCode en ecoutant notre presentation audio.</p></div><div class="landing-podcast-player" data-v-5dee128b><audio src="./media/podcast/fr.m4a" preload="metadata" data-v-5dee128b></audio><div class="podcast-info" data-v-5dee128b><div class="podcast-artwork" data-v-5dee128b><svg width="48" height="48" viewBox="0 0 24 24" fill="currentColor" data-v-5dee128b><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" data-v-5dee128b></path></svg></div><div class="podcast-meta" data-v-5dee128b><h3 data-v-5dee128b>Presentation AutoCode</h3><span class="podcast-lang-badge" data-v-5dee128b>FR</span></div></div><div class="podcast-controls" data-v-5dee128b><button class="podcast-play-btn" disabled data-v-5dee128b><svg width="24" height="24" fill="currentColor" viewBox="0 0 24 24" data-v-5dee128b><path d="M8 5v14l11-7z" data-v-5dee128b></path></svg></button><div class="podcast-progress-container" data-v-5dee128b><div class="podcast-progress-bar" data-v-5dee128b><div class="podcast-progress-fill" style="width:0%;" data-v-5dee128b></div></div><div class="podcast-time" data-v-5dee128b><span data-v-5dee128b>0:00</span><span data-v-5dee128b>0:00</span></div></div><div class="podcast-speed" data-v-5dee128b><!--[--><button class="" data-v-5dee128b>0.5x </button><button class="active" data-v-5dee128b>1x </button><button class="" data-v-5dee128b>1.5x </button><button class="" data-v-5dee128b>2x </button><!--]--></div><div class="podcast-volume" data-v-5dee128b><svg width="20" height="20" fill="currentColor" viewBox="0 0 24 24" data-v-5dee128b><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z" data-v-5dee128b></path></svg><input type="range" min="0" max="1" step="0.1" value="1" data-v-5dee128b></div></div></div></section><section id="features" class="landing-section"><div class="landing-section-header"><h2>Pourquoi AutoCode ?</h2><p>Claude Code code vite, mais le code genere par IA a besoin de validation. AutoCode automatise cette validation pour vous.</p></div><div class="landing-features-grid"><!--[--><div class="landing-feature-card"><div class="landing-feature-icon">🎯</div><h3>Wrapper Claude Code</h3><p>AutoCode orchestre Claude Code pour traiter vos issues. Chaque colonne du pipeline execute des instructions specifiques via Claude.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🛡️</div><h3>Pipeline de fiabilite</h3><p>Colonnes de validation personnalisables : bonnes pratiques, detection de duplication, coherence du code, revue securite, tests Playwright/Cypress.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">⏱️</div><h3>Liberez votre temps</h3><p>Plus de revues manuelles fastidieuses. AutoCode fait passer chaque developpement dans le pipeline automatiquement pendant que vous travaillez.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🗄️</div><h3>SQLite local</h3><p>Base de donnees mono-fichier avec Prisma ORM. Zero config, portable, requetes rapides. Copiez le dossier = copiez la base.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">📊</div><h3>Dashboard Kanban</h3><p>Suivez vos issues traverser le pipeline. Interface web temps reel, glisser-deposer, suivi de progression.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🔧</div><h3>Personnalisable</h3><p>Ajoutez vos propres colonnes et instructions. Adaptez le pipeline a vos besoins : plus de revues, tests specifiques, validations custom.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">💰</div><h3>Suivi des couts</h3><p>Suivez vos couts API Claude en temps reel. Voyez les depenses par session et totales, economies de cache incluses.</p></div><div class="highlight landing-feature-card"><div class="landing-feature-icon">🪄</div><h3>Generateur de pipeline IA</h3><p>Un clic analyse votre projet et propose le pipeline parfait. Claude detecte votre stack et suggere les colonnes pertinentes.</p></div><div class="landing-feature-card"><div class="landing-feature-icon">🌐</div><h3>Partage public</h3><p>Partagez votre dashboard avec --expose. Cree un tunnel Cloudflare securise avec une URL HTTPS publique.</p></div><!--]--></div></section><section id="pipeline" class="landing-section" data-v-b084b36d><div class="landing-section-header" data-v-b084b36d><h2 data-v-b084b36d>Le pipeline de fiabilisation</h2><p data-v-b084b36d>Chaque issue passe par une validation automatisee avant d&#39;atteindre la production.</p></div><div class="landing-pipeline-flow" data-v-b084b36d><!--[--><!--[--><div class="pipeline-phase pipeline-phase-blue" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>📝</div><h3 data-v-b084b36d>Creer et implementer</h3><p data-v-b084b36d>Backlog → Ready → In Progress</p><!----></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-purple" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🔍</div><h3 data-v-b084b36d>4 revues automatiques</h3><p data-v-b084b36d>Analyse de code par IA</p><div class="phase-items" data-v-b084b36d><!--[--><span class="phase-item" data-v-b084b36d>Bonnes pratiques</span><span class="phase-item" data-v-b084b36d>Sans duplication</span><span class="phase-item" data-v-b084b36d>Coherence</span><span class="phase-item" data-v-b084b36d>Securite</span><!--]--></div></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-orange" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🧪</div><h3 data-v-b084b36d>Tests automatises</h3><p data-v-b084b36d>Boucle Echec → Correction → Retry jusqu&#39;a succes</p><!----></div><div class="pipeline-arrow" data-v-b084b36d><svg width="24" height="24" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-b084b36d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" data-v-b084b36d></path></svg></div><!--]--><!--[--><div class="pipeline-phase pipeline-phase-green" data-v-b084b36d><div class="phase-icon" data-v-b084b36d>🚀</div><h3 data-v-b084b36d>Deploiement</h3><p data-v-b084b36d>Git push → Done</p><!----></div><!----><!--]--><!--]--></div><div class="landing-pipeline-note" data-v-b084b36d><span class="note-icon" data-v-b084b36d>💡</span><p data-v-b084b36d>Claude peut sauter des etapes si non necessaires et reculer si les tests echouent.</p></div></section><section id="workflow" class="landing-section landing-workflow"><div class="landing-section-header"><h2>Demarrez en 4 etapes</h2><p>De l&#39;installation a votre premiere issue en moins de 5 minutes.</p></div><div class="landing-workflow-container"><div class="landing-workflow-steps"><!--[--><div class="landing-workflow-step"><div class="landing-step-number">1</div><div class="landing-step-content"><h4>Installer AutoCode</h4><p>npm install -g @autocode-cli/autocode</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">2</div><div class="landing-step-content"><h4>Initialiser votre projet</h4><p>Executez autocode init dans votre repertoire projet</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">3</div><div class="landing-step-content"><h4>Creer une issue</h4><p>autocode new &#39;Ma fonctionnalite&#39; &#39;Description&#39;</p></div></div><div class="landing-workflow-step"><div class="landing-step-number">4</div><div class="landing-step-content"><h4>Lancer le dashboard</h4><p>autocode serve → http://localhost:3000</p></div></div><!--]--></div></div></section><section id="autonomy" class="landing-section" data-v-89440757><div class="landing-section-header" data-v-89440757><h2 data-v-89440757>Vraie autonomie IA</h2><p data-v-89440757>Claude ne fait pas qu&#39;executer — il reflechit, s&#39;adapte et cree.</p></div><div class="landing-autonomy-grid" data-v-89440757><!--[--><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>⏭️</div><h3 data-v-89440757>Saut intelligent</h3><p data-v-89440757>Claude saute intelligemment les etapes du pipeline quand elles ne s&#39;appliquent pas.</p></div><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>🔄</div><h3 data-v-89440757>Auto-correction</h3><p data-v-89440757>Quand les tests echouent, Claude recule pour corriger puis reessaie automatiquement.</p></div><div class="landing-autonomy-card" data-v-89440757><div class="autonomy-icon" data-v-89440757>🐣</div><h3 data-v-89440757>Creation d&#39;issues</h3><p data-v-89440757>Travail hors-scope decouvert ? Claude cree automatiquement de nouvelles issues.</p></div><!--]--></div><div class="landing-autonomy-workflow" data-v-89440757><div class="workflow-header" data-v-89440757><span data-v-89440757>Les trois chemins</span></div><div class="workflow-content" data-v-89440757><div class="workflow-source" data-v-89440757><div class="workflow-node source-node" data-v-89440757><span class="node-icon" data-v-89440757>🔍</span><span class="node-text" data-v-89440757>Quand Claude decouvre du travail supplementaire...</span></div></div><div class="workflow-arrow-down" data-v-89440757><svg width="24" height="40" viewBox="0 0 24 40" fill="none" stroke="currentColor" data-v-89440757><path stroke-width="2" d="M12 0v32m0 0l-6-6m6 6l6-6" data-v-89440757></path></svg></div><div class="workflow-paths" data-v-89440757><div class="workflow-path path-1" data-v-89440757><div class="path-condition" data-v-89440757>Hors scope ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>🐣</span><span class="node-text" data-v-89440757>Creer une issue separee, continuer le travail actuel</span></div></div><div class="workflow-path path-2" data-v-89440757><div class="path-condition" data-v-89440757>Dans le scope ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>⚡</span><span class="node-text" data-v-89440757>Traiter immediatement si dans le scope</span></div></div><div class="workflow-path path-3" data-v-89440757><div class="path-condition" data-v-89440757>Amélioration ?</div><div class="workflow-node action-node" data-v-89440757><span class="node-icon" data-v-89440757>📝</span><span class="node-text" data-v-89440757>Enregistrer comme amelioration pour plus tard</span></div></div></div></div></div></section><section id="installation" class="landing-section"><div class="landing-section-header"><h2>Installation</h2><p>Configuration rapide pour lancer AutoCode.</p></div><div class="landing-install-container"><div class="landing-code-block"><div class="landing-code-header"><span>Etape 1 : Installation globale</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Installation globale via npm</span><br><span class="landing-code-command">npm install -g @autocode-cli/autocode</span></code></div></div><div class="landing-code-block"><div class="landing-code-header"><span>Etape 2 : Initialisation</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Initialiser dans votre projet</span><br><span class="landing-code-command">autocode init</span></code></div></div><div class="landing-code-block"><div class="landing-code-header"><span>Etape 3 : Lancement</span><button class="landing-copy-btn">Copier</button></div><div class="landing-code-content"><code><span class="landing-code-comment"># Demarrer le dashboard</span><br><span class="landing-code-command">autocode serve</span></code></div></div></div></section><section id="commands" class="landing-section" data-v-dc1385aa><div class="landing-section-header" data-v-dc1385aa><h2 data-v-dc1385aa>Reference des commandes</h2><p data-v-dc1385aa>Liste complete des commandes CLI disponibles dans AutoCode.</p></div><div class="landing-commands-table-wrapper" data-v-dc1385aa><table class="landing-commands-table" data-v-dc1385aa><thead data-v-dc1385aa><tr data-v-dc1385aa><th data-v-dc1385aa>Commande</th><th data-v-dc1385aa>Description</th></tr></thead><tbody data-v-dc1385aa><!--[--><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode init</code></td><td data-v-dc1385aa>Initialiser AutoCode dans votre projet</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode serve</code></td><td data-v-dc1385aa>Lancer le dashboard web</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode serve --expose</code></td><td data-v-dc1385aa>Partager le dashboard via tunnel Cloudflare</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode new &lt;title&gt; [desc]</code></td><td data-v-dc1385aa>Creer une nouvelle issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode list</code></td><td data-v-dc1385aa>Lister toutes les issues</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode show &lt;key&gt;</code></td><td data-v-dc1385aa>Afficher les details d&#39;une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode next &lt;key&gt;</code></td><td data-v-dc1385aa>Avancer une issue vers la colonne suivante</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode move &lt;key&gt; &lt;column&gt;</code></td><td data-v-dc1385aa>Deplacer une issue vers une colonne specifique</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode start &lt;key&gt;</code></td><td data-v-dc1385aa>Demarrer une issue (depuis backlog uniquement)</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode comment &lt;key&gt; &lt;text&gt;</code></td><td data-v-dc1385aa>Ajouter un commentaire a une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode history &lt;key&gt;</code></td><td data-v-dc1385aa>Afficher l&#39;historique complet d&#39;une issue</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode parent &lt;key&gt; [parent]</code></td><td data-v-dc1385aa>Gerer les relations parent/enfant</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode stats</code></td><td data-v-dc1385aa>Afficher les statistiques de couts Claude</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode health</code></td><td data-v-dc1385aa>Verifier la sante du workflow</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode pipeline &lt;action&gt;</code></td><td data-v-dc1385aa>Gerer les pipelines (list, show, create, delete...)</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode catalog</code></td><td data-v-dc1385aa>Gerer le catalogue de colonnes</td></tr><tr data-v-dc1385aa><td data-v-dc1385aa><code data-v-dc1385aa>autocode help</code></td><td data-v-dc1385aa>Afficher l&#39;aide avec toutes les commandes</td></tr><!--]--></tbody></table></div></section><section id="architecture" class="landing-section" data-v-ab99f707><div class="landing-section-header" data-v-ab99f707><h2 data-v-ab99f707>Architecture</h2><p data-v-ab99f707>Comment AutoCode orchestre votre workflow de developpement.</p></div><div class="landing-architecture-flow" data-v-ab99f707><div class="flow-step" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>👤</div><span data-v-ab99f707>Vous</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step highlight" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>⚡</div><span data-v-ab99f707>AutoCode</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>🤖</div><span data-v-ab99f707>Claude Code</span></div><div class="flow-arrow" data-v-ab99f707>→</div><div class="flow-step success" data-v-ab99f707><div class="flow-icon" data-v-ab99f707>✅</div><span data-v-ab99f707>Code valide</span></div></div><div class="landing-architecture-details" data-v-ab99f707><!--[--><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>🗄️</div><h3 data-v-ab99f707>Stockage</h3><p data-v-ab99f707>SQLite local avec Prisma ORM. Zero config, portable.</p></div><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>🔌</div><h3 data-v-ab99f707>Interfaces</h3><p data-v-ab99f707>CLI + Dashboard Web + API REST</p></div><div class="architecture-detail-card" data-v-ab99f707><div class="detail-icon" data-v-ab99f707>⚙️</div><h3 data-v-ab99f707>Stack technique</h3><p data-v-ab99f707>Nuxt 4, TypeScript, Prisma, WebSocket</p></div><!--]--></div></section><section id="api" class="landing-section"><div class="landing-section-header"><h2>API REST</h2><p>API complete pour integrations et automatisations.</p></div><div class="landing-api-grid"><!--[--><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues/:id</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues</span></div><div class="landing-api-card"><span class="patch landing-api-method">PATCH</span><span class="landing-api-endpoint">/api/issues/:id</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/move</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/next</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/issues/:id/comments</span></div><div class="landing-api-card"><span class="post landing-api-method">POST</span><span class="landing-api-endpoint">/api/issues/:id/comments</span></div><div class="landing-api-card"><span class="delete landing-api-method">DELETE</span><span class="landing-api-endpoint">/api/issues/:id/archive</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/columns</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/pipelines</span></div><div class="landing-api-card"><span class="get landing-api-method">GET</span><span class="landing-api-endpoint">/api/stats</span></div><!--]--></div></section><section id="roadmap" class="landing-section" data-v-c498be6d><div class="landing-section-header" data-v-c498be6d><h2 data-v-c498be6d>Et ensuite</h2><p data-v-c498be6d>Fonctionnalites a venir sur notre roadmap.</p></div><div class="landing-roadmap-grid" data-v-c498be6d><!--[--><div class="landing-roadmap-card" data-v-c498be6d><div class="roadmap-icon" data-v-c498be6d>🔗</div><h3 data-v-c498be6d>Serveur MCP</h3><p data-v-c498be6d>Utilisez AutoCode comme serveur MCP pour une integration transparente avec Claude Desktop.</p><span class="roadmap-status" data-v-c498be6d>Bientot</span></div><div class="landing-roadmap-card" data-v-c498be6d><div class="roadmap-icon" data-v-c498be6d>📚</div><h3 data-v-c498be6d>Catalogue de pipelines</h3><p data-v-c498be6d>Templates de pipelines pre-construits pour les workflows courants.</p><span class="roadmap-status" data-v-c498be6d>Bientot</span></div><!--]--></div><div class="landing-roadmap-cta" data-v-c498be6d><a href="https://gitlab.com/evkoh/autocode/-/issues" target="_blank" class="landing-btn landing-btn-secondary" data-v-c498be6d>Voir les issues et la roadmap <svg width="20" height="20" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-v-c498be6d><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" data-v-c498be6d></path></svg></a></div></section><section id="faq" class="landing-section"><div class="landing-section-header"><h2>Questions frequentes</h2><p>Tout ce que vous devez savoir sur AutoCode.</p></div><div class="landing-faq-container"><!--[--><div class="landing-faq-item"><h3>Qu&#39;est-ce qu&#39;AutoCode ?</h3><p>AutoCode est un wrapper Claude Code qui valide automatiquement le code genere par IA via un pipeline personnalisable incluant revues de code, bonnes pratiques, audits securite et tests automatises.</p></div><div class="landing-faq-item"><h3>Comment installer AutoCode ?</h3><p>Installez globalement via npm : npm install -g @autocode-cli/autocode. Puis initialisez dans votre projet avec autocode init.</p></div><div class="landing-faq-item"><h3>AutoCode est-il gratuit ?</h3><p>AutoCode est source-available sous licence EvKoh Fair Company-Size Threshold License (FCTL). Gratuit pour les organisations de moins de 10 employes.</p></div><div class="landing-faq-item"><h3>Qu&#39;est-ce que le pipeline de validation ?</h3><p>Le pipeline inclut des colonnes personnalisables pour : bonnes pratiques, detection de duplication, coherence, revue securite, tests Playwright/Cypress, et plus.</p></div><div class="landing-faq-item"><h3>Comment AutoCode s&#39;integre avec Claude Code ?</h3><p>AutoCode orchestre Claude Code (claude -p) pour traiter les issues. Chaque colonne execute automatiquement des instructions Claude specifiques.</p></div><div class="landing-faq-item"><h3>Puis-je personnaliser le pipeline ?</h3><p>Oui ! Ajoutez vos propres colonnes, modifiez les instructions de validation, et adaptez le pipeline a vos besoins specifiques.</p></div><div class="landing-faq-item"><h3>AutoCode necessite-t-il une base de donnees ?</h3><p>AutoCode utilise une base SQLite locale avec Prisma ORM. Toutes les donnees sont dans un seul fichier : autocode/autocode.db.</p></div><div class="landing-faq-item"><h3>Quels frameworks de test sont supportes ?</h3><p>AutoCode a une integration native avec Playwright et Cypress pour les tests end-to-end.</p></div><!--]--></div></section><footer class="landing-footer" data-v-63ea1028><div class="landing-footer-content" data-v-63ea1028><div class="landing-footer-brand" data-v-63ea1028><span class="landing-footer-logo" data-v-63ea1028>AutoCode</span><span class="landing-footer-tagline" data-v-63ea1028>Fait avec amour pour les developpeurs</span></div><nav class="landing-footer-nav" data-v-63ea1028><a href="https://gitlab.com/evkoh/autocode" target="_blank" rel="noopener" data-v-63ea1028><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-v-63ea1028><path d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z" data-v-63ea1028></path></svg> GitLab </a><a href="https://www.npmjs.com/package/@autocode-cli/autocode" target="_blank" rel="noopener" data-v-63ea1028><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" data-v-63ea1028><path d="M0 7.334v8h6.666v1.332H12v-1.332h12v-8H0zm6.666 6.664H5.334v-4H3.999v4H1.335V8.667h5.331v5.331zm4 0v1.336H8.001V8.667h5.334v5.332h-2.669v-.001zm12.001 0h-1.33v-4h-1.336v4h-1.335v-4h-1.33v4h-2.671V8.667h8.002v5.331z" data-v-63ea1028></path></svg> npm </a><a href="#api" data-v-63ea1028>API</a><a href="/kanban" class="landing-footer-dashboard" data-v-63ea1028>Dashboard</a></nav><div class="landing-footer-bottom" data-v-63ea1028><p class="landing-footer-copy" data-v-63ea1028> © 2026 AutoCode · Source-available sous licence FCTL.</p></div></div></footer></div><!--]--></div></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{appName:"AutoCode Dashboard",wsUrl:"",wsPort:"3001",apiBase:"/api",i18n:{baseUrl:"",defaultLocale:"fr",rootRedirect:"",redirectStatusCode:302,skipSettingLocaleOnNavigate:false,locales:[{code:"en",name:"English",language:""},{code:"fr",name:"Français",language:""}],detectBrowserLanguage:{alwaysRedirect:false,cookieCrossOrigin:false,cookieDomain:"",cookieKey:"autocode-lang",cookieSecure:false,fallbackLocale:"fr",redirectOn:"root",useCookie:true},experimental:{localeDetector:"",typedPages:true,typedOptionsAndMessages:false,alternateLinkCanonicalQueries:true,devCache:false,cacheLifetime:"",stripMessagesPayload:false,preload:false,strictSeo:false,nitroContextDetection:true,httpCacheDuration:10},domainLocales:{en:{domain:""},fr:{domain:""}}}},app:{baseURL:"/",buildId:"234711bd-452d-42ba-9430-4d79ebc81813",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="true" id="__NUXT_DATA__" data-src="/_payload.json?234711bd-452d-42ba-9430-4d79ebc81813">[{"state":1,"once":10,"_errors":11,"serverRendered":6,"path":13,"prerenderedAt":14},["Reactive",2],{"$si18n:cached-locale-configs":3,"$si18n:resolved-locale":9},{"en":4,"fr":7},{"fallbacks":5,"cacheable":6},[],true,{"fallbacks":8,"cacheable":6},[],"",["Set"],["ShallowReactive",12],{},"/",1767767300895]</script></body></html>