cloneproof 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/runCloneproof.ts","../src/detectors/detectProject.ts","../src/utils/fs.ts","../src/detectors/env.ts","../src/detectors/go.ts","../src/detectors/node.ts","../src/detectors/python.ts","../src/detectors/rust.ts","../src/core/commandRunner.ts","../src/utils/git.ts","../src/utils/path.ts","../src/core/scoring.ts","../src/core/tempWorkspace.ts","../src/output/human.ts","../src/output/json.ts","../src/output/markdown.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\n\nimport { detectProject } from \"../detectors/detectProject.js\";\nimport type { NodeCommandSpec } from \"../detectors/node.js\";\nimport { copyFreshWorkspace } from \"../utils/fs.js\";\nimport { cloneGitRepository } from \"../utils/git.js\";\nimport { resolveTarget } from \"../utils/path.js\";\nimport { runCommand } from \"./commandRunner.js\";\nimport type { CloneproofOptions, CloneproofReport, CloneproofStep, CloneproofWarning } from \"./report.js\";\nimport { calculateScore } from \"./scoring.js\";\nimport { createTempWorkspace } from \"./tempWorkspace.js\";\n\nconst DEFAULT_TIMEOUT_SECONDS = 600;\n\nfunction createStep(name: string, status: CloneproofStep[\"status\"], startedAt: number, details?: Partial<CloneproofStep>): CloneproofStep {\n return {\n name,\n status,\n durationMs: Date.now() - startedAt,\n ...details\n };\n}\n\nfunction dedupeWarnings(warnings: CloneproofWarning[]): CloneproofWarning[] {\n const seen = new Set<string>();\n const result: CloneproofWarning[] = [];\n\n for (const warning of warnings) {\n const key = `${warning.code}:${warning.message}`;\n if (!seen.has(key)) {\n seen.add(key);\n result.push(warning);\n }\n }\n\n return result;\n}\n\nfunction finishReport(report: CloneproofReport): CloneproofReport {\n report.finishedAt = new Date().toISOString();\n report.durationMs = Date.parse(report.finishedAt) - Date.parse(report.startedAt);\n report.warnings = dedupeWarnings(report.warnings);\n report.suggestions = [...new Set(report.suggestions)];\n\n const failedStep = report.steps.some((step) => step.status === \"failed\");\n const unsupported = report.warnings.some((warning) => warning.code === \"UNSUPPORTED_PROJECT_TYPE\");\n report.ok = !failedStep && !unsupported;\n report.score = calculateScore(report);\n\n return report;\n}\n\nasync function runLogicalStep(options: {\n cwd: string;\n stepName: string;\n commands: NodeCommandSpec[];\n timeoutSeconds: number;\n verbose?: boolean;\n}): Promise<CloneproofStep> {\n const startedAt = Date.now();\n const stdout: string[] = [];\n const stderr: string[] = [];\n const labels = options.commands.map((command) => command.label).join(\" && \");\n\n for (const command of options.commands) {\n const result = await runCommand({\n cwd: options.cwd,\n command: command.command,\n args: command.args,\n timeoutSeconds: options.timeoutSeconds,\n stepName: options.stepName,\n verbose: options.verbose\n });\n\n if (result.step.stdout) {\n stdout.push(result.step.stdout);\n }\n\n if (result.step.stderr) {\n stderr.push(result.step.stderr);\n }\n\n if (result.step.status === \"failed\") {\n return {\n ...result.step,\n durationMs: Date.now() - startedAt,\n command: labels,\n summary: result.step.summary,\n stdout: stdout.join(\"\\n\\n\") || undefined,\n stderr: stderr.join(\"\\n\\n\") || undefined\n };\n }\n }\n\n return {\n name: options.stepName,\n status: \"passed\",\n durationMs: Date.now() - startedAt,\n command: labels,\n summary: `${labels} completed successfully`,\n stdout: stdout.join(\"\\n\\n\") || undefined,\n stderr: stderr.join(\"\\n\\n\") || undefined\n };\n}\n\nasync function pythonHasPytest(cwd: string, timeoutSeconds: number, verbose?: boolean): Promise<boolean> {\n const result = await runCommand({\n cwd,\n command: \"python\",\n args: [\"-c\", \"import pytest\"],\n timeoutSeconds,\n stepName: \"detect pytest\",\n verbose\n });\n\n return result.step.status === \"passed\";\n}\n\nexport async function runCloneproof(target: string = \".\", options: CloneproofOptions = {}): Promise<CloneproofReport> {\n const timeoutSeconds = options.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS;\n const startedAt = new Date().toISOString();\n const report: CloneproofReport = {\n ok: false,\n target,\n startedAt,\n finishedAt: startedAt,\n durationMs: 0,\n score: 0,\n projectTypes: [],\n steps: [],\n warnings: [],\n suggestions: []\n };\n\n const tempWorkspace = await createTempWorkspace();\n\n try {\n const resolvedTarget = await resolveTarget(target);\n report.target = resolvedTarget.display;\n\n if (resolvedTarget.kind === \"local\") {\n const cloneStartedAt = Date.now();\n try {\n await copyFreshWorkspace(resolvedTarget.source, tempWorkspace.checkoutPath);\n report.steps.push(createStep(\"clone\", \"passed\", cloneStartedAt, {\n command: `copy ${resolvedTarget.source}`,\n summary: \"Local repository copied into a fresh temporary workspace\"\n }));\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n report.steps.push(createStep(\"clone\", \"failed\", cloneStartedAt, {\n command: `copy ${resolvedTarget.source}`,\n summary: message\n }));\n return finishReport(report);\n }\n } else {\n await mkdir(tempWorkspace.checkoutPath, { recursive: true });\n const cloneStep = await cloneGitRepository({\n url: resolvedTarget.source,\n destination: tempWorkspace.checkoutPath,\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(cloneStep);\n if (cloneStep.status === \"failed\") {\n return finishReport(report);\n }\n }\n\n const detectStartedAt = Date.now();\n const detection = await detectProject(tempWorkspace.checkoutPath);\n report.projectTypes = detection.projectTypes;\n report.packageManager = detection.node?.packageManager;\n report.docker = detection.docker.files.length > 0 ? detection.docker : undefined;\n report.warnings.push(...detection.warnings);\n report.suggestions.push(...detection.suggestions);\n report.steps.push(createStep(\"detect project\", detection.projectTypes.length > 0 ? \"passed\" : \"warned\", detectStartedAt, {\n summary: detection.projectTypes.length > 0\n ? `Detected ${detection.projectTypes.join(\", \")} project`\n : \"No supported project type was detected\"\n }));\n\n const setupStatus = detection.warnings.length > 0 ? \"warned\" : \"passed\";\n report.steps.push(createStep(\"setup checks\", setupStatus, Date.now(), {\n summary: setupStatus === \"passed\" ? \"Setup metadata checks passed\" : \"Setup metadata warnings found\"\n }));\n\n if (detection.projectTypes.length === 0) {\n return finishReport(report);\n }\n\n if (detection.node) {\n const installStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"install\",\n commands: detection.node.installCommands,\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(installStep);\n if (installStep.status === \"failed\") {\n return finishReport(report);\n }\n\n if (options.skipBuild) {\n report.steps.push(createStep(\"build\", \"skipped\", Date.now(), { summary: \"Build skipped by --skip-build\" }));\n } else if (detection.node.buildCommand) {\n const buildStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"build\",\n commands: [detection.node.buildCommand],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(buildStep);\n } else {\n report.steps.push(createStep(\"build\", \"skipped\", Date.now(), { summary: \"No build script found\" }));\n }\n\n if (options.skipTests) {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"Tests skipped by --skip-tests\" }));\n } else if (detection.node.testCommand) {\n const testStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"test\",\n commands: [detection.node.testCommand],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(testStep);\n } else {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"No test script found\" }));\n }\n }\n\n if (detection.python) {\n if (detection.python.installCommand) {\n const installStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"install\",\n commands: [detection.python.installCommand],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(installStep);\n if (installStep.status === \"failed\") {\n return finishReport(report);\n }\n } else {\n report.steps.push(createStep(\"install\", \"skipped\", Date.now(), {\n summary: \"Pipfile detected, but Pipenv installation is not run in Cloneproof v0.1.0\"\n }));\n report.warnings.push({\n code: \"PYTHON_PIPFILE_STATIC_ONLY\",\n message: \"Pipfile detected, but Pipenv installation is not run in Cloneproof v0.1.0\"\n });\n }\n\n if (options.skipTests) {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"Tests skipped by --skip-tests\" }));\n } else if (detection.python.hasTests) {\n if (!(await pythonHasPytest(tempWorkspace.checkoutPath, timeoutSeconds, options.verbose))) {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), {\n summary: \"pytest is not installed\"\n }));\n report.warnings.push({\n code: \"PYTEST_MISSING\",\n message: \"Python tests were detected, but pytest is not installed\"\n });\n report.suggestions.push(\"Install pytest or document the Python test command\");\n } else {\n const testStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"test\",\n commands: [{ command: \"python\", args: [\"-m\", \"pytest\"], label: \"python -m pytest\" }],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(testStep);\n }\n } else {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"No Python tests detected\" }));\n }\n }\n\n if (detection.go) {\n const installStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"install\",\n commands: [{ command: \"go\", args: [\"mod\", \"download\"], label: \"go mod download\" }],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(installStep);\n if (installStep.status === \"failed\") {\n return finishReport(report);\n }\n\n if (options.skipTests) {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"Tests skipped by --skip-tests\" }));\n } else {\n const testStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"test\",\n commands: [{ command: \"go\", args: [\"test\", \"./...\"], label: \"go test ./...\" }],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(testStep);\n }\n }\n\n if (detection.rust) {\n if (options.skipTests) {\n report.steps.push(createStep(\"test\", \"skipped\", Date.now(), { summary: \"Tests skipped by --skip-tests\" }));\n } else {\n const testStep = await runLogicalStep({\n cwd: tempWorkspace.checkoutPath,\n stepName: \"test\",\n commands: [{ command: \"cargo\", args: [\"test\"], label: \"cargo test\" }],\n timeoutSeconds,\n verbose: options.verbose\n });\n report.steps.push(testStep);\n }\n }\n\n return finishReport(report);\n } finally {\n await tempWorkspace.cleanup();\n }\n}\n","import { join } from \"node:path\";\n\nimport type { CloneproofWarning, DockerInfo, ProjectType } from \"../core/report.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { detectEnvWarnings, type EnvDetection } from \"./env.js\";\nimport { detectGoProject, type GoDetection } from \"./go.js\";\nimport { detectNodeProject, type NodeDetection } from \"./node.js\";\nimport { detectPythonProject, type PythonDetection } from \"./python.js\";\nimport { detectRustProject, type RustDetection } from \"./rust.js\";\n\nexport interface ProjectDetection {\n projectTypes: ProjectType[];\n node?: NodeDetection;\n python?: PythonDetection;\n go?: GoDetection;\n rust?: RustDetection;\n docker: DockerInfo;\n readmeExists: boolean;\n env: EnvDetection;\n warnings: CloneproofWarning[];\n suggestions: string[];\n}\n\nasync function detectDocker(cwd: string): Promise<DockerInfo> {\n const candidates = [\n \"docker-compose.yml\",\n \"docker-compose.yaml\",\n \"compose.yml\",\n \"compose.yaml\",\n \"Dockerfile\"\n ];\n const files: string[] = [];\n\n for (const candidate of candidates) {\n if (await pathExists(join(cwd, candidate))) {\n files.push(candidate);\n }\n }\n\n return { files };\n}\n\nasync function hasReadme(cwd: string): Promise<boolean> {\n const candidates = [\"README.md\", \"README\", \"README.txt\", \"Readme.md\"];\n for (const candidate of candidates) {\n if (await pathExists(join(cwd, candidate))) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function detectProject(cwd: string): Promise<ProjectDetection> {\n const [node, python, go, rust, docker, readmeExists] = await Promise.all([\n detectNodeProject(cwd),\n detectPythonProject(cwd),\n detectGoProject(cwd),\n detectRustProject(cwd),\n detectDocker(cwd),\n hasReadme(cwd)\n ]);\n\n const projectTypes: ProjectType[] = [];\n if (node) {\n projectTypes.push(\"node\");\n }\n if (python) {\n projectTypes.push(\"python\");\n }\n if (go) {\n projectTypes.push(\"go\");\n }\n if (rust) {\n projectTypes.push(\"rust\");\n }\n\n const env = node ? await detectEnvWarnings(cwd) : {\n usedEnvVars: [],\n documentedEnvVars: [],\n warnings: [],\n suggestions: []\n };\n\n const warnings: CloneproofWarning[] = [];\n const suggestions: string[] = [];\n\n if (!readmeExists) {\n warnings.push({\n code: \"MISSING_README\",\n message: \"README is missing\"\n });\n suggestions.push(\"Add a README with first-time setup instructions\");\n }\n\n if (projectTypes.length === 0) {\n warnings.push({\n code: \"UNSUPPORTED_PROJECT_TYPE\",\n message: \"No supported project type was detected\"\n });\n suggestions.push(\"Add package metadata or setup instructions for a supported ecosystem\");\n }\n\n if (node && !node.runtimePinned) {\n warnings.push({\n code: \"MISSING_RUNTIME_PIN\",\n message: \"Node version is not pinned\"\n });\n suggestions.push(\"Pin Node version with .nvmrc, .node-version, or package.json engines.node\");\n }\n\n if (python && !python.runtimePinned) {\n warnings.push({\n code: \"MISSING_RUNTIME_PIN\",\n message: \"Python version is not pinned\"\n });\n suggestions.push(\"Pin Python version with .python-version or pyproject.toml requires-python\");\n }\n\n if (rust && !rust.runtimePinned) {\n warnings.push({\n code: \"MISSING_RUNTIME_PIN\",\n message: \"Rust toolchain version is not pinned\"\n });\n suggestions.push(\"Pin Rust with rust-toolchain.toml\");\n }\n\n if (docker.files.length > 0) {\n warnings.push({\n code: \"DOCKER_DETECTED\",\n message: `Docker files detected: ${docker.files.join(\", \")}. Services are not started in Cloneproof v0.1.0`\n });\n suggestions.push(\"Document any required Docker services in setup instructions\");\n }\n\n warnings.push(...env.warnings);\n suggestions.push(...env.suggestions);\n\n return {\n projectTypes,\n node,\n python,\n go,\n rust,\n docker,\n readmeExists,\n env,\n warnings,\n suggestions: [...new Set(suggestions)]\n };\n}\n","import { constants } from \"node:fs\";\nimport { access, cp, mkdir, readdir, readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, relative } from \"node:path\";\n\nconst COPY_EXCLUDE_NAMES = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"coverage\",\n \".next\",\n \".nuxt\",\n \".turbo\",\n \".cache\",\n \".pytest_cache\",\n \"target\",\n \"__pycache__\"\n]);\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readTextIfExists(path: string): Promise<string | undefined> {\n if (!(await pathExists(path))) {\n return undefined;\n }\n\n return readFile(path, \"utf8\");\n}\n\nexport async function readJsonIfExists<T>(path: string): Promise<T | undefined> {\n const text = await readTextIfExists(path);\n if (!text) {\n return undefined;\n }\n\n return JSON.parse(text) as T;\n}\n\nexport async function writeTextFile(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content, \"utf8\");\n}\n\nexport async function copyFreshWorkspace(source: string, destination: string): Promise<void> {\n await mkdir(destination, { recursive: true });\n await cp(source, destination, {\n recursive: true,\n force: true,\n filter: (entry) => {\n const name = basename(entry);\n if ((name === \".env\" || name.startsWith(\".env.\")) && name !== \".env.example\") {\n return false;\n }\n\n if (COPY_EXCLUDE_NAMES.has(name)) {\n return false;\n }\n\n const rel = relative(source, entry).replace(/\\\\/g, \"/\");\n if (rel === \"\") {\n return true;\n }\n\n return !rel.startsWith(\".git/\") && !rel.includes(\"/node_modules/\");\n }\n });\n}\n\nexport async function listFilesRecursive(root: string, options?: {\n extensions?: string[];\n maxFiles?: number;\n excludeDirectories?: string[];\n}): Promise<string[]> {\n const extensions = options?.extensions;\n const maxFiles = options?.maxFiles ?? 2_000;\n const excludeDirectories = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"coverage\",\n \".next\",\n \".nuxt\",\n \".turbo\",\n \".cache\",\n \".pytest_cache\",\n \"target\",\n \"__pycache__\",\n ...(options?.excludeDirectories ?? [])\n ]);\n const files: string[] = [];\n\n async function walk(directory: string): Promise<void> {\n if (files.length >= maxFiles) {\n return;\n }\n\n const entries = await readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n if (files.length >= maxFiles) {\n return;\n }\n\n const fullPath = join(directory, entry.name);\n if (entry.isDirectory()) {\n if (!excludeDirectories.has(entry.name)) {\n await walk(fullPath);\n }\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n if (!extensions || extensions.some((extension: string) => entry.name.endsWith(extension))) {\n files.push(fullPath);\n }\n }\n }\n\n const rootStat = await stat(root);\n if (rootStat.isDirectory()) {\n await walk(root);\n }\n\n return files;\n}\n","import { basename, join } from \"node:path\";\n\nimport type { CloneproofWarning } from \"../core/report.js\";\nimport { listFilesRecursive, readTextIfExists } from \"../utils/fs.js\";\n\nconst SOURCE_EXTENSIONS = [\".js\", \".jsx\", \".ts\", \".tsx\", \".mjs\", \".cjs\"];\nconst IGNORED_ENV_NAMES = new Set([\n \"CI\",\n \"NODE_ENV\",\n \"PATH\",\n \"HOME\",\n \"PWD\",\n \"SHELL\",\n \"TEMP\",\n \"TMP\",\n \"USER\",\n \"USERNAME\"\n]);\n\nfunction isTestFile(path: string): boolean {\n const normalized = path.replace(/\\\\/g, \"/\");\n return /(^|\\/)(test|tests|__tests__)\\//.test(normalized)\n || /\\.(test|spec)\\.[cm]?[jt]sx?$/.test(normalized);\n}\n\nexport interface EnvDetection {\n usedEnvVars: string[];\n documentedEnvVars: string[];\n warnings: CloneproofWarning[];\n suggestions: string[];\n}\n\nfunction extractEnvKeysFromExample(content: string | undefined): string[] {\n if (!content) {\n return [];\n }\n\n const keys = new Set<string>();\n for (const line of content.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || !trimmed.includes(\"=\")) {\n continue;\n }\n\n const key = trimmed.split(\"=\")[0]?.trim();\n if (key && /^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.add(key);\n }\n }\n\n return [...keys].sort();\n}\n\nfunction extractEnvVarsFromSource(content: string): string[] {\n const keys = new Set<string>();\n const dotAccess = /process\\.env\\.([A-Za-z_][A-Za-z0-9_]*)/g;\n const bracketAccess = /process\\.env\\[['\"]([A-Za-z_][A-Za-z0-9_]*)['\"]\\]/g;\n\n for (const regex of [dotAccess, bracketAccess]) {\n for (const match of content.matchAll(regex)) {\n const key = match[1];\n if (key && !IGNORED_ENV_NAMES.has(key) && !key.startsWith(\"npm_\")) {\n keys.add(key);\n }\n }\n }\n\n return [...keys];\n}\n\nexport async function detectEnvWarnings(cwd: string): Promise<EnvDetection> {\n const files = await listFilesRecursive(cwd, {\n extensions: SOURCE_EXTENSIONS,\n maxFiles: 2_000\n });\n const used = new Set<string>();\n\n for (const file of files) {\n if (basename(file).endsWith(\".d.ts\") || isTestFile(file)) {\n continue;\n }\n\n const content = await readTextIfExists(file);\n if (!content) {\n continue;\n }\n\n for (const key of extractEnvVarsFromSource(content)) {\n used.add(key);\n }\n }\n\n const envExample = await readTextIfExists(join(cwd, \".env.example\"));\n const documented = new Set(extractEnvKeysFromExample(envExample));\n const missing = [...used].filter((key) => !documented.has(key)).sort();\n\n return {\n usedEnvVars: [...used].sort(),\n documentedEnvVars: [...documented].sort(),\n warnings: missing.map((key) => ({\n code: \"MISSING_ENV_EXAMPLE\",\n message: `${key} is used but missing from .env.example`\n })),\n suggestions: missing.map((key) => `Add ${key} to .env.example`)\n };\n}\n","import { join } from \"node:path\";\n\nimport { pathExists } from \"../utils/fs.js\";\n\nexport interface GoDetection {\n type: \"go\";\n runtimePinned: boolean;\n}\n\nexport async function detectGoProject(cwd: string): Promise<GoDetection | undefined> {\n const hasGoMod = await pathExists(join(cwd, \"go.mod\"));\n if (!hasGoMod) {\n return undefined;\n }\n\n return {\n type: \"go\",\n runtimePinned: true\n };\n}\n","import { join } from \"node:path\";\n\nimport type { PackageManager } from \"../core/report.js\";\nimport { pathExists, readJsonIfExists } from \"../utils/fs.js\";\n\nexport interface PackageJson {\n packageManager?: string;\n scripts?: Record<string, string>;\n engines?: {\n node?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface NodeCommandSpec {\n command: string;\n args: string[];\n label: string;\n}\n\nexport interface NodeDetection {\n type: \"node\";\n packageJson: PackageJson;\n packageManager: PackageManager;\n packageManagerSource: \"packageManager\" | \"lockfile\" | \"default\";\n hasPackageLock: boolean;\n hasPnpmLock: boolean;\n hasYarnLock: boolean;\n yarnBerry: boolean;\n scripts: Record<string, string>;\n usefulScripts: string[];\n runtimePinned: boolean;\n installCommands: NodeCommandSpec[];\n buildCommand?: NodeCommandSpec;\n testCommand?: NodeCommandSpec;\n}\n\nfunction parsePackageManagerField(value: string | undefined): PackageManager | undefined {\n if (!value) {\n return undefined;\n }\n\n const name = value.split(\"@\")[0];\n if (name === \"npm\" || name === \"pnpm\" || name === \"yarn\") {\n return name;\n }\n\n return undefined;\n}\n\nfunction isYarnBerry(packageManagerField: string | undefined, hasYarnRc: boolean): boolean {\n if (hasYarnRc) {\n return true;\n }\n\n const versionMatch = packageManagerField?.match(/^yarn@(\\d+)/);\n if (!versionMatch) {\n return false;\n }\n\n return Number.parseInt(versionMatch[1] ?? \"1\", 10) >= 2;\n}\n\nfunction scriptCommand(packageManager: PackageManager, script: string): NodeCommandSpec {\n if (packageManager === \"yarn\") {\n return {\n command: \"yarn\",\n args: [script],\n label: `yarn ${script}`\n };\n }\n\n return {\n command: packageManager,\n args: [\"run\", script],\n label: `${packageManager} run ${script}`\n };\n}\n\nexport async function detectNodeProject(cwd: string): Promise<NodeDetection | undefined> {\n const packageJsonPath = join(cwd, \"package.json\");\n const packageJson = await readJsonIfExists<PackageJson>(packageJsonPath);\n if (!packageJson) {\n return undefined;\n }\n\n const hasPnpmLock = await pathExists(join(cwd, \"pnpm-lock.yaml\"));\n const hasYarnLock = await pathExists(join(cwd, \"yarn.lock\"));\n const hasPackageLock = await pathExists(join(cwd, \"package-lock.json\"));\n const hasYarnRc = await pathExists(join(cwd, \".yarnrc.yml\"));\n\n let packageManager = parsePackageManagerField(packageJson.packageManager);\n let packageManagerSource: NodeDetection[\"packageManagerSource\"] = \"packageManager\";\n\n if (!packageManager) {\n packageManagerSource = \"lockfile\";\n if (hasPnpmLock) {\n packageManager = \"pnpm\";\n } else if (hasYarnLock) {\n packageManager = \"yarn\";\n } else if (hasPackageLock) {\n packageManager = \"npm\";\n } else {\n packageManagerSource = \"default\";\n packageManager = \"npm\";\n }\n }\n\n const yarnBerry = packageManager === \"yarn\" && isYarnBerry(packageJson.packageManager, hasYarnRc);\n const installCommands: NodeCommandSpec[] = [];\n\n if (packageManager === \"pnpm\") {\n installCommands.push({ command: \"corepack\", args: [\"enable\"], label: \"corepack enable\" });\n installCommands.push({ command: \"pnpm\", args: [\"install\", \"--frozen-lockfile\"], label: \"pnpm install --frozen-lockfile\" });\n } else if (packageManager === \"yarn\") {\n installCommands.push({ command: \"corepack\", args: [\"enable\"], label: \"corepack enable\" });\n installCommands.push({\n command: \"yarn\",\n args: yarnBerry ? [\"install\", \"--immutable\"] : [\"install\", \"--frozen-lockfile\"],\n label: yarnBerry ? \"yarn install --immutable\" : \"yarn install --frozen-lockfile\"\n });\n } else {\n installCommands.push(hasPackageLock\n ? { command: \"npm\", args: [\"ci\"], label: \"npm ci\" }\n : { command: \"npm\", args: [\"install\"], label: \"npm install\" });\n }\n\n const scripts = packageJson.scripts ?? {};\n const usefulScripts = [\"dev\", \"lint\", \"typecheck\"].filter((script) => script in scripts);\n const runtimePinned = Boolean(\n packageJson.engines?.node\n || await pathExists(join(cwd, \".nvmrc\"))\n || await pathExists(join(cwd, \".node-version\"))\n );\n\n return {\n type: \"node\",\n packageJson,\n packageManager,\n packageManagerSource,\n hasPackageLock,\n hasPnpmLock,\n hasYarnLock,\n yarnBerry,\n scripts,\n usefulScripts,\n runtimePinned,\n installCommands,\n buildCommand: \"build\" in scripts ? scriptCommand(packageManager, \"build\") : undefined,\n testCommand: \"test\" in scripts ? scriptCommand(packageManager, \"test\") : undefined\n };\n}\n","import { join } from \"node:path\";\n\nimport { pathExists, readTextIfExists } from \"../utils/fs.js\";\n\nexport interface PythonDetection {\n type: \"python\";\n hasPyproject: boolean;\n hasRequirements: boolean;\n hasPipfile: boolean;\n hasTests: boolean;\n runtimePinned: boolean;\n installCommand?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nasync function pyprojectPinsPython(cwd: string): Promise<boolean> {\n const pyproject = await readTextIfExists(join(cwd, \"pyproject.toml\"));\n return Boolean(pyproject && /requires-python\\s*=/.test(pyproject));\n}\n\nexport async function detectPythonProject(cwd: string): Promise<PythonDetection | undefined> {\n const hasPyproject = await pathExists(join(cwd, \"pyproject.toml\"));\n const hasRequirements = await pathExists(join(cwd, \"requirements.txt\"));\n const hasPipfile = await pathExists(join(cwd, \"Pipfile\"));\n\n if (!hasPyproject && !hasRequirements && !hasPipfile) {\n return undefined;\n }\n\n const hasTests = Boolean(\n await pathExists(join(cwd, \"tests\"))\n || await pathExists(join(cwd, \"pytest.ini\"))\n || await pathExists(join(cwd, \"tox.ini\"))\n || await pathExists(join(cwd, \"setup.cfg\"))\n );\n\n const runtimePinned = Boolean(\n await pathExists(join(cwd, \".python-version\"))\n || await pyprojectPinsPython(cwd)\n );\n\n const installCommand = hasRequirements\n ? { command: \"python\", args: [\"-m\", \"pip\", \"install\", \"-r\", \"requirements.txt\"], label: \"python -m pip install -r requirements.txt\" }\n : hasPyproject\n ? { command: \"python\", args: [\"-m\", \"pip\", \"install\", \".\"], label: \"python -m pip install .\" }\n : undefined;\n\n return {\n type: \"python\",\n hasPyproject,\n hasRequirements,\n hasPipfile,\n hasTests,\n runtimePinned,\n installCommand\n };\n}\n","import { join } from \"node:path\";\n\nimport { pathExists } from \"../utils/fs.js\";\n\nexport interface RustDetection {\n type: \"rust\";\n runtimePinned: boolean;\n}\n\nexport async function detectRustProject(cwd: string): Promise<RustDetection | undefined> {\n const hasCargoToml = await pathExists(join(cwd, \"Cargo.toml\"));\n if (!hasCargoToml) {\n return undefined;\n }\n\n return {\n type: \"rust\",\n runtimePinned: Boolean(\n await pathExists(join(cwd, \"rust-toolchain.toml\"))\n || await pathExists(join(cwd, \"rust-toolchain\"))\n )\n };\n}\n","import { execa, type Options } from \"execa\";\n\nimport type { CloneproofStep } from \"./report.js\";\n\nconst LOG_LIMIT = 8_000;\n\nexport interface RunCommandOptions {\n cwd: string;\n command: string;\n args?: string[];\n timeoutSeconds: number;\n stepName: string;\n verbose?: boolean;\n}\n\nexport interface CommandResult {\n step: CloneproofStep;\n exitCode: number | undefined;\n timedOut: boolean;\n}\n\nexport function redactSecrets(input: string): string {\n return input\n .replace(/\\b(gh[pousr]_[A-Za-z0-9_]{20,})\\b/g, \"[REDACTED]\")\n .replace(/\\b(sk-[A-Za-z0-9_-]{20,})\\b/g, \"[REDACTED]\")\n .replace(/\\b((?:token|secret|password|passwd|api[_-]?key|authorization)\\s*[:=]\\s*)([^\\s\"'`]+)/gi, \"$1[REDACTED]\")\n .replace(/\\b(Bearer\\s+)([A-Za-z0-9._~+/-]+=*)/gi, \"$1[REDACTED]\");\n}\n\nexport function truncateLog(input: string): string {\n if (input.length <= LOG_LIMIT) {\n return input;\n }\n\n const omitted = input.length - LOG_LIMIT;\n return `${input.slice(0, LOG_LIMIT)}\\n...[truncated ${omitted} characters]`;\n}\n\nexport function formatCommand(command: string, args: string[] = []): string {\n const quote = (part: string): string => {\n if (/^[A-Za-z0-9_./:=@+-]+$/.test(part)) {\n return part;\n }\n return JSON.stringify(part);\n };\n\n return redactSecrets([command, ...args].map(quote).join(\" \"));\n}\n\nfunction logValueToString(value: unknown): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return Buffer.from(value).toString(\"utf8\");\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => String(item)).join(\"\\n\");\n }\n\n return String(value);\n}\n\nfunction sanitizeLog(value: unknown): string | undefined {\n const text = logValueToString(value);\n if (!text) {\n return undefined;\n }\n\n return truncateLog(redactSecrets(text));\n}\n\nexport async function runCommand(options: RunCommandOptions): Promise<CommandResult> {\n const args = options.args ?? [];\n const commandText = formatCommand(options.command, args);\n const startedAt = Date.now();\n\n if (options.verbose) {\n process.stderr.write(`$ ${commandText}\\n`);\n }\n\n const execaOptions: Options = {\n cwd: options.cwd,\n reject: false,\n timeout: options.timeoutSeconds * 1000,\n env: {\n CI: \"true\"\n }\n };\n\n try {\n const result = await execa(options.command, args, execaOptions);\n const durationMs = Date.now() - startedAt;\n const failed = result.exitCode !== 0;\n const summary = failed\n ? `${commandText} failed with exit code ${result.exitCode}`\n : `${commandText} completed successfully`;\n\n if (options.verbose && result.stdout) {\n process.stderr.write(`${sanitizeLog(result.stdout) ?? \"\"}\\n`);\n }\n\n if (options.verbose && result.stderr) {\n process.stderr.write(`${sanitizeLog(result.stderr) ?? \"\"}\\n`);\n }\n\n return {\n exitCode: result.exitCode,\n timedOut: false,\n step: {\n name: options.stepName,\n status: failed ? \"failed\" : \"passed\",\n durationMs,\n command: commandText,\n summary,\n stdout: sanitizeLog(result.stdout),\n stderr: sanitizeLog(result.stderr)\n }\n };\n } catch (error: unknown) {\n const durationMs = Date.now() - startedAt;\n const maybeError = error as {\n exitCode?: number;\n timedOut?: boolean;\n stdout?: string;\n stderr?: string;\n message?: string;\n };\n const timedOut = Boolean(maybeError.timedOut);\n const summary = timedOut\n ? `${commandText} timed out after ${options.timeoutSeconds} seconds`\n : `${commandText} failed: ${maybeError.message ?? \"unknown error\"}`;\n\n return {\n exitCode: maybeError.exitCode,\n timedOut,\n step: {\n name: options.stepName,\n status: \"failed\",\n durationMs,\n command: commandText,\n summary,\n stdout: sanitizeLog(maybeError.stdout),\n stderr: sanitizeLog(maybeError.stderr ?? maybeError.message)\n }\n };\n }\n}\n","import { runCommand } from \"../core/commandRunner.js\";\nimport type { CloneproofStep } from \"../core/report.js\";\n\nexport async function cloneGitRepository(options: {\n url: string;\n destination: string;\n timeoutSeconds: number;\n verbose?: boolean;\n}): Promise<CloneproofStep> {\n const result = await runCommand({\n cwd: options.destination,\n command: \"git\",\n args: [\"clone\", \"--depth\", \"1\", options.url, \".\"],\n timeoutSeconds: options.timeoutSeconds,\n stepName: \"clone\",\n verbose: options.verbose\n });\n\n return result.step;\n}\n","import { isAbsolute, resolve } from \"node:path\";\n\nimport { pathExists } from \"./fs.js\";\n\nexport type TargetKind = \"local\" | \"remote\";\n\nexport interface ResolvedTarget {\n kind: TargetKind;\n display: string;\n source: string;\n}\n\nconst GITHUB_SHORTHAND_RE = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+$/;\n\nexport function isGitHubHttpsUrl(target: string): boolean {\n return /^https:\\/\\/github\\.com\\/[^/\\s]+\\/[^/\\s]+(?:\\.git)?\\/?$/.test(target);\n}\n\nexport async function resolveTarget(target: string): Promise<ResolvedTarget> {\n if (isGitHubHttpsUrl(target)) {\n return {\n kind: \"remote\",\n display: target,\n source: target\n };\n }\n\n const localPath = isAbsolute(target) ? target : resolve(process.cwd(), target);\n if (await pathExists(localPath)) {\n return {\n kind: \"local\",\n display: target,\n source: localPath\n };\n }\n\n if (GITHUB_SHORTHAND_RE.test(target)) {\n return {\n kind: \"remote\",\n display: target,\n source: `https://github.com/${target}.git`\n };\n }\n\n return {\n kind: \"local\",\n display: target,\n source: localPath\n };\n}\n","import type { CloneproofReport } from \"./report.js\";\n\nfunction hasFailedStep(report: CloneproofReport, name: string): boolean {\n return report.steps.some((step) => step.name === name && step.status === \"failed\");\n}\n\nfunction hasWarning(report: CloneproofReport, code: string): boolean {\n return report.warnings.some((warning) => warning.code === code);\n}\n\nexport function calculateScore(report: CloneproofReport): number {\n if (hasFailedStep(report, \"clone\")) {\n return 0;\n }\n\n let score = 100;\n\n if (hasFailedStep(report, \"install\")) {\n score = Math.min(score, 40);\n }\n\n if (hasFailedStep(report, \"build\")) {\n score = Math.min(score, 60);\n }\n\n if (hasFailedStep(report, \"test\")) {\n score = Math.min(score, 70);\n }\n\n if (hasWarning(report, \"UNSUPPORTED_PROJECT_TYPE\")) {\n score = Math.min(score, 50);\n }\n\n if (hasWarning(report, \"MISSING_README\")) {\n score -= 10;\n }\n\n const missingEnvCount = report.warnings.filter((warning) => warning.code === \"MISSING_ENV_EXAMPLE\").length;\n score -= Math.min(missingEnvCount * 10, 30);\n\n if (hasWarning(report, \"MISSING_RUNTIME_PIN\")) {\n score -= 10;\n }\n\n return Math.max(0, Math.min(100, score));\n}\n","import { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface TempWorkspace {\n root: string;\n checkoutPath: string;\n cleanup: () => Promise<void>;\n}\n\nexport async function createTempWorkspace(): Promise<TempWorkspace> {\n const root = await mkdtemp(join(tmpdir(), \"cloneproof-\"));\n const checkoutPath = join(root, \"repo\");\n\n return {\n root,\n checkoutPath,\n cleanup: async () => {\n await rm(root, { recursive: true, force: true });\n }\n };\n}\n","import pc from \"picocolors\";\n\nimport type { CloneproofReport, CloneproofStep } from \"../core/report.js\";\n\nexport interface HumanOutputOptions {\n color?: boolean;\n}\n\nfunction formatStep(step: CloneproofStep): string {\n if (step.summary && step.status === \"failed\") {\n return `${step.name}: ${step.summary}`;\n }\n\n return step.name;\n}\n\nfunction section(title: string, items: string[], formatter: (value: string, index: number) => string): string[] {\n if (items.length === 0) {\n return [];\n }\n\n return [\"\", `${title}:`, ...items.map(formatter)];\n}\n\nexport function renderHumanReport(report: CloneproofReport, options: HumanOutputOptions = {}): string {\n const colors = pc.createColors(options.color !== false);\n const passed = report.steps.filter((step) => step.status === \"passed\").map(formatStep);\n const failed = report.steps.filter((step) => step.status === \"failed\").map(formatStep);\n const skipped = report.steps.filter((step) => step.status === \"skipped\").map(formatStep);\n const warnings = report.warnings.map((warning) => warning.message);\n const lines = [\n colors.bold(\"Cloneproof report\"),\n \"\",\n `Target: ${report.target}`,\n `Fresh clone: ${report.ok ? colors.green(\"passed\") : colors.red(\"failed\")}`,\n `Score: ${report.score}/100`,\n ...section(\"Passed\", passed, (item) => `- ${colors.green(item)}`),\n ...section(\"Failed\", failed, (item) => `- ${colors.red(item)}`),\n ...section(\"Skipped\", skipped, (item) => `- ${colors.dim(item)}`),\n ...section(\"Warnings\", warnings, (item) => `- ${colors.yellow(item)}`),\n ...section(\"Suggested fixes\", report.suggestions, (item, index) => `${index + 1}. ${item}`)\n ];\n\n return lines.join(\"\\n\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type { CloneproofReport } from \"../core/report.js\";\n\nexport function renderJsonReport(report: CloneproofReport): string {\n return JSON.stringify(report, null, 2);\n}\n\nexport async function writeJsonReport(report: CloneproofReport, path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${renderJsonReport(report)}\\n`, \"utf8\");\n}\n","import type { CloneproofReport, CloneproofStep } from \"../core/report.js\";\n\nfunction escapeCell(value: string): string {\n return value.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n}\n\nfunction stepRow(step: CloneproofStep): string {\n return `| ${escapeCell(step.name)} | ${step.status} | ${step.durationMs} | ${escapeCell(step.command ?? \"\")} | ${escapeCell(step.summary ?? \"\")} |`;\n}\n\nfunction bulletSection(title: string, items: string[]): string {\n if (items.length === 0) {\n return \"\";\n }\n\n return `\\n### ${title}\\n\\n${items.map((item) => `- ${item}`).join(\"\\n\")}\\n`;\n}\n\nfunction numberedSection(title: string, items: string[]): string {\n if (items.length === 0) {\n return \"\";\n }\n\n return `\\n### ${title}\\n\\n${items.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\")}\\n`;\n}\n\nexport function renderMarkdownReport(report: CloneproofReport): string {\n const warnings = report.warnings.map((warning) => warning.message);\n return [\n \"## Cloneproof report\",\n \"\",\n `**Target:** ${report.target}`,\n `**Fresh clone:** ${report.ok ? \"passed\" : \"failed\"}`,\n `**Score:** ${report.score}/100`,\n `**Project types:** ${report.projectTypes.length > 0 ? report.projectTypes.join(\", \") : \"none\"}`,\n report.packageManager ? `**Package manager:** ${report.packageManager}` : undefined,\n \"\",\n \"### Steps\",\n \"\",\n \"| Step | Status | Duration ms | Command | Summary |\",\n \"| --- | --- | ---: | --- | --- |\",\n ...report.steps.map(stepRow),\n bulletSection(\"Warnings\", warnings),\n numberedSection(\"Suggested fixes\", report.suggestions)\n ].filter((line): line is string => typeof line === \"string\").join(\"\\n\");\n}\n"],"mappings":"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","names":["mkdir","join","basename","join","basename","join","join","join","join","join","join","join","join","join","join","join","mkdir","mkdir","writeFile","dirname"]}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "cloneproof",
3
+ "version": "0.1.0",
4
+ "description": "CI for first-time setup. Test your repo like a first-time contributor.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "NMSOfficial",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/NMSOfficial/cloneproof.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/NMSOfficial/cloneproof/issues"
14
+ },
15
+ "homepage": "https://github.com/NMSOfficial/cloneproof#readme",
16
+ "packageManager": "npm@10.8.2",
17
+ "engines": {
18
+ "node": ">=20"
19
+ },
20
+ "bin": {
21
+ "cloneproof": "./dist/cli.js"
22
+ },
23
+ "main": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "schemas",
34
+ "action.yml",
35
+ "README.md",
36
+ "CHANGELOG.md",
37
+ "LICENSE"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "dev": "tsx src/cli.ts",
42
+ "test": "vitest run",
43
+ "typecheck": "tsc --noEmit",
44
+ "start": "node dist/cli.js"
45
+ },
46
+ "keywords": [
47
+ "ci",
48
+ "developer-experience",
49
+ "onboarding",
50
+ "setup",
51
+ "github-action"
52
+ ],
53
+ "dependencies": {
54
+ "commander": "^12.1.0",
55
+ "execa": "^9.6.0",
56
+ "picocolors": "^1.1.1"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.10.2",
60
+ "tsup": "^8.3.5",
61
+ "tsx": "^4.19.2",
62
+ "typescript": "^5.7.2",
63
+ "vitest": "^4.1.5"
64
+ }
65
+ }
@@ -0,0 +1,132 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/NMSOfficial/cloneproof/schemas/cloneproof-report.schema.json",
4
+ "title": "Cloneproof Report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "ok",
9
+ "target",
10
+ "startedAt",
11
+ "finishedAt",
12
+ "durationMs",
13
+ "score",
14
+ "projectTypes",
15
+ "steps",
16
+ "warnings",
17
+ "suggestions"
18
+ ],
19
+ "properties": {
20
+ "ok": {
21
+ "type": "boolean"
22
+ },
23
+ "target": {
24
+ "type": "string"
25
+ },
26
+ "startedAt": {
27
+ "type": "string",
28
+ "format": "date-time"
29
+ },
30
+ "finishedAt": {
31
+ "type": "string",
32
+ "format": "date-time"
33
+ },
34
+ "durationMs": {
35
+ "type": "integer",
36
+ "minimum": 0
37
+ },
38
+ "score": {
39
+ "type": "integer",
40
+ "minimum": 0,
41
+ "maximum": 100
42
+ },
43
+ "projectTypes": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string",
47
+ "enum": ["node", "python", "go", "rust"]
48
+ },
49
+ "uniqueItems": true
50
+ },
51
+ "packageManager": {
52
+ "type": "string",
53
+ "enum": ["npm", "pnpm", "yarn"]
54
+ },
55
+ "steps": {
56
+ "type": "array",
57
+ "items": {
58
+ "$ref": "#/$defs/step"
59
+ }
60
+ },
61
+ "warnings": {
62
+ "type": "array",
63
+ "items": {
64
+ "$ref": "#/$defs/warning"
65
+ }
66
+ },
67
+ "suggestions": {
68
+ "type": "array",
69
+ "items": {
70
+ "type": "string"
71
+ }
72
+ },
73
+ "docker": {
74
+ "type": "object",
75
+ "additionalProperties": false,
76
+ "required": ["files"],
77
+ "properties": {
78
+ "files": {
79
+ "type": "array",
80
+ "items": {
81
+ "type": "string"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ },
87
+ "$defs": {
88
+ "step": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": ["name", "status", "durationMs"],
92
+ "properties": {
93
+ "name": {
94
+ "type": "string"
95
+ },
96
+ "status": {
97
+ "type": "string",
98
+ "enum": ["passed", "failed", "skipped", "warned"]
99
+ },
100
+ "durationMs": {
101
+ "type": "integer",
102
+ "minimum": 0
103
+ },
104
+ "command": {
105
+ "type": "string"
106
+ },
107
+ "summary": {
108
+ "type": "string"
109
+ },
110
+ "stdout": {
111
+ "type": "string"
112
+ },
113
+ "stderr": {
114
+ "type": "string"
115
+ }
116
+ }
117
+ },
118
+ "warning": {
119
+ "type": "object",
120
+ "additionalProperties": false,
121
+ "required": ["code", "message"],
122
+ "properties": {
123
+ "code": {
124
+ "type": "string"
125
+ },
126
+ "message": {
127
+ "type": "string"
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }