| |
| |
| |
| |
| |
| |
|
|
| |
| export type { SpecOutput } from '@automaker/types'; |
| export { specOutputSchema } from '@automaker/types'; |
|
|
| |
| |
| |
| |
| export function escapeXml(str: string | undefined | null): string { |
| if (str == null) { |
| return ''; |
| } |
| return str |
| .replace(/&/g, '&') |
| .replace(/</g, '<') |
| .replace(/>/g, '>') |
| .replace(/"/g, '"') |
| .replace(/'/g, '''); |
| } |
|
|
| |
| |
| |
| export function specToXml(spec: import('@automaker/types').SpecOutput): string { |
| const indent = ' '; |
|
|
| let xml = `<?xml version="1.0" encoding="UTF-8"?> |
| <project_specification> |
| ${indent}<project_name>${escapeXml(spec.project_name)}</project_name> |
| |
| ${indent}<overview> |
| ${indent}${indent}${escapeXml(spec.overview)} |
| ${indent}</overview> |
| |
| ${indent}<technology_stack> |
| ${spec.technology_stack.map((t) => `${indent}${indent}<technology>${escapeXml(t)}</technology>`).join('\n')} |
| ${indent}</technology_stack> |
| |
| ${indent}<core_capabilities> |
| ${spec.core_capabilities.map((c) => `${indent}${indent}<capability>${escapeXml(c)}</capability>`).join('\n')} |
| ${indent}</core_capabilities> |
| |
| ${indent}<implemented_features> |
| ${spec.implemented_features |
| .map( |
| (f) => `${indent}${indent}<feature> |
| ${indent}${indent}${indent}<name>${escapeXml(f.name)}</name> |
| ${indent}${indent}${indent}<description>${escapeXml(f.description)}</description>${ |
| f.file_locations && f.file_locations.length > 0 |
| ? `\n${indent}${indent}${indent}<file_locations> |
| ${f.file_locations.map((loc) => `${indent}${indent}${indent}${indent}<location>${escapeXml(loc)}</location>`).join('\n')} |
| ${indent}${indent}${indent}</file_locations>` |
| : '' |
| } |
| ${indent}${indent}</feature>` |
| ) |
| .join('\n')} |
| ${indent}</implemented_features>`; |
|
|
| |
| if (spec.additional_requirements && spec.additional_requirements.length > 0) { |
| xml += ` |
| |
| ${indent}<additional_requirements> |
| ${spec.additional_requirements.map((r) => `${indent}${indent}<requirement>${escapeXml(r)}</requirement>`).join('\n')} |
| ${indent}</additional_requirements>`; |
| } |
|
|
| if (spec.development_guidelines && spec.development_guidelines.length > 0) { |
| xml += ` |
| |
| ${indent}<development_guidelines> |
| ${spec.development_guidelines.map((g) => `${indent}${indent}<guideline>${escapeXml(g)}</guideline>`).join('\n')} |
| ${indent}</development_guidelines>`; |
| } |
|
|
| if (spec.implementation_roadmap && spec.implementation_roadmap.length > 0) { |
| xml += ` |
| |
| ${indent}<implementation_roadmap> |
| ${spec.implementation_roadmap |
| .map( |
| (r) => `${indent}${indent}<phase> |
| ${indent}${indent}${indent}<name>${escapeXml(r.phase)}</name> |
| ${indent}${indent}${indent}<status>${escapeXml(r.status)}</status> |
| ${indent}${indent}${indent}<description>${escapeXml(r.description)}</description> |
| ${indent}${indent}</phase>` |
| ) |
| .join('\n')} |
| ${indent}</implementation_roadmap>`; |
| } |
|
|
| xml += ` |
| </project_specification>`; |
|
|
| return xml; |
| } |
|
|
| |
| |
| |
| export function getStructuredSpecPromptInstruction(): string { |
| return ` |
| Analyze the project and provide a comprehensive specification with: |
| |
| 1. **project_name**: The name of the project |
| 2. **overview**: A comprehensive description of what the project does, its purpose, and key goals |
| 3. **technology_stack**: List all technologies, frameworks, libraries, and tools used |
| 4. **core_capabilities**: List the main features and capabilities the project provides |
| 5. **implemented_features**: For each implemented feature, provide: |
| - name: Feature name |
| - description: What it does |
| - file_locations: Key files where it's implemented (optional) |
| 6. **additional_requirements**: Any system requirements, dependencies, or constraints (optional) |
| 7. **development_guidelines**: Development standards and best practices (optional) |
| 8. **implementation_roadmap**: Project phases with status (completed/in_progress/pending) (optional) |
| |
| Be thorough in your analysis. The output will be automatically formatted as structured JSON. |
| `; |
| } |
| export const APP_SPEC_XML_FORMAT = ` |
| The app_spec.txt file MUST follow this exact XML format: |
| |
| <project_specification> |
| <project_name>Project Name</project_name> |
| |
| <overview> |
| A comprehensive description of what the project does, its purpose, and key goals. |
| </overview> |
| |
| <technology_stack> |
| <technology>Technology 1</technology> |
| <technology>Technology 2</technology> |
| <!-- List all technologies, frameworks, libraries, and tools used --> |
| </technology_stack> |
| |
| <core_capabilities> |
| <capability>Core capability 1</capability> |
| <capability>Core capability 2</capability> |
| <!-- List main features and capabilities the project provides --> |
| </core_capabilities> |
| |
| <implemented_features> |
| <!-- Features that have been implemented (populated by AI agent based on code analysis) --> |
| </implemented_features> |
| |
| <!-- Optional sections that may be included: --> |
| <additional_requirements> |
| <!-- Any additional requirements or constraints --> |
| </additional_requirements> |
| |
| <development_guidelines> |
| <guideline>Guideline 1</guideline> |
| <guideline>Guideline 2</guideline> |
| <!-- Development standards and practices --> |
| </development_guidelines> |
| |
| <implementation_roadmap> |
| <!-- Phases or roadmap items for implementation --> |
| </implementation_roadmap> |
| </project_specification> |
| |
| IMPORTANT: |
| - All content must be wrapped in valid XML tags |
| - Use proper XML escaping for special characters (<, >, &) |
| - Maintain proper indentation (2 spaces) |
| - All sections should be populated based on project analysis |
| - The format must be strictly followed - do not use markdown, JSON, or any other format |
| `; |
|
|
| |
| |
| |
| |
| export function getAppSpecFormatInstruction(): string { |
| return ` |
| ${APP_SPEC_XML_FORMAT} |
| |
| CRITICAL FORMATTING REQUIREMENTS: |
| - Do NOT use the Write, Edit, or Bash tools to create files - just OUTPUT the XML in your response |
| - Your ENTIRE response MUST be valid XML following the exact template structure above |
| - Do NOT use markdown formatting (no # headers, no **bold**, no - lists, etc.) |
| - Do NOT include any explanatory text, prefix, or suffix outside the XML tags |
| - Do NOT include phrases like "Based on my analysis...", "I'll create...", "Let me analyze..." before the XML |
| - Do NOT include any text before <project_specification> or after </project_specification> |
| - Your response must start IMMEDIATELY with <project_specification> with no preceding text |
| - Your response must end IMMEDIATELY with </project_specification> with no following text |
| - Use ONLY XML tags as shown in the template |
| - Properly escape XML special characters (< for <, > for >, & for &) |
| - Maintain 2-space indentation for readability |
| - The output will be saved directly to app_spec.txt and must be parseable as valid XML |
| - The response must contain exactly ONE root XML element: <project_specification> |
| - Do not include code blocks, markdown fences, or any other formatting |
| |
| VERIFICATION: Before responding, verify that: |
| 1. Your response starts with <project_specification> (no spaces, no text before it) |
| 2. Your response ends with </project_specification> (no spaces, no text after it) |
| 3. There is exactly one root XML element |
| 4. There is no explanatory text, analysis, or commentary outside the XML tags |
| |
| Your response should be ONLY the XML content, nothing else. |
| `; |
| } |
|
|