feat: Script Generator Phase 1+2 — backend, engine, API, frontend, template editor, parameter detector
Complete Script Generator feature including: Backend: - ScriptCategory, ScriptTemplate, ScriptGeneration models - ScriptTemplateEngine with substitution, filters, sanitization - CRUD + share API endpoints with permission checks - Integration tests for permissions and sharing - Migration 057 with AD User Management seed templates Frontend — Script Library: - Browse templates with category tabs and search - Configure pane with parameter form and script generation - Script preview with live substitution and copy/download - scriptGeneratorStore Zustand store Frontend — Template Editor: - Full CRUD form with metadata, script body (Monaco Editor), parameters - ParameterSchemaBuilder with visual builder + JSON toggle - ScriptManagePage with routing and nav link Frontend — Parameter Detector: - Client-side PowerShell parameter detection engine - Detects script-level param() blocks and variable assignments - Type inference from PS type annotations and value patterns - ParameterDetectorStepper one-by-one review UI with accept/skip Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit was merged in pull request #105.
This commit is contained in:
78
frontend/src/api/scripts.ts
Normal file
78
frontend/src/api/scripts.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import apiClient from './client'
|
||||
import type {
|
||||
ScriptCategoryResponse,
|
||||
ScriptTemplateListItem,
|
||||
ScriptTemplateDetail,
|
||||
ScriptGenerateRequest,
|
||||
ScriptGenerateResponse,
|
||||
ScriptGenerationRecord,
|
||||
ScriptTemplateCreateRequest,
|
||||
ScriptTemplateUpdateRequest,
|
||||
} from '@/types'
|
||||
|
||||
export const scriptsApi = {
|
||||
async getCategories(): Promise<ScriptCategoryResponse[]> {
|
||||
const response = await apiClient.get<ScriptCategoryResponse[]>('/scripts/categories')
|
||||
return response.data
|
||||
},
|
||||
|
||||
async getTemplates(params?: {
|
||||
category_slug?: string
|
||||
search?: string
|
||||
tags?: string // Phase 3: comma-separated tag filter
|
||||
}): Promise<ScriptTemplateListItem[]> {
|
||||
const response = await apiClient.get<ScriptTemplateListItem[]>('/scripts/templates', { params })
|
||||
return response.data
|
||||
},
|
||||
|
||||
async getTemplateDetail(id: string): Promise<ScriptTemplateDetail> {
|
||||
const response = await apiClient.get<ScriptTemplateDetail>(`/scripts/templates/${id}`)
|
||||
return response.data
|
||||
},
|
||||
|
||||
async generate(req: ScriptGenerateRequest): Promise<ScriptGenerateResponse> {
|
||||
const response = await apiClient.post<ScriptGenerateResponse>('/scripts/generate', req)
|
||||
return response.data
|
||||
},
|
||||
|
||||
// Phase 3: fetch generation history for the current user
|
||||
async getGenerations(): Promise<ScriptGenerationRecord[]> {
|
||||
const response = await apiClient.get<ScriptGenerationRecord[]>('/scripts/generations')
|
||||
return response.data
|
||||
},
|
||||
|
||||
async getManagedTemplates(params?: {
|
||||
category_slug?: string
|
||||
search?: string
|
||||
}): Promise<ScriptTemplateListItem[]> {
|
||||
const response = await apiClient.get<ScriptTemplateListItem[]>('/scripts/templates', {
|
||||
params: { ...params, managed: true },
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
async createTemplate(data: ScriptTemplateCreateRequest): Promise<ScriptTemplateDetail> {
|
||||
const response = await apiClient.post<ScriptTemplateDetail>('/scripts/templates', data)
|
||||
return response.data
|
||||
},
|
||||
|
||||
async updateTemplate(id: string, data: ScriptTemplateUpdateRequest): Promise<ScriptTemplateDetail> {
|
||||
const response = await apiClient.put<ScriptTemplateDetail>(`/scripts/templates/${id}`, data)
|
||||
return response.data
|
||||
},
|
||||
|
||||
async deleteTemplate(id: string): Promise<void> {
|
||||
await apiClient.delete(`/scripts/templates/${id}`)
|
||||
},
|
||||
|
||||
async shareTemplate(id: string, shared: boolean): Promise<ScriptTemplateDetail> {
|
||||
const response = await apiClient.patch<ScriptTemplateDetail>(
|
||||
`/scripts/templates/${id}/share`,
|
||||
null,
|
||||
{ params: { shared } },
|
||||
)
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
export default scriptsApi
|
||||
Reference in New Issue
Block a user