@openspecui/core 7.0.2 → 9.0.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.
Files changed (107) hide show
  1. package/dist/{active-root-config-BHgXdX6b.d.mts → active-root-config-C77Duro0.d.mts} +5 -5
  2. package/dist/active-root-config.d.mts +5 -5
  3. package/dist/active-root-config.mjs +1 -1
  4. package/dist/app-daemon-control.d.mts +18 -18
  5. package/dist/{cli-projection-Um81AQW5.d.mts → cli-projection-BAU6-rFs.d.mts} +1 -1
  6. package/dist/cli-projection.d.mts +5 -5
  7. package/dist/cli-projection.mjs +1 -1
  8. package/dist/{dashboard-summary-transport-BJBod4rO.d.mts → dashboard-summary-transport-C3No2o4i.d.mts} +695 -330
  9. package/dist/{dashboard-summary-transport-ILCfZD_I.mjs → dashboard-summary-transport-Do8pzSES.mjs} +10 -1
  10. package/dist/dashboard-summary-transport.d.mts +26 -26
  11. package/dist/dashboard-summary-transport.mjs +2 -2
  12. package/dist/{document-translation-B3xaP0dJ.mjs → document-translation-Dmg3YJDA.mjs} +1 -1
  13. package/dist/document-translation.d.mts +1 -1
  14. package/dist/document-translation.mjs +2 -2
  15. package/dist/{hosted-app-B_T_tTvO.mjs → hosted-app-CHqdo5vd.mjs} +1 -1
  16. package/dist/hosted-app.d.mts +26 -26
  17. package/dist/hosted-app.mjs +6 -6
  18. package/dist/{hosted-contract-BxUx6ksP.mjs → hosted-contract-Qe5AmkiE.mjs} +4 -4
  19. package/dist/hosted-contract.d.mts +26 -26
  20. package/dist/hosted-contract.mjs +5 -5
  21. package/dist/{index-CYFOH_f8.d.mts → index-BGT-MVqL.d.mts} +819 -73
  22. package/dist/index.d.mts +27 -27
  23. package/dist/index.mjs +498 -291
  24. package/dist/{local-download-profiles-BQLPhuE0.d.mts → local-download-profiles-BZj6Tw_s.d.mts} +1 -1
  25. package/dist/local-download-profiles.d.mts +2 -2
  26. package/dist/local-download-profiles.mjs +1 -1
  27. package/dist/markdown-facts.d.mts +1 -1
  28. package/dist/{markdown-reading--Sr6JAl5.d.mts → markdown-reading-CsLbxubT.d.mts} +1 -1
  29. package/dist/markdown-reading.d.mts +2 -2
  30. package/dist/{notifications-BIs3J3BY.d.mts → notifications-B9cvPamG.d.mts} +4 -4
  31. package/dist/{notifications-VHUMI-qG.mjs → notifications-D6XlgL9b.mjs} +2 -2
  32. package/dist/notifications.d.mts +2 -2
  33. package/dist/notifications.mjs +3 -3
  34. package/dist/{openspec-annotations-BylPW5rz.d.mts → openspec-annotations-8ppmICAU.d.mts} +2 -2
  35. package/dist/openspec-annotations.d.mts +3 -3
  36. package/dist/openspec-compat-B246EQNW.mjs +121 -0
  37. package/dist/openspec-compat.d.mts +48 -13
  38. package/dist/openspec-compat.mjs +4 -79
  39. package/dist/{openspec-projection-_1NeavJP.d.mts → openspec-projection-vJ03fcdF.d.mts} +3 -3
  40. package/dist/openspec-projection.d.mts +5 -5
  41. package/dist/opsx-display-path.d.mts +1 -1
  42. package/dist/opsx-display-path.mjs +1 -1
  43. package/dist/{opsx-entity-DZ7onDWC.d.mts → opsx-entity-BFPRTIWN.d.mts} +2 -2
  44. package/dist/opsx-entity.d.mts +7 -7
  45. package/dist/{opsx-schema-detail-D2RnlxSg.d.mts → opsx-schema-detail-D1129ezo.d.mts} +2 -2
  46. package/dist/opsx-schema-detail.d.mts +8 -8
  47. package/dist/{opsx-types-Ch6juiWL.d.mts → opsx-types-C_4QxcU6.d.mts} +51 -50
  48. package/dist/opsx-workflows.d.mts +1 -1
  49. package/dist/opsx-workflows.mjs +1 -1
  50. package/dist/{planning-cli-projection-BreqsrYA.mjs → planning-cli-projection-DV22v3Xl.mjs} +23 -12
  51. package/dist/planning-cli-projection.d.mts +26 -26
  52. package/dist/planning-cli-projection.mjs +4 -3
  53. package/dist/{schemas-zh0_vzYQ.d.mts → schemas-Dnw_rfST.d.mts} +8 -8
  54. package/dist/{sounds-Bb_3aeJJ.d.mts → sounds-BoLuHRve.d.mts} +5 -5
  55. package/dist/sounds.d.mts +1 -1
  56. package/dist/sounds.mjs +1 -1
  57. package/dist/{spec-catalog-DEk_oHAx.mjs → spec-catalog-Ce3uSLSc.mjs} +45 -328
  58. package/dist/spec-catalog.d.mts +26 -26
  59. package/dist/spec-catalog.mjs +3 -2
  60. package/dist/{store-content-projection-Bpdb7_d9.mjs → store-content-projection-DV31znWA.mjs} +1 -1
  61. package/dist/store-content-projection.d.mts +1 -1
  62. package/dist/store-content-projection.mjs +2 -2
  63. package/dist/{store-mutation-protocol-BbgWMJVK.d.mts → store-mutation-protocol-C4rRiO4b.d.mts} +36 -36
  64. package/dist/store-mutation-protocol.d.mts +1 -1
  65. package/dist/store-mutation-protocol.mjs +1 -1
  66. package/dist/{store-types-CF7_LsVL.d.mts → store-types-CMqxPwaj.d.mts} +1 -1
  67. package/dist/store-types.d.mts +5 -5
  68. package/dist/store-types.mjs +1 -1
  69. package/dist/task-progress.d.mts +6 -6
  70. package/dist/{terminal-audio-GuG0qiiI.d.mts → terminal-audio-CNhCiZul.d.mts} +2 -2
  71. package/dist/{terminal-audio-DeubAfFC.mjs → terminal-audio-ELHVH24M.mjs} +1 -1
  72. package/dist/terminal-audio.d.mts +2 -2
  73. package/dist/terminal-audio.mjs +2 -2
  74. package/dist/{terminal-control-CdPuYwwU.mjs → terminal-control-D893EEN_.mjs} +7 -5
  75. package/dist/terminal-control.d.mts +2 -2
  76. package/dist/terminal-control.mjs +1 -1
  77. package/dist/{terminal-invocation-Dx1qfSKb.d.mts → terminal-invocation-BnMhxtP1.d.mts} +22 -22
  78. package/dist/terminal-invocation.d.mts +1 -1
  79. package/dist/terminal-invocation.mjs +1 -1
  80. package/dist/terminal-theme.d.mts +1 -1
  81. package/dist/terminal-theme.mjs +1 -1
  82. package/dist/translation-language-pair.d.mts +1 -1
  83. package/dist/translation-language-pair.mjs +1 -1
  84. package/dist/{translator-Cwaf_pXN.d.mts → translator-B7GQxmun.d.mts} +50 -50
  85. package/dist/translator.d.mts +1 -1
  86. package/dist/translator.mjs +1 -1
  87. package/dist/workflow-CmQ4pFYC.mjs +344 -0
  88. package/package.json +3 -1
  89. /package/dist/{active-root-config-L5QaMb3A.mjs → active-root-config-K_wVeuI3.mjs} +0 -0
  90. /package/dist/{cli-projection-CKRwTvwf.mjs → cli-projection-Bc2WVwGj.mjs} +0 -0
  91. /package/dist/{document-translation-BNbM3fEj.d.mts → document-translation-CBqubtWC.d.mts} +0 -0
  92. /package/dist/{local-download-profiles-h9lUTXr-.mjs → local-download-profiles-BRsR1-kK.mjs} +0 -0
  93. /package/dist/{markdown-facts-DLclHfpE.d.mts → markdown-facts-CEACwik1.d.mts} +0 -0
  94. /package/dist/{opsx-display-path-BD34M8QV.d.mts → opsx-display-path-DvvAFlWG.d.mts} +0 -0
  95. /package/dist/{opsx-display-path-ocbNzMZj.mjs → opsx-display-path-cv0NJHzW.mjs} +0 -0
  96. /package/dist/{opsx-workflows-DX1r6e5j.d.mts → opsx-workflows-B72EGtj_.d.mts} +0 -0
  97. /package/dist/{opsx-workflows-byPfLlo8.mjs → opsx-workflows-BA-46T7_.mjs} +0 -0
  98. /package/dist/{sounds-6prQvKXl.mjs → sounds-cd9lIDxN.mjs} +0 -0
  99. /package/dist/{store-content-projection-R74MV_sD.d.mts → store-content-projection-BnNYyb0x.d.mts} +0 -0
  100. /package/dist/{store-mutation-protocol-CJGUWWI6.mjs → store-mutation-protocol-CBrPcppU.mjs} +0 -0
  101. /package/dist/{store-types-CvpEVNoE.mjs → store-types-C87SlrJ3.mjs} +0 -0
  102. /package/dist/{terminal-invocation-DIpoFYDo.mjs → terminal-invocation-C_FsxEUs.mjs} +0 -0
  103. /package/dist/{terminal-theme-Byzxmnjm.mjs → terminal-theme-C6BPfQ2G.mjs} +0 -0
  104. /package/dist/{terminal-theme-DX08Gci8.d.mts → terminal-theme-C7X8pUqT.d.mts} +0 -0
  105. /package/dist/{translation-language-pair-BR5uxGm-.d.mts → translation-language-pair-B6A39Cai.d.mts} +0 -0
  106. /package/dist/{translation-language-pair-DG9mOuFD.mjs → translation-language-pair-CWLlH7Ab.mjs} +0 -0
  107. /package/dist/{translator-CEGdRmKw.mjs → translator-BkNACZ9R.mjs} +0 -0
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { B as CliWorkflowStatusSuccessSchema, C as CliArchiveInstructionsSuccessSchema, E as CliArtifactInstructionsSuccessSchema, F as CliShowSpecSchema, G as CliStoreDoctorSchema, H as CliDoctorSchema, I as CliSpecListSchema, J as CliStoreSchema, K as CliStoreListSchema, N as CliSchemasSchema, O as CliChangeListSchema, P as CliShowSpecDocumentSchema, Q as requireOpenSpecEntityRelativePath, R as CliValidateSchema, S as CliArchiveInstructionsSchema, T as CliArtifactInstructionsSchema, U as CliStoreCleanupSchema, V as CliContextSchema, W as CliStoreDoctorEntrySchema, X as requireCanonicalOpenSpecEntityId, Y as parseCliCommandResult, Z as requireCanonicalOpenSpecSpecId, _ as specRoutePath, a as SpecDocumentProjectionSchema, b as CliApplyInstructionsSchema, c as createStaticSpecCatalogOwnedProjection, d as getSpecCatalogEntry, f as isReferencedSpecIdentity, g as specIdentityKey, h as specIdentityFromRoute, i as SpecCommandEvidenceSchema, l as createStaticSpecCatalogReferenceProjection, m as specDocumentDisplayPath, n as ReferencedSpecIdentitySchema, o as SpecIdentitySchema, p as mergeSpecCatalog, q as CliStoreMutationSchema, r as SpecCatalogSchema, s as buildSpecCatalog, t as OwnedSpecIdentitySchema, u as createStaticSpecCatalogReferenceSource, v as OpenSpecCliContractExecutor, w as CliArchiveSchema, x as CliApplyInstructionsSuccessSchema, z as CliWorkflowStatusSchema } from "./spec-catalog-DEk_oHAx.mjs";
1
+ import { A as requireCanonicalOpenSpecEntityId, C as CliStoreDoctorSchema, E as CliStoreSchema, M as requireOpenSpecEntityRelativePath, O as CliSchemasSuccessSchema, S as CliStoreDoctorEntrySchema, T as CliStoreMutationSchema, _ as specRoutePath, a as SpecDocumentProjectionSchema, b as CliDoctorSchema, c as createStaticSpecCatalogOwnedProjection, d as getSpecCatalogEntry, f as isReferencedSpecIdentity, g as specIdentityKey, h as specIdentityFromRoute, i as SpecCommandEvidenceSchema, j as requireCanonicalOpenSpecSpecId, k as isCliSchemasFailure, l as createStaticSpecCatalogReferenceProjection, m as specDocumentDisplayPath, n as ReferencedSpecIdentitySchema, o as SpecIdentitySchema, p as mergeSpecCatalog, r as SpecCatalogSchema, s as buildSpecCatalog, t as OwnedSpecIdentitySchema, u as createStaticSpecCatalogReferenceSource, v as OpenSpecCliContractExecutor, w as CliStoreListSchema, x as CliStoreCleanupSchema, y as CliContextSchema } from "./spec-catalog-Ce3uSLSc.mjs";
2
2
  import { _ as isTextLikeMime, a as DeltaSpecSchema, c as ScenarioStepSchema, d as TrackedTaskProgressSchema, f as FILE_PREVIEW_KINDS, g as isTextLikeFile, h as isPreviewableFile, i as DeltaSchema, l as SpecSchema, m as inferFilePreviewKind, n as ChangeSchema, o as RequirementSchema, p as inferFileMime, r as DeltaOperationType, s as ScenarioStepKeywordSchema, t as ChangeFileSchema, u as TaskSchema } from "./schemas-CMThmKx1.mjs";
3
3
  import { a as normalizeOpsxEntityPath, c as parseOpsxEntityMetadata, i as isOpsxGlobPattern, n as getOpsxEntityMetadataPath, o as opsxGlobToRegex, r as getOpsxEntityRootRelativePath, s as opsxPathMatchesPattern, t as buildOpsxEntityDetail } from "./opsx-entity-BnO3k48r.mjs";
4
4
  import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-zk8ePaKK.mjs";
@@ -8,27 +8,29 @@ import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as an
8
8
  import { a as getOpenSpecReadingSections, c as projectOpenSpecMarkdown, i as getOpenSpecProjectionAnnotation, n as OPEN_SPEC_SPEC_PROJECTION_ID, o as parseOpenSpecMarkdownToSpec, r as createOpenSpecReadingPlugin, s as projectAnnotatedOpenSpecToSpec, t as OPEN_SPEC_READING_SECTIONS_PROJECTION_ID } from "./openspec-projection-Cno7FlwE.mjs";
