openxiangda-devkit-core 2.0.0-alpha.115 → 2.0.0-alpha.118

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.
Files changed (72) hide show
  1. package/dist/app-spec.d.ts +23 -11
  2. package/dist/app-spec.d.ts.map +1 -1
  3. package/dist/app-spec.js +171 -52
  4. package/dist/app-spec.js.map +1 -1
  5. package/dist/application-services.d.ts +290 -23
  6. package/dist/application-services.d.ts.map +1 -1
  7. package/dist/application-services.js +174 -79
  8. package/dist/application-services.js.map +1 -1
  9. package/dist/backend-image-build.js +6 -11
  10. package/dist/backend-image-build.js.map +1 -1
  11. package/dist/command-process.d.ts +14 -0
  12. package/dist/command-process.d.ts.map +1 -0
  13. package/dist/command-process.js +51 -0
  14. package/dist/command-process.js.map +1 -0
  15. package/dist/command-registry.d.ts +2 -2
  16. package/dist/command-registry.js +1 -1
  17. package/dist/command-registry.js.map +1 -1
  18. package/dist/compiler/ai-catalog.d.ts.map +1 -1
  19. package/dist/compiler/ai-catalog.js +2 -1
  20. package/dist/compiler/ai-catalog.js.map +1 -1
  21. package/dist/compiler/bundle.d.ts.map +1 -1
  22. package/dist/compiler/bundle.js +2 -1
  23. package/dist/compiler/bundle.js.map +1 -1
  24. package/dist/compiler/config.d.ts.map +1 -1
  25. package/dist/compiler/config.js +14 -7
  26. package/dist/compiler/config.js.map +1 -1
  27. package/dist/compiler/permission-review.d.ts.map +1 -1
  28. package/dist/configuration-preflight.d.ts +7 -0
  29. package/dist/configuration-preflight.d.ts.map +1 -0
  30. package/dist/configuration-preflight.js +13 -0
  31. package/dist/configuration-preflight.js.map +1 -0
  32. package/dist/control-plane-client.d.ts +8 -1
  33. package/dist/control-plane-client.d.ts.map +1 -1
  34. package/dist/control-plane-client.js +13 -0
  35. package/dist/control-plane-client.js.map +1 -1
  36. package/dist/delivery-cache.d.ts +34 -0
  37. package/dist/delivery-cache.d.ts.map +1 -0
  38. package/dist/delivery-cache.js +186 -0
  39. package/dist/delivery-cache.js.map +1 -0
  40. package/dist/delivery-source.d.ts +17 -0
  41. package/dist/delivery-source.d.ts.map +1 -0
  42. package/dist/delivery-source.js +85 -0
  43. package/dist/delivery-source.js.map +1 -0
  44. package/dist/deployment-observer.d.ts +14 -0
  45. package/dist/deployment-observer.d.ts.map +1 -0
  46. package/dist/deployment-observer.js +68 -0
  47. package/dist/deployment-observer.js.map +1 -0
  48. package/dist/deployment.d.ts +13 -0
  49. package/dist/deployment.d.ts.map +1 -1
  50. package/dist/deployment.js +34 -7
  51. package/dist/deployment.js.map +1 -1
  52. package/dist/developer-operations.d.ts +147 -43
  53. package/dist/developer-operations.d.ts.map +1 -1
  54. package/dist/developer-operations.js +22 -3
  55. package/dist/developer-operations.js.map +1 -1
  56. package/dist/development-lifecycle.d.ts +48 -0
  57. package/dist/development-lifecycle.d.ts.map +1 -0
  58. package/dist/development-lifecycle.js +180 -0
  59. package/dist/development-lifecycle.js.map +1 -0
  60. package/dist/documentation.d.ts +4 -4
  61. package/dist/documentation.d.ts.map +1 -1
  62. package/dist/documentation.js +4 -5
  63. package/dist/documentation.js.map +1 -1
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/operation-progress.d.ts +26 -0
  69. package/dist/operation-progress.d.ts.map +1 -0
  70. package/dist/operation-progress.js +92 -0
  71. package/dist/operation-progress.js.map +1 -0
  72. package/package.json +2 -2
@@ -1,57 +1,159 @@
1
1
  import type { OpenXiangdaApplicationServices } from './application-services.js';
2
2
  import type { DevkitResult } from 'openxiangda-contracts';
3
+ import { type OperationProgressListener } from './operation-progress.js';
3
4
  export declare const DEVELOPER_ENVIRONMENTS: readonly ["test", "production"];
4
5
  export type DeveloperEnvironment = (typeof DEVELOPER_ENVIRONMENTS)[number];
5
6
  export declare function developerEnvironment(value?: string): "preproduction" | "production";
