import { AppType } from "../../../types";
export interface ICreateProjectOptions {
    siteDomain: string;
    name: string;
    description?: string;
    detailDescription?: string;
    appType?: AppType;
    force?: boolean;
}
/**
 * 纯函数：name → base slug。**不查 fs**，所有调用同 (name, appKey) 必产同样输出。
 *
 * 撞名处理交给 pickProjectName，避免在"算名字"这一步做悲观启发式（如"含中文必加后缀"）
 * 而牺牲了 readability——大多数场景同一 cwd 下不会撞，clean slug 最舒服。
 *
 * slug 完全为空（如纯中文名 "节点表单"）走 `plugin-<appKeySuffix>` 兜底，保证非空。
 */
export declare function deriveProjectName(name: string, appKey: string): string;
/**
 * 新建场景下选一个**实际不撞名**的 dir 名：
 *   1. base slug（来自 deriveProjectName）——不撞就用，保留 readability
 *   2. base 撞 → 追加 `-<appKeySuffix>`（pluginId 末 6 位，globally unique）
 *   3. 还撞 → `-<appKeySuffix>-2` / `-3` …… 直到不撞或耗尽 999 次
 *
 * 算出来的结果必须由 caller 写入 sentinel.projectName，让后续 resume 不再算这一遍——
 * 否则 resume 时 fs 状态变了，重算会得到不同的 dir 名，导致清理对象错位。
 *
 * 解决用户场景：中文名经 slugify 信息丢失（"节点表单 AI 字段" → "ai"），导致同语境多个
 * 插件全撞 `ai/`——查 fs 命中 → 走 `ai-xxxyyy` / `ai-aaabbb` 自然区分。纯英文名只要不撞
 * 仍保留干净 slug，不被无脑加后缀污染。
 */
export declare function pickProjectName(name: string, appKey: string, cwd: string): string;
export declare function createProject(options: ICreateProjectOptions): Promise<void>;