9
9
  import { a as isMarkdownTaskSourcePath, c as toggleMarkdownTask, i as deriveTrackedTaskPhase, n as createDocumentChecklistSummary, o as parseMarkdownTasks, r as createTrackedTaskProgress, s as projectTaskProjectionsFromMarkdownFiles, t as createApplyInstructionProgress } from "./task-progress-Bvid_Ws8.mjs";
10
10
  import { a as CliRootSchema, i as CliReferenceIndexEntrySchema, n as CliDiagnosticSchema, o as CliRootSourceSchema, r as CliDoctorReferenceEntrySchema, t as CliDiagnosticFailureSchema } from "./common-BRL_34xt.mjs";
11
- import { a as CliProjectionInvalidationCauseSchema, d as toCliProjectionCommandEvidence, f as toCliProjectionFailure, i as CliProjectionFailureSchema, l as cliProjectionStates, n as CliProjectionCommandError, o as CliProjectionNoticeSchema, p as toCliProjectionNotice, r as CliProjectionCommandEvidenceSchema, s as CliProjectionStateNameSchema, t as CliJsonValueSchema, u as createCliProjectionStateSchema } from "./cli-projection-CKRwTvwf.mjs";
12
- import { $ as shouldShowTranslationEngineInstallGate, A as TranslationEngineIdSchema, B as TranslationLocalLlamaSettingsUpdateSchema, C as TranslationDownloadGroupPlanSchema, D as TranslationEngineDependencyStatusSchema, E as TranslationEngineDependencyStateSchema, F as TranslationEngineRuntimeStateSchema, G as createTranslationEngineLifecycleStatus, H as TranslationLocalSettingsUpdateSchema, I as TranslationEngineRuntimeStatusSchema, J as getTranslationEngineManifest, K as getManagedLocalTranslationEngineManifest, L as TranslationLocalCt2SettingsSchema, M as TranslationEngineInstallLogStreamSchema, N as TranslationEngineLifecycleEventSchema, O as TranslationEngineGlobalSettingsSchema, P as TranslationEngineLifecycleStatusSchema, Q as isTranslationEngineRuntimeReady, R as TranslationLocalCt2SettingsUpdateSchema, S as TranslationDownloadFilePlanSchema, T as TranslationEngineAssetStatusSchema, U as TranslationOpenAISettingsSchema, V as TranslationLocalSettingsSchema, W as TranslationOpenAISettingsUpdateSchema, X as isManagedLocalTranslationEngineId, Y as isDirectionalManagedLocalTranslationEngineId, Z as isTranslationEngineDependencyReady, _ as SERVICE_TRANSLATION_ENGINE_IDS, a as LocalModelAssetLogSchema, b as TRANSLATION_ENGINE_MANIFESTS, c as LocalModelDownloadStatusSchema, d as LocalModelProfileLoadStateSchema, et as isBatchTranslationAbort, f as LocalModelProfileManifestFileSchema, g as ManagedLocalCatalogSourceSchema, h as LocalModelProfileStatusSchema, i as DEFAULT_TRANSLATION_ENGINE_ID, j as TranslationEngineInstallLogEventSchema, k as TranslationEngineGlobalSettingsUpdateSchema, l as LocalModelLifecycleFileStateSchema, m as LocalModelProfileManifestSchema, n as BatchTranslateInputSchema, nt as runControlledTranslationTask, o as LocalModelAssetPlanSnapshotSchema, p as LocalModelProfileManifestGroupSchema, q as getTranslationEngineLifecycleMessage, s as LocalModelAssetStateSchema, t as BatchTranslateEventSchema, tt as normalizeBatchTranslationError, u as LocalModelLifecycleGroupStateSchema, v as ServiceTranslationEngineIdSchema, w as TranslationEngineAssetStateSchema, x as TRANSLATOR_CONTRACT_VERSION, y as TRANSLATION_ENGINE_IDS, z as TranslationLocalLlamaSettingsSchema } from "./translator-CEGdRmKw.mjs";
13
- import { a as ActiveRootOfficialConfigSchema, c as MAX_ACTIVE_ROOT_CONTEXT_BYTES, i as ActiveRootMutationSchema, n as patchActiveRootOfficialFields, o as ActiveRootRevisionSchema, r as validateActiveRootRawYaml, s as ActiveRootStructuredUpdateSchema, t as inspectActiveRootOfficialConfig } from "./active-root-config-L5QaMb3A.mjs";
14
- import { a as DocumentTranslationDisplayModeSchema, c as TRANSLATION_CACHE_POLICY_VERSION, d as TranslationCacheSettingsSchema, f as TranslationCacheSettingsUpdateSchema, g as TranslationEngineProjectSettingsUpdateSchema, h as TranslationEngineProjectSettingsSchema, i as DocumentTranslationConfigUpdateSchema, l as TranslationCacheEntrySchema, m as TranslationCacheWriteInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationCacheStatsSchema, r as DocumentTranslationConfigSchema, s as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheReadInputSchema } from "./document-translation-B3xaP0dJ.mjs";
15
- import { _ as customHashFromSoundId, a as CustomSoundHashSchema, b as soundIdFromCustomHash, c as CustomSoundMetadataSchema, f as LEGACY_SOUND_ID_MAP, g as SoundVolumeSchema, h as SoundIdSchema, i as CUSTOM_SOUND_ADD_VALUE, l as DEFAULT_BELL_SOUND_ID, m as SoundConfigIdSchema, n as BUILTIN_SOUND_OPTIONS, o as CustomSoundIdSchema, p as SILENT_SOUND_ID, r as BuiltinSoundIdSchema, s as CustomSoundMetadataFileSchema, t as BUILTIN_SOUND_IDS, u as DEFAULT_NOTIFICATION_SOUND_ID, v as getBuiltinSoundUrl, y as normalizeLegacySoundId } from "./sounds-6prQvKXl.mjs";
16
- import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-CdPuYwwU.mjs";
17
- import { a as NotificationPublishInputSchema, c as NotificationSoundSchema, h as groupNotifications, i as NotificationGroupKeySchema, l as NotificationSourceSchema, m as getNotificationGroupLabel, n as NOTIFICATION_SOUND_VALUES, o as NotificationRecordSchema, p as getNotificationGroupKey, r as NotificationActionSchema, s as NotificationSettingsSchema, t as NOTIFICATION_SOUND_OPTIONS, u as TerminalNotificationParser } from "./notifications-VHUMI-qG.mjs";
18
- import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-DeubAfFC.mjs";
19
- import { a as TERMINAL_THEME_VALUES, i as TERMINAL_THEME_MODE_VALUES, n as DEFAULT_TERMINAL_LIGHT_THEME, r as DEFAULT_TERMINAL_THEME_MODE, t as DEFAULT_TERMINAL_DARK_THEME } from "./terminal-theme-Byzxmnjm.mjs";
20
- import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-h9lUTXr-.mjs";
21
- import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-DG9mOuFD.mjs";
22
- import { C as SchemaResolutionSchema, D as isGlobPattern, E as TemplatesSchema, S as SchemaInfoSchema, T as TemplateContentSchema, _ as OpsxCliEvidenceSchema, a as PlanningCliProjectionDataSchema, b as SchemaArtifactSchema, c as ApplyInstructionsContextFilesSchema, d as ApplyTaskSchema, f as ArchiveInstructionsSchema, g as DependencyInfoSchema, h as ChangeStatusSchema, i as EnvironmentGlobalProjectionStateSchema, l as ApplyInstructionsProjectionSchema, m as ArtifactStatusSchema, n as EnvironmentGlobalFileProjectionStateSchema, o as PlanningCliProjectionSelectorSchema, p as ArtifactInstructionsSchema, r as EnvironmentGlobalProjectionDataSchema, s as PlanningCliProjectionStateSchema, t as EnvironmentGlobalFileProjectionDataSchema, u as ApplyInstructionsSchema, v as OpsxConfigBundleSchema, w as TemplateContentMapSchema, x as SchemaDetailSchema, y as OpsxStatusEvidenceSchema } from "./planning-cli-projection-BreqsrYA.mjs";
23
- import { a as OPSX_CORE_PROFILE_WORKFLOWS, c as OPSX_WORKFLOW_TO_SKILL_DIR, i as OPSX_COMMAND_CAPABLE_WORKFLOWS, l as isOpsxCoreWorkflowSelection, n as OPSX_ARTIFACT_INPUT_ACTIONS, o as OPSX_TEXT_INPUT_ACTIONS, r as OPSX_CHANGE_INPUT_ACTIONS, s as OPSX_WORKFLOW_LABELS, t as OPSX_ALL_WORKFLOWS } from "./opsx-workflows-byPfLlo8.mjs";
24
- import { a as DASHBOARD_METRIC_KEYS, c as DashboardSummaryProjectionSchema, i as DashboardSummaryProjectionStateSchema, l as DashboardTrendsProjectionSchema, n as DashboardSummaryInvalidationCauseSchema, o as DashboardGitSnapshotSchema, r as DashboardSummaryInvalidationSchema, s as DashboardOverviewSchema, t as DashboardSummaryIdentitySchema } from "./dashboard-summary-transport-ILCfZD_I.mjs";
25
- import { a as StoreListResultSchema, n as StoreDoctorResultSchema, o as classifyStoreCliResult, s as toStoreFeatureResult } from "./store-types-CvpEVNoE.mjs";
26
- import "./store-content-projection-Bpdb7_d9.mjs";
27
- import { i as StoreMutationStartResponseSchema, n as StoreMutationResultSchema, r as StoreMutationSchema, t as StoreMutationLifecycleEventSchema } from "./store-mutation-protocol-CJGUWWI6.mjs";
28
- import { C as OPENSPECUI_RUNTIME_CAPABILITIES, D as isTerminalMutationStatus, E as hasCapability, T as asEnvUri, t as HOSTED_SHELL_PROTOCOL_VERSION } from "./hosted-contract-BxUx6ksP.mjs";
29
- import { a as buildHostedLaunchUrl, c as isSupportedEmbeddedUiUrl, d as resolveHostedAppBaseUrl, i as buildEmbeddedUiLaunchUrl, l as normalizeEmbeddedUiUrl, n as OFFICIAL_APP_BASE_URL, o as isBackendHealthRuntimeMetadata, r as buildBackendHealthPayload, s as isHostedBackendHealthResponse, u as normalizeHostedAppBaseUrl } from "./hosted-app-B_T_tTvO.mjs";
30
- import { n as toOpsxDisplayPath, t as VIRTUAL_PROJECT_DIRNAME } from "./opsx-display-path-ocbNzMZj.mjs";
31
- import { a as TerminalInvocationSettingsSchema, c as TerminalSpawnCommandSchema, f as quoteTerminalShellArg, g as resolveTerminalShellDefaults, h as renderTerminalSpawnCommandLine, i as TerminalCommandFieldSchema, n as TERMINAL_COMMAND_FIELD_TYPE_VALUES, o as TerminalShellProfileSchema, p as renderTerminalCommandArgs, r as TERMINAL_SHELL_QUOTE_STYLE_VALUES, s as TerminalShellQuoteStyleSchema, t as BUILTIN_TERMINAL_SPAWN_COMMANDS, u as getTerminalCommandDefaultValues } from "./terminal-invocation-DIpoFYDo.mjs";
11
+ import { C as CliWorkflowStatusSuccessSchema, S as CliWorkflowStatusSchema, T as parseCliCommandResult, _ as CliSpecListSchema, a as CliArchiveInstructionsSuccessSchema, b as CliValidateReportSchema, c as CliArtifactInstructionsSuccessSchema, g as CliShowSpecSchema, h as CliShowSpecDocumentSchema, i as CliArchiveInstructionsSchema, n as CliApplyInstructionsSchema, o as CliArchiveSchema, r as CliApplyInstructionsSuccessSchema, s as CliArtifactInstructionsSchema, u as CliChangeListSchema, w as CliCommandTransportSchema, x as CliValidateSchema } from "./workflow-CmQ4pFYC.mjs";
12
+ import { a as CliProjectionInvalidationCauseSchema, d as toCliProjectionCommandEvidence, f as toCliProjectionFailure, i as CliProjectionFailureSchema, l as cliProjectionStates, n as CliProjectionCommandError, o as CliProjectionNoticeSchema, p as toCliProjectionNotice, r as CliProjectionCommandEvidenceSchema, s as CliProjectionStateNameSchema, t as CliJsonValueSchema, u as createCliProjectionStateSchema } from "./cli-projection-Bc2WVwGj.mjs";
13
+ import { $ as shouldShowTranslationEngineInstallGate, A as TranslationEngineIdSchema, B as TranslationLocalLlamaSettingsUpdateSchema, C as TranslationDownloadGroupPlanSchema, D as TranslationEngineDependencyStatusSchema, E as TranslationEngineDependencyStateSchema, F as TranslationEngineRuntimeStateSchema, G as createTranslationEngineLifecycleStatus, H as TranslationLocalSettingsUpdateSchema, I as TranslationEngineRuntimeStatusSchema, J as getTranslationEngineManifest, K as getManagedLocalTranslationEngineManifest, L as TranslationLocalCt2SettingsSchema, M as TranslationEngineInstallLogStreamSchema, N as TranslationEngineLifecycleEventSchema, O as TranslationEngineGlobalSettingsSchema, P as TranslationEngineLifecycleStatusSchema, Q as isTranslationEngineRuntimeReady, R as TranslationLocalCt2SettingsUpdateSchema, S as TranslationDownloadFilePlanSchema, T as TranslationEngineAssetStatusSchema, U as TranslationOpenAISettingsSchema, V as TranslationLocalSettingsSchema, W as TranslationOpenAISettingsUpdateSchema, X as isManagedLocalTranslationEngineId, Y as isDirectionalManagedLocalTranslationEngineId, Z as isTranslationEngineDependencyReady, _ as SERVICE_TRANSLATION_ENGINE_IDS, a as LocalModelAssetLogSchema, b as TRANSLATION_ENGINE_MANIFESTS, c as LocalModelDownloadStatusSchema, d as LocalModelProfileLoadStateSchema, et as isBatchTranslationAbort, f as LocalModelProfileManifestFileSchema, g as ManagedLocalCatalogSourceSchema, h as LocalModelProfileStatusSchema, i as DEFAULT_TRANSLATION_ENGINE_ID, j as TranslationEngineInstallLogEventSchema, k as TranslationEngineGlobalSettingsUpdateSchema, l as LocalModelLifecycleFileStateSchema, m as LocalModelProfileManifestSchema, n as BatchTranslateInputSchema, nt as runControlledTranslationTask, o as LocalModelAssetPlanSnapshotSchema, p as LocalModelProfileManifestGroupSchema, q as getTranslationEngineLifecycleMessage, s as LocalModelAssetStateSchema, t as BatchTranslateEventSchema, tt as normalizeBatchTranslationError, u as LocalModelLifecycleGroupStateSchema, v as ServiceTranslationEngineIdSchema, w as TranslationEngineAssetStateSchema, x as TRANSLATOR_CONTRACT_VERSION, y as TRANSLATION_ENGINE_IDS, z as TranslationLocalLlamaSettingsSchema } from "./translator-BkNACZ9R.mjs";
14
+ import { a as ActiveRootOfficialConfigSchema, c as MAX_ACTIVE_ROOT_CONTEXT_BYTES, i as ActiveRootMutationSchema, n as patchActiveRootOfficialFields, o as ActiveRootRevisionSchema, r as validateActiveRootRawYaml, s as ActiveRootStructuredUpdateSchema, t as inspectActiveRootOfficialConfig } from "./active-root-config-K_wVeuI3.mjs";
15
+ import { a as DocumentTranslationDisplayModeSchema, c as TRANSLATION_CACHE_POLICY_VERSION, d as TranslationCacheSettingsSchema, f as TranslationCacheSettingsUpdateSchema, g as TranslationEngineProjectSettingsUpdateSchema, h as TranslationEngineProjectSettingsSchema, i as DocumentTranslationConfigUpdateSchema, l as TranslationCacheEntrySchema, m as TranslationCacheWriteInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationCacheStatsSchema, r as DocumentTranslationConfigSchema, s as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheReadInputSchema } from "./document-translation-Dmg3YJDA.mjs";
16
+ import { _ as customHashFromSoundId, a as CustomSoundHashSchema, b as soundIdFromCustomHash, c as CustomSoundMetadataSchema, f as LEGACY_SOUND_ID_MAP, g as SoundVolumeSchema, h as SoundIdSchema, i as CUSTOM_SOUND_ADD_VALUE, l as DEFAULT_BELL_SOUND_ID, m as SoundConfigIdSchema, n as BUILTIN_SOUND_OPTIONS, o as CustomSoundIdSchema, p as SILENT_SOUND_ID, r as BuiltinSoundIdSchema, s as CustomSoundMetadataFileSchema, t as BUILTIN_SOUND_IDS, u as DEFAULT_NOTIFICATION_SOUND_ID, v as getBuiltinSoundUrl, y as normalizeLegacySoundId } from "./sounds-cd9lIDxN.mjs";
17
+ import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-D893EEN_.mjs";
18
+ import { a as NotificationPublishInputSchema, c as NotificationSoundSchema, h as groupNotifications, i as NotificationGroupKeySchema, l as NotificationSourceSchema, m as getNotificationGroupLabel, n as NOTIFICATION_SOUND_VALUES, o as NotificationRecordSchema, p as getNotificationGroupKey, r as NotificationActionSchema, s as NotificationSettingsSchema, t as NOTIFICATION_SOUND_OPTIONS, u as TerminalNotificationParser } from "./notifications-D6XlgL9b.mjs";
19
+ import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-ELHVH24M.mjs";
20
+ import { a as TERMINAL_THEME_VALUES, i as TERMINAL_THEME_MODE_VALUES, n as DEFAULT_TERMINAL_LIGHT_THEME, r as DEFAULT_TERMINAL_THEME_MODE, t as DEFAULT_TERMINAL_DARK_THEME } from "./terminal-theme-C6BPfQ2G.mjs";
21
+ import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-BRsR1-kK.mjs";
22
+ import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-CWLlH7Ab.mjs";
23
+ import { C as SchemaResolutionSchema, D as isGlobPattern, E as TemplatesSchema, S as SchemaInfoSchema, T as TemplateContentSchema, _ as OpsxCliEvidenceSchema, a as PlanningCliProjectionDataSchema, b as SchemaArtifactSchema, c as ApplyInstructionsContextFilesSchema, d as ApplyTaskSchema, f as ArchiveInstructionsSchema, g as DependencyInfoSchema, h as ChangeStatusSchema, i as EnvironmentGlobalProjectionStateSchema, l as ApplyInstructionsProjectionSchema, m as ArtifactStatusSchema, n as EnvironmentGlobalFileProjectionStateSchema, o as PlanningCliProjectionSelectorSchema, p as ArtifactInstructionsSchema, r as EnvironmentGlobalProjectionDataSchema, s as PlanningCliProjectionStateSchema, t as EnvironmentGlobalFileProjectionDataSchema, u as ApplyInstructionsSchema, v as OpsxConfigBundleSchema, w as TemplateContentMapSchema, x as SchemaDetailSchema, y as OpsxStatusEvidenceSchema } from "./planning-cli-projection-DV22v3Xl.mjs";
24
+ import { h as parseOpenSpecCliVersion, p as deriveOpenSpecCliCapabilities } from "./openspec-compat-B246EQNW.mjs";
25
+ import { a as OPSX_CORE_PROFILE_WORKFLOWS, c as OPSX_WORKFLOW_TO_SKILL_DIR, i as OPSX_COMMAND_CAPABLE_WORKFLOWS, l as isOpsxCoreWorkflowSelection, n as OPSX_ARTIFACT_INPUT_ACTIONS, o as OPSX_TEXT_INPUT_ACTIONS, r as OPSX_CHANGE_INPUT_ACTIONS, s as OPSX_WORKFLOW_LABELS, t as OPSX_ALL_WORKFLOWS } from "./opsx-workflows-BA-46T7_.mjs";
26
+ import { a as DASHBOARD_METRIC_KEYS, c as DashboardSummaryProjectionSchema, i as DashboardSummaryProjectionStateSchema, l as DashboardTrendsProjectionSchema, n as DashboardSummaryInvalidationCauseSchema, o as DashboardGitSnapshotSchema, r as DashboardSummaryInvalidationSchema, s as DashboardOverviewSchema, t as DashboardSummaryIdentitySchema } from "./dashboard-summary-transport-Do8pzSES.mjs";
27
+ import { a as StoreListResultSchema, n as StoreDoctorResultSchema, o as classifyStoreCliResult, s as toStoreFeatureResult } from "./store-types-C87SlrJ3.mjs";
28
+ import "./store-content-projection-DV31znWA.mjs";
29
+ import { i as StoreMutationStartResponseSchema, n as StoreMutationResultSchema, r as StoreMutationSchema, t as StoreMutationLifecycleEventSchema } from "./store-mutation-protocol-CBrPcppU.mjs";
30
+ import { C as OPENSPECUI_RUNTIME_CAPABILITIES, D as isTerminalMutationStatus, E as hasCapability, T as asEnvUri, t as HOSTED_SHELL_PROTOCOL_VERSION } from "./hosted-contract-Qe5AmkiE.mjs";
31
+ import { a as buildHostedLaunchUrl, c as isSupportedEmbeddedUiUrl, d as resolveHostedAppBaseUrl, i as buildEmbeddedUiLaunchUrl, l as normalizeEmbeddedUiUrl, n as OFFICIAL_APP_BASE_URL, o as isBackendHealthRuntimeMetadata, r as buildBackendHealthPayload, s as isHostedBackendHealthResponse, u as normalizeHostedAppBaseUrl } from "./hosted-app-CHqdo5vd.mjs";
32
+ import { n as toOpsxDisplayPath, t as VIRTUAL_PROJECT_DIRNAME } from "./opsx-display-path-cv0NJHzW.mjs";
33
+ import { a as TerminalInvocationSettingsSchema, c as TerminalSpawnCommandSchema, f as quoteTerminalShellArg, g as resolveTerminalShellDefaults, h as renderTerminalSpawnCommandLine, i as TerminalCommandFieldSchema, n as TERMINAL_COMMAND_FIELD_TYPE_VALUES, o as TerminalShellProfileSchema, p as renderTerminalCommandArgs, r as TERMINAL_SHELL_QUOTE_STYLE_VALUES, s as TerminalShellQuoteStyleSchema, t as BUILTIN_TERMINAL_SPAWN_COMMANDS, u as getTerminalCommandDefaultValues } from "./terminal-invocation-C_FsxEUs.mjs";
32
34
  import { mkdir, writeFile } from "fs/promises";
