@stalfh233/omc-cli 0.0.0-stage → 0.4.0
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.
- package/LICENSE +21 -0
- package/README.md +304 -3
- package/coverage/m1-coverage-manifest-v1.json +1278 -0
- package/dist/approval-token.js +102 -0
- package/dist/args.js +25 -0
- package/dist/artifacts.js +119 -0
- package/dist/bench/call-face-eval.js +256 -0
- package/dist/bench/context-attribution.js +151 -0
- package/dist/bench/discovery-cost-eval.js +230 -0
- package/dist/bench/driver.js +81 -0
- package/dist/bench/evals.js +236 -0
- package/dist/bench/fake-http-server.js +65 -0
- package/dist/bench/instrument.js +87 -0
- package/dist/bench/intent-face-eval.js +343 -0
- package/dist/bench/run.js +166 -0
- package/dist/bench/scenario.js +343 -0
- package/dist/bench/types.js +76 -0
- package/dist/bi-wire.js +41 -0
- package/dist/bizservice-config.js +581 -0
- package/dist/call.js +153 -0
- package/dist/capability-absences.js +23 -0
- package/dist/capability-overview.js +492 -0
- package/dist/capability-shape.js +154 -0
- package/dist/cli-contract.js +70 -0
- package/dist/cli-output.js +73 -0
- package/dist/cli.js +1418 -0
- package/dist/code-rules.js +69 -0
- package/dist/command-transport.js +155 -0
- package/dist/config-store.js +195 -0
- package/dist/context.js +21 -0
- package/dist/contract-consistency.js +66 -0
- package/dist/contract-resources.js +62 -0
- package/dist/coverage-consistency.js +62 -0
- package/dist/coverage-registry.js +76 -0
- package/dist/coverage.js +130 -0
- package/dist/data-list-filter.js +114 -0
- package/dist/discovery.js +390 -0
- package/dist/endpoints.js +154 -0
- package/dist/environment-policy.js +26 -0
- package/dist/execution-metadata.js +1092 -0
- package/dist/fake/app.js +45 -0
- package/dist/fake/b2-registration.js +594 -0
- package/dist/fake/businessrule.js +242 -0
- package/dist/fake/datarule.js +72 -0
- package/dist/fake/dictionary.js +108 -0
- package/dist/fake/environment.js +30 -0
- package/dist/fake/field.js +167 -0
- package/dist/fake/form.js +101 -0
- package/dist/fake/index.js +121 -0
- package/dist/fake/list-view.js +289 -0
- package/dist/fake/model.js +136 -0
- package/dist/fake/online-js.js +18 -0
- package/dist/fake/report.js +253 -0
- package/dist/fake/routes.js +47 -0
- package/dist/fake/rule-lifecycle.js +37 -0
- package/dist/fake/runtime-data.js +367 -0
- package/dist/fake/state.js +67 -0
- package/dist/fake/workflow.js +364 -0
- package/dist/field-change.js +200 -0
- package/dist/field-families.js +896 -0
- package/dist/form-layout.js +111 -0
- package/dist/form-support.js +821 -0
- package/dist/goal-routes.js +468 -0
- package/dist/governed-execution.js +87 -0
- package/dist/human-summary.js +212 -0
- package/dist/identity.js +62 -0
- package/dist/intent/baseline.js +57 -0
- package/dist/intent/capabilities/bizservice.js +274 -0
- package/dist/intent/capabilities/businessrule.js +493 -0
- package/dist/intent/capabilities/datarule.js +187 -0
- package/dist/intent/capabilities/field.js +545 -0
- package/dist/intent/capabilities/form.js +136 -0
- package/dist/intent/capabilities/index.js +64 -0
- package/dist/intent/capabilities/listview.js +157 -0
- package/dist/intent/capabilities/model.js +100 -0
- package/dist/intent/capabilities/onlinejs.js +108 -0
- package/dist/intent/capabilities/report.js +355 -0
- package/dist/intent/capabilities/workflow.js +458 -0
- package/dist/intent/capability.js +6 -0
- package/dist/intent/cli.js +91 -0
- package/dist/intent/compare.js +56 -0
- package/dist/intent/compiler.js +79 -0
- package/dist/intent/dsl.js +129 -0
- package/dist/intent/plan-file.js +63 -0
- package/dist/intent/readback.js +65 -0
- package/dist/intent/schema.js +158 -0
- package/dist/intent/validation.js +30 -0
- package/dist/intent/yaml.js +315 -0
- package/dist/json-column.js +68 -0
- package/dist/lanes/app-contract.js +95 -0
- package/dist/lanes/app-coverage.js +16 -0
- package/dist/lanes/app.js +174 -0
- package/dist/lanes/apply-changes.js +231 -0
- package/dist/lanes/b2-registration-contract.js +292 -0
- package/dist/lanes/b2-registration-coverage.js +48 -0
- package/dist/lanes/b2-registration.js +1187 -0
- package/dist/lanes/businessrule-contract.js +232 -0
- package/dist/lanes/businessrule-coverage.js +16 -0
- package/dist/lanes/businessrule.js +221 -0
- package/dist/lanes/contract-support.js +65 -0
- package/dist/lanes/coverage-declaration.js +9 -0
- package/dist/lanes/datarule-contract.js +155 -0
- package/dist/lanes/datarule-coverage.js +19 -0
- package/dist/lanes/datarule-protocol.js +308 -0
- package/dist/lanes/datarule.js +818 -0
- package/dist/lanes/dictionary-contract.js +78 -0
- package/dist/lanes/dictionary-coverage.js +24 -0
- package/dist/lanes/dictionary.js +235 -0
- package/dist/lanes/environment-contract.js +70 -0
- package/dist/lanes/environment-coverage.js +14 -0
- package/dist/lanes/environment.js +163 -0
- package/dist/lanes/field-contract.js +223 -0
- package/dist/lanes/field-coverage.js +27 -0
- package/dist/lanes/field.js +374 -0
- package/dist/lanes/form-contract.js +97 -0
- package/dist/lanes/form-coverage.js +16 -0
- package/dist/lanes/form.js +185 -0
- package/dist/lanes/lane-ids.js +34 -0
- package/dist/lanes/list-view-contract.js +175 -0
- package/dist/lanes/list-view-coverage.js +20 -0
- package/dist/lanes/list-view-shapes.js +1207 -0
- package/dist/lanes/list-view.js +578 -0
- package/dist/lanes/meta-contract.js +85 -0
- package/dist/lanes/meta.js +255 -0
- package/dist/lanes/model-contract.js +168 -0
- package/dist/lanes/model-coverage.js +20 -0
- package/dist/lanes/model.js +986 -0
- package/dist/lanes/online-js-contract.js +99 -0
- package/dist/lanes/online-js-coverage.js +28 -0
- package/dist/lanes/online-js.js +127 -0
- package/dist/lanes/report-contract.js +144 -0
- package/dist/lanes/report-coverage.js +21 -0
- package/dist/lanes/report.js +476 -0
- package/dist/lanes/rule-graph.js +1846 -0
- package/dist/lanes/rule-lifecycle-contract.js +92 -0
- package/dist/lanes/rule-lifecycle-coverage.js +20 -0
- package/dist/lanes/rule-lifecycle.js +176 -0
- package/dist/lanes/runtime-data-contract.js +264 -0
- package/dist/lanes/runtime-data-coverage.js +25 -0
- package/dist/lanes/runtime-data.js +1054 -0
- package/dist/lanes/workflow-contract.js +223 -0
- package/dist/lanes/workflow-coverage.js +40 -0
- package/dist/lanes/workflow.js +1813 -0
- package/dist/online-js-layout.js +58 -0
- package/dist/online-js-source.js +276 -0
- package/dist/package-tool.js +51 -0
- package/dist/package.js +73 -0
- package/dist/plan.js +73 -0
- package/dist/read.js +144 -0
- package/dist/redact.js +28 -0
- package/dist/rule-support.js +587 -0
- package/dist/runtime-support.js +134 -0
- package/dist/server.js +92 -0
- package/dist/session-manager.js +30 -0
- package/dist/session.js +149 -0
- package/dist/skills.js +112 -0
- package/dist/support.js +98 -0
- package/dist/tool-types.js +127 -0
- package/dist/tools.js +59 -0
- package/dist/usage-log.js +197 -0
- package/dist/wire.js +287 -0
- package/dist/workflow-support.js +99 -0
- package/dist/write-lease.js +26 -0
- package/dist/write-lock.js +109 -0
- package/dist/write.js +176 -0
- package/dist/zip.js +156 -0
- package/docs/tool-surface-map.md +42 -0
- package/package.json +71 -6
- package/skills/omc-acceptance-criteria.md +47 -0
- package/skills/omc-business-configuration.md +257 -0
- package/skills/omc-capabilities.md +197 -0
- package/skills/omc-capability-scouting.md +55 -0
- package/skills/omc-config-draft-review.md +171 -0
- package/skills/omc-five-piece-flow.md +35 -0
- package/skills/omc-glossary.md +86 -0
- package/skills/omc-refusals.md +110 -0
- package/skills/omc-requirement-analysis.md +161 -0
- package/skills/omc-requirement-vocabulary.md +51 -0
- package/skills/omc-start-here.md +82 -0
- package/skills/omc-tool-selection.md +119 -0
- package/skills/omc-write-hazards.md +87 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { assertDescriptionCarries, assertLaneContract, behaviorBinding, CONTRACT_FAMILY, CONTRACT_REFERENCE_VERSION } from "./contract-support.js";
|
|
2
|
+
import { LANES } from "./lane-ids.js";
|
|
3
|
+
/**
|
|
4
|
+
* B2-registration wire facts (live-proven + 8.6.26 source evidence, ticket 35).
|
|
5
|
+
* The get_by_code/method list split, the register body, and the id-resolved
|
|
6
|
+
* delete are the single source for the handler descriptions and the coverage
|
|
7
|
+
* declarations. The read surface covers extension-package-published methods:
|
|
8
|
+
* app-package import writes the same bizservice tables the read faces query
|
|
9
|
+
* (BizModelExportImportService → importPackageBizService), so a 二开 package
|
|
10
|
+
* BizMethod is read back identically to a designer-registered one.
|
|
11
|
+
*/
|
|
12
|
+
export const B2_WIRE = Object.freeze({
|
|
13
|
+
getShape: "get_by_code + method list_by_service_code (filterFlag=false keeps platform-injected params raw; a failed method list does not block the service readback)",
|
|
14
|
+
registerBody: "service/create {code,name,adapterCode,description,configJson?} (adapterCode empty → 500005 业务服务关联适配器编码为空, live 2026-09-12; default INTERNAL = local extension adapter) + optional method/create {serviceCode,code,name,configJson?,inputParametersJson?,outputParametersJson?}",
|
|
15
|
+
updateShape: "service/update {id,…} (BizServiceModel, id 必填 — BizServiceController.java:103-128 强制 id 并设置 modifiedBy): resolve the id via get_by_code first, patch name/serviceConfig(structured, adapter preflight as register)/metadata, then confirm via get_by_code; serviceCategoryId/shared/userIdList/modifierList pass through verbatim (never silently dropped); an absent service answers the live 500001 envelope before any update write, and a serviceConfig write on a non-whitelisted adapter (e.g. INTERNAL) is refused before the update write (read-only id resolution may precede; zero writes either way)",
|
|
16
|
+
requiredFields: "designer-parity requireds (user directive 2026-09-14): service.register requires name (非空, 中文≤50 — BizServiceController.java:84-112 服务端同样强制), adapterCode, and serviceCategoryId (设计器「所属目录」必填; resolve via service.category.list — the virtual「全部」row has an empty id and is NOT a valid category); every source-evidenced native adapter requires serviceConfig; methodName requires methodConfig for RESTFUL/DATA_SQL/DATA_TABLE/SAP/KAFKA; SOAP is the exception because methods are WSDL dynamically discovered and have no fixed method config; INTERNAL method creation stays extension-package import, not a fake config shell",
|
|
17
|
+
writeFaceCodec: "ticket 92 (ADR 0001): service configJson is structured→PLAINTEXT (auth+commonlist stay as sent); method configJson is structured→AES-128-ECB+Base64 with the controller static key (BizServiceMethodController.java:546-550; AESUtils.java:18-51) — a plaintext payload silently decrypts to NULL and is stored NULL, so the raw-string face is refused at dry-lint (zero wire). Enum representation: the WIRE form is the INTEGER index (HttpType/RequestBodyType/BizServiceLocationType are @JsonValue int getIndex() + @JsonCreator get(int); platform built-in rows store httpType:0 / position:3; NOT the name — writing the name leaves the designer field unparseable, live 8.6.26 round19). The tool ACCEPTS the name (tool-speak) and ENCODES to the integer on write; the READ side decodes integer→canonical name (ADR 0002 cross-version decode)",
|
|
18
|
+
adapterWriteWhitelist: "designer/source-evidenced writable adapters are RESTFUL, DATA_SQL, DATA_TABLE, SAP, KAFKA, and SOAP service configuration. RESTFUL/INTERNAL service auth+commonlist.url and RESTFUL/INTERNAL method HTTP config; DATA_SQL/DATA_TABLE commonlist.databaseConnectionPoolCode with SQL method config; SAP commonlist.sapConnectionPoolCode with functionName/returnType method config; KAFKA commonlist.kafkaConnectionPoolCode with sendMode/connectTime/retryTimes/topic method config; SOAP service auth+commonlist.url and WSDL-native method discovery only (no fabricated fixed method config). INTERNAL method creation remains extension-package import → outside this write face",
|
|
19
|
+
parameterFace: "structured parameter arrays serialize to input/outputParametersJson; RESTFUL parameters MUST carry configJson.position (missing → invoke NPE) and position=URL_VARIABLE(1) is refused (runtime 501007, no branch); required is three-state passthrough (true/false/absent — absent is NOT coerced to false, fwb §2)",
|
|
20
|
+
deleteShape: "service/delete?id=: resolve the id via get_by_code first, then delete by id, then confirm absence",
|
|
21
|
+
deleteAbsenceError: "get_by_code answers 500001 业务服务不存在 when the service is gone",
|
|
22
|
+
methodRowShape: "method rows decode configJson/inputParametersJson/outputParametersJson (BizServiceMethodModel string columns) and carry code/name/serviceCode/referenced; filterFlag=true would strip X-API-TenantId/X-API-AuthToken/X-API-ScenarioCode/apiType/pageIndex/pageSize and mark referenced",
|
|
23
|
+
parameterFaceGate: "the rule publish dry gate (550018 checkBizRuleIsEnable→filterProertyVo) rejects a mapping whose serviceMethodParameterCode is missing from the method's declared parameter face — service.register declares it via methodInputParameters/methodOutputParameters (live 2026-09-12: parameterless shell + inputMappings → 550018)",
|
|
24
|
+
readCoversExtensionMethods: "extension packages publish into the same bizservice tables via app-package import (importPackageBizService), so service.get reads back 二开-published BizMethods; adapterCode INTERNAL(6) is the local extension adapter (ProtocolAdapterType)",
|
|
25
|
+
registrationShellBoundary: "a source-evidenced native adapter configuration is complete only when its adapter-specific service config is present; RESTFUL/DATA_SQL/DATA_TABLE/SAP/KAFKA also require their adapter-specific method config for a named method; SOAP methods are WSDL-discovered rather than fixed configJson; INTERNAL method creation remains extension-package import. A fully configured native method is a complete, bindable BizMethod; a name/parameter-face-only registration shell is NOT a published BizMethod and must never be bound",
|
|
26
|
+
categoryCrud: "ticket 103: category/update {id,name} (missing id → 501052; duplicate name → 501004, BizServiceCategoryServiceImpl.save:54-63) and category/delete?id= (services under the category → 501003 业务服务目录下存在集成服务,不可删除!BizServiceFacadeImpl.java:196-207 — blocked, no cascade); the platform NEVER validates a service's serviceCategoryId (BizServiceServiceImpl.update:251 writes it verbatim), so register/update refuse a dangling id (bizservice-category-dangling) with zero writes after a read-only list resolution",
|
|
27
|
+
dbConnPoolCrud: "ticket 104: dbconnpool list/create/update/delete (/api/api/bizservice/dbconnpool/*, BizDatabaseConnectionPoolController). The RAW list face returns the password column UNMASKED — the tool strips it (explicit field whitelist; credentials never echo, never enter artifacts). Platform update is a FULL-ROW overwrite (BizDatabaseConnectionPoolServiceImpl.update:135-168 carries only createdTime) → the tool echoes untouched columns including the stored password ciphertext (a name-only update cannot wipe jdbcUrl/username/credentials). delete is blocked with 502006 while any service config references the pool code (BizServiceFacadeImpl delete:173-189 — no cascade); name empty → 502004, code invalid → 502003, duplicate → 502002 (save:103-118). DATA_SQL/DATA_TABLE serviceConfig.commonlist.databaseConnectionPoolCode gets a fail-closed existence preflight (bizservice-dbconnpool-dangling, zero writes)",
|
|
28
|
+
discoveryFaces: "ticket 105: /bizservice/service/adapter_config answers a JSON STRING of every registered protocol adapter {code,name,config:{authList,commonList,serviceActionList,methodActionList}} (BizServiceController.java:329-344, AdapterConfigParam.java:16-181; with sqlConfigEnabled the platform removes DATA_SQL/DATA_TABLE — readback verbatim) — the SAME source service.register's adapter preflight enforces, so the faces cannot drift. get_tablename_list / get_table_column (BizServiceMethodController.java:503-560) serve DATA_TABLE services only: a DATA_SQL service answers 501010 业务服务不为DataTable类型 (evidence correction — the research doc's 'DATA_SQL table discovery' reading was wrong), and get_table_column answers GENERATED SQL TEMPLATES (DataTableSqlModel{sql,sqlType ∈ SELECT/INSERT/UPDATE/DELETE/UPSERT}), not column metadata. All strictly read-only (zero POST calls)",
|
|
29
|
+
ieFaces: "ticket 106: the IE chain is export (POST /bizservice/service/export {serviceCodes:[]} → ZIP stream: manifest.json + version.md, BizServiceIEController.java:110-148), upload (POST /api/runtime/query/upload_file, multipart field `file`, answers a PLAIN STRING refId — QueryRuntimeController.java:2414-2428), check ({fileName,overWrite,modifyServiceCodes} → BizServiceIEMsgModel{modifyServiceCodes[isRepeated],missedDataSourceCodes,missedUserList}), import ({fileName,overWrite,modifyServiceCodes,groupId}). Every refId is ONE-SHOT: downloadFile(...,true) removes the refId→filename cache entry (FileOperateHelper2.java:43-57), so each check/import uploads its own fresh copy. The package carries services[]+methodsMap{} verbatim from the DB (service configJson plaintext incl. auth values; method configJson stored PLAINTEXT — controller decrypts on create/update, BizServiceMethodController.java:142-143; the IE import path never AES-decrypts) and NEVER the connection-pool rows; a repeated code without overwrite/modify refuses 309008 (ErrorCode.java:698) and the rename regex is [a-zA-Z][a-zA-Z0-9_]{0,27} (INVALID_NAME 580001). Version gate truncates to major.minor (8.6.x↔8.6.y pass). Tool boundary: responses echo a secret-free package summary only — auth parameterlist VALUES are masked, the zip stays platform-shaped for round-trip and is referenced by path+sha256, never inlined",
|
|
30
|
+
testFace: "ticket 107: POST /bizservice/method/service_test {code, serviceCode, testInputParametersMap: Map<String,Object>} (BizServiceMethodController.java:398-412; BizServiceMethodVO.java:14-35) answers {success,msg,data:<adapter result>} (BizServiceFacadeImpl.java:426-464). It is a REAL execution, not a dry-run: BizBusService.invoke dispatches to the service's ProtocolAdapterRuntimeService — RESTFUL fires real HTTP (RestProtocolAdapterRuntimeServiceImpl.java:218-350), DATA_SQL/DATA_TABLE run real JDBC behind the cloudpivot.bizservice.sqlConfig.enabled switch (DataSql…:105-188), SOAP calls for real (Soap…:98-123), INTERNAL reuses the HTTP code path (Internal…:126-230). SAP/KAFKA runtimes are NOT evidenced on this face — refused, never guessed. ZERO config writes: the chain only reads h_biz_service/h_biz_service_method and writes async integration logs (BizBusServiceImpl.java:190-226,403-414). The tool is a governed write (real external side effects), validates testInputParametersMap against the declared parameter face (missing required / unknown key = zero service_test wire), refuses registration shells, and re-reads the method row to prove the config survived untouched",
|
|
31
|
+
});
|
|
32
|
+
const B2_SCOPE = "create readback delete";
|
|
33
|
+
export const B2_LANE_CONTRACT = Object.freeze({
|
|
34
|
+
lane: LANES.b2,
|
|
35
|
+
family: CONTRACT_FAMILY,
|
|
36
|
+
referenceVersion: CONTRACT_REFERENCE_VERSION,
|
|
37
|
+
endpoints: Object.freeze({
|
|
38
|
+
getByCode: "bizServiceGetByCode",
|
|
39
|
+
methodList: "bizServiceMethodList",
|
|
40
|
+
create: "bizServiceCreate",
|
|
41
|
+
update: "bizServiceUpdate",
|
|
42
|
+
methodCreate: "bizServiceMethodCreate",
|
|
43
|
+
delete: "bizServiceDelete",
|
|
44
|
+
categoryList: "bizServiceCategoryList",
|
|
45
|
+
categoryCreate: "bizServiceCategoryCreate",
|
|
46
|
+
categoryUpdate: "bizServiceCategoryUpdate",
|
|
47
|
+
categoryDelete: "bizServiceCategoryDelete",
|
|
48
|
+
dbConnPoolList: "bizDbConnPoolList",
|
|
49
|
+
dbConnPoolCreate: "bizDbConnPoolCreate",
|
|
50
|
+
dbConnPoolUpdate: "bizDbConnPoolUpdate",
|
|
51
|
+
dbConnPoolDelete: "bizDbConnPoolDelete",
|
|
52
|
+
adapterConfig: "bizServiceAdapterConfig",
|
|
53
|
+
tableList: "bizServiceTableList",
|
|
54
|
+
tableSql: "bizServiceTableSql",
|
|
55
|
+
export: "bizServiceExport",
|
|
56
|
+
check: "bizServiceCheck",
|
|
57
|
+
import: "bizServiceImport",
|
|
58
|
+
ieUpload: "runtimeQueryUploadFile",
|
|
59
|
+
methodTest: "bizServiceMethodTest",
|
|
60
|
+
}),
|
|
61
|
+
wire: Object.freeze({
|
|
62
|
+
getShape: B2_WIRE.getShape,
|
|
63
|
+
registerBody: B2_WIRE.registerBody,
|
|
64
|
+
updateShape: B2_WIRE.updateShape,
|
|
65
|
+
requiredFields: B2_WIRE.requiredFields,
|
|
66
|
+
writeFaceCodec: B2_WIRE.writeFaceCodec,
|
|
67
|
+
adapterWriteWhitelist: B2_WIRE.adapterWriteWhitelist,
|
|
68
|
+
parameterFace: B2_WIRE.parameterFace,
|
|
69
|
+
deleteShape: B2_WIRE.deleteShape,
|
|
70
|
+
deleteAbsenceError: B2_WIRE.deleteAbsenceError,
|
|
71
|
+
methodRowShape: B2_WIRE.methodRowShape,
|
|
72
|
+
parameterFaceGate: B2_WIRE.parameterFaceGate,
|
|
73
|
+
readCoversExtensionMethods: B2_WIRE.readCoversExtensionMethods,
|
|
74
|
+
registrationShellBoundary: B2_WIRE.registrationShellBoundary,
|
|
75
|
+
categoryCrud: B2_WIRE.categoryCrud,
|
|
76
|
+
dbConnPoolCrud: B2_WIRE.dbConnPoolCrud,
|
|
77
|
+
discoveryFaces: B2_WIRE.discoveryFaces,
|
|
78
|
+
ieFaces: B2_WIRE.ieFaces,
|
|
79
|
+
testFace: B2_WIRE.testFace,
|
|
80
|
+
}),
|
|
81
|
+
wireBindings: Object.freeze({
|
|
82
|
+
getShape: Object.freeze([behaviorBinding("test/b2-method-get-update.test.ts#ticket 94/95: method.get decodes one method", assertB2Contract)]),
|
|
83
|
+
registerBody: Object.freeze([behaviorBinding("test/b2-writeface-codec.test.ts#ticket 92 wire: service.register builds a COMPLETE RESTFUL BizMethod", assertB2Contract)]),
|
|
84
|
+
updateShape: Object.freeze([behaviorBinding("test/b2-service-update.test.ts#ticket 93 wire: metadata passes through verbatim", assertB2Contract)]),
|
|
85
|
+
requiredFields: Object.freeze([behaviorBinding("test/b2-category-and-requireds.test.ts#rider requireds: missing name/serviceCategoryId refuses at zero wire", assertB2Contract)]),
|
|
86
|
+
writeFaceCodec: Object.freeze([behaviorBinding("test/b2-writeface-codec.test.ts#ticket 92 pure codec: method config required keys + enum encodes to the WIRE integer index", assertB2Contract)]),
|
|
87
|
+
adapterWriteWhitelist: Object.freeze([behaviorBinding("test/b2-writeface-codec.test.ts#ticket 92 pure codec: adapter whitelist names the support face", assertB2Contract)]),
|
|
88
|
+
parameterFace: Object.freeze([behaviorBinding("test/b2-writeface-codec.test.ts#ticket 92 pure codec: parameter face", assertB2Contract)]),
|
|
89
|
+
deleteShape: Object.freeze([behaviorBinding("test/b2-method-delete.test.ts#ticket 97: service.delete reads the method list back empty", assertB2Contract)]),
|
|
90
|
+
deleteAbsenceError: Object.freeze([behaviorBinding("test/b2-method-get-update.test.ts#ticket 94/95: absent method reads back as structured absence; raw method config refuses", assertB2Contract)]),
|
|
91
|
+
methodRowShape: Object.freeze([behaviorBinding("test/b2-method-get-update.test.ts#ticket 94/95: method.get decodes one method", assertB2Contract)]),
|
|
92
|
+
parameterFaceGate: Object.freeze([behaviorBinding("test/b2-rule-mapping-required.test.ts#ticket 96: required mirrors from the parameter face", assertB2Contract)]),
|
|
93
|
+
readCoversExtensionMethods: Object.freeze([behaviorBinding("test/b2-writeface-codec.test.ts#ticket 92 compatibility: plain INTERNAL shell registration still works", assertB2Contract)]),
|
|
94
|
+
registrationShellBoundary: Object.freeze([behaviorBinding("test/b2-rule-mapping-required.test.ts#ticket 96: a RESTFUL registration shell", assertB2Contract)]),
|
|
95
|
+
categoryCrud: Object.freeze([behaviorBinding("test/ticket-103-category-crud.test.ts#category update renames and reads back", assertB2Contract)]),
|
|
96
|
+
dbConnPoolCrud: Object.freeze([behaviorBinding("test/ticket-104-dbconnpool-crud.test.ts#dbconnpool update is full-row overwrite semantics", assertB2Contract)]),
|
|
97
|
+
discoveryFaces: Object.freeze([behaviorBinding("test/ticket-105-discovery.test.ts#get_tablename_list and get_table_column serve DATA_TABLE services", assertB2Contract)]),
|
|
98
|
+
ieFaces: Object.freeze([behaviorBinding("test/ticket-106-bizservice-ie.test.ts#contract pins the IE face tokens", assertB2Contract)]),
|
|
99
|
+
testFace: Object.freeze([behaviorBinding("test/ticket-107-method-test.test.ts#contract pins the test-face tokens", assertB2Contract)]),
|
|
100
|
+
}),
|
|
101
|
+
evidence: Object.freeze([
|
|
102
|
+
".scratch/omc-route-wayfinder/leg2-closeout.md",
|
|
103
|
+
"packages/omc-cli/src/lanes/b2-registration.ts",
|
|
104
|
+
"ticket 35 (8.6.26 source): BizServiceMethodController.listByServiceCode filterFlag semantics; BizServiceMethodModel configJson/inputParametersJson/outputParametersJson string columns; BizModelExportImportService writes biz services via importPackageBizService (extension-package methods land in the same tables); ProtocolAdapterType INTERNAL(6) local extension adapter",
|
|
105
|
+
"ticket 35 (live 2026-09-12): service/create with empty adapterCode → 500005 业务服务关联适配器编码为空 (INTERNAL accepted); rule publish dry gate 550018 rejects a parameterless registration shell bound with inputMappings (checkBizRuleIsEnable→filterProertyVo quotes the declared parameter face)",
|
|
106
|
+
"ticket 92 (8.6.26 source + fwb readback): research/bizservice-integration-backend-face.md (BizServiceController service configJson plaintext; BizServiceMethodController.java:104-105,546-550 + AESUtils.java:18-51 method configJson AES-128-ECB/Base64 entry, plaintext silently NULLs; adapter required keys file:line; URL_VARIABLE runtime 501007); evidence/bizservice-rule-binding-fwb-20260914.md (fwb 8.6.39 authoritative readback: configJson plaintext, integer enums httpType:0/requestBodyType:1, required three-state); s32-restful-contract.ts:20 (live 8.6.26 name-form enums + parameter position); ADR 0001/0002",
|
|
107
|
+
"ticket 93 (8.6.26 source): BizServiceController.java:103-136 service/update requires id, sets modifiedBy, saves and re-gets; BizServiceHeaderModel carries shared/userIdList; BizServiceModel carries serviceCategoryId — metadata passes through verbatim",
|
|
108
|
+
]),
|
|
109
|
+
tools: Object.freeze({
|
|
110
|
+
"service.get": Object.freeze({
|
|
111
|
+
scope: "readback",
|
|
112
|
+
description: "B2 业务集成服务读回:get_by_code + 方法列表(filterFlag=false 原样;方法行解码 configJson/inputParametersJson/outputParametersJson,方法 configJson 读回为明文、枚举双表示解码为名字形——8.6.26 写侧 'Post'/8.6.39 读侧 0 都解码;方法列表失败不阻断服务读回)。读面覆盖二开扩展包发布的方法(同表存储;adapterCode=INTERNAL 是本地扩展适配器)。",
|
|
113
|
+
}),
|
|
114
|
+
"service.register": Object.freeze({
|
|
115
|
+
scope: B2_SCOPE,
|
|
116
|
+
description: "注册业务集成服务(`/bizservice/service/create`,body `{code,name,adapterCode,description,configJson?}`;adapterCode 空 → 500005)+ 可选方法(`/bizservice/method/create`,可带 `configJson`/`inputParametersJson`/`outputParametersJson`),并回读。serviceConfig 明文序列化(RESTFUL/INTERNAL/SOAP 需 auth+commonlist.url;DATA_SQL/DATA_TABLE 需 commonlist.databaseConnectionPoolCode;SAP 需 commonlist.sapConnectionPoolCode;KAFKA 需 commonlist.kafkaConnectionPoolCode),methodConfig 由工具 AES-128-ECB+Base64 加密(SOAP 方法由 WSDL 动态发现,无固定方法 configJson)。参数面结构化序列化;RESTFUL 每参数需 configJson.position,URL_VARIABLE 拒绝;required 三态透传。设计器同款必填:name(≤50)、adapterCode、serviceCategoryId;除 SOAP 动态方法外,各原生适配器带 methodName 时必带 methodConfig;INTERNAL 方法创建走二开扩展包导入,不在本写面;仅名字/参数面的注册壳不可绑定。",
|
|
117
|
+
}),
|
|
118
|
+
"service.update": Object.freeze({
|
|
119
|
+
scope: "update readback",
|
|
120
|
+
description: "更新业务集成服务(`/bizservice/service/update`,body BizServiceModel,id 必填):先 `get_by_code` 解析 id,可改名称与结构化 `serviceConfig`(RESTFUL/INTERNAL/SOAP 需 auth+commonlist.url;DATA_SQL/DATA_TABLE 需 databaseConnectionPoolCode;SAP 需 sapConnectionPoolCode;KAFKA 需 kafkaConnectionPoolCode;明文上送),服务元数据 `serviceCategoryId`/`shared`/`userIdList`/`modifierList` 通用透传不静默丢弃;写后 `get_by_code` 权威读回。传原始 configJson 字符串或白名单外 adapterCode 的 serviceConfig 一律本地拒绝(零写入)。",
|
|
121
|
+
}),
|
|
122
|
+
"method.get": Object.freeze({
|
|
123
|
+
scope: "method readback",
|
|
124
|
+
description: "按 serviceCode + methodCode 读取单个业务集成方法;解码 configJson 与 input/output 参数面为结构化对象。",
|
|
125
|
+
}),
|
|
126
|
+
"method.update": Object.freeze({
|
|
127
|
+
scope: "method update readback",
|
|
128
|
+
description: "原地更新业务集成方法(`/bizservice/method/update`):方法 configJson 由工具 AES 加密,参数面结构化序列化并回读;保留方法身份与规则引用。",
|
|
129
|
+
}),
|
|
130
|
+
"method.create": Object.freeze({
|
|
131
|
+
scope: "method create readback",
|
|
132
|
+
description: "在**已存在的业务服务**下新增方法(`/bizservice/method/create`):新写一个扩展接口通常不是新建服务,而是往已有服务里加方法。服务不存在 → refused(新增服务用 `service.register`);方法已存在 → refused(改用 `method.update`)。configJson 由工具 AES 加密,参数面结构化序列化并回读。",
|
|
133
|
+
}),
|
|
134
|
+
"method.delete": Object.freeze({
|
|
135
|
+
scope: "method delete readback",
|
|
136
|
+
description: "删除业务集成方法(`/bizservice/method/delete?id=`):先按 serviceCode 经方法列表解析方法 id,再删除,写后 `method.get`/方法列表确认缺失。方法仍被业务规则引用时平台如实拒绝(errcode 500108 业务方法已绑定默认方法,不可删除——BizServiceMethodController.java:246-272),规则与绑定保持原状。",
|
|
137
|
+
}),
|
|
138
|
+
"service.category.list": Object.freeze({
|
|
139
|
+
scope: "readback",
|
|
140
|
+
description: "业务集成服务分类(所属目录)列表:`/bizservice/category/list`。设计器要求每个服务挂在一个实体分类下(「全部」是虚拟项、id 为空,不能作为所属目录);`service.register` 的 `serviceCategoryId` 从这里解析。",
|
|
141
|
+
}),
|
|
142
|
+
"service.category.create": Object.freeze({
|
|
143
|
+
scope: "create readback",
|
|
144
|
+
description: "新建业务集成服务分类(所属目录):`/bizservice/category/create`,body `{name}`(非空,中文≤50,BizServiceCategoryController.java:43-176);建后用 category/list 读回确认。分类是服务注册的前置依赖——没有实体分类时先建目录再注册服务。",
|
|
145
|
+
}),
|
|
146
|
+
"service.category.update": Object.freeze({
|
|
147
|
+
scope: "update readback",
|
|
148
|
+
description: "重命名业务集成服务分类(所属目录):`/bizservice/category/update`,body `{id,name}`(id 从 service.category.list 解析;非空,中文≤50)。id 不存在 → 501052;重名 → 501004(BizServiceCategoryController.java:109-140 + BizServiceCategoryServiceImpl.save:54-63),平台拒绝原样透出;写后 category/list 按 id 读回确认改名。",
|
|
149
|
+
}),
|
|
150
|
+
"service.category.delete": Object.freeze({
|
|
151
|
+
scope: "delete readback",
|
|
152
|
+
description: "删除业务集成服务分类(所属目录):`/bizservice/category/delete?id=`。目录下仍有集成服务时平台拒绝(errcode 501003 业务服务目录下存在集成服务,不可删除!BizServiceFacadeImpl.java:196-207——阻止删除、无级联),拒绝原样透出;删除后 category/list 读回缺失确认。",
|
|
153
|
+
}),
|
|
154
|
+
"service.dbconnpool.list": Object.freeze({
|
|
155
|
+
scope: "readback",
|
|
156
|
+
description: "数据库连接池列表:`/bizservice/dbconnpool/list`。平台原始读面**不脱敏**口令列——本工具读回用显式字段白名单剥离 password(凭据永不回显)。DATA_SQL/DATA_TABLE 服务的 commonlist.databaseConnectionPoolCode 从这里解析。",
|
|
157
|
+
}),
|
|
158
|
+
"service.dbconnpool.create": Object.freeze({
|
|
159
|
+
scope: "create readback",
|
|
160
|
+
description: "新建数据库连接池:`/bizservice/dbconnpool/create`(BizDatabaseConnectionPoolModel 全body:code/name/databaseType/jdbcUrl/username/password?/description?/datasourceType?/externInfo?)。名称空 → 502004、编码无效 → 502003、重复 → 502002;jdbcUrl 走服务端白名单校验;datasourceType 缺省 DATABASE。口令只上送、读回永不回显。",
|
|
161
|
+
}),
|
|
162
|
+
"service.dbconnpool.update": Object.freeze({
|
|
163
|
+
scope: "update readback",
|
|
164
|
+
description: "更新数据库连接池:`/bizservice/dbconnpool/update`。平台 update 是**整行覆写**(BizDatabaseConnectionPoolServiceImpl.update:135-168 只携带 createdTime)——工具按当前行回显所有未改列(含存量口令密文),name-only 更新不会抹掉 jdbcUrl/username/凭据;写后 list 读回(不含口令)。",
|
|
165
|
+
}),
|
|
166
|
+
"service.dbconnpool.delete": Object.freeze({
|
|
167
|
+
scope: "delete readback",
|
|
168
|
+
description: "删除数据库连接池:`/bizservice/dbconnpool/delete?id=`。被任一业务服务 config 引用(dbConnPoolCode)时平台拒绝(errcode 502006 数据库连接池已经被业务服务引用,BizServiceFacadeImpl:173-189——阻止、无级联);删除后 list 读回缺失确认。",
|
|
169
|
+
}),
|
|
170
|
+
"service.adapter_config": Object.freeze({
|
|
171
|
+
scope: "readback",
|
|
172
|
+
description: "适配器配置发现(设计器同源):`/bizservice/service/adapter_config` 返回 JSON 字符串(已解码),每个适配器 {code,name,config:{authList,commonList,serviceActionList,methodActionList}}——commonList/authList 的 code+required 就是 service.register 预检所依据的必需键(同源无漂移)。RESTFUL:url 必填 + basic/oauth_password/oauth_client/customer 鉴权面;DATA_SQL:databaseConnectionPoolCode 必填、无服务级鉴权(sqlConfigEnabled 开启时平台会移除 DATA_SQL/DATA_TABLE,读回原样)。纯只读。",
|
|
173
|
+
}),
|
|
174
|
+
"service.table_list": Object.freeze({
|
|
175
|
+
scope: "readback",
|
|
176
|
+
description: "DATA_TABLE 库表发现:`/bizservice/method/get_tablename_list?serviceCode=`(分页/关键词可选)读回表名 List<String>。仅服务 DATA_TABLE 服务——DATA_SQL 服务被平台拒绝(errcode 501010 业务服务不为DataTable类型,BizServiceMethodController.java:503-537;研究文档的「DATA_SQL 表发现」系误记)。纯只读。",
|
|
177
|
+
}),
|
|
178
|
+
"service.table_sql": Object.freeze({
|
|
179
|
+
scope: "readback",
|
|
180
|
+
description: "表 SQL 模板发现:`/bizservice/method/get_table_column?serviceCode=&tableName=`。端点名虽为 column,实际返回**生成的 SQL 模板**(DataTableSqlModel{sql,sqlType ∈ SELECT/INSERT/UPDATE/DELETE/UPSERT},BizServiceFacadeImpl.getDataTableSql:889-910),不是列元数据;同样仅 DATA_TABLE 服务(501010)。纯只读。",
|
|
181
|
+
}),
|
|
182
|
+
"service.delete": Object.freeze({
|
|
183
|
+
scope: B2_SCOPE,
|
|
184
|
+
description: "删除业务集成服务(`/bizservice/service/delete?id=`):先 `get_by_code` 解析 id,再按 id 删除,最后确认服务行缺失,并按 serviceCode 显式回读方法列表为空(方法级联缺失)后才报告 absent。",
|
|
185
|
+
}),
|
|
186
|
+
"service.export": Object.freeze({
|
|
187
|
+
scope: "export readback",
|
|
188
|
+
description: "导出业务集成服务包(`/bizservice/service/export`,body `{serviceCodes:[]}`,返回 ZIP 流:manifest.json + version.md)。未知编码平台会静默跳过——工具先逐码 `get_by_code` 预检,缺码即 refused(`bizservice-export-code-unresolved`,零导出调用)。产物落盘会话 artifacts 目录,回执只给 path/bytes/sha256 与脱敏包摘要(auth parameterlist 值掩码,连接池口令永不入包——平台导出只搬 services+methodsMap)。包内 method configJson 是平台存储形(明文),导入往返需要它,工具响应永不内联包内容。",
|
|
189
|
+
}),
|
|
190
|
+
"service.check": Object.freeze({
|
|
191
|
+
scope: "readback",
|
|
192
|
+
description: "导入前校验集成服务包(`/bizservice/service/check`,body `{fileName,overWrite,modifyServiceCodes}`):先本地解析 zip(坏包/缺 manifest 即 refused,零上传),再经 `/api/runtime/query/upload_file`(multipart 字段 `file`,返回纯字符串 refId;refId 一次性,check 与 import 各自上传)上送后调用平台。回执 BizServiceIEMsgModel:重码标 isRepeated、改名建议、缺失数据源/用户清单。纯校验零写入。",
|
|
193
|
+
}),
|
|
194
|
+
"service.import": Object.freeze({
|
|
195
|
+
scope: "import readback",
|
|
196
|
+
description: "导入业务集成服务包(治理写,`/bizservice/service/import`,body `{fileName,overWrite,modifyServiceCodes,groupId}`):manifest 解析后、上传前用 `get_by_code` 读取最终 service/method code;`overWrite=false` 发现冲突即 blocker `bizservice-import-conflict`,零上传/零 import(check 保持独立语义);`overWrite=true` 明确回执覆盖清单。写后按 manifest 权威读回 service/method code 与 input/output 参数面,读回异常不吞并报告已完成部分。导入不级联连接池:missedDataSourceCodes 如实报告。",
|
|
197
|
+
}),
|
|
198
|
+
"method.test": Object.freeze({
|
|
199
|
+
scope: "test readback",
|
|
200
|
+
description: "设计器测试面:对已配置的业务集成方法发起一次真实试跑(治理写——会真调用外部系统;`/bizservice/method/service_test`,body `{serviceCode, code, testInputParametersMap}`,回显平台内层 `{success,msg,data}`)。testInputParametersMap 按方法声明参数面 fail-closed 校验:缺必填入参/未知参数键/注册壳方法/SAP、KAFKA(该面无运行时证据)一律本地拒绝零试跑调用。试跑**零配置写**(链路只读 h_biz_service/h_biz_service_method,仅异步记集成日志),读回面复核方法 config 原样未动;RESTFUL/DATA_SQL/DATA_TABLE/SOAP/INTERNAL 真执行(DATA_SQL/DATA_TABLE 受平台 sqlConfig 开关限制)。服务级 testBizService 是人员/部门回显测试,不属本面。",
|
|
201
|
+
}),
|
|
202
|
+
}),
|
|
203
|
+
});
|
|
204
|
+
export function assertB2Contract() {
|
|
205
|
+
assertLaneContract(B2_LANE_CONTRACT);
|
|
206
|
+
if (!B2_WIRE.deleteShape.includes("get_by_code"))
|
|
207
|
+
throw new Error("b2 contract must pin the delete id-resolution to get_by_code");
|
|
208
|
+
if (!B2_WIRE.registrationShellBoundary.includes("shell"))
|
|
209
|
+
throw new Error("b2 contract must state the registration-shell boundary");
|
|
210
|
+
if (!B2_WIRE.registrationShellBoundary.includes("bindable BizMethod"))
|
|
211
|
+
throw new Error("b2 contract must state that designer RESTFUL/DATA_SQL methods are complete bindable BizMethods (ADR 0001)");
|
|
212
|
+
if (!B2_WIRE.parameterFaceGate.includes("550018"))
|
|
213
|
+
throw new Error("b2 contract must pin the parameter-face publish gate");
|
|
214
|
+
if (!B2_WIRE.writeFaceCodec.includes("AES-128-ECB"))
|
|
215
|
+
throw new Error("b2 contract must pin the method-config AES boundary");
|
|
216
|
+
if (!B2_WIRE.writeFaceCodec.includes("INTEGER index"))
|
|
217
|
+
throw new Error("b2 contract must pin the WIRE integer-index enum form");
|
|
218
|
+
if (!B2_WIRE.writeFaceCodec.includes("httpType:0"))
|
|
219
|
+
throw new Error("b2 contract must pin the fwb integer readback decode");
|
|
220
|
+
if (!B2_WIRE.adapterWriteWhitelist.startsWith("designer/source-evidenced writable adapters are RESTFUL, DATA_SQL, DATA_TABLE, SAP, KAFKA, and SOAP"))
|
|
221
|
+
throw new Error("b2 contract must pin the adapter write whitelist");
|
|
222
|
+
if (!B2_WIRE.parameterFace.includes("URL_VARIABLE"))
|
|
223
|
+
throw new Error("b2 contract must pin the URL_VARIABLE preflight refusal");
|
|
224
|
+
if (!B2_WIRE.updateShape.includes("serviceCategoryId"))
|
|
225
|
+
throw new Error("b2 contract must pin the update metadata passthrough");
|
|
226
|
+
if (!B2_WIRE.requiredFields.includes("serviceCategoryId"))
|
|
227
|
+
throw new Error("b2 contract must pin the designer-parity requireds");
|
|
228
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.category.list", ["category/list", "所属目录"]);
|
|
229
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.category.create", ["category/create", "name"]);
|
|
230
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.category.update", ["category/update", "501052", "501004"]);
|
|
231
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.category.delete", ["category/delete", "501003", "级联"]);
|
|
232
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.dbconnpool.list", ["dbconnpool/list", "password", "databaseConnectionPoolCode"]);
|
|
233
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.dbconnpool.create", ["dbconnpool/create", "502004", "502003", "502002"]);
|
|
234
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.dbconnpool.update", ["dbconnpool/update", "整行覆写", "回显"]);
|
|
235
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.dbconnpool.delete", ["dbconnpool/delete", "502006"]);
|
|
236
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.adapter_config", ["adapter_config", "同源", "authList"]);
|
|
237
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.table_list", ["get_tablename_list", "501010", "DATA_TABLE"]);
|
|
238
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.table_sql", ["get_table_column", "SQL 模板", "DataTableSqlModel"]);
|
|
239
|
+
if (!B2_WIRE.categoryCrud.includes("bizservice-category-dangling"))
|
|
240
|
+
throw new Error("b2 contract must pin the dangling-category preflight (ticket 103)");
|
|
241
|
+
if (!B2_WIRE.dbConnPoolCrud.includes("bizservice-dbconnpool-dangling"))
|
|
242
|
+
throw new Error("b2 contract must pin the dangling-dbconnpool preflight (ticket 104)");
|
|
243
|
+
if (!B2_WIRE.dbConnPoolCrud.includes("FULL-ROW overwrite"))
|
|
244
|
+
throw new Error("b2 contract must pin the dbconnpool full-row overwrite echo");
|
|
245
|
+
if (!B2_WIRE.discoveryFaces.includes("501010"))
|
|
246
|
+
throw new Error("b2 contract must pin the DATA_TABLE-only discovery gate (ticket 105)");
|
|
247
|
+
if (!B2_WIRE.discoveryFaces.includes("SQL TEMPLATES"))
|
|
248
|
+
throw new Error("b2 contract must pin get_table_column's SQL-template semantics");
|
|
249
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.get", ["get_by_code", "方法列表", "filterFlag=false", "INTERNAL", "扩展包"]);
|
|
250
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.register", ["bizservice/service/create", "bizservice/method/create", "500005", "inputParametersJson", "INTERNAL", "注册壳", "AES-128-ECB", "RESTFUL", "DATA_SQL", "DATA_TABLE", "SAP", "KAFKA", "SOAP", "URL_VARIABLE"]);
|
|
251
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.update", ["service/update", "get_by_code", "serviceConfig", "serviceCategoryId", "userIdList"]);
|
|
252
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "method.get", ["serviceCode", "methodCode", "configJson", "参数面"]);
|
|
253
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "method.update", ["method/update", "AES", "参数面", "规则引用"]);
|
|
254
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "method.create", ["method/create", "已存在", "方法", "service.register"]);
|
|
255
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "method.delete", ["method/delete", "500108", "引用", "BizServiceMethodController"]);
|
|
256
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.delete", ["service/delete", "get_by_code", "缺失", "方法级联"]);
|
|
257
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.export", ["service/export", "serviceCodes", "bizservice-export-code-unresolved", "sha256"]);
|
|
258
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.check", ["service/check", "upload_file", "multipart", "refId", "isRepeated"]);
|
|
259
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "service.import", ["service/import", "bizservice-import-conflict", "零上传", "覆盖清单", "参数面", "get_by_code"]);
|
|
260
|
+
if (!B2_WIRE.ieFaces.includes("multipart"))
|
|
261
|
+
throw new Error("b2 contract must pin the IE multipart upload face (ticket 106)");
|
|
262
|
+
if (!B2_WIRE.ieFaces.includes("309008"))
|
|
263
|
+
throw new Error("b2 contract must pin the IE repeated-code refusal");
|
|
264
|
+
if (!B2_WIRE.ieFaces.includes("one-shot") && !B2_WIRE.ieFaces.includes("ONE-SHOT"))
|
|
265
|
+
throw new Error("b2 contract must pin the one-shot refId semantics");
|
|
266
|
+
if (!B2_WIRE.ieFaces.includes("connection-pool"))
|
|
267
|
+
throw new Error("b2 contract must pin that pool rows never travel in the IE package");
|
|
268
|
+
assertDescriptionCarries(B2_LANE_CONTRACT, "method.test", ["service_test", "testInputParametersMap", "零配置写", "SAP", "参数面"]);
|
|
269
|
+
if (!B2_WIRE.testFace.includes("REAL execution"))
|
|
270
|
+
throw new Error("b2 contract must pin the real-execution semantics of the test face");
|
|
271
|
+
if (!B2_WIRE.testFace.includes("SAP/KAFKA"))
|
|
272
|
+
throw new Error("b2 contract must pin the SAP/KAFKA evidence gap on the test face");
|
|
273
|
+
if (!B2_WIRE.getShape.includes("filterFlag=false"))
|
|
274
|
+
throw new Error("b2 contract must pin the method-list filterFlag=false read shape");
|
|
275
|
+
if (!B2_WIRE.registerBody.includes("service/create"))
|
|
276
|
+
throw new Error("b2 contract must pin the register endpoint");
|
|
277
|
+
if (!B2_WIRE.updateShape.includes("service/update"))
|
|
278
|
+
throw new Error("b2 contract must pin the update endpoint");
|
|
279
|
+
if (!B2_WIRE.deleteAbsenceError.includes("500001"))
|
|
280
|
+
throw new Error("b2 contract must pin the service-absent errcode");
|
|
281
|
+
if (!B2_WIRE.methodRowShape.includes("filterFlag=true"))
|
|
282
|
+
throw new Error("b2 contract must pin the method-row filterFlag semantics");
|
|
283
|
+
if (!B2_WIRE.readCoversExtensionMethods.includes("importPackageBizService"))
|
|
284
|
+
throw new Error("b2 contract must pin the extension-package read coverage");
|
|
285
|
+
if (!B2_WIRE.discoveryFaces.includes("adapter_config"))
|
|
286
|
+
throw new Error("b2 contract must pin the adapter discovery endpoint");
|
|
287
|
+
if (!B2_WIRE.ieFaces.includes("BizServiceIEController"))
|
|
288
|
+
throw new Error("b2 contract must pin the IE controller");
|
|
289
|
+
if (!B2_WIRE.testFace.includes("service_test"))
|
|
290
|
+
throw new Error("b2 contract must pin the method-test endpoint");
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=b2-registration-contract.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { claim, declareLaneCoverage } from "./coverage-declaration.js";
|
|
2
|
+
import { B2_LANE_CONTRACT } from "./b2-registration-contract.js";
|
|
3
|
+
const T = B2_LANE_CONTRACT.tools;
|
|
4
|
+
export const B2_COVERAGE = declareLaneCoverage(B2_LANE_CONTRACT.lane, [
|
|
5
|
+
{
|
|
6
|
+
capability: "B2 service and method registration face (create/readback/delete) with the designer structured write face (RESTFUL, DATA_SQL, DATA_TABLE, SAP, KAFKA, SOAP; serviceConfig plaintext, methodConfig AES-128-ECB, SOAP methods WSDL-discovered)",
|
|
7
|
+
evidence: [".scratch/omc-route-wayfinder/leg2-closeout.md", "packages/omc-cli/src/lanes/b2-registration.ts", "packages/omc-cli/src/bizservice-config.ts", ".scratch/omc-app-management/research/bizservice-integration-backend-face.md", ".scratch/omc-app-management/evidence/bizservice-rule-binding-fwb-20260914.md"],
|
|
8
|
+
tools: [
|
|
9
|
+
claim("service.get", T["service.get"].scope),
|
|
10
|
+
claim("service.register", T["service.register"].scope),
|
|
11
|
+
claim("service.update", T["service.update"].scope),
|
|
12
|
+
claim("method.get", T["method.get"].scope),
|
|
13
|
+
claim("method.create", T["method.create"].scope),
|
|
14
|
+
claim("method.update", T["method.update"].scope),
|
|
15
|
+
claim("method.delete", T["method.delete"].scope),
|
|
16
|
+
claim("service.delete", T["service.delete"].scope),
|
|
17
|
+
claim("service.category.list", T["service.category.list"].scope),
|
|
18
|
+
claim("service.category.create", T["service.category.create"].scope),
|
|
19
|
+
claim("service.category.update", T["service.category.update"].scope),
|
|
20
|
+
claim("service.category.delete", T["service.category.delete"].scope),
|
|
21
|
+
claim("service.dbconnpool.list", T["service.dbconnpool.list"].scope),
|
|
22
|
+
claim("service.dbconnpool.create", T["service.dbconnpool.create"].scope),
|
|
23
|
+
claim("service.dbconnpool.update", T["service.dbconnpool.update"].scope),
|
|
24
|
+
claim("service.dbconnpool.delete", T["service.dbconnpool.delete"].scope),
|
|
25
|
+
claim("service.adapter_config", T["service.adapter_config"].scope),
|
|
26
|
+
claim("service.table_list", T["service.table_list"].scope),
|
|
27
|
+
claim("service.table_sql", T["service.table_sql"].scope),
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
capability: "B2 business-integration import/export face (ZIP package: export via multipart upload + check + governed import; one-shot refIds; secret-free tool responses)",
|
|
32
|
+
evidence: [
|
|
33
|
+
"packages/omc-cli/src/lanes/b2-registration.ts",
|
|
34
|
+
"packages/omc-cli/src/zip.ts",
|
|
35
|
+
"ticket 106 (8.6.26 source): BizServiceIEController.java:110-148,196-261,329-382 (export/check/import); QueryRuntimeController.java:2414-2428 + FileOperateHelper2.java:24-57 (multipart upload, plain-string refId, one-shot consumption); BizServiceIEFacadeImpl.java:135-148,168-260 (package = services+methodsMap verbatim, no pool rows); ErrorCode.java:698 (309008); BizServiceIEFacadeImpl REGEX + ErrorCode.java:576 (580001)",
|
|
36
|
+
],
|
|
37
|
+
tools: [claim("service.export", T["service.export"].scope), claim("service.check", T["service.check"].scope), claim("service.import", T["service.import"].scope)],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
capability: "B2 business-integration designer test face (method.test: governed one-shot real execution with parameter-face preflight and zero-config-write proof)",
|
|
41
|
+
evidence: [
|
|
42
|
+
"packages/omc-cli/src/lanes/b2-registration.ts",
|
|
43
|
+
"ticket 107 (8.6.26 source): BizServiceMethodController.java:398-412 + BizServiceMethodVO.java:14-35 (service_test {code,serviceCode,testInputParametersMap}); BizServiceFacadeImpl.java:426-464 ({success,msg,data}); BizBusServiceImpl.java:190-226,403-414 (adapter dispatch, async log only — zero config writes); RestProtocolAdapterRuntimeServiceImpl.java:218-350 / DataSqlProtocolAdapterRuntimeServiceImpl.java:105-188 / SoapProtocolAdapterRuntimeServiceImpl.java:98-123 / InternalProtocolAdapterRuntimeServiceImpl.java:126-230 (real-execution runtimes; SAP/KAFKA not evidenced on this face)",
|
|
44
|
+
],
|
|
45
|
+
tools: [claim("method.test", T["method.test"].scope)],
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
//# sourceMappingURL=b2-registration-coverage.js.map
|