@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.
- package/dist/{active-root-config-BHgXdX6b.d.mts → active-root-config-C77Duro0.d.mts} +5 -5
- package/dist/active-root-config.d.mts +5 -5
- package/dist/active-root-config.mjs +1 -1
- package/dist/app-daemon-control.d.mts +18 -18
- package/dist/{cli-projection-Um81AQW5.d.mts → cli-projection-BAU6-rFs.d.mts} +1 -1
- package/dist/cli-projection.d.mts +5 -5
- package/dist/cli-projection.mjs +1 -1
- package/dist/{dashboard-summary-transport-BJBod4rO.d.mts → dashboard-summary-transport-C3No2o4i.d.mts} +695 -330
- package/dist/{dashboard-summary-transport-ILCfZD_I.mjs → dashboard-summary-transport-Do8pzSES.mjs} +10 -1
- package/dist/dashboard-summary-transport.d.mts +26 -26
- package/dist/dashboard-summary-transport.mjs +2 -2
- package/dist/{document-translation-B3xaP0dJ.mjs → document-translation-Dmg3YJDA.mjs} +1 -1
- package/dist/document-translation.d.mts +1 -1
- package/dist/document-translation.mjs +2 -2
- package/dist/{hosted-app-B_T_tTvO.mjs → hosted-app-CHqdo5vd.mjs} +1 -1
- package/dist/hosted-app.d.mts +26 -26
- package/dist/hosted-app.mjs +6 -6
- package/dist/{hosted-contract-BxUx6ksP.mjs → hosted-contract-Qe5AmkiE.mjs} +4 -4
- package/dist/hosted-contract.d.mts +26 -26
- package/dist/hosted-contract.mjs +5 -5
- package/dist/{index-CYFOH_f8.d.mts → index-BGT-MVqL.d.mts} +819 -73
- package/dist/index.d.mts +27 -27
- package/dist/index.mjs +498 -291
- package/dist/{local-download-profiles-BQLPhuE0.d.mts → local-download-profiles-BZj6Tw_s.d.mts} +1 -1
- package/dist/local-download-profiles.d.mts +2 -2
- package/dist/local-download-profiles.mjs +1 -1
- package/dist/markdown-facts.d.mts +1 -1
- package/dist/{markdown-reading--Sr6JAl5.d.mts → markdown-reading-CsLbxubT.d.mts} +1 -1
- package/dist/markdown-reading.d.mts +2 -2
- package/dist/{notifications-BIs3J3BY.d.mts → notifications-B9cvPamG.d.mts} +4 -4
- package/dist/{notifications-VHUMI-qG.mjs → notifications-D6XlgL9b.mjs} +2 -2
- package/dist/notifications.d.mts +2 -2
- package/dist/notifications.mjs +3 -3
- package/dist/{openspec-annotations-BylPW5rz.d.mts → openspec-annotations-8ppmICAU.d.mts} +2 -2
- package/dist/openspec-annotations.d.mts +3 -3
- package/dist/openspec-compat-B246EQNW.mjs +121 -0
- package/dist/openspec-compat.d.mts +48 -13
- package/dist/openspec-compat.mjs +4 -79
- package/dist/{openspec-projection-_1NeavJP.d.mts → openspec-projection-vJ03fcdF.d.mts} +3 -3
- package/dist/openspec-projection.d.mts +5 -5
- package/dist/opsx-display-path.d.mts +1 -1
- package/dist/opsx-display-path.mjs +1 -1
- package/dist/{opsx-entity-DZ7onDWC.d.mts → opsx-entity-BFPRTIWN.d.mts} +2 -2
- package/dist/opsx-entity.d.mts +7 -7
- package/dist/{opsx-schema-detail-D2RnlxSg.d.mts → opsx-schema-detail-D1129ezo.d.mts} +2 -2
- package/dist/opsx-schema-detail.d.mts +8 -8
- package/dist/{opsx-types-Ch6juiWL.d.mts → opsx-types-C_4QxcU6.d.mts} +51 -50
- package/dist/opsx-workflows.d.mts +1 -1
- package/dist/opsx-workflows.mjs +1 -1
- package/dist/{planning-cli-projection-BreqsrYA.mjs → planning-cli-projection-DV22v3Xl.mjs} +23 -12
- package/dist/planning-cli-projection.d.mts +26 -26
- package/dist/planning-cli-projection.mjs +4 -3
- package/dist/{schemas-zh0_vzYQ.d.mts → schemas-Dnw_rfST.d.mts} +8 -8
- package/dist/{sounds-Bb_3aeJJ.d.mts → sounds-BoLuHRve.d.mts} +5 -5
- package/dist/sounds.d.mts +1 -1
- package/dist/sounds.mjs +1 -1
- package/dist/{spec-catalog-DEk_oHAx.mjs → spec-catalog-Ce3uSLSc.mjs} +45 -328
- package/dist/spec-catalog.d.mts +26 -26
- package/dist/spec-catalog.mjs +3 -2
- package/dist/{store-content-projection-Bpdb7_d9.mjs → store-content-projection-DV31znWA.mjs} +1 -1
- package/dist/store-content-projection.d.mts +1 -1
- package/dist/store-content-projection.mjs +2 -2
- package/dist/{store-mutation-protocol-BbgWMJVK.d.mts → store-mutation-protocol-C4rRiO4b.d.mts} +36 -36
- package/dist/store-mutation-protocol.d.mts +1 -1
- package/dist/store-mutation-protocol.mjs +1 -1
- package/dist/{store-types-CF7_LsVL.d.mts → store-types-CMqxPwaj.d.mts} +1 -1
- package/dist/store-types.d.mts +5 -5
- package/dist/store-types.mjs +1 -1
- package/dist/task-progress.d.mts +6 -6
- package/dist/{terminal-audio-GuG0qiiI.d.mts → terminal-audio-CNhCiZul.d.mts} +2 -2
- package/dist/{terminal-audio-DeubAfFC.mjs → terminal-audio-ELHVH24M.mjs} +1 -1
- package/dist/terminal-audio.d.mts +2 -2
- package/dist/terminal-audio.mjs +2 -2
- package/dist/{terminal-control-CdPuYwwU.mjs → terminal-control-D893EEN_.mjs} +7 -5
- package/dist/terminal-control.d.mts +2 -2
- package/dist/terminal-control.mjs +1 -1
- package/dist/{terminal-invocation-Dx1qfSKb.d.mts → terminal-invocation-BnMhxtP1.d.mts} +22 -22
- package/dist/terminal-invocation.d.mts +1 -1
- package/dist/terminal-invocation.mjs +1 -1
- package/dist/terminal-theme.d.mts +1 -1
- package/dist/terminal-theme.mjs +1 -1
- package/dist/translation-language-pair.d.mts +1 -1
- package/dist/translation-language-pair.mjs +1 -1
- package/dist/{translator-Cwaf_pXN.d.mts → translator-B7GQxmun.d.mts} +50 -50
- package/dist/translator.d.mts +1 -1
- package/dist/translator.mjs +1 -1
- package/dist/workflow-CmQ4pFYC.mjs +344 -0
- package/package.json +3 -1
- /package/dist/{active-root-config-L5QaMb3A.mjs → active-root-config-K_wVeuI3.mjs} +0 -0
- /package/dist/{cli-projection-CKRwTvwf.mjs → cli-projection-Bc2WVwGj.mjs} +0 -0
- /package/dist/{document-translation-BNbM3fEj.d.mts → document-translation-CBqubtWC.d.mts} +0 -0
- /package/dist/{local-download-profiles-h9lUTXr-.mjs → local-download-profiles-BRsR1-kK.mjs} +0 -0
- /package/dist/{markdown-facts-DLclHfpE.d.mts → markdown-facts-CEACwik1.d.mts} +0 -0
- /package/dist/{opsx-display-path-BD34M8QV.d.mts → opsx-display-path-DvvAFlWG.d.mts} +0 -0
- /package/dist/{opsx-display-path-ocbNzMZj.mjs → opsx-display-path-cv0NJHzW.mjs} +0 -0
- /package/dist/{opsx-workflows-DX1r6e5j.d.mts → opsx-workflows-B72EGtj_.d.mts} +0 -0
- /package/dist/{opsx-workflows-byPfLlo8.mjs → opsx-workflows-BA-46T7_.mjs} +0 -0
- /package/dist/{sounds-6prQvKXl.mjs → sounds-cd9lIDxN.mjs} +0 -0
- /package/dist/{store-content-projection-R74MV_sD.d.mts → store-content-projection-BnNYyb0x.d.mts} +0 -0
- /package/dist/{store-mutation-protocol-CJGUWWI6.mjs → store-mutation-protocol-CBrPcppU.mjs} +0 -0
- /package/dist/{store-types-CvpEVNoE.mjs → store-types-C87SlrJ3.mjs} +0 -0
- /package/dist/{terminal-invocation-DIpoFYDo.mjs → terminal-invocation-C_FsxEUs.mjs} +0 -0
- /package/dist/{terminal-theme-Byzxmnjm.mjs → terminal-theme-C6BPfQ2G.mjs} +0 -0
- /package/dist/{terminal-theme-DX08Gci8.d.mts → terminal-theme-C7X8pUqT.d.mts} +0 -0
- /package/dist/{translation-language-pair-BR5uxGm-.d.mts → translation-language-pair-B6A39Cai.d.mts} +0 -0
- /package/dist/{translation-language-pair-DG9mOuFD.mjs → translation-language-pair-CWLlH7Ab.mjs} +0 -0
- /package/dist/{translator-CEGdRmKw.mjs → translator-BkNACZ9R.mjs} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
12
|
-
import {
|
|
13
|
-
import { a as
|
|
14
|
-
import { a as
|
|
15
|
-
import {
|
|
16
|
-
import { n as
|
|
17
|
-
import {
|
|
18
|
-
import { n as
|
|
19
|
-
import {
|
|
20
|
-
import { i as
|
|
21
|
-
import { n as
|
|
22
|
-
import {
|
|
23
|
-
import { a as
|
|
24
|
-
import {
|
|
25
|
-
import { a as
|
|
26
|
-
import "./
|
|
27
|
-
import {
|
|
28
|
-
import
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { a as
|
|
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-
|
|
5034
|
-
* 1. Execute buffered CLI work through process/Worker backends with runner recovery,
|
|
5035
|
-
*
|
|
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
|
|
5038
|
-
*
|
|
5039
|
-
*
|
|
5040
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
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.
|
|
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: ".
|
|
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: "
|
|
6747
|
+
name: "Shared .agents skills",
|
|
6631
6748
|
value: "agents",
|
|
6632
|
-
available:
|
|
6633
|
-
successLabel: "
|
|
6634
|
-
skillsDir:
|
|
6635
|
-
|
|
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-
|
|
6860
|
-
* 1. Project the unified OpenSpec 1.
|
|
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.
|
|
6863
|
-
* 4.
|
|
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.
|
|
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
|
|
6835
|
+
function getSkillArtifactsFromInventory(inventoryRoot, workflows = ALL_TOOL_WORKFLOWS) {
|
|
6894
6836
|
return workflows.map((workflow) => ({
|
|
6895
6837
|
workflow,
|
|
6896
|
-
path: resolve(
|
|
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([
|
|
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
|
|
6921
|
-
const
|
|
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.
|
|
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
|
-
|
|
7097
|
-
|
|
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
|
|
7122
|
-
const
|
|
7123
|
-
const
|
|
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-
|
|
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.
|
|
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
|
|
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,
|
|
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:
|
|
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
|
-
|
|
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
|
-
/**
|
|
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 };
|