33
35
  import { dirname, join } from "path";
34
36
  import { isMap, parseDocument } from "yaml";
@@ -2020,7 +2022,8 @@ var OpenSpecAdapter = class {
2020
2022
  trackedTaskProgress: taskProjection.trackedTaskProgress,
2021
2023
  documentChecklistSummary: taskProjection.documentChecklistSummary,
2022
2024
  createdAt: timeInfo?.createdAt ?? 0,
2023
- updatedAt: timeInfo?.updatedAt ?? 0
2025
+ updatedAt: timeInfo?.updatedAt ?? 0,
2026
+ cliTaskSummary: null
2024
2027
  };
2025
2028
  }
2026
2029
  /**
@@ -5030,28 +5033,19 @@ function runOpenSpecCliWorker(options) {
5030
5033
  //#endregion
5031
5034
  //#region src/cli-executor.ts
5032
5035
  /**
5033
- * Orthogonal intents (updated 2026-08-08 Asia/Shanghai):
5034
- * 1. Execute buffered CLI work through process/Worker backends with runner recovery,
5035
- * observer-explicit OTel phase evidence, bounded probes, and owner-scoped disposal.
5036
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
5037
+ * 1. Execute buffered CLI work through process/Worker backends with runner recovery, observer-explicit
5038
+ * OTel phase evidence, bounded probes, and owner-scoped disposal.
5036
5039
  * 2. Own streaming CLI process trees through cancellation request, escalation, and confirmed settlement.
5037
- * 3. Retain lifecycle helpers and add the fixed-path, tools-none project bootstrap stream.
5038
- * 4. Expose the physically separated OpenSpec 1.6 typed command facade.
5039
- * 5. Clear the Core-owned direct-child slot independently from stream settlement, and keep
5040
- * response-Span delivery physically separate from late child-process settlement evidence.
5040
+ * 3. Retain lifecycle helpers, add the fixed-path tools-none project bootstrap stream, and keep the
5041
+ * Core-owned direct-child slot clear independently from stream settlement.
5042
+ * 4. Expose the physically separated OpenSpec 1.6-1.9 typed command facade with response-Span delivery
5043
+ * separate from late child-process settlement evidence.
5044
+ * 5. Report eager-resolved exit codes as unknown instead of fabricated zeros.
5041
5045
  *
5042
5046
  * Original request (2026-07-15): "你先负责后端(内核)的开发。"
5043
5047
  * Original request (2026-07-17): "A stream cancellation request is not child-process settlement."
5044
- * Built-runtime correction (2026-07-30): foreground Server shutdown must retire buffered projection children and settled probe timers.
5045
- * Tracing (2026-07-31): each CLI subprocess call is wrapped in an OpenTelemetry span so the Server
5046
- * `planningRoot.runOperation` breakdown can attribute latency to specific CLI invocations
5047
- * (doctor / context / list ...). Uses `@opentelemetry/api` only — a no-op tracer is returned when
5048
- * no SDK is registered, so standalone Core use incurs zero overhead.
5049
- * Original request (2026-07-31): "这些命令的执行,时间绝对不是七八秒那么久...请看一下代码,看能不能让trace更精确"
5050
- * Original request (2026-07-31): "终端大量报错,比如: Cannot execute the operation on ended Span"
5051
- * Original request (2026-07-31): "在主线程,通过 OPENSPEC_SPAWN_MODE=process|worker 来进行区分两种模式。"
5052
- * Original request (2026-08-02): initialize the Launch Project with `openspec init <path> --tools=none`.
5053
- * Review correction (2026-08-02): streamed command evidence must preserve argv boundaries.
5054
- * Original request (2026-08-04): "Make pnpm openspecui start and equivalent package scripts work on Windows."
5048
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
5055
5049
  */
5056
5050
  /** Failure raised when even forced termination cannot confirm child-process close. */
