Enforce Genarrative play-type SOP and update docs

Rewrite Genarrative play-type integration guidance across .codex and .hermes to define a platform-level SOP: default to form/image workbench, unify single-image asset slots (CreativeImageInputPanel), standardize series-material sheet->cut->transparent->OSS pipeline, and forbid copying legacy chat/agent workflows as the default. Add decision-log entry freezing the SOP and a pitfalls note warning against direct reuse of old play tools. Update CONTEXT.md and docs/README.md, add a new PRD file, and apply related small server-side changes (module-auth, spacetime-client mappers and runtime) to align back-end code with the new contracts and flows.
This commit is contained in:
2026-05-20 12:12:00 +08:00
parent f370539a6f
commit 3931442249
123 changed files with 15514 additions and 3419 deletions

View File

@@ -1,6 +1,7 @@
export type * from './creativeAgent';
export type * from './creationAudio';
export type * from './hyper3d';
export type * from './jumpHop';
export type * from './puzzleCreativeTemplate';
export type * from './visualNovel';
export type * from './barkBattle';

View File

@@ -0,0 +1,262 @@
export type JumpHopDifficulty = 'easy' | 'standard' | 'advanced' | 'challenge';
export type JumpHopStylePreset =
| 'minimal-blocks'
| 'paper-toy'
| 'neon-glass'
| 'forest-stone'
| 'future-metal'
| 'custom';
export type JumpHopGenerationStatus =
| 'draft'
| 'generating'
| 'ready'
| 'failed';
export type JumpHopTileType =
| 'start'
| 'normal'
| 'target'
| 'finish'
| 'bonus'
| 'accent';
export type JumpHopActionType =
| 'compile-draft'
| 'regenerate-character'
| 'regenerate-tiles'
| 'update-work-meta'
| 'update-difficulty';
export type JumpHopRunStatus = 'playing' | 'failed' | 'cleared';
export type JumpHopJumpResult = 'miss' | 'hit' | 'perfect' | 'finish';
export interface JumpHopWorkspaceCreateRequest {
templateId: string;
workTitle: string;
workDescription: string;
themeTags: string[];
difficulty: JumpHopDifficulty;
stylePreset: JumpHopStylePreset;
characterPrompt: string;
tilePrompt: string;
endMoodPrompt?: string | null;
}
export interface JumpHopActionRequest {
actionType: JumpHopActionType;
workTitle?: string | null;
workDescription?: string | null;
themeTags?: string[] | null;
difficulty?: JumpHopDifficulty | null;
stylePreset?: JumpHopStylePreset | null;
characterPrompt?: string | null;
tilePrompt?: string | null;
endMoodPrompt?: string | null;
}
export interface JumpHopCharacterAsset {
assetId: string;
imageSrc: string;
imageObjectKey: string;
assetObjectId: string;
generationProvider: string;
prompt: string;
width: number;
height: number;
}
export interface JumpHopTileAsset {
tileType: JumpHopTileType;
imageSrc: string;
imageObjectKey: string;
assetObjectId: string;
sourceAtlasCell: string;
visualWidth: number;
visualHeight: number;
topSurfaceRadius: number;
landingRadius: number;
}
export interface JumpHopScoring {
chargeToDistanceRatio: number;
maxChargeMs: number;
hitBonus: number;
perfectBonus: number;
}
export interface JumpHopPlatform {
platformId: string;
tileType: JumpHopTileType;
x: number;
y: number;
width: number;
height: number;
landingRadius: number;
perfectRadius: number;
scoreValue: number;
}
export interface JumpHopPath {
seed: string;
difficulty: JumpHopDifficulty;
platforms: JumpHopPlatform[];
finishIndex: number;
cameraPreset: string;
scoring: JumpHopScoring;
}
export interface JumpHopLastJump {
chargeMs: number;
jumpDistance: number;
targetPlatformIndex: number;
landedX: number;
landedY: number;
result: JumpHopJumpResult;
}
export interface JumpHopDraftResponse {
templateId: string;
templateName: string;
profileId: string | null;
workTitle: string;
workDescription: string;
themeTags: string[];
difficulty: JumpHopDifficulty;
stylePreset: JumpHopStylePreset;
characterPrompt: string;
tilePrompt: string;
endMoodPrompt: string | null;
characterAsset: JumpHopCharacterAsset | null;
tileAtlasAsset: JumpHopCharacterAsset | null;
tileAssets: JumpHopTileAsset[];
path: JumpHopPath | null;
coverComposite: string | null;
generationStatus: JumpHopGenerationStatus;
}
export interface JumpHopSessionSnapshotResponse {
sessionId: string;
ownerUserId: string;
status: JumpHopGenerationStatus;
draft: JumpHopDraftResponse | null;
createdAt: string;
updatedAt: string;
}
export interface JumpHopSessionResponse {
session: JumpHopSessionSnapshotResponse;
}
export interface JumpHopActionResponse {
actionType: JumpHopActionType;
session: JumpHopSessionSnapshotResponse;
work: JumpHopWorkProfileResponse | null;
}
export interface JumpHopWorkSummaryResponse {
runtimeKind: 'jump-hop';
workId: string;
profileId: string;
ownerUserId: string;
sourceSessionId: string | null;
workTitle: string;
workDescription: string;
themeTags: string[];
difficulty: JumpHopDifficulty;
stylePreset: JumpHopStylePreset;
coverImageSrc: string | null;
publicationStatus: string;
playCount: number;
updatedAt: string;
publishedAt: string | null;
publishReady: boolean;
generationStatus: JumpHopGenerationStatus;
}
export interface JumpHopWorkProfileResponse {
summary: JumpHopWorkSummaryResponse;
draft: JumpHopDraftResponse;
path: JumpHopPath;
characterAsset: JumpHopCharacterAsset;
tileAtlasAsset: JumpHopCharacterAsset;
tileAssets: JumpHopTileAsset[];
}
export interface JumpHopWorksResponse {
items: JumpHopWorkSummaryResponse[];
}
export interface JumpHopWorkDetailResponse {
item: JumpHopWorkProfileResponse;
}
export interface JumpHopWorkMutationResponse {
item: JumpHopWorkProfileResponse;
}
export interface JumpHopGalleryCardResponse {
publicWorkCode: string;
workId: string;
profileId: string;
ownerUserId: string;
authorDisplayName: string;
workTitle: string;
workDescription: string;
coverImageSrc: string | null;
themeTags: string[];
difficulty: JumpHopDifficulty;
stylePreset: JumpHopStylePreset;
publicationStatus: string;
playCount: number;
updatedAt: string;
publishedAt: string | null;
generationStatus: JumpHopGenerationStatus;
}
export interface JumpHopGalleryResponse {
items: JumpHopGalleryCardResponse[];
hasMore: boolean;
nextCursor: string | null;
}
export interface JumpHopGalleryDetailResponse {
item: JumpHopWorkProfileResponse;
}
export interface JumpHopRuntimeRunSnapshotResponse {
runId: string;
profileId: string;
ownerUserId: string;
status: JumpHopRunStatus;
currentPlatformIndex: number;
score: number;
combo: number;
path: JumpHopPath;
lastJump: JumpHopLastJump | null;
startedAtMs: number;
finishedAtMs: number | null;
}
export interface JumpHopRunResponse {
run: JumpHopRuntimeRunSnapshotResponse;
}
export interface JumpHopStartRunRequest {
profileId: string;
}
export interface JumpHopJumpRequest {
chargeMs: number;
clientEventId: string;
}
export interface JumpHopRestartRunRequest {
clientActionId: string;
}
export interface JumpHopJumpResponse {
run: JumpHopRuntimeRunSnapshotResponse;
}