env_generate
Generate .env file content from project manifest, resolving secrets from q-ring vault and warning about missing or expired credentials.
Instructions
Generate .env file content from the project manifest (.q-ring.json). Resolves each declared secret from q-ring, collapses superposition, and returns .env formatted output. Warns about missing or expired secrets.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| projectPath | No | Project root path for project-scoped secrets | |
| env | No | Environment for superposition collapse (e.g., dev, staging, prod) |
Implementation Reference
- src/mcp/server.ts:396-449 (handler)The tool "env_generate" is defined and registered in src/mcp/server.ts, including its input schema and the handler implementation which resolves secrets from the project manifest and returns .env formatted output.
server.tool( "env_generate", "Generate .env file content from the project manifest (.q-ring.json). Resolves each declared secret from q-ring, collapses superposition, and returns .env formatted output. Warns about missing or expired secrets.", { projectPath: projectPathSchema, env: envSchema, }, async (params) => { const projectPath = params.projectPath ?? process.cwd(); const config = readProjectConfig(projectPath); if (!config?.secrets || Object.keys(config.secrets).length === 0) { return text("No secrets manifest found in .q-ring.json", true); } const lines: string[] = []; const warnings: string[] = []; for (const [key, manifest] of Object.entries(config.secrets)) { const value = getSecret(key, { projectPath, env: params.env, source: "mcp", }); if (value === null) { if (manifest.required !== false) { warnings.push(`MISSING (required): ${key}`); } lines.push(`# ${key}=`); continue; } const result = getEnvelope(key, { projectPath, source: "mcp" }); if (result) { const decay = checkDecay(result.envelope); if (decay.isExpired) warnings.push(`EXPIRED: ${key}`); else if (decay.isStale) warnings.push(`STALE: ${key}`); } const escaped = value .replace(/\\/g, "\\\\") .replace(/"/g, '\\"') .replace(/\n/g, "\\n"); lines.push(`${key}="${escaped}"`); } const output = lines.join("\n"); const result = warnings.length > 0 ? `${output}\n\n# Warnings:\n${warnings.map((w) => `# ${w}`).join("\n")}` : output; return text(result); },