6
7
  export declare function checkApplication(services: OpenXiangdaApplicationServices, input?: {
7
8
  root?: string;
8
9
  environment?: string;
9
- }): Promise<DevkitResult<undefined> | DevkitResult<{
10
- generated: {
11
- output: string;
12
- changed: boolean;
13
- contractDigest: string;
14
- aiCatalogDigest: string;
15
- } | undefined;
16
- compatibility: import("openxiangda-contracts").ConfigurationValidationResult | null;
17
- stages: {
18
- name: string;
19
- state: "passed" | "failed" | "skipped";
20
- ok: boolean;
21
- exitCode: number | null;
22
- output: string;
23
- }[];
24
- sealedArtifact: import("./application-services.js").SealedArtifactStatus;
25
- appSpec: {
26
- enabled: boolean;
27
- mode: "advisory";
28
- releaseGate: false;
29
- workspaceDigest: string | null;
30
- selectionDigest: string | null;
31
- contextBudget: {
32
- maximumBytes: number;
33
- contentBytes: number;
34
- truncated: boolean;
35
- omitted: import("./app-spec.js").AppSpecDocumentSummary[];
10
+ local?: boolean;
11
+ onProgress?: OperationProgressListener;
12
+ }): Promise<{
13
+ data: {
14
+ validationScope: string;
15
+ targetEnvironment: "preproduction" | "production" | null;
16
+ generated?: {
17
+ output: string;
18
+ changed: boolean;
19
+ contractDigest: string;
20
+ aiCatalogDigest: string;
21
+ } | undefined;
22
+ compatibility?: import("openxiangda-contracts").ConfigurationValidationResult | null;
23
+ stages?: {
24
+ name: string;
25
+ state: "passed" | "failed" | "skipped";
26
+ ok: boolean;
27
+ exitCode: number | null;
28
+ output: string;
29
+ reused?: boolean;
30
+ }[];
31
+ sealedArtifact?: import("./application-services.js").SealedArtifactStatus;
32
+ appSpec?: {
33
+ lifecycle: {
34
+ schemaVersion: "openxiangda.development-lifecycle/v1";
35
+ stage: "design-incomplete" | "ready-for-test";
36
+ readyForTest: boolean;
37
+ changeId: string | null;
38
+ acceptanceIds: string[];
39
+ currentSpecDigest: string | null;
40
+ diagnostics: import("openxiangda-contracts").Diagnostic[];
41
+ nextCommand: string;
42
+ };
43
+ enabled: boolean;
44
+ mode: "guided";
45
+ releaseGate: true;
46
+ workspaceDigest: string | null;
47
+ selectionDigest: string | null;
48
+ historyPage: {
49
+ offset: number;
50
+ limit: number;
51
+ total: number;
52
+ nextOffset: number | null;
53
+ };
54
+ contextBudget: {
55
+ maximumBytes: number;
56
+ contentBytes: number;
57
+ truncated: boolean;
58
+ omitted: import("./app-spec.js").AppSpecDocumentSummary[];
59
+ };
60
+ stats: {
61
+ files: number;
62
+ bytes: number;
63
+ capabilities: number;
64
+ activeChanges: number;
65
+ historyChanges: number;
66
+ decisions: number;
67
+ requirements: number;
68
+ acceptanceScenarios: number;
69
+ };
70
+ diagnostics: {
71
+ errors: number;
72
+ warnings: number;
73
+ info: number;
74
+ };
75
+ nextCommand: string;
36
76
  };
37
- stats: {
38
- files: number;
39
- bytes: number;
40
- capabilities: number;
41
- activeChanges: number;
42
- historyChanges: number;
43
- decisions: number;
44
- requirements: number;
45
- acceptanceScenarios: number;
46
- };
47
- diagnostics: {
48
- errors: number;
49
- warnings: number;
50
- info: number;
77
+ };
78
+ ok: boolean;
79
+ operation: string;
80
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
81
+ diagnostics: import("openxiangda-contracts").Diagnostic[];
82
+ nextActions: import("openxiangda-contracts").NextAction[];
83
+ traceId?: string;
84
+ } | {
85
+ data: {
86
+ validationScope: string;
87
+ targetEnvironment: "preproduction" | "production" | null;
88
+ generated?: {
89
+ output: string;
90
+ changed: boolean;
91
+ contractDigest: string;
92
+ aiCatalogDigest: string;
93
+ } | undefined;
94
+ compatibility?: import("openxiangda-contracts").ConfigurationValidationResult | null;
95
+ stages?: {
96
+ name: string;
97
+ state: "passed" | "failed" | "skipped";
98
+ ok: boolean;
99
+ exitCode: number | null;
100
+ output: string;
101
+ reused?: boolean;
102
+ }[];
103
+ sealedArtifact?: import("./application-services.js").SealedArtifactStatus;
104
+ appSpec?: {
105
+ lifecycle: {
106
+ schemaVersion: "openxiangda.development-lifecycle/v1";
107
+ stage: "design-incomplete" | "ready-for-test";
108
+ readyForTest: boolean;
109
+ changeId: string | null;
110
+ acceptanceIds: string[];
111
+ currentSpecDigest: string | null;
112
+ diagnostics: import("openxiangda-contracts").Diagnostic[];
113
+ nextCommand: string;
114
+ };
115
+ enabled: boolean;
116
+ mode: "guided";
117
+ releaseGate: true;
118
+ workspaceDigest: string | null;
119
+ selectionDigest: string | null;
120
+ historyPage: {
121
+ offset: number;
122
+ limit: number;
123
+ total: number;
124
+ nextOffset: number | null;
125
+ };
126
+ contextBudget: {
127
+ maximumBytes: number;
128
+ contentBytes: number;
129
+ truncated: boolean;
130
+ omitted: import("./app-spec.js").AppSpecDocumentSummary[];
131
+ };
132
+ stats: {
133
+ files: number;
134
+ bytes: number;
135
+ capabilities: number;
136
+ activeChanges: number;
137
+ historyChanges: number;
138
+ decisions: number;
139
+ requirements: number;
140
+ acceptanceScenarios: number;
141
+ };
142
+ diagnostics: {
143
+ errors: number;
144
+ warnings: number;
145
+ info: number;
146
+ };
147
+ nextCommand: string;
51
148
  };
52
- nextCommand: string;
53
149
  };
54
- }>>;
150
+ ok: boolean;
151
+ operation: string;
152
+ workspace: import("openxiangda-contracts").WorkspaceIdentity;
153
+ diagnostics: import("openxiangda-contracts").Diagnostic[];
154
+ nextActions: import("openxiangda-contracts").NextAction[];
155
+ traceId?: string;
156
+ }>;
55
157
  export interface DeveloperDeploymentInput {
56
158
  root?: string;
57
159
  environment?: string;
@@ -59,6 +161,8 @@ export interface DeveloperDeploymentInput {
59
161
  environmentId?: string;
60
162
  idempotencyKey?: string;
61
163
  dryRun?: boolean;
164
+ wait?: boolean;
165
+ onProgress?: OperationProgressListener;
62
166
  }
63
167
  export declare function deployApplication(services: OpenXiangdaApplicationServices, input: DeveloperDeploymentInput): Promise<DevkitResult<unknown>>;
64
168
  //# sourceMappingURL=developer-operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"developer-operations.d.ts","sourceRoot":"","sources":["../src/developer-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,eAAO,MAAM,sBAAsB,iCAAkC,CAAC;AACtE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3E,wBAAgB,oBAAoB,CAAC,KAAK,GAAE,MAAe,kCAI1D;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,8BAA8B,EACxC,KAAK,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIpD;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,8BAA8B,EACxC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAoBhC"}
1
+ {"version":3,"file":"developer-operations.d.ts","sourceRoot":"","sources":["../src/developer-operations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAGhG,eAAO,MAAM,sBAAsB,iCAAkC,CAAC;AACtE,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3E,wBAAgB,oBAAoB,CAAC,KAAK,GAAE,MAAe,kCAI1D;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,8BAA8B,EACxC,KAAK,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,yBAAyB,CAAA;CAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQ7G;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,8BAA8B,EACxC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAMhC"}
@@ -1,6 +1,8 @@
1
1
  import { realpathSync } from 'node:fs';
2
2
  import { discoverWorkspace } from './workspace-loader.js';
3
3
  import { withWorkspaceOperation } from './workspace-operation.js';
4
+ import { withOperationProgress } from './operation-progress.js';
5
+ import { observeDeployment } from './deployment-observer.js';
4
6
  export const DEVELOPER_ENVIRONMENTS = ['test', 'production'];
5
7
  export function developerEnvironment(value = 'test') {
6
8
  if (value === 'test')
@@ -11,9 +13,21 @@ export function developerEnvironment(value = 'test') {
11
13
  }
12
14
  export function checkApplication(services, input = {}) {
13
15
  const environment = developerEnvironment(input.environment);
14
- return withWorkspaceOperation(realpathSync(discoverWorkspace(input.root).root), 'check', () => services.check(input.root, environment));
16
+ if (input.local && input.environment === 'production')
17
+ throw new Error('LOCAL_CHECK_TARGET_CONFLICT: 本地检查不验证生产环境,请分别执行');
18
+ return withOperationProgress('check', input.onProgress, () => withWorkspaceOperation(realpathSync(discoverWorkspace(input.root).root), 'check', async () => {
19
+ const result = await services.check(input.root, input.local ? undefined : environment);
20
+ return { ...result, data: { ...result.data, validationScope: input.local ? 'local' : 'target', targetEnvironment: input.local ? null : environment } };
21
+ }));
15
22
  }
16
23
  export function deployApplication(services, input) {
24
+ validateDeploymentInput(input);
25
+ return withOperationProgress(input.dryRun ? 'deployment.plan' : 'deploy', input.onProgress, async () => {
26
+ const result = await executeDeployment(services, input);
27
+ return input.dryRun || input.wait === false ? result : observeDeployment(services, result, input);
28
+ });
29
+ }
30
+ function validateDeploymentInput(input) {
17
31
  const environment = developerEnvironment(input.environment);
18
32
  if (environment === 'production') {
19
33
  if (!input.from)
@@ -21,12 +35,17 @@ export function deployApplication(services, input) {
21
35
  if (input.environmentId || input.idempotencyKey) {
22
36
  throw new Error('PRODUCTION_DEPLOYMENT_OPTIONS_INVALID: 生产晋级由指定测试运行确定目标版本和幂等身份');
23
37
  }
38
+ }
39
+ else if (input.from)
40
+ throw new Error('DEPLOY_TEST_FROM_INVALID: from 仅用于 production 晋级');
41
+ }
42
+ async function executeDeployment(services, input) {
43
+ const environment = developerEnvironment(input.environment);
44
+ if (environment === 'production') {
24
45
  return input.dryRun
25
46
  ? services.productionDeploymentPlan(input.root, input.from)
26
47
  : services.deployProduction(input.root, input.from);
27
48
  }
28
- if (input.from)
29
- throw new Error('DEPLOY_TEST_FROM_INVALID: from 仅用于 production 晋级');
30
49
  return input.dryRun
31
50
  ? services.deploymentPlan({ ...(input.root ? { root: input.root } : {}), environment })
32
51
  : withWorkspaceOperation(realpathSync(discoverWorkspace(input.root).root), 'deploy', () => services.deploy({
@@ -1 +1 @@
1
- {"version":3,"file":"developer-operations.js","sourceRoot":"","sources":["../src/developer-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAIlE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,YAAY,CAAU,CAAC;AAGtE,MAAM,UAAU,oBAAoB,CAAC,QAAgB,MAAM;IACzD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,eAAwB,CAAC;IACtD,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,YAAqB,CAAC;IACzD,MAAM,IAAI,KAAK,CAAC,6DAA6D,KAAK,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAwC,EACxC,QAAiD,EAAE;IAEnD,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,OAAO,sBAAsB,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1I,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAC/B,QAAwC,EACxC,KAA+B;IAE/B,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAClG,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,KAAK,CAAC,MAAM;YACjB,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;YAC3D,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,MAAM;QACjB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;QACvF,CAAC,CAAC,sBAAsB,CAAC,YAAY,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,WAAW;YACX,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC,CAAC,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"developer-operations.js","sourceRoot":"","sources":["../src/developer-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type DeploymentRun, type Diagnostic } from 'openxiangda-contracts';
2
+ import { type AppSpecContractIndex } from './app-spec.js';
3
+ /** 按发布阶段评估事实完整性;不推断用户确认,也不将章节存在当作业务验收。 */
4
+ export declare function developmentLifecycle(root: string, contract: AppSpecContractIndex, message?: string): {
5
+ schemaVersion: "openxiangda.development-lifecycle/v1";
6
+ stage: "design-incomplete" | "ready-for-test";
7
+ readyForTest: boolean;
8
+ changeId: string | null;
9
+ acceptanceIds: string[];
10
+ currentSpecDigest: string | null;
11
+ diagnostics: Diagnostic[];
12
+ nextCommand: string;
13
+ context: import("./app-spec.js").AppSpecContext;
14
+ };
15
+ export declare function summarizeLifecycle(value: ReturnType<typeof developmentLifecycle>): {
16
+ schemaVersion: "openxiangda.development-lifecycle/v1";
17
+ stage: "design-incomplete" | "ready-for-test";
18
+ readyForTest: boolean;
19
+ changeId: string | null;
20
+ acceptanceIds: string[];
21
+ currentSpecDigest: string | null;
22
+ diagnostics: Diagnostic[];
23
+ nextCommand: string;
24
+ };
25
+ /** 生产验收按测试版本中的需求计划核对,当前主线后来增加的规则不会冒充已测规则。 */
26
+ export declare function lifecycleAtCommit(root: string, commit: string, contract: AppSpecContractIndex): {
27
+ schemaVersion: "openxiangda.development-lifecycle/v1";
28
+ stage: "design-incomplete" | "ready-for-test";
29
+ readyForTest: boolean;
30
+ changeId: string | null;
31
+ acceptanceIds: string[];
32
+ currentSpecDigest: string | null;
33
+ diagnostics: Diagnostic[];
34
+ nextCommand: string;
35
+ context: import("./app-spec.js").AppSpecContext;
36
+ };
37
+ export declare function verifyBusinessAcceptance(root: string, run: DeploymentRun, expected: {
38
+ changeId: string | null;
39
+ acceptanceIds: string[];
40
+ }, pathInput?: string): {
41
+ ok: boolean;
42
+ path: string;
43
+ sourceDeploymentId: string;
44
+ packageDigest: string;
45
+ scenarios: any;
46
+ diagnostics: Diagnostic[];
47
+ };
48
+ //# sourceMappingURL=development-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-lifecycle.d.ts","sourceRoot":"","sources":["../src/development-lifecycle.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAkB,KAAK,oBAAoB,EAAwB,MAAM,eAAe,CAAC;AA0BhG,0CAA0C;AAC1C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,SAAoB;;;;;;;;;;EAiC7G;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC;;;;;;;;;EAGhF;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB;;;;;;;;;;EAqB7F;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;;;EA6C5J"}
@@ -0,0 +1,180 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join, relative, resolve } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { SCHEMA_VERSIONS } from 'openxiangda-contracts';
6
+ import { inspectAppSpec } from './app-spec.js';
7
+ const APP_SECTIONS = ['业务目标', '角色', '架构与数据关系', '业务任务与页面', '权限矩阵与确认', '性能与容量预算'];
8
+ const CHANGE_SECTIONS = ['为什么', '需求依据', '方案与影响', '任务与实现', '验收', '性能与容量预算'];
9
+ function issue(code, message, path) {
10
+ return { schemaVersion: SCHEMA_VERSIONS.diagnostic, severity: 'error', retryable: false, code, message, path, remediation: '依据实际业务补齐对应记录;运行 openxiangda spec context --json 查看阶段缺口,不能填写虚假确认或通过结果' };
11
+ }
12
+ function section(content, title) {
13
+ const source = content.replace(/<!--[\s\S]*?-->/g, '');
14
+ const start = source.indexOf(`\n## ${title}\n`);
15
+ if (start < 0)
16
+ return '';
17
+ return source.slice(start + title.length + 5).split(/\n## /)[0] || '';
18
+ }
19
+ function meaningful(content) {
20
+ return content.split('\n').map(line => line.replace(/^\s*[-*]\s*(?:\[[ x]\]\s*)?/, '').trim())
21
+ .filter(line => line && !line.startsWith('|') && !line.startsWith('#') && !/^(待补充|待确认|TBD|TODO|无。?|一个可观察的正向结果|需要时补充拒绝、异常或权限反例)$/.test(line)).join('\n').length >= 8
22
+ || content.split('\n').filter(line => line.trim().startsWith('|') && !/^[|\s:-]+$/.test(line)).length >= 2;
23
+ }
24
+ function boundedGit(root, args, maxBuffer = 2 * 1024 * 1024) {
25
+ return execFileSync('git', ['-C', root, ...args], { encoding: 'utf8', timeout: 10_000, maxBuffer, stdio: ['ignore', 'pipe', 'pipe'] }).trim();
26
+ }
27
+ function headMessage(root) {
28
+ try {
29
+ return boundedGit(root, ['log', '-1', '--format=%B']);
30
+ }
31
+ catch {
32
+ return '';
33
+ }
34
+ }
35
+ /** 按发布阶段评估事实完整性;不推断用户确认,也不将章节存在当作业务验收。 */
36
+ export function developmentLifecycle(root, contract, message = headMessage(root)) {
37
+ const index = inspectAppSpec(root, contract);
38
+ const explicit = message.match(/^AppSpec:\s*([a-z0-9]+(?:-[a-z0-9]+)*)\s*$/m)?.[1];
39
+ const changeId = explicit || (index.index.activeChanges.length === 1 ? index.index.activeChanges[0]?.id : undefined);
40
+ const context = changeId ? inspectAppSpec(root, contract, changeId) : index;
41
+ const change = [...context.activeChanges, ...context.archivedChanges].find(item => item.id === changeId);
42
+ const diagnostics = context.diagnostics.filter(item => item.severity === 'error');
43
+ const app = context.application;
44
+ if (!app)
45
+ diagnostics.push(issue('APPSPEC_APPLICATION_REQUIRED', '正式发布需要应用总纲;运行 openxiangda spec init 后填写实际目标、权限、架构和容量', 'appspec/app.md'));
46
+ else
47
+ for (const title of APP_SECTIONS) {
48
+ if (!meaningful(section(app.content, title)))
49
+ diagnostics.push(issue('APPSPEC_APPLICATION_SECTION_INCOMPLETE', `应用总纲“${title}”尚无具体记录`, `${app.path}#${title}`));
50
+ }
51
+ if (!change)
52
+ diagnostics.push(issue('APPSPEC_DELIVERY_CHANGE_REQUIRED', '需要关联本轮变更;有多个活动变更或引用历史记录时,在提交说明加入 AppSpec: <变更ID>', 'appspec/changes/active'));
53
+ else {
54
+ for (const title of CHANGE_SECTIONS) {
55
+ if (!meaningful(section(change.content, title)))
56
+ diagnostics.push(issue('APPSPEC_CHANGE_SECTION_INCOMPLETE', `变更“${title}”尚无具体记录`, `${change.path}#${title}`));
57
+ }
58
+ if (change.status === 'draft' || change.status === 'cancelled')
59
+ diagnostics.push(issue('APPSPEC_CHANGE_NOT_READY', '变更仍是草稿或已取消;先澄清业务含义并记录实际依据,再进入 implementing', change.path));
60
+ }
61
+ for (const document of [app, change].filter((item) => !!item)) {
62
+ if (/^- \[ \]/m.test(section(document.content, '未确认问题')))
63
+ diagnostics.push(issue('APPSPEC_BLOCKING_QUESTIONS', '仍有影响正式交付的未确认问题;非阻断假设单独记录,不冒充用户确认', `${document.path}#未确认问题`));
64
+ }
65
+ const acceptanceIds = [...new Set([...(app?.acceptanceIds || []), ...(change?.acceptanceIds || []), ...context.capabilities.flatMap(item => item.acceptanceIds)])];
66
+ if (change && !acceptanceIds.length)
67
+ diagnostics.push(issue('APPSPEC_ACCEPTANCE_PLAN_REQUIRED', '至少定义一个 #### AC-* 可观察验收场景,供测试部署后逐项验证', `${change.path}#验收`));
68
+ return {
69
+ schemaVersion: 'openxiangda.development-lifecycle/v1',
70
+ stage: diagnostics.length ? 'design-incomplete' : 'ready-for-test',
71
+ readyForTest: !diagnostics.length, changeId: change?.id || null, acceptanceIds,
72
+ currentSpecDigest: context.selectionDigest,
73
+ diagnostics,
74
+ nextCommand: changeId ? `openxiangda spec context ${changeId} --json` : 'openxiangda spec context --json',
75
+ context,
76
+ };
77
+ }
78
+ export function summarizeLifecycle(value) {
79
+ const { context, ...summary } = value;
80
+ return summary;
81
+ }
82
+ /** 生产验收按测试版本中的需求计划核对,当前主线后来增加的规则不会冒充已测规则。 */
83
+ export function lifecycleAtCommit(root, commit, contract) {
84
+ if (!/^[a-f0-9]{40,64}$/.test(commit))
85
+ throw new Error('APPSPEC_SOURCE_COMMIT_INVALID');
86
+ const scratch = mkdtempSync(join(tmpdir(), 'openxiangda-spec-source-'));
87
+ try {
88
+ const message = boundedGit(root, ['log', '-1', '--format=%B', commit]);
89
+ const selected = message.match(/^AppSpec:\s*([a-z0-9]+(?:-[a-z0-9]+)*)\s*$/m)?.[1];
90
+ const paths = boundedGit(root, ['ls-tree', '-r', '--name-only', commit, '--', 'appspec']).split('\n').filter(path => /^appspec\/(?:app\.md|capabilities\/[^/]+\.md|decisions\/[^/]+\.md|changes\/active\/[^/]+\.md)$/.test(path)
91
+ || (selected && new RegExp(`^appspec/changes/history/[^/]+/${selected}\\.md$`).test(path)));
92
+ if (paths.length > 128)
93
+ throw new Error('APPSPEC_SOURCE_FILE_LIMIT');
94
+ let bytes = 0;
95
+ for (const path of paths) {
96
+ const content = boundedGit(root, ['show', `${commit}:${path}`], 256 * 1024);
97
+ bytes += Buffer.byteLength(content);
98
+ if (bytes > 2 * 1024 * 1024)
99
+ throw new Error('APPSPEC_SOURCE_SIZE_LIMIT');
100
+ const target = join(scratch, path);
101
+ mkdirSync(dirname(target), { recursive: true });
102
+ writeFileSync(target, `${content}\n`);
103
+ }
104
+ return developmentLifecycle(scratch, contract, message);
105
+ }
106
+ finally {
107
+ rmSync(scratch, { recursive: true, force: true });
108
+ }
109
+ }
110
+ export function verifyBusinessAcceptance(root, run, expected, pathInput) {
111
+ const defaultPath = `appspec/verification/${run.id}.json`;
112
+ const path = resolve(root, pathInput || defaultPath);
113
+ const local = relative(root, path).replaceAll('\\', '/');
114
+ const diagnostics = [];
115
+ function evidenceExists(value) {
116
+ if (typeof value !== 'string' || !value.trim())
117
+ return false;
118
+ if (value.startsWith('https://')) {
119
+ try {
120
+ return !!new URL(value).hostname;
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ const path = resolve(root, value);
127
+ const local = relative(root, path);
128
+ if (!local || local.startsWith('..'))
129
+ return false;
130
+ try {
131
+ let current = root;
132
+ for (const name of local.split(/[\\/]/)) {
133
+ current = join(current, name);
134
+ if (lstatSync(current).isSymbolicLink())
135
+ return false;
136
+ }
137
+ return lstatSync(path).isFile();
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ }
143
+ try {
144
+ if (!/^appspec\/verification\/[a-zA-Z0-9._-]+\.json$/.test(local))
145
+ throw new Error('验收报告应位于 appspec/verification/ 中');
146
+ for (const part of ['appspec', 'appspec/verification', local]) {
147
+ if (lstatSync(join(root, part)).isSymbolicLink())
148
+ throw new Error('验收报告路径不能使用符号链接');
149
+ }
150
+ if (!existsSync(path) || lstatSync(path).size > 1024 * 1024)
151
+ throw new Error('验收报告缺失或超过 1 MiB');
152
+ const report = JSON.parse(readFileSync(path, 'utf8'));
153
+ if (report.schemaVersion !== 'openxiangda.business-verification/v1' || report.appCode !== run.appCode || report.sourceDeploymentId !== run.id || report.packageDigest !== run.packageDigest || !expected.changeId || report.changeId !== expected.changeId || run.status !== 'succeeded' || run.environment.kind !== 'preproduction')
154
+ throw new Error('验收报告未绑定指定成功测试运行、包摘要与变更');
155
+ if (!Number.isFinite(Date.parse(report.recordedAt)) || !Array.isArray(report.scenarios) || !report.scenarios.length || report.scenarios.length > 500 || !Array.isArray(report.performance) || !report.performance.length || report.performance.length > 100)
156
+ throw new Error('报告需要记录时间、具体场景与性能测量');
157
+ const seen = new Set();
158
+ for (const scenario of report.scenarios) {
159
+ if (!/^AC-[A-Z0-9-]+$/.test(scenario.id) || seen.has(scenario.id) || scenario.status !== 'passed' || !meaningful(String(scenario.observation || '')) || !String(scenario.actor || '').trim() || !Array.isArray(scenario.evidence) || !scenario.evidence.some((value) => typeof value === 'string' && value.trim().length >= 4))
160
+ throw new Error('验收场景必须有唯一 AC ID、已通过结果、实际角色、观察与证据引用;失败或未测场景不能晋级');
161
+ seen.add(scenario.id);
162
+ if (!scenario.evidence.every(evidenceExists))
163
+ throw new Error('场景证据需要工作区内实际存在的文件或 HTTPS 引用');
164
+ }
165
+ if (expected.acceptanceIds.some(id => !seen.has(id)))
166
+ throw new Error('测试版本计划中的验收场景尚未全部覆盖');
167
+ for (const measurement of report.performance) {
168
+ if (!meaningful(String(measurement.scenario || '')) || !meaningful(String(measurement.sample || '')) || typeof measurement.targetMs !== 'number' || !Number.isFinite(measurement.targetMs) || measurement.targetMs <= 0 || typeof measurement.observedMs !== 'number' || !Number.isFinite(measurement.observedMs) || measurement.observedMs < 0 || measurement.observedMs > measurement.targetMs || !Array.isArray(measurement.evidence) || !measurement.evidence.length)
169
+ throw new Error('性能记录需要真实样本、目标毫秒数、实测毫秒数及证据;超出目标时先评估并修复');
170
+ if (!measurement.evidence.every(evidenceExists))
171
+ throw new Error('性能证据需要工作区内实际存在的文件或 HTTPS 引用');
172
+ }
173
+ return { ok: true, path: local, sourceDeploymentId: run.id, packageDigest: run.packageDigest, scenarios: report.scenarios.length, diagnostics };
174
+ }
175
+ catch (error) {
176
+ diagnostics.push(issue('APPSPEC_BUSINESS_ACCEPTANCE_REQUIRED', `生产晋级前需要该测试版本的实际验收报告:${error.message}`, local));
177
+ return { ok: false, path: local, sourceDeploymentId: run.id, packageDigest: run.packageDigest, scenarios: 0, diagnostics };
178
+ }
179
+ }
180
+ //# sourceMappingURL=development-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development-lifecycle.js","sourceRoot":"","sources":["../src/development-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare const DOCUMENTATION_TOPICS: readonly [{
13
13
  readonly file: "application-foundation.md";
14
14
  }, {
15
15
  readonly id: "appspec";
16
- readonly title: "可选的业务需求记录";
16
+ readonly title: "需求、设计与交付记录";
17
17
  readonly file: "appspec.md";
18
18
  }, {
19
19
  readonly id: "concepts";
@@ -68,14 +68,14 @@ export declare const DOCUMENTATION_TOPICS: readonly [{
68
68
  readonly title: "MCP 配置与工具参考";
69
69
  readonly file: "reference/mcp.md";
70
70
  }];
71
- /** Skill 参考文件名保留稳定入口,正文仍由中文主题生成。 */
71
+ /** Skill 参考文件名直接使用主题 ID,正文由同一中文主题生成。 */
72
72
  export declare function documentationReferenceFile(id: string): string;
73
73
  export declare function documentationRoot(): string;
74
74
  export declare function documentationIndex(root?: string): {
75
75
  schemaVersion: string;
76
76
  topics: {
77
77
  id: "appspec" | "delivery" | "frontend" | "backend" | "getting-started" | "development" | "application-foundation" | "concepts" | "field-components" | "data-authz" | "public-access" | "workflow-events" | "administration" | "testing" | "upgrading" | "cli" | "mcp";
78
- title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "可选的业务需求记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
78
+ title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "需求、设计与交付记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
79
79
  uri: string;
80
80
  version: string;
81
81
  sha256: string;
@@ -89,7 +89,7 @@ export declare function documentationIndex(root?: string): {
89
89
  export declare function readDocumentation(id: string, section?: string, root?: string): {
90
90
  schemaVersion: string;
91
91
  topic: string;
92
- title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "可选的业务需求记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
92
+ title: "CLI 命令参考" | "安装与开始开发" | "需求与开发流程" | "业务模型与标准 CRUD" | "需求、设计与交付记录" | "架构与能力所有者" | "页面与标准组件扩展" | "字段、表单与移动控件" | "数据查询与权限" | "无账号的匿名公开访问" | "审批、事件与通知" | "按需后端与业务动作" | "应用管理与有效配置" | "检查与真实业务验收" | "部署、生产晋级与恢复" | "版本升级与资料刷新" | "MCP 配置与工具参考";
93
93
  version: string;
94
94
  sha256: string;
95
95
  uri: string;
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"AAIA,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAEX,oCAAoC;AACpC,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,UAGpD;AAID,wBAAgB,iBAAiB,WAEhC;AA4CD,wBAAgB,kBAAkB,CAAC,IAAI,SAAsB;;;;;;;;;;;;;;EAW5D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,SAAsB;;;;;;;;;;;;EAWzF;AAED,wBAAgB,6BAA6B,WAI5C"}
1
+ {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"AAIA,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBvB,CAAC;AAEX,wCAAwC;AACxC,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,UAEpD;AAID,wBAAgB,iBAAiB,WAEhC;AA4CD,wBAAgB,kBAAkB,CAAC,IAAI,SAAsB;;;;;;;;;;;;;;EAW5D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,SAAsB;;;;;;;;;;;;EAWzF;AAED,wBAAgB,6BAA6B,WAI5C"}
@@ -6,7 +6,7 @@ export const DOCUMENTATION_TOPICS = [
6
6
  { id: 'getting-started', title: '安装与开始开发', file: 'getting-started.md' },
7
7
  { id: 'development', title: '需求与开发流程', file: 'development.md' },
8
8
  { id: 'application-foundation', title: '业务模型与标准 CRUD', file: 'application-foundation.md' },
9
- { id: 'appspec', title: '可选的业务需求记录', file: 'appspec.md' },
9
+ { id: 'appspec', title: '需求、设计与交付记录', file: 'appspec.md' },
10
10
  { id: 'concepts', title: '架构与能力所有者', file: 'concepts.md' },
11
11
  { id: 'frontend', title: '页面与标准组件扩展', file: 'frontend.md' },
12
12
  { id: 'field-components', title: '字段、表单与移动控件', file: 'field-components.md' },
@@ -21,10 +21,9 @@ export const DOCUMENTATION_TOPICS = [
21
21
  { id: 'cli', title: 'CLI 命令参考', file: 'reference/cli.md' },
22
22
  { id: 'mcp', title: 'MCP 配置与工具参考', file: 'reference/mcp.md' },
23
23
  ];
24
- /** Skill 参考文件名保留稳定入口,正文仍由中文主题生成。 */
24
+ /** Skill 参考文件名直接使用主题 ID,正文由同一中文主题生成。 */
25
25
  export function documentationReferenceFile(id) {
26
- const aliases = { development: 'discovery', concepts: 'architecture', cli: 'commands' };
27
- return `${aliases[id] || id}.md`;
26
+ return `${id}.md`;
28
27
  }
29
28
  const MAX_TOPIC_BYTES = 128 * 1024;
30
29
  export function documentationRoot() {
@@ -33,7 +32,7 @@ export function documentationRoot() {
33
32
  function topicSource(id, root) {
34
33
  const topic = DOCUMENTATION_TOPICS.find(item => item.id === id);
35
34
  if (!topic)
36
- throw new Error(`DOCUMENTATION_TOPIC_NOT_FOUND: 未知主题 ${id},运行 pnpm openxiangda docs 查看目录`);
35
+ throw new Error(`DOCUMENTATION_TOPIC_NOT_FOUND: 未知主题 ${id}。CLI 运行 pnpm openxiangda docs,MCP 调用 docs_read 并省略 topic,按目录中的 id 读取正文`);
37
36
  const path = resolve(root, topic.file);
38
37
  if (!existsSync(path))
39
38
  throw new Error(`DOCUMENTATION_NOT_INSTALLED: 当前安装缺少 ${id},请通过同版本 openxiangda 根包启动`);