Initial commit: Add project files
ci / backend (push) Failing after 12s
ci / frontend (push) Failing after 19s
ci / static (push) Failing after 45s

This commit is contained in:
2026-08-02 05:15:36 +09:00
commit dcd1322d41
636 changed files with 122352 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
import { api } from '@/shared/api/client'
import { requestSchema, responseSchema, type Request } from './schema'
export async function execute(request: Request) {
const body = requestSchema.parse(request)
const response = await api.post('/__ROUTE__', body)
return responseSchema.parse(response.data)
}
+10
View File
@@ -0,0 +1,10 @@
<script setup lang="ts">
// Server state belongs to TanStack Query. Pinia is limited to session/UI preferences.
</script>
<template>
<main>
<h1>__FEATURE__</h1>
<p>Contract-first scaffold. Complete Zod request/response schemas before enabling the route.</p>
</main>
</template>
@@ -0,0 +1,5 @@
import { useMutation, useQuery } from '@tanstack/vue-query'
import { execute } from './api'
export const featureKeys = { all: ['__FEATURE__'] as const }
export function useExecute() { return useMutation({ mutationFn: execute }) }
@@ -0,0 +1,8 @@
import { describe, expect, it } from 'vitest'
import { responseSchema } from './schema'
describe('__FEATURE__ response contract', () => {
it('fails closed for an unapproved empty payload', () => {
expect(responseSchema.safeParse({}).success).toBe(false)
})
})
+6
View File
@@ -0,0 +1,6 @@
import { z } from 'zod'
export const requestSchema = z.object({ /* approved contract */ })
export const responseSchema = z.object({ /* runtime trust boundary */ })
export type Request = z.infer<typeof requestSchema>
export type Response = z.infer<typeof responseSchema>
@@ -0,0 +1,10 @@
<script setup lang="ts">
import { DetailReadPage, EvidenceVersionSet } from '@/shared/ui'
const versionSet = { datasetId: 'DECISION_REQUIRED', dataHash: 'DECISION_REQUIRED', modelVersion: 'DECISION_REQUIRED', configVersion: 'DECISION_REQUIRED', codeSha: 'DECISION_REQUIRED', contractVersion: '__CONTRACT_VERSION__' }
</script>
<template>
<DetailReadPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }">
<section class="ks-card ks-section">상세 내용</section>
<template #evidence><EvidenceVersionSet :value="versionSet" /></template>
</DetailReadPage>
</template>
@@ -0,0 +1,10 @@
<script setup lang="ts">
import { EditFormPage } from '@/shared/ui/screen-types'
import { KsButton, KsTextField } from '@/shared/ui/components'
</script>
<template>
<EditFormPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }" @submit="undefined">
<KsTextField model-value="" label="이름" />
<template #footer><KsButton label="저장" type="submit" /></template>
</EditFormPage>
</template>
@@ -0,0 +1,10 @@
<script setup lang="ts">
import { SearchListCrudPage } from '@/shared/ui/screen-types'
import { KsButton, KsDataGrid } from '@/shared/ui/components'
</script>
<template>
<SearchListCrudPage title="__TITLE__" state="LOADING" :evidence="{ version: '__CONTRACT_VERSION__' }">
<template #actions><KsButton label="등록" /></template>
<KsDataGrid :rows="[]" :columns="[]" />
</SearchListCrudPage>
</template>
@@ -0,0 +1,10 @@
<script setup lang="ts">
import { ApprovalWorkbenchPage } from '@/shared/ui/screen-types'
</script>
<template>
<ApprovalWorkbenchPage title="__TITLE__" state="READY" :evidence="{ version: '__CONTRACT_VERSION__' }">
<template #queue>검토 대기열</template>
<template #detail>증거와 상세</template>
<template #decision>승인/보류/기각</template>
</ApprovalWorkbenchPage>
</template>