收敛客户端静态发布链路

This commit is contained in:
2026-08-10 17:04:29 +08:00
parent 2e737dee31
commit 4df047708b
37 changed files with 604 additions and 3071 deletions

View File

@@ -3,7 +3,7 @@ import { watch, type FSWatcher } from 'node:fs';
import { access, readFile } from 'node:fs/promises';
import { join } from 'node:path';
import type { OpencodeProject, OpencodeProjectStore } from '../opencode/project-store';
import { readWorksPublishFile } from '../opencode/works-publish-file';
import { readWorksSubmissionBinding } from './works-submission-binding';
import { WORKS_SQUARE_CONFIG } from '../api/works-config';
import { proxyAwareFetch } from '../utils/proxy-fetch';
import { logger } from '../utils/logger';
@@ -15,13 +15,13 @@ import {
getValidWorksSquareAccessToken,
subscribeWorksSquareSession,
} from './works-square-session';
import { WORKS_SUBMISSION_BINDING_FILE_NAME } from '../../shared/works-submission-binding';
export const PROJECT_PROGRESS_DOCUMENT_NAMES = ['GDD.md', 'TASKS.md'] as const;
export const PROJECT_PROGRESS_DEBOUNCE_MS = 1_000;
const PROJECT_PROGRESS_ENDPOINT = '/api/project-progress';
const PROJECT_AGENT_PROMPT_ENDPOINT_PREFIX = '/api/projects';
const PROJECT_PROGRESS_MAX_CHARS = 20_000;
const WORKS_PUBLISH_FILE_NAME = 'works-publish.json';
type ProjectProgressDocumentName = typeof PROJECT_PROGRESS_DOCUMENT_NAMES[number];
type ProjectProgressType = 'server' | 'local';
@@ -89,7 +89,7 @@ function isSyncRelevantFile(filename: string | null): boolean {
return PROJECT_PROGRESS_DOCUMENT_NAMES.includes(normalized as ProjectProgressDocumentName)
|| normalized === PRODUCT_OVERVIEW_FILENAME
|| normalized === LEGACY_PROMOTION_PLAN_FILENAME
|| normalized === WORKS_PUBLISH_FILE_NAME;
|| normalized === WORKS_SUBMISSION_BINDING_FILE_NAME;
}
export function mergeProjectProgressDocuments(gdd: string, tasks: string): string {
@@ -139,9 +139,9 @@ async function readProductOverview(projectPath: string): Promise<string> {
async function resolveProjectProgressIdentity(
project: OpencodeProject,
): Promise<ProjectProgressIdentity> {
const publish = await readWorksPublishFile(project.path);
if (publish.status === 'ready' && publish.publish.app_id) {
return { projectType: 'server', projectKey: publish.publish.app_id };
const binding = await readWorksSubmissionBinding(project.path);
if (binding?.status === 'submitted' && binding.app_id) {
return { projectType: 'server', projectKey: binding.app_id };
}
return { projectType: 'local', projectKey: project.id };
}
@@ -189,7 +189,7 @@ export function createProjectProgressSync(
if (!normalized || normalized === PRODUCT_OVERVIEW_FILENAME || normalized === LEGACY_PROMOTION_PLAN_FILENAME) {
state.pendingPromotion = true;
}
if (normalized === WORKS_PUBLISH_FILE_NAME) {
if (normalized === WORKS_SUBMISSION_BINDING_FILE_NAME) {
state.pendingProgress = true;
state.pendingPromotion = true;
state.lastSyncedFingerprint = null;