@gtkx/cli 1.5.0 → 1.6.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/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/codegen/freshness.d.ts.map +1 -1
- package/dist/codegen/freshness.js +2 -1
- package/dist/codegen/freshness.js.map +1 -1
- package/dist/codegen/reference.d.ts +17 -0
- package/dist/codegen/reference.d.ts.map +1 -0
- package/dist/codegen/reference.js +37 -0
- package/dist/codegen/reference.js.map +1 -0
- package/dist/codegen/report.d.ts.map +1 -1
- package/dist/codegen/report.js +17 -3
- package/dist/codegen/report.js.map +1 -1
- package/dist/codegen/run-codegen.d.ts +2 -0
- package/dist/codegen/run-codegen.d.ts.map +1 -1
- package/dist/codegen/run-codegen.js +63 -21
- package/dist/codegen/run-codegen.js.map +1 -1
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +10 -16
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/mcp.d.ts +13 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/deploy/notices/gtkx.js +1 -1
- package/dist/deploy/notices/gtkx.js.map +1 -1
- package/dist/deploy/notices/libraries.d.ts.map +1 -1
- package/dist/deploy/notices/libraries.js +2 -1
- package/dist/deploy/notices/libraries.js.map +1 -1
- package/dist/deploy/settings/libraries.d.ts.map +1 -1
- package/dist/deploy/settings/libraries.js +7 -9
- package/dist/deploy/settings/libraries.js.map +1 -1
- package/dist/deploy/tools.d.ts.map +1 -1
- package/dist/deploy/tools.js +1 -3
- package/dist/deploy/tools.js.map +1 -1
- package/dist/dev/runner-main.d.ts.map +1 -1
- package/dist/dev/runner-main.js +2 -1
- package/dist/dev/runner-main.js.map +1 -1
- package/dist/internal/agent-rules.d.ts +7 -0
- package/dist/internal/agent-rules.d.ts.map +1 -0
- package/dist/internal/agent-rules.js +106 -0
- package/dist/internal/agent-rules.js.map +1 -0
- package/dist/internal/docs-elements.d.ts +8 -0
- package/dist/internal/docs-elements.d.ts.map +1 -0
- package/dist/internal/docs-elements.js +12 -0
- package/dist/internal/docs-elements.js.map +1 -0
- package/dist/internal/source-imports.d.ts.map +1 -1
- package/dist/internal/source-imports.js +2 -3
- package/dist/internal/source-imports.js.map +1 -1
- package/dist/mcp/client-config.d.ts +22 -0
- package/dist/mcp/client-config.d.ts.map +1 -0
- package/dist/mcp/client-config.js +94 -0
- package/dist/mcp/client-config.js.map +1 -0
- package/dist/vite-plugins/animated.d.ts +5 -0
- package/dist/vite-plugins/animated.d.ts.map +1 -0
- package/dist/vite-plugins/animated.js +325 -0
- package/dist/vite-plugins/animated.js.map +1 -0
- package/dist/vite-plugins/asset-imports.js +2 -2
- package/dist/vite-plugins/asset-imports.js.map +1 -1
- package/dist/vite-plugins/index.d.ts.map +1 -1
- package/dist/vite-plugins/index.js +2 -0
- package/dist/vite-plugins/index.js.map +1 -1
- package/dist/vite-plugins/resources.js +2 -2
- package/dist/vite-plugins/resources.js.map +1 -1
- package/dist/vite-plugins/settings-worker-env.js +2 -2
- package/dist/vite-plugins/settings-worker-env.js.map +1 -1
- package/dist/vite-plugins/settings.d.ts.map +1 -1
- package/dist/vite-plugins/settings.js +2 -1
- package/dist/vite-plugins/settings.js.map +1 -1
- package/package.json +10 -9
- package/src/cli.ts +5 -0
- package/src/codegen/freshness.ts +2 -1
- package/src/codegen/reference.ts +59 -0
- package/src/codegen/report.ts +18 -3
- package/src/codegen/run-codegen.ts +81 -24
- package/src/commands/docs.ts +10 -28
- package/src/commands/mcp.ts +81 -0
- package/src/deploy/notices/gtkx.ts +1 -1
- package/src/deploy/notices/libraries.ts +2 -1
- package/src/deploy/settings/libraries.ts +7 -10
- package/src/deploy/tools.ts +1 -3
- package/src/dev/runner-main.ts +2 -1
- package/src/internal/agent-rules.ts +135 -0
- package/src/internal/docs-elements.ts +21 -0
- package/src/internal/source-imports.ts +3 -3
- package/src/mcp/client-config.ts +130 -0
- package/src/vite-plugins/animated.ts +486 -0
- package/src/vite-plugins/asset-imports.ts +2 -2
- package/src/vite-plugins/index.ts +2 -0
- package/src/vite-plugins/resources.ts +2 -2
- package/src/vite-plugins/settings-worker-env.ts +2 -2
- package/src/vite-plugins/settings.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-worker-env.js","sourceRoot":"","sources":["../../src/vite-plugins/settings-worker-env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAExF,SAAS,qBAAqB;IAC1B,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,OAAO;QACH,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QAEd,KAAK,CAAC,MAAM,CAAC,MAAkB;YAC3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5G,MAAM,GAAG,GAAG,6BAA6B,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEhE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACf,OAAO;YACX,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAEtC,OAAO;gBACH,IAAI,EAAE;oBACF,GAAG,EAAE,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE;iBACzF;aACJ,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC","sourcesContent":["import type { UserConfig } from \"vite\";\nimport type { Plugin } from \"vitest/config\";\nimport { createConfigLoader, resolveFuture } from \"@gtkx/config/internal\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { prependSchemaDir, stageAndCompileProjectSchemas } from \"../settings/schema.js\";\n\nfunction gtkxSettingsWorkerEnv(): Plugin {\n const loadConfig = createConfigLoader();\n\n return {\n name: \"gtkx:settings-worker-env\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n const dataDir = resolveFuture(loaded.config.future).isResourceImported ? null : resolveDataDir(loaded.root);\n const dir = stageAndCompileProjectSchemas(loaded.root, dataDir);\n\n if (dir === null) {\n return;\n }\n\n process.env.GTKX_DEV_SCHEMA_DIR = dir;\n\n return {\n test: {\n env: { GSETTINGS_SCHEMA_DIR: prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR) },\n },\n };\n },\n };\n}\n\nexport { gtkxSettingsWorkerEnv };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAc,MAAM,EAA6C,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAc,MAAM,EAA6C,MAAM,MAAM,CAAC;AAK1F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAkQ5E,iBAAS,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,sBAAsB,GAAG,MAAM,CA6D9F;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveFuture } from "@gtkx/config/internal";
|
|
1
2
|
import { error, errorMessage, info, sortStrings } from "@gtkx/utils";
|
|
2
3
|
import { readFileSync } from "node:fs";
|
|
3
4
|
import { basename, join } from "node:path";
|
|
@@ -65,7 +66,7 @@ const scheduleSchemaEnvSync = (state) => {
|
|
|
65
66
|
};
|
|
66
67
|
const applyUserConfig = async (state, config, loadConfig) => {
|
|
67
68
|
const loaded = await loadConfig.load(config.root ?? process.cwd());
|
|
68
|
-
state.isV2ResourceImports = loaded.config.future
|
|
69
|
+
state.isV2ResourceImports = resolveFuture(loaded.config.future).isResourceImported;
|
|
69
70
|
state.dataDir = state.isV2ResourceImports ? null : resolveDataDir(loaded.root);
|
|
70
71
|
};
|
|
71
72
|
const applyResolvedConfig = (state, config) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ModuleNode, Plugin, ResolvedConfig, UserConfig, ViteDevServer } from \"vite\";\nimport { error, errorMessage, info, sortStrings } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { BuildManifestCollector } from \"../internal/build-manifest.js\";\nimport type { AssetEmitter } from \"./asset-emitter.js\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from \"../internal/staging-dir.js\";\nimport { compileSchemas } from \"../settings/compile.js\";\nimport { parseSchemaXml, SchemaParseError } from \"../settings/parser.js\";\nimport { renderRuntimeModule } from \"../settings/render.js\";\nimport {\n assertUniqueSchemaBasenames,\n emitSchemaEnv,\n prependSchemaDir,\n projectRelativeSchemaPath,\n SCHEMA_SUFFIX,\n stageSchema,\n} from \"../settings/schema.js\";\nimport { createVirtualNamespace } from \"./virtual-module.js\";\n\ntype PluginState = {\n schemaDir: RetainedStagingDir;\n rootDir: string | null;\n dataDir: string | null;\n isV2ResourceImports: boolean;\n isBuild: boolean;\n schemaEnvTimer: ReturnType<typeof setTimeout> | null;\n trackedSchemas: Map<string, string>;\n buildSchemas: Set<string>;\n};\n\ntype PluginContext = AssetEmitter & {\n error: (message: string) => never;\n};\n\nconst VIRTUAL_PREFIX = \"\\0gtkx-settings:\";\nconst SCHEMA_STAGING_PREFIX = \"schemas\";\nconst SOURCE_MODULE_RE = /\\.[cm]?[jt]sx?$/;\nconst SCHEMA_ENV_DEBOUNCE_MS = 50;\nconst { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);\n\nconst SCHEMA_ENV_BANNER = [\n \"process.env.GSETTINGS_SCHEMA_DIR = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.GSETTINGS_SCHEMA_DIR,\",\n \"]\",\n \" .filter(Boolean)\",\n \" .join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst ensureSchemaDir = (state: PluginState): string => {\n const existing = state.schemaDir.getPath();\n\n if (existing !== null) {\n return existing;\n }\n\n const runnerDir = process.env.GTKX_DEV_SCHEMA_DIR;\n\n return runnerDir ? state.schemaDir.adopt(runnerDir) : state.schemaDir.retain();\n};\n\nconst compileSchemaDir = (state: PluginState): void => {\n const dir = state.schemaDir.getPath();\n\n if (dir === null) {\n return;\n }\n\n compileSchemas(dir);\n process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);\n};\n\nconst syncSchemaEnv = (state: PluginState): void => {\n if (state.rootDir === null) {\n return;\n }\n\n try {\n emitSchemaEnv(state.rootDir, state.dataDir, state.isV2ResourceImports);\n } catch (error_) {\n error(`Failed to generate GSettings schema types: ${errorMessage(error_)}`);\n }\n};\n\nconst cancelSchemaEnvSync = (state: PluginState): void => {\n if (state.schemaEnvTimer === null) {\n return;\n }\n\n clearTimeout(state.schemaEnvTimer);\n state.schemaEnvTimer = null;\n};\n\nconst scheduleSchemaEnvSync = (state: PluginState): void => {\n cancelSchemaEnvSync(state);\n\n state.schemaEnvTimer = setTimeout(() => {\n state.schemaEnvTimer = null;\n syncSchemaEnv(state);\n }, SCHEMA_ENV_DEBOUNCE_MS);\n};\n\nconst applyUserConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader): Promise<void> => {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2ResourceImports = loaded.config.future?.v2ResourceImports === true;\n state.dataDir = state.isV2ResourceImports ? null : resolveDataDir(loaded.root);\n};\n\nconst applyResolvedConfig = (state: PluginState, config: ResolvedConfig): void => {\n state.isBuild = config.command === \"build\";\n state.rootDir = typeof config.root === \"string\" ? config.root : null;\n syncSchemaEnv(state);\n};\n\nconst registerSchemaForMode = (state: PluginState, filePath: string, id: string): void => {\n const fileName = basename(filePath);\n\n if (state.isBuild) {\n state.buildSchemas.add(filePath);\n info(`Queued GSettings schema: ${fileName}`);\n\n return;\n }\n\n state.trackedSchemas.set(filePath, id);\n const dir = ensureSchemaDir(state);\n stageSchema(dir, filePath);\n compileSchemaDir(state);\n info(`Compiled GSettings schema: ${fileName}`);\n};\n\nconst loadSchemaModule = (ctx: PluginContext, state: PluginState, id: string): string | undefined => {\n if (!isVirtual(id)) {\n return undefined;\n }\n\n const filePath = fromVirtualId(id);\n const xml = readFileSync(filePath, \"utf8\");\n const fileName = basename(filePath);\n registerSchemaForMode(state, filePath, id);\n let parsed: ReturnType<typeof parseSchemaXml>;\n\n try {\n parsed = parseSchemaXml(xml, fileName);\n } catch (error) {\n if (!(error instanceof SchemaParseError)) {\n throw error;\n }\n\n ctx.error(error.message);\n }\n\n if (parsed.schemas.length === 0) {\n ctx.error(`No <schema id=\"...\"> found in ${fileName}`);\n }\n\n return renderRuntimeModule(parsed);\n};\n\nconst compileBuildSchemas = (schemaFiles: string[]): Buffer =>\n withStagingDir(\"schemas-build\", (dir) => {\n for (const filePath of schemaFiles) {\n stageSchema(dir, filePath);\n }\n\n compileSchemas(dir);\n\n return readFileSync(join(dir, \"gschemas.compiled\"));\n });\n\nconst buildSchemaPaths = (rootDir: string, schemaFiles: string[]): string[] =>\n schemaFiles.map((filePath) => {\n const rel = projectRelativeSchemaPath(rootDir, filePath);\n\n if (rel === null) {\n throw new Error(`Cannot package the GSettings schema ${filePath}: it is outside ${rootDir}`);\n }\n\n return rel;\n });\n\nconst emitBuildSchemas = (\n ctx: PluginContext,\n state: PluginState,\n buildManifest: BuildManifestCollector | undefined,\n): void => {\n if (!state.isBuild || state.rootDir === null) {\n return;\n }\n\n const rootDir = state.rootDir;\n const schemaFiles = sortStrings(state.buildSchemas);\n assertUniqueSchemaBasenames(schemaFiles);\n const schemas = buildSchemaPaths(rootDir, schemaFiles);\n\n if (buildManifest !== undefined) {\n buildManifest.schemas = schemas;\n }\n\n if (schemaFiles.length === 0) {\n return;\n }\n\n const compiled = compileBuildSchemas(schemaFiles);\n\n ctx.emitFile({\n type: \"asset\",\n fileName: \"gschemas.compiled\",\n source: compiled,\n });\n\n info(`Compiled ${String(schemaFiles.length)} GSettings schema(s)`);\n};\n\nconst handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDevServer): ModuleNode[] | undefined => {\n if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {\n scheduleSchemaEnvSync(state);\n }\n\n const virtualId = state.trackedSchemas.get(file);\n\n if (!virtualId) {\n return;\n }\n\n const dir = ensureSchemaDir(state);\n stageSchema(dir, file);\n compileSchemaDir(state);\n info(`Recompiled GSettings schema: ${basename(file)}`);\n const mod = server.moduleGraph.getModuleById(virtualId);\n\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n\n return [mod];\n }\n\n return undefined;\n};\n\nconst watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {\n const onClose = (): void => {\n cancelSchemaEnvSync(state);\n state.schemaDir.release();\n };\n\n server.httpServer?.once(\"close\", onClose);\n server.watcher.once(\"close\", onClose);\n\n const refreshSchemaTypes = (file: string): void => {\n if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {\n scheduleSchemaEnvSync(state);\n }\n };\n\n server.watcher.on(\"add\", refreshSchemaTypes);\n server.watcher.on(\"unlink\", refreshSchemaTypes);\n};\n\nfunction gtkxSettings(loadConfig: ConfigLoader, buildManifest?: BuildManifestCollector): Plugin {\n const state: PluginState = {\n schemaDir: createRetainedStagingDir(SCHEMA_STAGING_PREFIX),\n rootDir: null,\n dataDir: null,\n isV2ResourceImports: false,\n isBuild: false,\n schemaEnvTimer: null,\n trackedSchemas: new Map(),\n buildSchemas: new Set(),\n };\n\n return {\n name: \"gtkx:settings\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n await applyUserConfig(state, config, loadConfig);\n },\n\n configResolved(config) {\n applyResolvedConfig(state, config);\n },\n\n configureServer(server) {\n watchSchemaFiles(state, server);\n },\n\n outputOptions(options) {\n if (!state.isBuild) {\n return;\n }\n\n return prependBanner(options, SCHEMA_ENV_BANNER);\n },\n\n async resolveId(source, importer, options) {\n if (!source.endsWith(SCHEMA_SUFFIX)) {\n return;\n }\n\n return resolveToVirtual(this, { source, importer, options });\n },\n\n load(id) {\n return loadSchemaModule(this, state, id);\n },\n\n buildEnd() {\n emitBuildSchemas(this, state, buildManifest);\n },\n\n closeBundle() {\n cancelSchemaEnvSync(state);\n state.schemaDir.release();\n },\n\n handleHotUpdate({ file, server }) {\n return handleSchemaHotUpdate(state, file, server);\n },\n };\n}\n\nexport { gtkxSettings };\n"]}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/vite-plugins/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConfigLoader } from \"@gtkx/config\";\nimport type { ModuleNode, Plugin, ResolvedConfig, UserConfig, ViteDevServer } from \"vite\";\nimport { resolveFuture } from \"@gtkx/config/internal\";\nimport { error, errorMessage, info, sortStrings } from \"@gtkx/utils\";\nimport { readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { BuildManifestCollector } from \"../internal/build-manifest.js\";\nimport type { AssetEmitter } from \"./asset-emitter.js\";\nimport { prependBanner } from \"../internal/banner.js\";\nimport { resolveDataDir } from \"../internal/data-dir.js\";\nimport { createRetainedStagingDir, type RetainedStagingDir, withStagingDir } from \"../internal/staging-dir.js\";\nimport { compileSchemas } from \"../settings/compile.js\";\nimport { parseSchemaXml, SchemaParseError } from \"../settings/parser.js\";\nimport { renderRuntimeModule } from \"../settings/render.js\";\nimport {\n assertUniqueSchemaBasenames,\n emitSchemaEnv,\n prependSchemaDir,\n projectRelativeSchemaPath,\n SCHEMA_SUFFIX,\n stageSchema,\n} from \"../settings/schema.js\";\nimport { createVirtualNamespace } from \"./virtual-module.js\";\n\ntype PluginState = {\n schemaDir: RetainedStagingDir;\n rootDir: string | null;\n dataDir: string | null;\n isV2ResourceImports: boolean;\n isBuild: boolean;\n schemaEnvTimer: ReturnType<typeof setTimeout> | null;\n trackedSchemas: Map<string, string>;\n buildSchemas: Set<string>;\n};\n\ntype PluginContext = AssetEmitter & {\n error: (message: string) => never;\n};\n\nconst VIRTUAL_PREFIX = \"\\0gtkx-settings:\";\nconst SCHEMA_STAGING_PREFIX = \"schemas\";\nconst SOURCE_MODULE_RE = /\\.[cm]?[jt]sx?$/;\nconst SCHEMA_ENV_DEBOUNCE_MS = 50;\nconst { isVirtual, fromVirtualId, resolveToVirtual } = createVirtualNamespace(VIRTUAL_PREFIX);\n\nconst SCHEMA_ENV_BANNER = [\n \"process.env.GSETTINGS_SCHEMA_DIR = [\",\n \" decodeURIComponent(new URL(\\\".\\\", import.meta.url).pathname),\",\n \" process.env.GSETTINGS_SCHEMA_DIR,\",\n \"]\",\n \" .filter(Boolean)\",\n \" .join(\\\":\\\");\",\n].join(\"\\n\");\n\nconst ensureSchemaDir = (state: PluginState): string => {\n const existing = state.schemaDir.getPath();\n\n if (existing !== null) {\n return existing;\n }\n\n const runnerDir = process.env.GTKX_DEV_SCHEMA_DIR;\n\n return runnerDir ? state.schemaDir.adopt(runnerDir) : state.schemaDir.retain();\n};\n\nconst compileSchemaDir = (state: PluginState): void => {\n const dir = state.schemaDir.getPath();\n\n if (dir === null) {\n return;\n }\n\n compileSchemas(dir);\n process.env.GSETTINGS_SCHEMA_DIR = prependSchemaDir(dir, process.env.GSETTINGS_SCHEMA_DIR);\n};\n\nconst syncSchemaEnv = (state: PluginState): void => {\n if (state.rootDir === null) {\n return;\n }\n\n try {\n emitSchemaEnv(state.rootDir, state.dataDir, state.isV2ResourceImports);\n } catch (error_) {\n error(`Failed to generate GSettings schema types: ${errorMessage(error_)}`);\n }\n};\n\nconst cancelSchemaEnvSync = (state: PluginState): void => {\n if (state.schemaEnvTimer === null) {\n return;\n }\n\n clearTimeout(state.schemaEnvTimer);\n state.schemaEnvTimer = null;\n};\n\nconst scheduleSchemaEnvSync = (state: PluginState): void => {\n cancelSchemaEnvSync(state);\n\n state.schemaEnvTimer = setTimeout(() => {\n state.schemaEnvTimer = null;\n syncSchemaEnv(state);\n }, SCHEMA_ENV_DEBOUNCE_MS);\n};\n\nconst applyUserConfig = async (state: PluginState, config: UserConfig, loadConfig: ConfigLoader): Promise<void> => {\n const loaded = await loadConfig.load(config.root ?? process.cwd());\n state.isV2ResourceImports = resolveFuture(loaded.config.future).isResourceImported;\n state.dataDir = state.isV2ResourceImports ? null : resolveDataDir(loaded.root);\n};\n\nconst applyResolvedConfig = (state: PluginState, config: ResolvedConfig): void => {\n state.isBuild = config.command === \"build\";\n state.rootDir = typeof config.root === \"string\" ? config.root : null;\n syncSchemaEnv(state);\n};\n\nconst registerSchemaForMode = (state: PluginState, filePath: string, id: string): void => {\n const fileName = basename(filePath);\n\n if (state.isBuild) {\n state.buildSchemas.add(filePath);\n info(`Queued GSettings schema: ${fileName}`);\n\n return;\n }\n\n state.trackedSchemas.set(filePath, id);\n const dir = ensureSchemaDir(state);\n stageSchema(dir, filePath);\n compileSchemaDir(state);\n info(`Compiled GSettings schema: ${fileName}`);\n};\n\nconst loadSchemaModule = (ctx: PluginContext, state: PluginState, id: string): string | undefined => {\n if (!isVirtual(id)) {\n return undefined;\n }\n\n const filePath = fromVirtualId(id);\n const xml = readFileSync(filePath, \"utf8\");\n const fileName = basename(filePath);\n registerSchemaForMode(state, filePath, id);\n let parsed: ReturnType<typeof parseSchemaXml>;\n\n try {\n parsed = parseSchemaXml(xml, fileName);\n } catch (error) {\n if (!(error instanceof SchemaParseError)) {\n throw error;\n }\n\n ctx.error(error.message);\n }\n\n if (parsed.schemas.length === 0) {\n ctx.error(`No <schema id=\"...\"> found in ${fileName}`);\n }\n\n return renderRuntimeModule(parsed);\n};\n\nconst compileBuildSchemas = (schemaFiles: string[]): Buffer =>\n withStagingDir(\"schemas-build\", (dir) => {\n for (const filePath of schemaFiles) {\n stageSchema(dir, filePath);\n }\n\n compileSchemas(dir);\n\n return readFileSync(join(dir, \"gschemas.compiled\"));\n });\n\nconst buildSchemaPaths = (rootDir: string, schemaFiles: string[]): string[] =>\n schemaFiles.map((filePath) => {\n const rel = projectRelativeSchemaPath(rootDir, filePath);\n\n if (rel === null) {\n throw new Error(`Cannot package the GSettings schema ${filePath}: it is outside ${rootDir}`);\n }\n\n return rel;\n });\n\nconst emitBuildSchemas = (\n ctx: PluginContext,\n state: PluginState,\n buildManifest: BuildManifestCollector | undefined,\n): void => {\n if (!state.isBuild || state.rootDir === null) {\n return;\n }\n\n const rootDir = state.rootDir;\n const schemaFiles = sortStrings(state.buildSchemas);\n assertUniqueSchemaBasenames(schemaFiles);\n const schemas = buildSchemaPaths(rootDir, schemaFiles);\n\n if (buildManifest !== undefined) {\n buildManifest.schemas = schemas;\n }\n\n if (schemaFiles.length === 0) {\n return;\n }\n\n const compiled = compileBuildSchemas(schemaFiles);\n\n ctx.emitFile({\n type: \"asset\",\n fileName: \"gschemas.compiled\",\n source: compiled,\n });\n\n info(`Compiled ${String(schemaFiles.length)} GSettings schema(s)`);\n};\n\nconst handleSchemaHotUpdate = (state: PluginState, file: string, server: ViteDevServer): ModuleNode[] | undefined => {\n if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {\n scheduleSchemaEnvSync(state);\n }\n\n const virtualId = state.trackedSchemas.get(file);\n\n if (!virtualId) {\n return;\n }\n\n const dir = ensureSchemaDir(state);\n stageSchema(dir, file);\n compileSchemaDir(state);\n info(`Recompiled GSettings schema: ${basename(file)}`);\n const mod = server.moduleGraph.getModuleById(virtualId);\n\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n\n return [mod];\n }\n\n return undefined;\n};\n\nconst watchSchemaFiles = (state: PluginState, server: ViteDevServer): void => {\n const onClose = (): void => {\n cancelSchemaEnvSync(state);\n state.schemaDir.release();\n };\n\n server.httpServer?.once(\"close\", onClose);\n server.watcher.once(\"close\", onClose);\n\n const refreshSchemaTypes = (file: string): void => {\n if (file.endsWith(SCHEMA_SUFFIX) || SOURCE_MODULE_RE.test(file)) {\n scheduleSchemaEnvSync(state);\n }\n };\n\n server.watcher.on(\"add\", refreshSchemaTypes);\n server.watcher.on(\"unlink\", refreshSchemaTypes);\n};\n\nfunction gtkxSettings(loadConfig: ConfigLoader, buildManifest?: BuildManifestCollector): Plugin {\n const state: PluginState = {\n schemaDir: createRetainedStagingDir(SCHEMA_STAGING_PREFIX),\n rootDir: null,\n dataDir: null,\n isV2ResourceImports: false,\n isBuild: false,\n schemaEnvTimer: null,\n trackedSchemas: new Map(),\n buildSchemas: new Set(),\n };\n\n return {\n name: \"gtkx:settings\",\n enforce: \"pre\",\n\n async config(config: UserConfig) {\n await applyUserConfig(state, config, loadConfig);\n },\n\n configResolved(config) {\n applyResolvedConfig(state, config);\n },\n\n configureServer(server) {\n watchSchemaFiles(state, server);\n },\n\n outputOptions(options) {\n if (!state.isBuild) {\n return;\n }\n\n return prependBanner(options, SCHEMA_ENV_BANNER);\n },\n\n async resolveId(source, importer, options) {\n if (!source.endsWith(SCHEMA_SUFFIX)) {\n return;\n }\n\n return resolveToVirtual(this, { source, importer, options });\n },\n\n load(id) {\n return loadSchemaModule(this, state, id);\n },\n\n buildEnd() {\n emitBuildSchemas(this, state, buildManifest);\n },\n\n closeBundle() {\n cancelSchemaEnvSync(state);\n state.schemaDir.release();\n },\n\n handleHotUpdate({ file, server }) {\n return handleSchemaHotUpdate(state, file, server);\n },\n };\n}\n\nexport { gtkxSettings };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "GTK app toolchain for React: scaffold, dev server, build, docs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -74,19 +74,20 @@
|
|
|
74
74
|
"react-refresh": "^0.18.0",
|
|
75
75
|
"vite": "^8.2.2",
|
|
76
76
|
"yaml": "^2.9.0",
|
|
77
|
-
"@gtkx/codegen": "1.
|
|
78
|
-
"@gtkx/
|
|
79
|
-
"@gtkx/runtime": "1.
|
|
80
|
-
"@gtkx/
|
|
81
|
-
"@gtkx/utils": "1.
|
|
82
|
-
"
|
|
83
|
-
"
|
|
77
|
+
"@gtkx/codegen": "1.6.0",
|
|
78
|
+
"@gtkx/config": "1.6.0",
|
|
79
|
+
"@gtkx/runtime": "1.6.0",
|
|
80
|
+
"@gtkx/mcp": "1.6.0",
|
|
81
|
+
"@gtkx/utils": "1.6.0",
|
|
82
|
+
"create-gtkx": "1.6.0",
|
|
83
|
+
"@gtkx/vitest": "1.6.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
86
|
"@types/babel__core": "^7.20.5",
|
|
87
87
|
"@types/react-refresh": "^0.14.7",
|
|
88
88
|
"vitest": "^4.1.11",
|
|
89
|
-
"@gtkx/
|
|
89
|
+
"@gtkx/animated": "1.6.0",
|
|
90
|
+
"@gtkx/testing": "1.6.0"
|
|
90
91
|
},
|
|
91
92
|
"peerDependencies": {
|
|
92
93
|
"react": "^19"
|
package/src/cli.ts
CHANGED
|
@@ -38,6 +38,11 @@ const main = defineCommand({
|
|
|
38
38
|
|
|
39
39
|
return withErrorBoundary(docs);
|
|
40
40
|
},
|
|
41
|
+
mcp: async () => {
|
|
42
|
+
const { mcp } = await import("./commands/mcp.js");
|
|
43
|
+
|
|
44
|
+
return withErrorBoundary(mcp);
|
|
45
|
+
},
|
|
41
46
|
create: async () => {
|
|
42
47
|
const { scaffoldCommand } = await import("create-gtkx");
|
|
43
48
|
|
package/src/codegen/freshness.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Config } from "@gtkx/config";
|
|
2
2
|
import { resolveGirPath, resolveLibraries } from "@gtkx/codegen";
|
|
3
|
+
import { resolveFuture } from "@gtkx/config/internal";
|
|
3
4
|
import { existsSync } from "node:fs";
|
|
4
5
|
import { join } from "node:path";
|
|
5
6
|
import { type CodegenStore, resolveCodegenStore } from "./store-resolver.js";
|
|
@@ -14,7 +15,7 @@ const REACT_GENERATED_MODULES: string[] = ["index.js", "metadata.js", join("gtk"
|
|
|
14
15
|
|
|
15
16
|
const resolveCodegenInputs = (cwd: string, config: Config): CodegenInputs => {
|
|
16
17
|
const girPath = resolveGirPath(config.girPath);
|
|
17
|
-
const libraries = resolveLibraries(config.libraries, girPath);
|
|
18
|
+
const libraries = resolveLibraries(config.libraries, girPath, resolveFuture(config.future).isAdwaitaDefault);
|
|
18
19
|
const store = resolveCodegenStore(cwd);
|
|
19
20
|
|
|
20
21
|
return { girPath, libraries, store };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Config } from "@gtkx/config";
|
|
2
|
+
import { mergeOmittedProps } from "@gtkx/codegen";
|
|
3
|
+
import { writeDocs } from "@gtkx/codegen/internal";
|
|
4
|
+
import { isAgentReferenceEnabled, resolveOmittedProps } from "@gtkx/config/internal";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { resolveDocsElements } from "../internal/docs-elements.js";
|
|
7
|
+
|
|
8
|
+
type WriteReferenceOptions = {
|
|
9
|
+
root: string;
|
|
10
|
+
config: Config;
|
|
11
|
+
girPath: string[];
|
|
12
|
+
libraries: string[];
|
|
13
|
+
isForced?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type ReferenceResult = {
|
|
17
|
+
isRegenerated: boolean;
|
|
18
|
+
elements: number;
|
|
19
|
+
namespaces: number;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const REFERENCE_PATH = ".gtkx/reference";
|
|
23
|
+
const SKIPPED: ReferenceResult = { isRegenerated: false, elements: 0, namespaces: 0 };
|
|
24
|
+
|
|
25
|
+
const resolveReferenceDir = (root: string): string => join(root, ".gtkx", "reference");
|
|
26
|
+
|
|
27
|
+
const writeReference = async (options: WriteReferenceOptions): Promise<ReferenceResult> => {
|
|
28
|
+
const { root, config, girPath, libraries } = options;
|
|
29
|
+
|
|
30
|
+
if (!isAgentReferenceEnabled(config) || girPath.length === 0 || libraries.length === 0) {
|
|
31
|
+
return SKIPPED;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const builtin = await resolveDocsElements(root);
|
|
35
|
+
|
|
36
|
+
const { isRegenerated, namespaces } = writeDocs({
|
|
37
|
+
libraries,
|
|
38
|
+
girPath,
|
|
39
|
+
outDir: resolveReferenceDir(root),
|
|
40
|
+
basePath: REFERENCE_PATH,
|
|
41
|
+
linkStyle: "file",
|
|
42
|
+
props: builtin.props,
|
|
43
|
+
omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),
|
|
44
|
+
isForced: options.isForced === true,
|
|
45
|
+
isByteArrayTyped: config.future?.v2ByteArrays === true,
|
|
46
|
+
isValueUnwrapped: config.future?.v2ValueReturns === true,
|
|
47
|
+
isFinishTrimmed: config.future?.v2FinishResults === true,
|
|
48
|
+
isInoutInPlace: config.future?.v2InoutReturns === true,
|
|
49
|
+
isTreeShaken: config.future?.v2TreeShaking === true,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
isRegenerated,
|
|
54
|
+
elements: namespaces.reduce((total, namespace) => total + namespace.elements.length, 0),
|
|
55
|
+
namespaces: namespaces.length,
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { REFERENCE_PATH, writeReference, type ReferenceResult };
|
package/src/codegen/report.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { RunCodegenResult } from "./run-codegen.js";
|
|
2
|
+
import { REFERENCE_PATH } from "./reference.js";
|
|
2
3
|
|
|
3
4
|
const PREFIX = "codegen: ";
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
+
const contextDetails = (result: RunCodegenResult): string[] => {
|
|
6
7
|
const details: string[] = [];
|
|
7
8
|
|
|
8
9
|
if (result.configFile) {
|
|
@@ -21,10 +22,24 @@ const formatCodegenResult = (result: RunCodegenResult, totalMs: number): string[
|
|
|
21
22
|
details.push(`future=${result.future.join(", ")}`);
|
|
22
23
|
}
|
|
23
24
|
|
|
24
|
-
details
|
|
25
|
+
return details;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const referenceDetails = (result: RunCodegenResult): string[] => {
|
|
29
|
+
if (result.reference?.isRegenerated !== true) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return [`${String(result.reference.elements)} reference pages in ${REFERENCE_PATH}`];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const formatCodegenResult = (result: RunCodegenResult, totalMs: number): string[] => {
|
|
37
|
+
const details = [
|
|
38
|
+
...contextDetails(result),
|
|
25
39
|
`${String(result.namespaces)} namespaces, ${String(result.intrinsicElements)} intrinsic elements ` +
|
|
26
40
|
`in ${String(result.duration)}ms (total ${String(totalMs)}ms)`,
|
|
27
|
-
|
|
41
|
+
...referenceDetails(result),
|
|
42
|
+
];
|
|
28
43
|
|
|
29
44
|
return details.map((detail) => PREFIX + detail);
|
|
30
45
|
};
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { runCodegen as runCodegenCore } from "@gtkx/codegen";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
getShadowingStorePaths,
|
|
4
|
+
LIBRARIES_WILDCARD,
|
|
5
|
+
redundantLibraries,
|
|
6
|
+
sweepProjectStaging,
|
|
7
|
+
} from "@gtkx/codegen/internal";
|
|
3
8
|
import { type Config, loadConfig } from "@gtkx/config";
|
|
4
9
|
import {
|
|
10
|
+
isAgentRulesEnabled,
|
|
11
|
+
type ResolvedFuture,
|
|
5
12
|
resolveElementComponents,
|
|
6
13
|
resolveElementProps,
|
|
14
|
+
resolveFuture,
|
|
7
15
|
resolveLazyElements,
|
|
8
16
|
resolveOmittedProps,
|
|
17
|
+
unknownFutureKeys,
|
|
9
18
|
} from "@gtkx/config/internal";
|
|
10
19
|
import { info, warn } from "@gtkx/utils";
|
|
11
20
|
import { existsSync, rmSync } from "node:fs";
|
|
@@ -13,10 +22,12 @@ import { join, resolve } from "node:path";
|
|
|
13
22
|
import { resolveCatalogProject, synchronizeCatalogs } from "../i18n/catalogs.js";
|
|
14
23
|
import { extractSourceCatalog } from "../i18n/source-messages.js";
|
|
15
24
|
import { emitI18nTypes } from "../i18n/types.js";
|
|
25
|
+
import { upsertAgentRules } from "../internal/agent-rules.js";
|
|
16
26
|
import { resolveDataDir } from "../internal/data-dir.js";
|
|
17
27
|
import { discoverSourceFiles } from "../internal/source-imports.js";
|
|
18
28
|
import { emitSchemaEnv } from "../settings/schema.js";
|
|
19
29
|
import { type CodegenInputs, isCodegenStale, resolveCodegenInputs } from "./freshness.js";
|
|
30
|
+
import { type ReferenceResult, writeReference } from "./reference.js";
|
|
20
31
|
import { type CodegenContext, type CodegenStore, resolveCodegenContext } from "./store-resolver.js";
|
|
21
32
|
|
|
22
33
|
type RunCodegenOptions = {
|
|
@@ -43,6 +54,7 @@ type RunCodegenResult = {
|
|
|
43
54
|
configFile?: string | undefined;
|
|
44
55
|
libraries?: string[] | undefined;
|
|
45
56
|
future?: string[] | undefined;
|
|
57
|
+
reference?: ReferenceResult | undefined;
|
|
46
58
|
};
|
|
47
59
|
|
|
48
60
|
type CodegenOptionsInput = {
|
|
@@ -50,10 +62,7 @@ type CodegenOptionsInput = {
|
|
|
50
62
|
libraries: string[];
|
|
51
63
|
girPath: string[];
|
|
52
64
|
elements: Config["elements"];
|
|
53
|
-
|
|
54
|
-
isValueUnwrapped: boolean;
|
|
55
|
-
isFinishTrimmed: boolean;
|
|
56
|
-
isInoutInPlace: boolean;
|
|
65
|
+
future: ResolvedFuture;
|
|
57
66
|
};
|
|
58
67
|
|
|
59
68
|
type PreparedCodegen = CodegenInputs & { isForced: boolean };
|
|
@@ -88,13 +97,14 @@ const removeShadowingStores = (cwd: string): void => {
|
|
|
88
97
|
removeStores(getShadowingStorePaths(cwd));
|
|
89
98
|
};
|
|
90
99
|
|
|
91
|
-
const codegenOptions = ({ store, libraries, girPath, elements,
|
|
100
|
+
const codegenOptions = ({ store, libraries, girPath, elements, future }: CodegenOptionsInput) => ({
|
|
92
101
|
libraries,
|
|
93
102
|
girPath,
|
|
94
103
|
isByteArrayTyped: future.isByteArrayTyped,
|
|
95
104
|
isValueUnwrapped: future.isValueUnwrapped,
|
|
96
105
|
isFinishTrimmed: future.isFinishTrimmed,
|
|
97
106
|
isInoutInPlace: future.isInoutInPlace,
|
|
107
|
+
isTreeShaken: future.isTreeShaken,
|
|
98
108
|
gi: {
|
|
99
109
|
storeDir: store.giStoreDir,
|
|
100
110
|
linkDir: store.giLinkDir,
|
|
@@ -115,16 +125,19 @@ const codegenOptions = ({ store, libraries, girPath, elements, ...future }: Code
|
|
|
115
125
|
userOmittedProps: resolveOmittedProps(elements),
|
|
116
126
|
});
|
|
117
127
|
|
|
118
|
-
const enabledFutureFlags = (config: Config): string[] =>
|
|
119
|
-
|
|
120
|
-
|
|
128
|
+
const enabledFutureFlags = (config: Config): string[] => {
|
|
129
|
+
const unknown: Set<string> = new Set(unknownFutureKeys(config.future));
|
|
130
|
+
|
|
131
|
+
return Object.entries(config.future ?? {})
|
|
132
|
+
.filter(([name, value]) => value === true && !unknown.has(name))
|
|
121
133
|
.map(([name]) => name);
|
|
134
|
+
};
|
|
122
135
|
|
|
123
|
-
const disabledCodegenResult = (configFile: string): RunCodegenResult => ({
|
|
136
|
+
const disabledCodegenResult = (configFile: string, notices: string[]): RunCodegenResult => ({
|
|
124
137
|
isRegenerated: false,
|
|
125
138
|
namespaces: 0,
|
|
126
139
|
intrinsicElements: 0,
|
|
127
|
-
notices
|
|
140
|
+
notices,
|
|
128
141
|
duration: 0,
|
|
129
142
|
girPath: [],
|
|
130
143
|
configFile,
|
|
@@ -137,6 +150,46 @@ const warnNotices = (notices: string[]): void => {
|
|
|
137
150
|
}
|
|
138
151
|
};
|
|
139
152
|
|
|
153
|
+
const unknownFutureNotice = (keys: string[]): string[] => {
|
|
154
|
+
if (keys.length === 0) {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return [
|
|
159
|
+
`gtkx.config.ts: \`future\` has no ${keys.join(", ")} flag, so the key is ignored. Check it against ` +
|
|
160
|
+
"the flags the configuration guide lists.",
|
|
161
|
+
];
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const redundantLibraryNotice = (entries: string[]): string[] => {
|
|
165
|
+
if (entries.length === 0) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return [
|
|
170
|
+
`gtkx.config.ts: \`future.v2DefaultLibraries\` binds ${entries.join(", ")} on its own, so naming them ` +
|
|
171
|
+
"in `libraries` changes nothing. Drop them; naming them becomes a configuration error in GTKX 2.0.",
|
|
172
|
+
];
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
const wildcardLibrariesNotice = (libraries: Config["libraries"]): string[] => {
|
|
176
|
+
if (libraries !== LIBRARIES_WILDCARD) {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return [
|
|
181
|
+
'gtkx.config.ts: `libraries: "*"` binds whatever the build host happens to have installed, so the ' +
|
|
182
|
+
"store changes with the machine. Instead, list the libraries the project needs; the wildcard is " +
|
|
183
|
+
"removed in GTKX 2.0.",
|
|
184
|
+
];
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const configNotices = (config: Config, future: ResolvedFuture): string[] => [
|
|
188
|
+
...unknownFutureNotice(unknownFutureKeys(config.future)),
|
|
189
|
+
...wildcardLibrariesNotice(config.libraries),
|
|
190
|
+
...redundantLibraryNotice(redundantLibraries(config.libraries, future.isAdwaitaDefault)),
|
|
191
|
+
];
|
|
192
|
+
|
|
140
193
|
const regeneratedStorePaths = (store: CodegenStore): string[] => {
|
|
141
194
|
if (store.react === null) {
|
|
142
195
|
return [store.giStoreDir, store.giLinkDir];
|
|
@@ -167,13 +220,16 @@ const prepareCodegen = (options: RunCodegenOptions, cwd: string, config: Config)
|
|
|
167
220
|
const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenResult> => {
|
|
168
221
|
const cwd = options.cwd ?? process.cwd();
|
|
169
222
|
const { config, configFile } = await resolveLoadedConfig(options, cwd);
|
|
223
|
+
const future = resolveFuture(config.future);
|
|
224
|
+
const configured = configNotices(config, future);
|
|
225
|
+
warnNotices(configured);
|
|
170
226
|
await syncI18n(cwd, config.applicationId, options.shouldPreserveI18nMetadata);
|
|
171
|
-
syncSchemaEnv(cwd,
|
|
227
|
+
syncSchemaEnv(cwd, future.isResourceImported);
|
|
172
228
|
|
|
173
229
|
if (config.codegen === false) {
|
|
174
230
|
removeShadowingStores(cwd);
|
|
175
231
|
|
|
176
|
-
return disabledCodegenResult(configFile);
|
|
232
|
+
return disabledCodegenResult(configFile, configured);
|
|
177
233
|
}
|
|
178
234
|
|
|
179
235
|
const { girPath, libraries, store, isForced } = prepareCodegen(options, cwd, config);
|
|
@@ -183,34 +239,35 @@ const runCodegen = async (options: RunCodegenOptions = {}): Promise<RunCodegenRe
|
|
|
183
239
|
}
|
|
184
240
|
|
|
185
241
|
const result = await runCodegenCore({
|
|
186
|
-
...codegenOptions({
|
|
187
|
-
store,
|
|
188
|
-
libraries,
|
|
189
|
-
girPath,
|
|
190
|
-
elements: config.elements,
|
|
191
|
-
isByteArrayTyped: config.future?.v2ByteArrays === true,
|
|
192
|
-
isValueUnwrapped: config.future?.v2ValueReturns === true,
|
|
193
|
-
isFinishTrimmed: config.future?.v2FinishResults === true,
|
|
194
|
-
isInoutInPlace: config.future?.v2InoutReturns === true,
|
|
195
|
-
}),
|
|
242
|
+
...codegenOptions({ store, libraries, girPath, elements: config.elements, future }),
|
|
196
243
|
isForced,
|
|
197
244
|
});
|
|
198
245
|
|
|
199
246
|
warnNotices(result.notices);
|
|
247
|
+
const notices = [...configured, ...result.notices];
|
|
248
|
+
const reference = await writeReference({ root: cwd, config, girPath, libraries, isForced });
|
|
249
|
+
syncAgentRules(cwd, config);
|
|
200
250
|
|
|
201
251
|
return {
|
|
202
252
|
isRegenerated: result.isRegenerated,
|
|
203
253
|
namespaces: result.namespaces,
|
|
204
254
|
intrinsicElements: result.intrinsicElements,
|
|
205
|
-
notices
|
|
255
|
+
notices,
|
|
206
256
|
duration: result.duration,
|
|
207
257
|
girPath,
|
|
208
258
|
configFile,
|
|
209
259
|
libraries,
|
|
210
260
|
future: enabledFutureFlags(config),
|
|
261
|
+
reference,
|
|
211
262
|
};
|
|
212
263
|
};
|
|
213
264
|
|
|
265
|
+
const syncAgentRules = (root: string, config: Config): void => {
|
|
266
|
+
if (isAgentRulesEnabled(config)) {
|
|
267
|
+
upsertAgentRules(root);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
|
|
214
271
|
const syncI18n = async (
|
|
215
272
|
root: string,
|
|
216
273
|
applicationId: string,
|
package/src/commands/docs.ts
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ElementProps,
|
|
3
|
-
mergeOmittedProps,
|
|
4
|
-
type OmittedProps,
|
|
5
|
-
readBuiltinElements,
|
|
6
|
-
resolveGirPath,
|
|
7
|
-
resolveLibraries,
|
|
8
|
-
resolveStore,
|
|
9
|
-
} from "@gtkx/codegen";
|
|
1
|
+
import { mergeOmittedProps, resolveGirPath, resolveLibraries } from "@gtkx/codegen";
|
|
10
2
|
import { writeDocs } from "@gtkx/codegen/internal";
|
|
11
3
|
import { loadConfig } from "@gtkx/config";
|
|
12
|
-
import { resolveOmittedProps } from "@gtkx/config/internal";
|
|
4
|
+
import { resolveFuture, resolveOmittedProps } from "@gtkx/config/internal";
|
|
13
5
|
import { info } from "@gtkx/utils";
|
|
14
6
|
import { defineCommand } from "citty";
|
|
15
|
-
import { existsSync } from "node:fs";
|
|
16
7
|
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
8
|
+
import { resolveDocsElements } from "../internal/docs-elements.js";
|
|
17
9
|
import { cwdArg, resolveCwd } from "../internal/entry-arg.js";
|
|
18
10
|
|
|
19
11
|
const docs = defineCommand({
|
|
@@ -65,7 +57,8 @@ const docs = defineCommand({
|
|
|
65
57
|
);
|
|
66
58
|
}
|
|
67
59
|
|
|
68
|
-
const
|
|
60
|
+
const future = resolveFuture(config.future);
|
|
61
|
+
const libraries = resolveLibraries(config.libraries, girPath, future.isAdwaitaDefault);
|
|
69
62
|
const startedAt = Date.now();
|
|
70
63
|
const outDir = resolveOutDir(cwd, args.out);
|
|
71
64
|
const builtin = await resolveDocsElements(cwd);
|
|
@@ -78,10 +71,11 @@ const docs = defineCommand({
|
|
|
78
71
|
props: builtin.props,
|
|
79
72
|
omittedProps: mergeOmittedProps(builtin.omittedProps, resolveOmittedProps(config.elements)),
|
|
80
73
|
isForced: args.force,
|
|
81
|
-
isByteArrayTyped:
|
|
82
|
-
isValueUnwrapped:
|
|
83
|
-
isFinishTrimmed:
|
|
84
|
-
isInoutInPlace:
|
|
74
|
+
isByteArrayTyped: future.isByteArrayTyped,
|
|
75
|
+
isValueUnwrapped: future.isValueUnwrapped,
|
|
76
|
+
isFinishTrimmed: future.isFinishTrimmed,
|
|
77
|
+
isInoutInPlace: future.isInoutInPlace,
|
|
78
|
+
isTreeShaken: future.isTreeShaken,
|
|
85
79
|
});
|
|
86
80
|
|
|
87
81
|
if (!isRegenerated) {
|
|
@@ -130,16 +124,4 @@ const resolveOutDir = (cwd: string, out: string): string => {
|
|
|
130
124
|
);
|
|
131
125
|
};
|
|
132
126
|
|
|
133
|
-
const resolveDocsElements = async (cwd: string): Promise<{ props: ElementProps; omittedProps: OmittedProps }> => {
|
|
134
|
-
const { gi, reactSubexports } = resolveStore(cwd);
|
|
135
|
-
|
|
136
|
-
if (!existsSync(gi.storeDir)) {
|
|
137
|
-
return { props: {}, omittedProps: {} };
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const { props, omittedProps } = await readBuiltinElements(reactSubexports, gi.storeDir);
|
|
141
|
-
|
|
142
|
-
return { props, omittedProps };
|
|
143
|
-
};
|
|
144
|
-
|
|
145
127
|
export { docs };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { info } from "@gtkx/utils";
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
import { cwdArg, resolveCwd } from "../internal/entry-arg.js";
|
|
4
|
+
import { type ClientName, type ClientResult, CLIENTS, isClientName, writeClientConfig } from "../mcp/client-config.js";
|
|
5
|
+
|
|
6
|
+
const clientList = CLIENTS.map((client) => client.name).join(", ");
|
|
7
|
+
|
|
8
|
+
const init = defineCommand({
|
|
9
|
+
meta: {
|
|
10
|
+
name: "init",
|
|
11
|
+
description: "Write the gtkx MCP server into an editor's configuration file",
|
|
12
|
+
},
|
|
13
|
+
args: {
|
|
14
|
+
client: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: `Which editor to configure: one of ${clientList}`,
|
|
17
|
+
required: true,
|
|
18
|
+
},
|
|
19
|
+
...cwdArg,
|
|
20
|
+
},
|
|
21
|
+
run({ args }) {
|
|
22
|
+
const cwd = resolveCwd(args);
|
|
23
|
+
const name = args.client;
|
|
24
|
+
|
|
25
|
+
if (!isClientName(name)) {
|
|
26
|
+
throw new Error(`Unknown --client "${name}". Pass one of ${clientList}.`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
report(name, writeClientConfig(cwd, name));
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const mcp = defineCommand({
|
|
34
|
+
meta: {
|
|
35
|
+
name: "mcp",
|
|
36
|
+
description: "Run the MCP server that exposes this project's running app and generated API reference",
|
|
37
|
+
},
|
|
38
|
+
args: {
|
|
39
|
+
tools: {
|
|
40
|
+
type: "string",
|
|
41
|
+
description:
|
|
42
|
+
"Comma-separated tool name patterns to register, `*` matching any run of characters and a " +
|
|
43
|
+
"leading `!` excluding. Overrides `mcp.tools` in gtkx.config.ts",
|
|
44
|
+
},
|
|
45
|
+
"read-only": {
|
|
46
|
+
type: "boolean",
|
|
47
|
+
description: "Register only the tools that read state, leaving out the ones that drive the app",
|
|
48
|
+
},
|
|
49
|
+
...cwdArg,
|
|
50
|
+
},
|
|
51
|
+
subCommands: { init },
|
|
52
|
+
async run({ args }) {
|
|
53
|
+
const { runMcpServer } = await import("@gtkx/mcp/server");
|
|
54
|
+
|
|
55
|
+
await runMcpServer({
|
|
56
|
+
cwd: resolveCwd(args),
|
|
57
|
+
...(args.tools !== undefined && { tools: splitPatterns(args.tools) }),
|
|
58
|
+
...(args["read-only"] !== undefined && { isReadOnly: args["read-only"] }),
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const splitPatterns = (value: string): string[] =>
|
|
64
|
+
value.split(",").map((pattern) => pattern.trim()).filter((pattern) => pattern.length > 0);
|
|
65
|
+
|
|
66
|
+
const report = (name: ClientName, result: ClientResult): void => {
|
|
67
|
+
if (result.kind === "manual") {
|
|
68
|
+
info(`mcp: ${name} keeps its servers in ${result.path}, which is outside this project. Add:`);
|
|
69
|
+
|
|
70
|
+
for (const line of result.snippet.split("\n")) {
|
|
71
|
+
info(`mcp: ${line}`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
info(`mcp: ${result.isCreated ? "created" : "updated"} ${result.path} for ${name}`);
|
|
78
|
+
info("mcp: restart the editor for it to pick the server up");
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { mcp };
|
|
@@ -44,7 +44,7 @@ const summaryFor = (settings: DeploySettings, packages: BundledPackage[]): strin
|
|
|
44
44
|
"Section 3.2(a) asks that whoever receives an executable form be told how to obtain the source code,",
|
|
45
45
|
"which is what the source pointer below is for: it leads to the release these files were built from.",
|
|
46
46
|
`The addon also statically links Rust crates GTKX did not write, so ${lib}/${NATIVE_FILENAME} is not`,
|
|
47
|
-
`${LICENSE_NAME} alone. The
|
|
47
|
+
`${LICENSE_NAME} alone. The crates notice below names the licenses those crates carry; it does not`,
|
|
48
48
|
`reproduce their texts, and ${CRATES_MANIFEST} in the source pointed at records which crates went in`,
|
|
49
49
|
"and at which versions.",
|
|
50
50
|
...modulesLine(packages),
|