5057
5051
  var CliStreamTerminationError = class extends Error {
@@ -5324,11 +5318,12 @@ var CliExecutor = class {
5324
5318
  phases: result.phases,
5325
5319
  spawnMode
5326
5320
  };
5321
+ const eagerResolved = result.phases?.resultReason === "eager-json";
5327
5322
  return {
5328
- success: result.exitCode === 0,
5323
+ success: result.exitCode === 0 || eagerResolved && result.exitCode === null,
5329
5324
  stdout: result.stdout,
5330
5325
  stderr: result.stderr,
5331
- exitCode: result.exitCode,
5326
+ exitCode: eagerResolved ? null : result.exitCode,
5332
5327
  phases: result.phases,
5333
5328
  spawnMode
5334
5329
  };
@@ -5498,10 +5493,12 @@ var CliExecutor = class {
5498
5493
  return this.execute(args);
5499
5494
  }
5500
5495
  /**
5501
- * 执行 openspec schemas --json
5496
+ * 执行 openspec schemas --json(可选转发所选 Root 的 Store 选择器)
5502
5497
  */
5503
- async schemas() {
5504
- return this.execute(["schemas", "--json"]);
5498
+ async schemas(selector = {}) {
5499
+ const args = ["schemas", "--json"];
5500
+ if (selector.store !== void 0) args.push("--store", selector.store);
5501
+ return this.execute(args);
5505
5502
  }
5506
5503
  /**
5507
5504
  * 执行 openspec schema which <name> --json
@@ -6207,6 +6204,59 @@ var RuntimeRootInvalidationRegistry = class {
6207
6204
 
6208
6205
  //#endregion
6209
6206
  //#region src/agent-delivery-registry.ts
6207
+ /**
6208
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
6209
+ * 1. Preserve the complete pinned OpenSpec 1.9 Agent delivery registry in one typed physical owner.
6210
+ * 2. Co-locate capability, command artifact, invocation, alias, setup, cleanup, and migration metadata.
6211
+ * 3. Model current/legacy project roots, user-global skill roots, detection paths, and IDE restart facts.
6212
+ * 4. Provide deterministic path-template helpers without reading runtime filesystem state.
6213
+ * 5. Select the official inventory per admitted CLI line (1.8 lacks Command Code and restart facts).
6214
+ *
6215
+ * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
6216
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
6217
+ */
6218
+ function agentCliSeriesOrder(series) {
6219
+ return series === "1.9" ? 19 : 18;
6220
+ }
6221
+ /**
6222
+ * Select the official Agent delivery inventory for one CLI version string.
6223
+ *
6224
+ * Only a stable, admitted version — current (1.9.x) or supported non-current (1.8.x) — selects
6225
+ * an inventory. Unsupported forms (prereleases, >=1.10, below-range) and unparseable output
6226
+ * select none: a page-level version bypass must not manufacture a 1.9 inventory for a CLI the
6227
+ * release line refuses to admit.
6228
+ */
6229
+ function selectAgentDeliveryRegistry(cliVersion) {
6230
+ const series = parseOpenSpecCliSeries(cliVersion);
6231
+ if (series === null) return [];
6232
+ const running = agentCliSeriesOrder(series);
6233
+ return AGENT_DELIVERY_REGISTRY.filter((tool) => {
6234
+ if (tool.minCliSeries && agentCliSeriesOrder(tool.minCliSeries) > running) return false;
6235
+ return true;
6236
+ }).map((tool) => {
6237
+ if (tool.requiresIdeRestart !== void 0 && tool.requiresIdeRestartSince && agentCliSeriesOrder(tool.requiresIdeRestartSince) > running) {
6238
+ const { ...rest } = tool;
6239
+ delete rest.requiresIdeRestart;
6240
+ return rest;
6241
+ }
6242
+ return { ...tool };
6243
+ });
6244
+ }
6245
+ /**
6246
+ * Parse a CLI version string into an admitted Agent inventory line.
6247
+ *
6248
+ * Delegates to the single compat version parser so the same stdout that classifies a session
6249
+ * also selects its inventory — two parsers must never disagree at this boundary. Returns
6250
+ * '1.9' only for stable 1.9.x, '1.8' only for stable 1.8.x, and null for every non-admitted
6251
+ * form: prereleases, >=1.10, below-range, or unparseable output.
6252
+ */
6253
+ function parseOpenSpecCliSeries(cliVersion) {
6254
+ const version = parseOpenSpecCliVersion(cliVersion ?? void 0);
6255
+ if (!version || version.prerelease !== null) return null;
6256
+ if (version.major === 1 && version.minor === 9) return "1.9";
6257
+ if (version.major === 1 && version.minor === 8) return "1.8";
6258
+ return null;
6259
+ }
6210
6260
  const CODEX_MANAGED_PROMPTS = {
6211
6261
  "opsx-propose.md": ["propose"],
6212
6262
  "opsx-explore.md": ["explore"],
@@ -6261,7 +6311,7 @@ const projectCleanup = (...patterns) => ({
6261
6311
  kind: "project-patterns",
6262
6312
  patterns
6263
6313
  });
6264
- /** Complete OpenSpec 1.7 Agent delivery registry in official order. */
6314
+ /** Complete OpenSpec 1.9 Agent delivery registry in official order. */
6265
6315
  const AGENT_DELIVERY_REGISTRY = [
6266
6316
  {
6267
6317
  name: "Amazon Q Developer",
@@ -6269,6 +6319,8 @@ const AGENT_DELIVERY_REGISTRY = [
6269
6319
  available: true,
6270
6320
  successLabel: "Amazon Q Developer",
6271
6321
  skillsDir: ".amazonq",
6322
+ requiresIdeRestart: true,
6323
+ requiresIdeRestartSince: "1.9",
6272
6324
  capability: "adapter-backed",
6273
6325
  command: command(".amazonq/prompts/opsx-{workflow}.md", yamlMarkdown("description"), { invocationPrefix: "@" }),
6274
6326
  cleanup: projectCleanup(".amazonq/prompts/openspec-*.md")
@@ -6279,6 +6331,8 @@ const AGENT_DELIVERY_REGISTRY = [
6279
6331
  available: true,
6280
6332
  successLabel: "Antigravity",
6281
6333
  skillsDir: ".agent",
6334
+ requiresIdeRestart: true,
6335
+ requiresIdeRestartSince: "1.9",
6282
6336
  capability: "adapter-backed",
6283
6337
  command: command(".agent/workflows/opsx-{workflow}.md", yamlMarkdown("description")),
6284
6338
  cleanup: projectCleanup(".agent/workflows/openspec-*.md")
@@ -6318,10 +6372,22 @@ const AGENT_DELIVERY_REGISTRY = [
6318
6372
  available: true,
6319
6373
  successLabel: "Cline",
6320
6374
  skillsDir: ".cline",
6375
+ requiresIdeRestart: true,
6376
+ requiresIdeRestartSince: "1.9",
6321
6377
  capability: "adapter-backed",
6322
6378
  command: command(".clinerules/workflows/opsx-{workflow}.md", headingMarkdown),
6323
6379
  cleanup: projectCleanup(".clinerules/workflows/openspec-*.md")
6324
6380
  },
6381
+ {
6382
+ name: "Command Code",
6383
+ value: "command-code",
6384
+ minCliSeries: "1.9",
6385
+ available: true,
6386
+ successLabel: "Command Code",
6387
+ skillsDir: ".commandcode",
6388
+ capability: "adapter-backed",
6389
+ command: command(".commandcode/commands/opsx-{workflow}.md", plainMarkdown)
6390
+ },
6325
6391
  {
6326
6392
  name: "CodeArts",
6327
6393
  value: "codeartsagent",
@@ -6336,7 +6402,9 @@ const AGENT_DELIVERY_REGISTRY = [
6336
6402
  value: "codex",
6337
6403
  available: true,
6338
6404
  successLabel: "Codex",
6339
- skillsDir: ".codex",
6405
+ skillsDir: ".agents",
6406
+ legacySkillsDirs: [".codex"],
6407
+ detectionPaths: [".agents/skills", ".codex/skills"],
6340
6408
  capability: "skills-invocable",
6341
6409
  command: null,
6342
6410
  cleanup: {
@@ -6344,7 +6412,12 @@ const AGENT_DELIVERY_REGISTRY = [
6344
6412
  projectPatterns: [".codex/prompts/openspec-*.md"],
6345
6413
  managedFiles: CODEX_MANAGED_PROMPTS,
6346
6414
  replacementLabel: "Codex skills"
6347
- }
6415
+ },
6416
+ migrations: [{
6417
+ from: ".codex",
6418
+ to: ".agents",
6419
+ needsConsent: false
6420
+ }]
6348
6421
  },
6349
6422
  {
6350
6423
  name: "Devin Desktop (formerly Windsurf)",
@@ -6353,6 +6426,8 @@ const AGENT_DELIVERY_REGISTRY = [
6353
6426
  successLabel: "Devin Desktop",
6354
6427
  skillsDir: ".devin",
6355
6428
  detectionPaths: [".devin", ".windsurf"],
6429
+ requiresIdeRestart: true,
6430
+ requiresIdeRestartSince: "1.9",
6356
6431
  capability: "adapter-backed",
6357
6432
  command: command(".devin/workflows/opsx-{workflow}.md", yamlMarkdown("name", "description", "category", "tags")),
6358
6433
  aliases: ["windsurf"],
@@ -6388,6 +6463,8 @@ const AGENT_DELIVERY_REGISTRY = [
6388
6463
  available: true,
6389
6464
  successLabel: "Continue (VS Code / JetBrains / Cli)",
6390
6465
  skillsDir: ".continue",
6466
+ requiresIdeRestart: true,
6467
+ requiresIdeRestartSince: "1.9",
6391
6468
  capability: "adapter-backed",
6392
6469
  command: command(".continue/prompts/opsx-{workflow}.prompt", yamlMarkdown("name", "description", "invokable")),
6393
6470
  cleanup: projectCleanup(".continue/prompts/openspec-*.prompt")
@@ -6398,6 +6475,8 @@ const AGENT_DELIVERY_REGISTRY = [
6398
6475
  available: true,
6399
6476
  successLabel: "CoStrict",
6400
6477
  skillsDir: ".cospec",
6478
+ requiresIdeRestart: true,
6479
+ requiresIdeRestartSince: "1.9",
6401
6480
  capability: "adapter-backed",
6402
6481
  command: command(".cospec/openspec/commands/opsx-{workflow}.md", yamlMarkdown("description", "argument-hint")),
6403
6482
  cleanup: projectCleanup(".cospec/openspec/commands")
@@ -6418,6 +6497,8 @@ const AGENT_DELIVERY_REGISTRY = [
6418
6497
  available: true,
6419
6498
  successLabel: "Cursor",
6420
6499
  skillsDir: ".cursor",
6500
+ requiresIdeRestart: true,
6501
+ requiresIdeRestartSince: "1.9",
6421
6502
  capability: "adapter-backed",
6422
6503
  command: command(".cursor/commands/opsx-{workflow}.md", yamlMarkdown("name", "id", "category", "description")),
6423
6504
  cleanup: projectCleanup(".cursor/commands/openspec-*.md")
@@ -6457,6 +6538,8 @@ const AGENT_DELIVERY_REGISTRY = [
6457
6538
  ".github/skills",
6458
6539
  ".github/.mcp.json"
6459
6540
  ],
6541
+ requiresIdeRestart: true,
6542
+ requiresIdeRestartSince: "1.9",
6460
6543
  capability: "adapter-backed",
6461
6544
  command: command(".github/prompts/opsx-{workflow}.prompt.md", yamlMarkdown("description")),
6462
6545
  cleanup: projectCleanup(".github/prompts/openspec-*.prompt.md")
@@ -6492,6 +6575,8 @@ const AGENT_DELIVERY_REGISTRY = [
6492
6575
  available: true,
6493
6576
  successLabel: "Junie",
6494
6577
  skillsDir: ".junie",
6578
+ requiresIdeRestart: true,
6579
+ requiresIdeRestartSince: "1.9",
6495
6580
  capability: "adapter-backed",
6496
6581
  command: command(".junie/commands/opsx-{workflow}.md", yamlMarkdown("description")),
6497
6582
  cleanup: projectCleanup(".junie/commands/opsx-*.md", ".junie/commands/openspec-*.md")
@@ -6502,6 +6587,8 @@ const AGENT_DELIVERY_REGISTRY = [
6502
6587
  available: true,
6503
6588
  successLabel: "Kilo Code",
6504
6589
  skillsDir: ".kilocode",
6590
+ requiresIdeRestart: true,
6591
+ requiresIdeRestartSince: "1.9",
6505
6592
  capability: "adapter-backed",
6506
6593
  command: command(".kilocode/workflows/opsx-{workflow}.md", plainMarkdown),
6507
6594
  cleanup: projectCleanup(".kilocode/workflows/openspec-*.md")
@@ -6527,6 +6614,8 @@ const AGENT_DELIVERY_REGISTRY = [
6527
6614
  available: true,
6528
6615
  successLabel: "Kiro",
6529
6616
  skillsDir: ".kiro",
6617
+ requiresIdeRestart: true,
6618
+ requiresIdeRestartSince: "1.9",
6530
6619
  capability: "adapter-backed",
6531
6620
  command: command(".kiro/prompts/opsx-{workflow}.prompt.md", yamlMarkdown("description")),
6532
6621
  cleanup: projectCleanup(".kiro/prompts/openspec-*.prompt.md")
@@ -6537,10 +6626,22 @@ const AGENT_DELIVERY_REGISTRY = [
6537
6626
  available: true,
6538
6627
  successLabel: "Lingma",
6539
6628
  skillsDir: ".lingma",
6629
+ requiresIdeRestart: true,
6630
+ requiresIdeRestartSince: "1.9",
6540
6631
  capability: "adapter-backed",
6541
6632
  command: command(".lingma/commands/opsx/{workflow}.md", yamlMarkdown("name", "description", "category", "tags")),
6542
6633
  cleanup: projectCleanup(".lingma/commands/openspec")
6543
6634
  },
6635
+ {
6636
+ name: "MiniMax Code",
6637
+ value: "minimax-code",
6638
+ available: true,
6639
+ successLabel: "MiniMax Code",
6640
+ skillsDir: null,
6641
+ globalSkillsDir: ".minimax",
6642
+ capability: "skills-invocable",
6643
+ command: null
6644
+ },
6544
6645
  {
6545
6646
  name: "Mistral Vibe",
6546
6647
  value: "vibe",
@@ -6584,6 +6685,8 @@ const AGENT_DELIVERY_REGISTRY = [
6584
6685
  available: true,
6585
6686
  successLabel: "Qoder",
6586
6687
  skillsDir: ".qoder",
6688
+ requiresIdeRestart: true,
6689
+ requiresIdeRestartSince: "1.9",
6587
6690
  capability: "adapter-backed",
6588
6691
  command: command(".qoder/commands/opsx/{workflow}.md", yamlMarkdown("name", "description", "category", "tags")),
6589
6692
  cleanup: projectCleanup(".qoder/commands/openspec")
@@ -6598,12 +6701,24 @@ const AGENT_DELIVERY_REGISTRY = [
6598
6701
  command: command(".qwen/commands/opsx-{workflow}.md", yamlMarkdown("description")),
6599
6702
  cleanup: projectCleanup(".qwen/commands/opsx-*.toml", ".qwen/commands/openspec-*.toml")
6600
6703
  },
6704
+ {
6705
+ name: "Rovo Dev CLI",
6706
+ value: "rovodev",
6707
+ available: true,
6708
+ successLabel: "Rovo Dev CLI",
6709
+ skillsDir: ".rovodev",
6710
+ detectionPaths: [".rovodev/skills", ".rovodev"],
6711
+ capability: "skills-invocable",
6712
+ command: null
6713
+ },
6601
6714
  {
6602
6715
  name: "Zoo Code",
6603
6716
  value: "roocode",
6604
6717
  available: true,
6605
6718
  successLabel: "Zoo Code",
6606
6719
  skillsDir: ".roo",
6720
+ requiresIdeRestart: true,
6721
+ requiresIdeRestartSince: "1.9",
6607
6722
  capability: "adapter-backed",
6608
6723
  command: command(".roo/commands/opsx-{workflow}.md", headingMarkdown),
6609
6724
  cleanup: projectCleanup(".roo/commands/openspec-*.md")
@@ -6614,6 +6729,8 @@ const AGENT_DELIVERY_REGISTRY = [
6614
6729
  available: true,
6615
6730
  successLabel: "Trae",
6616
6731
  skillsDir: ".trae",
6732
+ requiresIdeRestart: true,
6733
+ requiresIdeRestartSince: "1.9",
6617
6734
  capability: "adapter-backed",
6618
6735
  command: command(".trae/commands/opsx-{workflow}.md", yamlMarkdown("name", "description"))
6619
6736
  },
@@ -6627,12 +6744,13 @@ const AGENT_DELIVERY_REGISTRY = [
6627
6744
  command: command(".zcode/commands/opsx/{workflow}.md", yamlMarkdown("name", "description", "category", "tags"))
6628
6745
  },
6629
6746
  {
6630
- name: "AGENTS.md (works with Amp, VS Code, …)",
6747
+ name: "Shared .agents skills",
6631
6748
  value: "agents",
6632
- available: false,
6633
- successLabel: "your AGENTS.md-compatible assistant",
6634
- skillsDir: null,
6635
- capability: "none",
6749
+ available: true,
6750
+ successLabel: "shared .agents skills",
6751
+ skillsDir: ".agents",
6752
+ detectionPaths: [".agents/skills"],
6753
+ capability: "skills-invocable",
6636
6754
  command: null
6637
6755
  }
6638
6756
  ];
@@ -6647,225 +6765,49 @@ function resolveAgentCommandPathTemplate(pathTemplate, workflow) {
6647
6765
  return pathTemplate.replace("{workflow}", workflow);
6648
6766
  }
6649
6767
 
6650
- //#endregion
6651
- //#region src/tool-config.ts
6652
- /**
6653
- * Orthogonal intents (updated 2026-08-01 Asia/Shanghai):
6654
- * 1. Expose the unified OpenSpec 1.7 Agent delivery registry through the established Tool APIs.
6655
- * 2. Detect configured project-local Agent roots reactively without duplicating registry metadata.
6656
- *
6657
- * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
6658
- */
6659
- /** OpenSpec initialization generated skill directory names. */
6660
- const SKILL_NAMES = [
6661
- "openspec-explore",
6662
- "openspec-new-change",
6663
- "openspec-continue-change",
6664
- "openspec-apply-change",
6665
- "openspec-update-change",
6666
- "openspec-ff-change",
6667
- "openspec-sync-specs",
6668
- "openspec-archive-change",
6669
- "openspec-bulk-archive-change",
6670
- "openspec-verify-change",
6671
- "openspec-onboard",
6672
- "openspec-propose"
6673
- ];
6674
- /** Return registry entries available to OpenSpec init/update. */
6675
- function getAvailableTools() {
6676
- return AI_TOOLS.filter((tool) => tool.available);
6677
- }
6678
- /** Return available official Tool ids. */
6679
- function getAvailableToolIds() {
6680
- return getAvailableTools().map((tool) => tool.value);
6681
- }
6682
- /** Return the complete official registry, including unavailable pseudo-tools. */
6683
- function getAllTools() {
6684
- return AI_TOOLS;
6685
- }
6686
- /** Detect project-local Agent roots using the official OpenSpec detection paths. */
6687
- async function getDetectedProjectTools(projectDir) {
6688
- return (await Promise.all(AI_TOOLS.map(async (tool) => {
6689
- if (!tool.skillsDir) return null;
6690
- if (tool.detectionPaths?.length) return (await Promise.all(tool.detectionPaths.map((detectionPath) => reactiveStat(join$1(projectDir, detectionPath))))).some((entry) => entry !== null) ? tool : null;
6691
- return (await reactiveStat(join$1(projectDir, tool.skillsDir)))?.isDirectory === true ? tool : null;
6692
- }))).filter((tool) => tool !== null);
6693
- }
6694
- /** Return every current official Tool id in registry order. */
6695
- function getAllToolIds() {
6696
- return AI_TOOLS.map((tool) => tool.value);
6697
- }
6698
- /** Resolve one current or retired Tool id to its official registry entry. */
6699
- function getToolById(toolId) {
6700
- const resolvedToolId = resolveAgentToolId(toolId);
6701
- return AI_TOOLS.find((tool) => tool.value === resolvedToolId);
6702
- }
6703
- const stateCache = /* @__PURE__ */ new Map();
6704
- const releaseCache = /* @__PURE__ */ new Map();
6705
- function getSkillsDir(projectDir, tool) {
6706
- return tool.skillsDir ? join$1(projectDir, tool.skillsDir, "skills") : null;
6707
- }
6708
- async function getSkillCount(projectDir, tool) {
6709
- const skillsDir = getSkillsDir(projectDir, tool);
6710
- if (!skillsDir) return 0;
6711
- let count = 0;
6712
- for (const skillName of SKILL_NAMES) if (await reactiveExists(join$1(skillsDir, skillName, "SKILL.md"))) count++;
6713
- return count;
6714
- }
6715
- async function scanConfiguredTools(projectDir) {
6716
- return (await Promise.all(AI_TOOLS.map(async (tool) => {
6717
- if (!tool.skillsDir) return null;
6718
- return await getSkillCount(projectDir, tool) > 0 ? tool.value : null;
6719
- }))).filter((toolId) => toolId !== null);
6720
- }
6721
- function getProjectWatchDirs(projectDir) {
6722
- const dirs = /* @__PURE__ */ new Set();
6723
- for (const tool of AI_TOOLS) {
6724
- if (tool.skillsDir) dirs.add(join$1(projectDir, tool.skillsDir));
6725
- for (const migration of tool.migrations ?? []) dirs.add(join$1(projectDir, migration.from));
6726
- }
6727
- return [...dirs];
6728
- }
6729
- /** Detect configured Agents through a retained reactive projection. */
6730
- async function getConfiguredTools(projectDir) {
6731
- const normalizedPath = resolve(projectDir);
6732
- const key = `tools:${normalizedPath}`;
6733
- let state = stateCache.get(key);
6734
- if (!state) {
6735
- state = new ReactiveState(await scanConfiguredTools(normalizedPath), { equals: (left, right) => left.length === right.length && left.every((value, index) => value === right[index]) });
6736
- stateCache.set(key, state);
6737
- const releases = [];
6738
- const onUpdate = async () => state?.set(await scanConfiguredTools(normalizedPath));
6739
- for (const dir of getProjectWatchDirs(normalizedPath)) releases.push(acquireWatcher(dir, onUpdate, { recursive: true }));
6740
- releases.push(acquireWatcher(normalizedPath, onUpdate, { recursive: false }));
6741
- releaseCache.set(key, () => releases.forEach((release) => release()));
6742
- }
6743
- return state.get();
6744
- }
6745
- /** Check whether a current or retired Tool id resolves to configured skills. */
6746
- async function isToolConfigured(projectDir, toolId) {
6747
- return (await getConfiguredTools(projectDir)).includes(resolveAgentToolId(toolId));
6748
- }
6749
-
6750
- //#endregion
6751
- //#region src/agent-delivery-policy.ts
6752
- /**
6753
- * Orthogonal intents (created 2026-08-01 Asia/Shanghai):
6754
- * 1. Define the structured Agent profile, delivery, and workflow mutation contract.
6755
- * 2. Normalize Core versus Custom workflow semantics exactly once.
6756
- * 3. Preserve unknown environment-global JSON fields while updating official Agent policy keys.
6757
- *
6758
- * Original request (2026-08-01): keep raw environment config authoring while moving official Agent controls to Config.
6759
- */
6760
- const AgentDeliveryProfileSchema = z.enum(["core", "custom"]);
6761
- const AgentDeliveryModeSchema = z.enum([
6762
- "both",
6763
- "skills",
6764
- "commands"
6765
- ]);
6766
- const AgentDeliveryWorkflowSchema = z.enum(OPSX_ALL_WORKFLOWS);
6767
- const AgentDeliveryPolicyUpdateSchema = z.object({
6768
- profile: AgentDeliveryProfileSchema,
6769
- delivery: AgentDeliveryModeSchema,
6770
- workflows: z.array(AgentDeliveryWorkflowSchema)
6771
- }).superRefine((value, context$1) => {
6772
- if (new Set(value.workflows).size !== value.workflows.length) context$1.addIssue({
6773
- code: "custom",
6774
- message: "Agent workflows must be unique."
6775
- });
6776
- });
6777
- /** Normalize authored policy through official omitted-value defaults and Core workflow semantics. */
6778
- function normalizeAgentDeliveryPolicy(input) {
6779
- const profile = input.profile === "custom" ? "custom" : "core";
6780
- return {
6781
- profile,
6782
- delivery: input.delivery === "skills" || input.delivery === "commands" ? input.delivery : "both",
6783
- workflows: profile === "core" ? [...OPSX_CORE_PROFILE_WORKFLOWS] : OPSX_ALL_WORKFLOWS.filter((workflow) => input.workflows?.includes(workflow))
6784
- };
6785
- }
6786
- /** Update only official Agent policy keys while retaining every team-authored extension field. */
6787
- function applyAgentDeliveryPolicy(config, update) {
6788
- const policy = normalizeAgentDeliveryPolicy(update);
6789
- return {
6790
- ...config,
6791
- profile: policy.profile,
6792
- delivery: policy.delivery,
6793
- workflows: policy.workflows
6794
- };
6795
- }
6796
-
6797
- //#endregion
6798
- //#region src/agent-command-content.ts
6799
- /**
6800
- * Orthogonal intents (created 2026-08-01 Asia/Shanghai):
6801
- * 1. Resolve the running OpenSpec CLI's private command-generation boundary without bundling copied prompts.
6802
- * 2. Produce exact per-Agent, per-workflow command contents for physical fingerprint comparison.
6803
- * 3. Fail closed when the configured runner has no importable OpenSpec module or compatible generator contract.
6804
- *
6805
- * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
6806
- */
6807
- const KNOWN_WORKFLOWS = new Set(OPSX_ALL_WORKFLOWS);
6808
- function isRecord(value) {
6809
- return typeof value === "object" && value !== null;
6810
- }
6811
- function isRuntimeSkillGenerationModule(value) {
6812
- return isRecord(value) && typeof value.getCommandContents === "function";
6813
- }
6814
- function isRuntimeCommandAdapterRegistry(value) {
6815
- if (typeof value !== "object" && typeof value !== "function" || value === null) return false;
6816
- return "get" in value && typeof value.get === "function";
6817
- }
6818
- function isRuntimeCommandGenerationModule(value) {
6819
- return isRecord(value) && isRuntimeCommandAdapterRegistry(value.CommandAdapterRegistry) && typeof value.generateCommands === "function";
6820
- }
6821
- function isRuntimeCommandContent(value) {
6822
- return isRecord(value) && typeof value.id === "string" && KNOWN_WORKFLOWS.has(value.id);
6823
- }
6824
- function isRuntimeGeneratedCommand(value) {
6825
- return isRecord(value) && typeof value.fileContent === "string";
6826
- }
6827
- /**
6828
- * Load exact command contents from the configured OpenSpec CLI.
6829
- *
6830
- * The private generator is intentionally treated as optional evidence. When the runner is not an
6831
- * importable local OpenSpec module, callers receive `null` and commands-only installs cannot be
6832
- * declared current from path existence alone.
6833
- */
6834
- async function loadOpenSpecAgentCommandContents(cliCommand, workflows) {
6835
- try {
6836
- const cliModuleDir = dirname$1((await resolveOpenSpecWorkerInvocation(cliCommand)).modulePath);
6837
- const [skillGenerationModule, commandGenerationModule] = await Promise.all([import(pathToFileURL(resolve(cliModuleDir, "../core/shared/skill-generation.js")).href), import(pathToFileURL(resolve(cliModuleDir, "../core/command-generation/index.js")).href)]);
6838
- if (!isRuntimeSkillGenerationModule(skillGenerationModule) || !isRuntimeCommandGenerationModule(commandGenerationModule)) return null;
6839
- const commandContents = skillGenerationModule.getCommandContents(workflows);
6840
- if (!Array.isArray(commandContents) || !commandContents.every(isRuntimeCommandContent)) return null;
6841
- const catalog = {};
6842
- for (const tool of AGENT_DELIVERY_REGISTRY) {
6843
- if (!tool.command) continue;
6844
- const adapter = commandGenerationModule.CommandAdapterRegistry.get(tool.value);
6845
- if (!adapter) return null;
6846
- const generatedCommands = commandGenerationModule.generateCommands(commandContents, adapter);
6847
- if (!Array.isArray(generatedCommands) || generatedCommands.length !== commandContents.length || !generatedCommands.every(isRuntimeGeneratedCommand)) return null;
6848
- catalog[tool.value] = Object.fromEntries(commandContents.map((content, index) => [content.id, generatedCommands[index]?.fileContent]));
6849
- }
6850
- return catalog;
6851
- } catch {
6852
- return null;
6853
- }
6854
- }
6855
-
6856
6768
  //#endregion
6857
6769
  //#region src/tool-init-state.ts
6858
6770
  /**
6859
- * Orthogonal intents (updated 2026-08-01 Asia/Shanghai):
6860
- * 1. Project the unified OpenSpec 1.7 Agent registry into exact skill and command artifact state.
6771
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
6772
+ * 1. Project the unified OpenSpec 1.9 Agent registry into exact skill and command artifact state.
6861
6773
  * 2. Report partial, stale-version, cleanup-needed, migration-required, and unavailable states from physical evidence.
6862
- * 3. Preserve bounded reactive directory observation and fresh one-shot cache invalidation.
6863
- * 4. Expose Codex managed-global-prompt observation without treating those prompts as current commands.
6774
+ * 3. Observe user-global skill roots (e.g. MiniMax Code) without ever cleaning or migrating them here.
6775
+ * 4. Preserve bounded reactive directory observation and fresh one-shot cache invalidation.
6776
+ * 5. Expose Codex managed-global-prompt observation without treating those prompts as current commands.
6864
6777
  *
6865
6778
  * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
6779
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
6866
6780
  */
6867
6781
  /** Pinned source version used when a runtime CLI version is not supplied by the Server owner. */
6868
- const PINNED_AGENT_GENERATOR_VERSION = "1.7.0";
6782
+ const PINNED_AGENT_GENERATOR_VERSION = "1.9.0";
6783
+ /** Resolve the physical skills inventory scope for one registry entry. */
6784
+ function resolveToolSkillsScope(tool) {
6785
+ if (tool.globalSkillsDir) return {
6786
+ kind: "user-global",
6787
+ globalSkillsDir: tool.globalSkillsDir
6788
+ };
6789
+ if (tool.skillsDir) return {
6790
+ kind: "project",
6791
+ skillsDir: tool.skillsDir
6792
+ };
6793
+ return { kind: "none" };
6794
+ }
6795
+ /** Resolve the home directory the same way the official CLI resolves user-global roots. */
6796
+ function resolveAgentHome() {
6797
+ return process.env.USERPROFILE || process.env.HOME || homedir();
6798
+ }
6799
+ /** Resolve the absolute user-global skills inventory directory for a global root (e.g. `.minimax`). */
6800
+ function resolveGlobalSkillsInventoryDir(globalSkillsDir) {
6801
+ return resolve(resolveAgentHome(), globalSkillsDir, "skills");
6802
+ }
6803
+ /** External user-global skills inventory roots observed by the Agent delivery projection. */
6804
+ function getExternalAgentSkillsObservationRoots() {
6805
+ return AI_TOOLS.flatMap((tool) => {
6806
+ if (!tool.globalSkillsDir) return [];
6807
+ const root = resolveGlobalSkillsInventoryDir(tool.globalSkillsDir);
6808
+ return root === getExternalCodexCommandObservationRoot() ? [] : [root];
6809
+ });
6810
+ }
6869
6811
  const ALL_TOOL_WORKFLOWS = [...OPSX_ALL_WORKFLOWS];
6870
6812
  function toKnownWorkflows(workflows) {
6871
6813
  return workflows.filter((workflow) => workflow in OPSX_WORKFLOW_TO_SKILL_DIR);
@@ -6890,12 +6832,15 @@ function resolveCommandArtifact(projectDir, tool, workflow, rootOverride) {
6890
6832
  legacyPaths: tool.command.legacyPathTemplates?.map((pathTemplate) => resolve(projectDir, resolveAgentCommandPathTemplate(rebase(pathTemplate), workflow)))
6891
6833
  };
6892
6834
  }
6893
- function getSkillArtifacts(projectDir, skillsDir, workflows = ALL_TOOL_WORKFLOWS) {
6835
+ function getSkillArtifactsFromInventory(inventoryRoot, workflows = ALL_TOOL_WORKFLOWS) {
6894
6836
  return workflows.map((workflow) => ({
6895
6837
  workflow,
6896
- path: resolve(projectDir, skillsDir, "skills", OPSX_WORKFLOW_TO_SKILL_DIR[workflow], "SKILL.md")
6838
+ path: resolve(inventoryRoot, OPSX_WORKFLOW_TO_SKILL_DIR[workflow], "SKILL.md")
6897
6839
  }));
6898
6840
  }
6841
+ function getSkillArtifacts(projectDir, skillsDir, workflows = ALL_TOOL_WORKFLOWS) {
6842
+ return getSkillArtifactsFromInventory(resolve(projectDir, skillsDir, "skills"), workflows);
6843
+ }
6899
6844
  function getCommandArtifacts(projectDir, tool, rootOverride) {
6900
6845
  return ALL_TOOL_WORKFLOWS.flatMap((workflow) => {
6901
6846
  const artifact = resolveCommandArtifact(projectDir, tool, workflow, rootOverride);
@@ -6903,9 +6848,14 @@ function getCommandArtifacts(projectDir, tool, rootOverride) {
6903
6848
  });
6904
6849
  }
6905
6850
  function invalidateToolInitCaches(projectDir) {
6906
- const cacheRoots = new Set([resolve(projectDir), getExternalCodexCommandObservationRoot()]);
6851
+ const cacheRoots = new Set([
6852
+ resolve(projectDir),
6853
+ getExternalCodexCommandObservationRoot(),
6854
+ ...getExternalAgentSkillsObservationRoots()
6855
+ ]);
6907
6856
  for (const tool of AI_TOOLS) {
6908
6857
  if (tool.skillsDir) cacheRoots.add(resolve(projectDir, tool.skillsDir));
6858
+ for (const legacyRoot of tool.legacySkillsDirs ?? []) cacheRoots.add(resolve(projectDir, legacyRoot));
6909
6859
  for (const migration of tool.migrations ?? []) cacheRoots.add(resolve(projectDir, migration.from));
6910
6860
  for (const commandArtifact of getCommandArtifacts(projectDir, tool)) {
6911
6861
  cacheRoots.add(dirname$1(commandArtifact.path));
@@ -6917,11 +6867,8 @@ function invalidateToolInitCaches(projectDir) {
6917
6867
  async function readArtifactDirectory(dir) {
6918
6868
  return new Set(await reactiveReadDir(dir, { includeHidden: true }));
6919
6869
  }
6920
- async function getExistingSkillPaths(projectDir, skillsDir, entries, projectRootEntries) {
6921
- const toolRoot = resolve(projectDir, skillsDir);
6922
- if (!projectRootEntries.has(basename(toolRoot))) return /* @__PURE__ */ new Set();
6923
- if (!(await readArtifactDirectory(toolRoot)).has("skills")) return /* @__PURE__ */ new Set();
6924
- const rootEntries = await readArtifactDirectory(resolve(toolRoot, "skills"));
6870
+ async function getExistingInventorySkillPaths(inventoryRoot, entries) {
6871
+ const rootEntries = await readArtifactDirectory(inventoryRoot);
6925
6872
  const presentEntries = entries.filter((entry) => rootEntries.has(basename(dirname$1(entry.path))));
6926
6873
  const directoryEntries = await Promise.all(presentEntries.map(async (entry) => ({
6927
6874
  entry,
@@ -6929,6 +6876,12 @@ async function getExistingSkillPaths(projectDir, skillsDir, entries, projectRoot
6929
6876
  })));
6930
6877
  return new Set(directoryEntries.filter(({ entry, files }) => files.has(basename(entry.path))).map(({ entry }) => entry.path));
6931
6878
  }
6879
+ async function getExistingSkillPaths(projectDir, skillsDir, entries, projectRootEntries) {
6880
+ const toolRoot = resolve(projectDir, skillsDir);
6881
+ if (!projectRootEntries.has(basename(toolRoot))) return /* @__PURE__ */ new Set();
6882
+ if (!(await readArtifactDirectory(toolRoot)).has("skills")) return /* @__PURE__ */ new Set();
6883
+ return getExistingInventorySkillPaths(resolve(toolRoot, "skills"), entries);
6884
+ }
6932
6885
  async function getExistingCommandPaths(entries) {
6933
6886
  const pathsByDirectory = /* @__PURE__ */ new Map();
6934
6887
  for (const entry of entries) for (const path of [entry.path, ...entry.legacyPaths ?? []]) {
@@ -7058,7 +7011,7 @@ async function collectCleanup(projectDir, tool, projectRootEntries) {
7058
7011
  kind: projectCleanup$1.paths.length > 0 && globalCleanup ? "mixed" : globalCleanup ? "managed-global-prompts" : "project-artifacts",
7059
7012
  paths,
7060
7013
  workflows,
7061
- replacementLabel: globalCleanup?.replacementLabel ?? "OpenSpec 1.7 Agent delivery"
7014
+ replacementLabel: globalCleanup?.replacementLabel ?? "OpenSpec 1.9 Agent delivery"
7062
7015
  };
7063
7016
  }
7064
7017
  async function collectMigrationEvidence(projectDir, tool, projectRootEntries) {
@@ -7093,14 +7046,17 @@ async function projectToolInitStates(projectDir, options) {
7093
7046
  const desiredWorkflows = toKnownWorkflows(options.workflows);
7094
7047
  const desiredWorkflowSet = new Set(desiredWorkflows);
7095
7048
  const projectRootEntries = await readArtifactDirectory(projectDir);
7096
- return Promise.all(AI_TOOLS.map(async (tool) => {
7097
- if (!tool.available || !tool.skillsDir) return {
7049
+ const officialRegistry = options.registry ?? AI_TOOLS;
7050
+ return Promise.all(officialRegistry.map(async (tool) => {
7051
+ const skillsScope = resolveToolSkillsScope(tool);
7052
+ if (!tool.available || skillsScope.kind === "none") return {
7098
7053
  toolId: tool.value,
7099
7054
  toolName: tool.name,
7100
7055
  status: "unavailable",
7101
7056
  readiness: "unavailable",
7102
7057
  issues: [],
7103
7058
  hasAnyArtifacts: false,
7059
+ commandSurfaceUnavailableReason: null,
7104
7060
  expectedSkillCount: 0,
7105
7061
  presentExpectedSkillCount: 0,
7106
7062
  detectedSkillCount: 0,
@@ -7114,13 +7070,17 @@ async function projectToolInitStates(projectDir, options) {
7114
7070
  legacyCommandWorkflows: [],
7115
7071
  installedSkillWorkflows: [],
7116
7072
  installedCommandWorkflows: [],
7117
- generatedByVersion: null
7073
+ generatedByVersion: null,
7074
+ skillsScope,
7075
+ legacySkillRoots: [],
7076
+ requiresIdeRestart: tool.requiresIdeRestart === true
7118
7077
  };
7119
7078
  const shouldGenerateSkills = options.delivery !== "commands" || tool.capability === "skills-invocable";
7120
7079
  const shouldGenerateCommands = options.delivery !== "skills" && tool.capability === "adapter-backed";
7121
- const skillArtifacts = getSkillArtifacts(projectDir, tool.skillsDir);
7122
- const commandArtifacts = getCommandArtifacts(projectDir, tool);
7123
- const existingSkillPaths = await getExistingSkillPaths(projectDir, tool.skillsDir, skillArtifacts, projectRootEntries);
7080
+ const inventoryRoot = skillsScope.kind === "user-global" ? resolveGlobalSkillsInventoryDir(skillsScope.globalSkillsDir) : resolve(projectDir, skillsScope.skillsDir, "skills");
7081
+ const skillArtifacts = getSkillArtifactsFromInventory(inventoryRoot);
7082
+ const commandArtifacts = skillsScope.kind === "user-global" ? [] : getCommandArtifacts(projectDir, tool);
7083
+ const existingSkillPaths = skillsScope.kind === "user-global" ? await getExistingInventorySkillPaths(inventoryRoot, skillArtifacts) : await getExistingSkillPaths(projectDir, skillsScope.skillsDir, skillArtifacts, projectRootEntries);
7124
7084
  const existingCommandPaths = await getExistingCommandPaths(commandArtifacts);
7125
7085
  const expectedSkillArtifacts = shouldGenerateSkills ? skillArtifacts.filter((entry) => desiredWorkflowSet.has(entry.workflow)) : [];
7126
7086
  const expectedCommandArtifacts = shouldGenerateCommands ? commandArtifacts.filter((entry) => desiredWorkflowSet.has(entry.workflow)) : [];
@@ -7169,6 +7129,10 @@ async function projectToolInitStates(projectDir, options) {
7169
7129
  installedSkillWorkflows,
7170
7130
  installedCommandWorkflows,
7171
7131
  generatedByVersion,
7132
+ skillsScope,
7133
+ legacySkillRoots: [...tool.legacySkillsDirs ?? []],
7134
+ requiresIdeRestart: tool.requiresIdeRestart === true,
7135
+ commandSurfaceUnavailableReason: options.unavailableCommandTools?.[tool.value] ?? null,
7172
7136
  cleanup,
7173
7137
  migration
7174
7138
  };
@@ -7185,11 +7149,235 @@ function createToolInitStateProjection(projectDir, options) {
7185
7149
  delivery: options.delivery,
7186
7150
  workflows: [...options.workflows],
7187
7151
  generatorVersion: options.generatorVersion,
7188
- commandContents: options.commandContents
7152
+ commandContents: options.commandContents,
7153
+ unavailableCommandTools: options.unavailableCommandTools ?? null,
7154
+ registry: options.registry ? options.registry.map((tool) => ({ ...tool })) : void 0
7189
7155
  };
7190
7156
  return () => projectToolInitStates(projectDir, projectionOptions);
7191
7157
  }
7192
7158
 
7159
+ //#endregion
7160
+ //#region src/tool-config.ts
7161
+ /**
7162
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
7163
+ * 1. Expose the unified OpenSpec 1.9 Agent delivery registry through the established Tool APIs.
7164
+ * 2. Detect configured project-local and user-global Agent roots reactively without duplicating registry metadata.
7165
+ *
7166
+ * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
7167
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
7168
+ */
7169
+ /** OpenSpec initialization generated skill directory names. */
7170
+ const SKILL_NAMES = [
7171
+ "openspec-explore",
7172
+ "openspec-new-change",
7173
+ "openspec-continue-change",
7174
+ "openspec-apply-change",
7175
+ "openspec-update-change",
7176
+ "openspec-ff-change",
7177
+ "openspec-sync-specs",
7178
+ "openspec-archive-change",
7179
+ "openspec-bulk-archive-change",
7180
+ "openspec-verify-change",
7181
+ "openspec-onboard",
7182
+ "openspec-propose"
7183
+ ];
7184
+ /** Return registry entries available to OpenSpec init/update. */
7185
+ function getAvailableTools() {
7186
+ return AI_TOOLS.filter((tool) => tool.available);
7187
+ }
7188
+ /** Return available official Tool ids. */
7189
+ function getAvailableToolIds() {
7190
+ return getAvailableTools().map((tool) => tool.value);
7191
+ }
7192
+ /** Return the complete official registry, including unavailable pseudo-tools. */
7193
+ function getAllTools() {
7194
+ return AI_TOOLS;
7195
+ }
7196
+ /** Detect configured Agents using the official OpenSpec project and user-global detection rules. */
7197
+ async function getDetectedProjectTools(projectDir) {
7198
+ return (await Promise.all(AI_TOOLS.map(async (tool) => {
7199
+ if (tool.globalSkillsDir) {
7200
+ const inventoryRoot = resolveGlobalSkillsInventoryDir(tool.globalSkillsDir);
7201
+ return (await Promise.all(SKILL_NAMES.map((skillName) => reactiveExists(join$1(inventoryRoot, skillName, "SKILL.md"))))).some(Boolean) ? tool : null;
7202
+ }
7203
+ if (!tool.skillsDir) return null;
7204
+ if (tool.detectionPaths?.length) return (await Promise.all(tool.detectionPaths.map((detectionPath) => reactiveStat(join$1(projectDir, detectionPath))))).some((entry) => entry !== null) ? tool : null;
7205
+ return (await reactiveStat(join$1(projectDir, tool.skillsDir)))?.isDirectory === true ? tool : null;
7206
+ }))).filter((tool) => tool !== null);
7207
+ }
7208
+ /** Return every current official Tool id in registry order. */
7209
+ function getAllToolIds() {
7210
+ return AI_TOOLS.map((tool) => tool.value);
7211
+ }
7212
+ /** Resolve one current or retired Tool id to its official registry entry. */
7213
+ function getToolById(toolId) {
7214
+ const resolvedToolId = resolveAgentToolId(toolId);
7215
+ return AI_TOOLS.find((tool) => tool.value === resolvedToolId);
7216
+ }
7217
+ const stateCache = /* @__PURE__ */ new Map();
7218
+ const releaseCache = /* @__PURE__ */ new Map();
7219
+ function getSkillsDir(projectDir, tool) {
7220
+ if (tool.globalSkillsDir) return resolveGlobalSkillsInventoryDir(tool.globalSkillsDir);
7221
+ return tool.skillsDir ? join$1(projectDir, tool.skillsDir, "skills") : null;
7222
+ }
7223
+ async function getSkillCount(projectDir, tool) {
7224
+ const skillsDir = getSkillsDir(projectDir, tool);
7225
+ if (!skillsDir) return 0;
7226
+ let count = 0;
7227
+ for (const skillName of SKILL_NAMES) if (await reactiveExists(join$1(skillsDir, skillName, "SKILL.md"))) count++;
7228
+ return count;
7229
+ }
7230
+ async function scanConfiguredTools(projectDir) {
7231
+ return (await Promise.all(AI_TOOLS.map(async (tool) => {
7232
+ if (!tool.skillsDir && !tool.globalSkillsDir) return null;
7233
+ return await getSkillCount(projectDir, tool) > 0 ? tool.value : null;
7234
+ }))).filter((toolId) => toolId !== null);
7235
+ }
7236
+ function getProjectWatchDirs(projectDir) {
7237
+ const dirs = /* @__PURE__ */ new Set();
7238
+ for (const tool of AI_TOOLS) {
7239
+ if (tool.skillsDir) dirs.add(join$1(projectDir, tool.skillsDir));
7240
+ for (const migration of tool.migrations ?? []) dirs.add(join$1(projectDir, migration.from));
7241
+ }
7242
+ return [...dirs];
7243
+ }
7244
+ /** Detect configured Agents through a retained reactive projection. */
7245
+ async function getConfiguredTools(projectDir) {
7246
+ const normalizedPath = resolve(projectDir);
7247
+ const key = `tools:${normalizedPath}`;
7248
+ let state = stateCache.get(key);
7249
+ if (!state) {
7250
+ state = new ReactiveState(await scanConfiguredTools(normalizedPath), { equals: (left, right) => left.length === right.length && left.every((value, index) => value === right[index]) });
7251
+ stateCache.set(key, state);
7252
+ const releases = [];
7253
+ const onUpdate = async () => state?.set(await scanConfiguredTools(normalizedPath));
7254
+ for (const dir of getProjectWatchDirs(normalizedPath)) releases.push(acquireWatcher(dir, onUpdate, { recursive: true }));
7255
+ releases.push(acquireWatcher(normalizedPath, onUpdate, { recursive: false }));
7256
+ releaseCache.set(key, () => releases.forEach((release) => release()));
7257
+ }
7258
+ return state.get();
7259
+ }
7260
+ /** Check whether a current or retired Tool id resolves to configured skills. */
7261
+ async function isToolConfigured(projectDir, toolId) {
7262
+ return (await getConfiguredTools(projectDir)).includes(resolveAgentToolId(toolId));
7263
+ }
7264
+
7265
+ //#endregion
7266
+ //#region src/agent-delivery-policy.ts
7267
+ /**
7268
+ * Orthogonal intents (created 2026-08-01 Asia/Shanghai):
7269
+ * 1. Define the structured Agent profile, delivery, and workflow mutation contract.
7270
+ * 2. Normalize Core versus Custom workflow semantics exactly once.
7271
+ * 3. Preserve unknown environment-global JSON fields while updating official Agent policy keys.
7272
+ *
7273
+ * Original request (2026-08-01): keep raw environment config authoring while moving official Agent controls to Config.
7274
+ */
7275
+ const AgentDeliveryProfileSchema = z.enum(["core", "custom"]);
7276
+ const AgentDeliveryModeSchema = z.enum([
7277
+ "both",
7278
+ "skills",
7279
+ "commands"
7280
+ ]);
7281
+ const AgentDeliveryWorkflowSchema = z.enum(OPSX_ALL_WORKFLOWS);
7282
+ const AgentDeliveryPolicyUpdateSchema = z.object({
7283
+ profile: AgentDeliveryProfileSchema,
7284
+ delivery: AgentDeliveryModeSchema,
7285
+ workflows: z.array(AgentDeliveryWorkflowSchema)
7286
+ }).superRefine((value, context$1) => {
7287
+ if (new Set(value.workflows).size !== value.workflows.length) context$1.addIssue({
7288
+ code: "custom",
7289
+ message: "Agent workflows must be unique."
7290
+ });
7291
+ });
7292
+ /** Normalize authored policy through official omitted-value defaults and Core workflow semantics. */
7293
+ function normalizeAgentDeliveryPolicy(input) {
7294
+ const profile = input.profile === "custom" ? "custom" : "core";
7295
+ return {
7296
+ profile,
7297
+ delivery: input.delivery === "skills" || input.delivery === "commands" ? input.delivery : "both",
7298
+ workflows: profile === "core" ? [...OPSX_CORE_PROFILE_WORKFLOWS] : OPSX_ALL_WORKFLOWS.filter((workflow) => input.workflows?.includes(workflow))
7299
+ };
7300
+ }
7301
+ /** Update only official Agent policy keys while retaining every team-authored extension field. */
7302
+ function applyAgentDeliveryPolicy(config, update) {
7303
+ const policy = normalizeAgentDeliveryPolicy(update);
7304
+ return {
7305
+ ...config,
7306
+ profile: policy.profile,
7307
+ delivery: policy.delivery,
7308
+ workflows: policy.workflows
7309
+ };
7310
+ }
7311
+
7312
+ //#endregion
7313
+ //#region src/agent-command-content.ts
7314
+ /**
7315
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
7316
+ * 1. Resolve the running OpenSpec CLI's private command-generation boundary without bundling copied prompts.
7317
+ * 2. Produce exact per-Agent, per-workflow command contents for physical fingerprint comparison.
7318
+ * 3. Fail closed when the configured runner has no importable OpenSpec module or compatible generator contract.
7319
+ * 4. Isolate per-tool adapter absence as version-scoped unavailability, keeping unrelated evidence.
7320
+ *
7321
+ * Original request (2026-08-01): adapt the complete OpenSpec 1.7 Agent delivery protocol for OpenSpecUI 7.
7322
+
7323
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
7324
+ */
7325
+ const KNOWN_WORKFLOWS = new Set(OPSX_ALL_WORKFLOWS);
7326
+ function isRecord(value) {
7327
+ return typeof value === "object" && value !== null;
7328
+ }
7329
+ function isRuntimeSkillGenerationModule(value) {
7330
+ return isRecord(value) && typeof value.getCommandContents === "function";
7331
+ }
7332
+ function isRuntimeCommandAdapterRegistry(value) {
7333
+ if (typeof value !== "object" && typeof value !== "function" || value === null) return false;
7334
+ return "get" in value && typeof value.get === "function";
7335
+ }
7336
+ function isRuntimeCommandGenerationModule(value) {
7337
+ return isRecord(value) && isRuntimeCommandAdapterRegistry(value.CommandAdapterRegistry) && typeof value.generateCommands === "function";
7338
+ }
7339
+ function isRuntimeCommandContent(value) {
7340
+ return isRecord(value) && typeof value.id === "string" && KNOWN_WORKFLOWS.has(value.id);
7341
+ }
7342
+ function isRuntimeGeneratedCommand(value) {
7343
+ return isRecord(value) && typeof value.fileContent === "string";
7344
+ }
7345
+ /**
7346
+ * Load exact command contents from the configured OpenSpec CLI.
7347
+ *
7348
+ * The private generator is intentionally treated as optional evidence. When the runner is not an
7349
+ * importable local OpenSpec module, callers receive `null` and commands-only installs cannot be
7350
+ * declared current from path existence alone.
7351
+ */
7352
+ async function loadOpenSpecAgentCommandContents(cliCommand, workflows) {
7353
+ try {
7354
+ const cliModuleDir = dirname$1((await resolveOpenSpecWorkerInvocation(cliCommand)).modulePath);
7355
+ const [skillGenerationModule, commandGenerationModule] = await Promise.all([import(pathToFileURL(resolve(cliModuleDir, "../core/shared/skill-generation.js")).href), import(pathToFileURL(resolve(cliModuleDir, "../core/command-generation/index.js")).href)]);
7356
+ if (!isRuntimeSkillGenerationModule(skillGenerationModule) || !isRuntimeCommandGenerationModule(commandGenerationModule)) return null;
7357
+ const commandContents = skillGenerationModule.getCommandContents(workflows);
7358
+ if (!Array.isArray(commandContents) || !commandContents.every(isRuntimeCommandContent)) return null;
7359
+ const catalog = {};
7360
+ const unavailableTools = {};
7361
+ for (const tool of AGENT_DELIVERY_REGISTRY) {
7362
+ if (!tool.command) continue;
7363
+ const adapter = commandGenerationModule.CommandAdapterRegistry.get(tool.value);
7364
+ if (!adapter) {
7365
+ unavailableTools[tool.value] = tool.minCliSeries !== void 0 ? `Command adapter first ships with OpenSpec CLI ${tool.minCliSeries}; this runner does not declare it.` : "This OpenSpec CLI runner does not register the command adapter.";
7366
+ continue;
7367
+ }
7368
+ const generatedCommands = commandGenerationModule.generateCommands(commandContents, adapter);
7369
+ if (!Array.isArray(generatedCommands) || generatedCommands.length !== commandContents.length || !generatedCommands.every(isRuntimeGeneratedCommand)) return null;
7370
+ catalog[tool.value] = Object.fromEntries(commandContents.map((content, index) => [content.id, generatedCommands[index]?.fileContent]));
7371
+ }
7372
+ return {
7373
+ catalog,
7374
+ unavailableTools
7375
+ };
7376
+ } catch {
7377
+ return null;
7378
+ }
7379
+ }
7380
+
7193
7381
  //#endregion
7194
7382
  //#region src/hooks.ts
7195
7383
  const OPENSPECUI_DOCUMENT_HOOK_VERSION = 1;
@@ -7342,17 +7530,16 @@ async function mapCliProjectionSeries(inputs, project) {
7342
7530
  //#endregion
7343
7531
  //#region src/opsx-kernel.ts
7344
7532
  /**
7345
- * Orthogonal intents (updated 2026-08-02 Asia/Shanghai):
7533
+ * Orthogonal intents (updated 2026-08-15 Asia/Shanghai):
7346
7534
  * 1. Maintain reactive CLI-backed projections and their direct typed Projection Work readers.
7347
7535
  * 2. Share and release per-entity streams through one planning-root kernel lifecycle.
7348
7536
  * 3. Keep OpenSpec configuration ownership outside the workflow cache while tracking both YAML filename variants.
7349
7537
  * 4. Preserve typed Status and Artifact/Apply/Archive Instructions provenance with the resolved root selector.
7350
- * 5. Keep Change enumeration business truth in the typed CLI result while files only invalidate it.
7538
+ * 5. Resolve per-command CLI capabilities once per lifetime and gate version-only selectors behind admission.
7351
7539
  *
7352
7540
  * Original request (2026-07-15): "Planning-root adapters and services consume the CLI-resolved root."
7353
- * Original request (2026-07-23): "OPSX Status 不应等待完整 Kernel warmup,且必须保留 CLI evidence。"
7354
- * Original request (2026-07-26): "展开全面的接口升级和内核升级和测试升级。"
7355
7541
  * Original request (2026-07-31): "系统性地进行修复,因为List页面也有类似的问题。所有可能其它页面都有类似的问题。"
7542
+ * Original request (2026-08-15): "v9的适配需要同时适配 1.8和1.9。"
7356
7543
  */
7357
7544
  function toRelativePath(root, absolutePath) {
7358
7545
  return relative(root, absolutePath).split(sep).join("/");
@@ -7505,6 +7692,7 @@ var OpsxKernel = class {
7505
7692
  cliExecutor;
7506
7693
  runtimeInvalidation;
7507
7694
  rootSelector;
7695
+ cliCapabilitiesPromise = null;
7508
7696
  controller = new AbortController();
7509
7697
  warmupPromise = null;
7510
7698
  _streamReady = /* @__PURE__ */ new Map();
@@ -7827,15 +8015,28 @@ var OpsxKernel = class {
7827
8015
  clearStreamReadyByPrefix(prefix) {
7828
8016
  for (const key of this._streamReady.keys()) if (key.startsWith(prefix)) this._streamReady.delete(key);
7829
8017
  }
8018
+ /**
8019
+ * Resolve the admitted CLI's per-command capabilities once per Kernel lifetime.
8020
+ *
8021
+ * The detected version decides whether version-specific selectors and options are forwarded.
8022
+ * A failed availability probe yields no capabilities, so no version-only flag is ever sent
8023
+ * to an unverifiable CLI.
8024
+ */
8025
+ resolveCliCapabilities() {
8026
+ this.cliCapabilitiesPromise ??= this.cliExecutor.checkAvailability().then((availability) => deriveOpenSpecCliCapabilities(availability.available ? parseOpenSpecCliVersion(availability.version) : null)).catch(() => deriveOpenSpecCliCapabilities(null));
8027
+ return this.cliCapabilitiesPromise;
8028
+ }
7830
8029
  async fetchSchemas() {
7831
8030
  return (await this.fetchSchemasProjection()).value;
7832
8031
  }
7833
8032
  async fetchSchemasProjection() {
7834
8033
  this.runtimeInvalidation.track("schemas");
7835
8034
  await touchOpsxProjectDeps(this.projectDir);
7836
- const result = await this.cliExecutor.contracts.schemas();
8035
+ const schemasSelector = (await this.resolveCliCapabilities()).schemasRootSelector ? { ...this.rootSelector } : {};
8036
+ const result = await this.cliExecutor.contracts.schemas(schemasSelector);
8037
+ if (result.data && isCliSchemasFailure(result.data)) throw new CliProjectionCommandError(result.data.status.map((diagnostic) => diagnostic.message).join("\n") || "openspec schemas failed to select a Root.", result);
7837
8038
  return {
7838
- value: requireCommandData("openspec schemas", result, CliSchemasSchema),
8039
+ value: requireCommandData("openspec schemas", result, CliSchemasSuccessSchema),
7839
8040
  evidence: toCliProjectionCommandEvidence(result)
7840
8041
  };
7841
8042
  }
@@ -7849,8 +8050,10 @@ var OpsxKernel = class {
7849
8050
  async fetchChangeListProjection() {
7850
8051
  await this.fetchChangeIds();
7851
8052
  const result = await this.cliExecutor.contracts.listChanges(this.rootSelector);
8053
+ const data = requireCommandData("openspec list", result, CliChangeListSchema);
7852
8054
  return {
7853
- value: requireCommandData("openspec list", result, CliChangeListSchema).changes.map(({ name }) => name),
8055
+ value: data.changes.map(({ name }) => name),
8056
+ entries: data.changes,
7854
8057
  evidence: toCliProjectionCommandEvidence(result)
7855
8058
  };
7856
8059
  }
@@ -7866,7 +8069,7 @@ var OpsxKernel = class {
7866
8069
  const status = ChangeStatusSchema.parse({
7867
8070
  changeName: data.changeName,
7868
8071
  schemaName: data.schemaName,
7869
- isComplete: data.isComplete,
8072
+ isPlanningComplete: data.isPlanningComplete,
7870
8073
  applyRequires: data.applyRequires,
7871
8074
  artifacts: data.artifacts,
7872
8075
  provenance: {
@@ -8036,7 +8239,11 @@ var OpsxKernel = class {
8036
8239
  readStatusProjection(changeId, schema) {
8037
8240
  return this.fetchStatus(changeId, schema);
8038
8241
  }
8039
- /** Execute CLI-owned Change enumeration with file dependencies owned by the caller's Work generation. */
8242
+ /**
8243
+ * Execute CLI-owned Change enumeration with file dependencies owned by the caller's Work
8244
+ * generation. `entries` carries the CLI's own per-Change task counts and phase so list
8245
+ * surfaces can show CLI-reported progress without UI-side file arithmetic.
8246
+ */
8040
8247
  readChangeListProjection() {
8041
8248
  return this.fetchChangeListProjection();
8042
8249
  }
@@ -8388,4 +8595,4 @@ const PtyServerMessageSchema = z.discriminatedUnion("type", [
8388
8595
  ]);
8389
8596
 
8390
8597
  //#endregion
8391
- export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ActiveRootMutationSchema, ActiveRootOfficialConfigSchema, ActiveRootRevisionSchema, ActiveRootStructuredUpdateSchema, AgentDeliveryModeSchema, AgentDeliveryPolicyUpdateSchema, AgentDeliveryProfileSchema, AgentDeliveryWorkflowSchema, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArchiveInstructionsSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliApplyInstructionsSchema, CliArchiveInstructionsSchema, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, CliContextSchema, CliDiagnosticFailureSchema, CliDiagnosticSchema, CliDoctorReferenceEntrySchema, CliDoctorSchema, CliExecutor, CliJsonValueSchema, CliProjectionCommandError, CliProjectionCommandEvidenceSchema, CliProjectionFailureSchema, CliProjectionInvalidationCauseSchema, CliProjectionNoticeSchema, CliProjectionStateNameSchema, CliReferenceIndexEntrySchema, CliRootSchema, CliRootSourceSchema, CliShowSpecDocumentSchema, CliShowSpecSchema, CliSpecListSchema, CliStoreCleanupSchema, CliStoreDoctorEntrySchema, CliStoreDoctorSchema, CliStoreListSchema, CliStoreMutationSchema, CliStoreSchema, CliStreamTerminationError, CliValidateSchema, CliWorkflowStatusSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardOverviewSchema, DashboardSummaryIdentitySchema, DashboardSummaryInvalidationCauseSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationConfigUpdateSchema, DocumentTranslationDisplayModeSchema, DocumentTranslationGlobalSettingsUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, FILE_PREVIEW_KINDS, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileLoadStateSchema, LocalModelProfileManifestFileSchema, LocalModelProfileManifestGroupSchema, LocalModelProfileManifestSchema, LocalModelProfileStatusSchema, MAX_ACTIVE_ROOT_CONTEXT_BYTES, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, ManagedLocalCatalogSourceSchema, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPENSPEC_SPAWN_MODE_ENV, OPEN_SPEC_DATA_DIRECTORY_NAME, OPEN_SPEC_DATA_HOME_OBSERVATION_TARGETS, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OPSX_ALL_WORKFLOWS, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OPSX_WORKFLOW_LABELS, OPSX_WORKFLOW_TO_SKILL_DIR, OPSX_WORKFLOW_TO_SKILL_DIR as TOOL_WORKFLOW_TO_SKILL_DIR, OpenSpecAdapter, OpenSpecCliContractExecutor, OpenSpecDataHomeObserver, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxCliEvidenceSchema, OpsxConfigBundleSchema, OpsxConfigSchema, OpsxKernel, OpsxStatusEvidenceSchema, OwnedSpecIdentitySchema, PINNED_AGENT_GENERATOR_VERSION, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, PlanningConfigJsonValueSchema, PlanningConfigReferenceSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, ReferencedSpecIdentitySchema, RequirementSchema, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, SERVE_PRESENTATION_MODES, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServePresentationModeSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecCatalogSchema, SpecCommandEvidenceSchema, SpecDocumentProjectionSchema, SpecIdentitySchema, SpecSchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationResultSchema, StoreMutationSchema, StoreMutationStartResponseSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplateContentMapSchema, TemplateContentSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalCwdTargetSchema, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TrackedTaskProgressSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheSettingsUpdateSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineAssetStateSchema, TranslationEngineAssetStatusSchema, TranslationEngineDependencyStateSchema, TranslationEngineDependencyStatusSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineGlobalSettingsUpdateSchema, TranslationEngineIdSchema, TranslationEngineInstallLogEventSchema, TranslationEngineInstallLogStreamSchema, TranslationEngineLifecycleEventSchema, TranslationEngineLifecycleStatusSchema, TranslationEngineProjectSettingsSchema, TranslationEngineProjectSettingsUpdateSchema, TranslationEngineRuntimeStateSchema, TranslationEngineRuntimeStatusSchema, TranslationLocalCt2SettingsSchema, TranslationLocalCt2SettingsUpdateSchema, TranslationLocalLlamaSettingsSchema, TranslationLocalLlamaSettingsUpdateSchema, TranslationLocalSettingsSchema, TranslationLocalSettingsUpdateSchema, TranslationOpenAISettingsSchema, TranslationOpenAISettingsUpdateSchema, VIRTUAL_PROJECT_DIRNAME, Validator, accessGateFingerprint, acquireWatcher, acquireWatcherRoot, annotateOpenSpecFacts, annotateOpenSpecMarkdown, applyAgentDeliveryPolicy, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, contextStorage, createApplyInstructionProgress, createCleanCliEnv, createCliProjectionStateSchema, createDocumentChecklistSummary, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, createPhysicalReactiveDirectory, createStaticSpecCatalogOwnedProjection, createStaticSpecCatalogReferenceProjection, createStaticSpecCatalogReferenceSource, createToolInitStateProjection, createTrackedTaskProgress, createTranslationEngineLifecycleStatus, customHashFromSoundId, deriveTrackedTaskPhase, detectRuntimePackageManager, generateAccessGateCredential, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getRootContextCliSelector, getSpecCatalogEntry, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineLifecycleMessage, getTranslationEngineManifest, getWatcherRuntimeStatus, groupNotifications, hasCapability, inferFileMime, inferFilePreviewKind, inferLocalDirectionalModelLanguagePair, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, loadOpenSpecAgentCommandContents, mergeSpecCatalog, normalizeAccessGatePassword, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveOpenSpecSpawnMode, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, resolveWindowsCommandInvocation, runControlledTranslationTask, runPhysicalReactivePathMutation, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, spawnSafe, specDocumentDisplayPath, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, terminateWindowsProcessTreeByIdentity, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writeAtomicPhysicalReactiveFile, writePhysicalReactiveFile };
8598
+ export { ACCESS_GATE_CREDENTIAL_BYTES, AI_TOOLS, ActiveRootMutationSchema, ActiveRootOfficialConfigSchema, ActiveRootRevisionSchema, ActiveRootStructuredUpdateSchema, AgentDeliveryModeSchema, AgentDeliveryPolicyUpdateSchema, AgentDeliveryProfileSchema, AgentDeliveryWorkflowSchema, ApplyInstructionsContextFilesSchema, ApplyInstructionsProjectionSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArchiveInstructionsSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliApplyInstructionsSchema, CliArchiveInstructionsSchema, CliArchiveSchema, CliArtifactInstructionsSchema, CliChangeListSchema, CliCommandTransportSchema, CliContextSchema, CliDiagnosticFailureSchema, CliDiagnosticSchema, CliDoctorReferenceEntrySchema, CliDoctorSchema, CliExecutor, CliJsonValueSchema, CliProjectionCommandError, CliProjectionCommandEvidenceSchema, CliProjectionFailureSchema, CliProjectionInvalidationCauseSchema, CliProjectionNoticeSchema, CliProjectionStateNameSchema, CliReferenceIndexEntrySchema, CliRootSchema, CliRootSourceSchema, CliShowSpecDocumentSchema, CliShowSpecSchema, CliSpecListSchema, CliStoreCleanupSchema, CliStoreDoctorEntrySchema, CliStoreDoctorSchema, CliStoreListSchema, CliStoreMutationSchema, CliStoreSchema, CliStreamTerminationError, CliValidateReportSchema, CliValidateSchema, CliWorkflowStatusSchema, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DashboardGitSnapshotSchema, DashboardOverviewSchema, DashboardSummaryIdentitySchema, DashboardSummaryInvalidationCauseSchema, DashboardSummaryInvalidationSchema, DashboardSummaryProjectionSchema, DashboardSummaryProjectionStateSchema, DashboardTrendsProjectionSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationConfigUpdateSchema, DocumentTranslationDisplayModeSchema, DocumentTranslationGlobalSettingsUpdateSchema, EnvironmentDefaultStoreUpdateSchema, EnvironmentGlobalConfigValueSchema, EnvironmentGlobalFileProjectionDataSchema, EnvironmentGlobalFileProjectionStateSchema, EnvironmentGlobalProjectionDataSchema, EnvironmentGlobalProjectionStateSchema, FILE_PREVIEW_KINDS, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileLoadStateSchema, LocalModelProfileManifestFileSchema, LocalModelProfileManifestGroupSchema, LocalModelProfileManifestSchema, LocalModelProfileStatusSchema, MAX_ACTIVE_ROOT_CONTEXT_BYTES, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, ManagedLocalCatalogSourceSchema, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENSPECUI_DOCUMENT_HOOK_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPENSPECUI_WORKFLOW_HOOK_VERSION, OPENSPEC_SPAWN_MODE_ENV, OPEN_SPEC_DATA_DIRECTORY_NAME, OPEN_SPEC_DATA_HOME_OBSERVATION_TARGETS, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OPSX_ALL_WORKFLOWS, OPSX_ARTIFACT_INPUT_ACTIONS, OPSX_CHANGE_INPUT_ACTIONS, OPSX_COMMAND_CAPABLE_WORKFLOWS, OPSX_CORE_PROFILE_WORKFLOWS, OPSX_TEXT_INPUT_ACTIONS, OPSX_WORKFLOW_LABELS, OPSX_WORKFLOW_TO_SKILL_DIR, OPSX_WORKFLOW_TO_SKILL_DIR as TOOL_WORKFLOW_TO_SKILL_DIR, OpenSpecAdapter, OpenSpecCliContractExecutor, OpenSpecDataHomeObserver, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecUIGlobalSettingsUpdateSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxCliEvidenceSchema, OpsxConfigBundleSchema, OpsxConfigSchema, OpsxKernel, OpsxStatusEvidenceSchema, OwnedSpecIdentitySchema, PINNED_AGENT_GENERATOR_VERSION, PlanningCliProjectionDataSchema, PlanningCliProjectionSelectorSchema, PlanningCliProjectionStateSchema, PlanningConfigJsonValueSchema, PlanningConfigReferenceSchema, ProjectBindingUpdateSchema, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, RUNTIME_INVALIDATION_FACETS, ReactiveContext, ReactiveObservationEnvironment, ReactiveState, ReferencedSpecIdentitySchema, RequirementSchema, RuntimeInvalidationIndex, RuntimeRootInvalidationRegistry, SERVE_PRESENTATION_MODES, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServePresentationModeSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecCatalogSchema, SpecCommandEvidenceSchema, SpecDocumentProjectionSchema, SpecIdentitySchema, SpecSchema, StoreDoctorResultSchema, StoreListResultSchema, StoreMutationLifecycleEventSchema, StoreMutationResultSchema, StoreMutationSchema, StoreMutationStartResponseSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplateContentMapSchema, TemplateContentSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalCwdTargetSchema, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TrackedTaskProgressSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheSettingsUpdateSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineAssetStateSchema, TranslationEngineAssetStatusSchema, TranslationEngineDependencyStateSchema, TranslationEngineDependencyStatusSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineGlobalSettingsUpdateSchema, TranslationEngineIdSchema, TranslationEngineInstallLogEventSchema, TranslationEngineInstallLogStreamSchema, TranslationEngineLifecycleEventSchema, TranslationEngineLifecycleStatusSchema, TranslationEngineProjectSettingsSchema, TranslationEngineProjectSettingsUpdateSchema, TranslationEngineRuntimeStateSchema, TranslationEngineRuntimeStatusSchema, TranslationLocalCt2SettingsSchema, TranslationLocalCt2SettingsUpdateSchema, TranslationLocalLlamaSettingsSchema, TranslationLocalLlamaSettingsUpdateSchema, TranslationLocalSettingsSchema, TranslationLocalSettingsUpdateSchema, TranslationOpenAISettingsSchema, TranslationOpenAISettingsUpdateSchema, VIRTUAL_PROJECT_DIRNAME, Validator, accessGateFingerprint, acquireWatcher, acquireWatcherRoot, annotateOpenSpecFacts, annotateOpenSpecMarkdown, applyAgentDeliveryPolicy, asEnvUri, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, buildRuntimePackageInstallCommand, buildSpecCatalog, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, classifyStoreCliResult, clearCache, cliProjectionStates, closeAllProjectWatchers, closeAllWatchers, compareAndWriteAtomicPhysicalReactiveFile, computeEnvUri, constantTimeEqual, contextStorage, createApplyInstructionProgress, createCleanCliEnv, createCliProjectionStateSchema, createDocumentChecklistSummary, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, createPhysicalReactiveDirectory, createStaticSpecCatalogOwnedProjection, createStaticSpecCatalogReferenceProjection, createStaticSpecCatalogReferenceSource, createToolInitStateProjection, createTrackedTaskProgress, createTranslationEngineLifecycleStatus, customHashFromSoundId, deriveTrackedTaskPhase, detectRuntimePackageManager, generateAccessGateCredential, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getExternalAgentSkillsObservationRoots, getExternalCodexCommandObservationRoot, getManagedLocalTranslationEngineManifest, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getRootContextCliSelector, getSpecCatalogEntry, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineLifecycleMessage, getTranslationEngineManifest, getWatcherRuntimeStatus, groupNotifications, hasCapability, inferFileMime, inferFilePreviewKind, inferLocalDirectionalModelLanguagePair, inspectActiveRootOfficialConfig, inspectEnvironmentDefaultStore, inspectProjectBinding, isBackendHealthRuntimeMetadata, isBatchTranslationAbort, isDirectionalManagedLocalTranslationEngineId, isGlobPattern, isHostedBackendHealthResponse, isManagedLocalTranslationEngineId, isMarkdownTaskSourcePath, isOpsxCoreWorkflowSelection, isOpsxGlobPattern, isPreviewableFile, isReferencedSpecIdentity, isSupportedEmbeddedUiUrl, isTerminalMutationStatus, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isTranslationEngineDependencyReady, isTranslationEngineRuntimeReady, isWatcherPoolInitialized, loadOpenSpecAgentCommandContents, mergeSpecCatalog, normalizeAccessGatePassword, normalizeAgentDeliveryPolicy, normalizeBatchTranslationError, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseCliCommandResult, parseMarkdownFacts, parseMarkdownTasks, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, patchActiveRootOfficialFields, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, projectTaskProjectionsFromMarkdownFiles, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, redactSnapshotForPublication, removePhysicalReactivePath, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, replaceFileAtomically, requireCanonicalOpenSpecEntityId, requireCanonicalOpenSpecSpecId, requireOpenSpecEntityRelativePath, resolveCommandInvocation, resolveGlobalSkillsInventoryDir, resolveHostedAppBaseUrl, resolveOpenSpecDataScope, resolveOpenSpecSpawnMode, resolveRootContext, resolveRuntimePackageInstallStrategy, resolveTerminalShellDefaults, resolveToolSkillsScope, resolveWindowsCommandInvocation, runControlledTranslationTask, runPhysicalReactivePathMutation, selectAgentDeliveryRegistry, selectLocalDownloadGroup, shouldShowTranslationEngineInstallGate, snapshotHasAbsolutePath, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, spawnSafe, specDocumentDisplayPath, specIdentityFromRoute, specIdentityKey, specRoutePath, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, terminateChildProcessTree, terminateWindowsProcessTreeByIdentity, toCliProjectionCommandEvidence, toCliProjectionFailure, toCliProjectionNotice, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, toStoreFeatureResult, toggleMarkdownTask, trimMarkdownSlice, updateProjectBindingContent, updateReactiveFileCache, validateActiveRootRawYaml, writeAtomicPhysicalReactiveFile, writePhysicalReactiveFile };