diff --git a/packages/theme/src/cli/services/package.test.ts b/packages/theme/src/cli/services/package.test.ts index 24300fbc4b6..edbf5bae0d3 100644 --- a/packages/theme/src/cli/services/package.test.ts +++ b/packages/theme/src/cli/services/package.test.ts @@ -16,6 +16,7 @@ describe('packageTheme', () => { await mkdir(inputDirectory) const themeRelativePaths = [ 'AGENTS.md', + 'DESIGN.md', 'assets/base.css', 'layout/theme.liquid', 'config/settings_schema.json', diff --git a/packages/theme/src/cli/services/package.ts b/packages/theme/src/cli/services/package.ts index 239865e718d..bfe10e0b60a 100644 --- a/packages/theme/src/cli/services/package.ts +++ b/packages/theme/src/cli/services/package.ts @@ -7,6 +7,7 @@ import {parseJSON} from '@shopify/theme-check-node' const themeFilesPattern = [ 'AGENTS.md', + 'DESIGN.md', 'assets/**', 'blocks/**', 'config/**', diff --git a/packages/theme/src/cli/utilities/fixtures/theme/DESIGN.md b/packages/theme/src/cli/utilities/fixtures/theme/DESIGN.md new file mode 100644 index 00000000000..be9d93f24b2 --- /dev/null +++ b/packages/theme/src/cli/utilities/fixtures/theme/DESIGN.md @@ -0,0 +1,3 @@ +# Theme design + +Use the existing visual language. diff --git a/packages/theme/src/cli/utilities/theme-fs.test.ts b/packages/theme/src/cli/utilities/theme-fs.test.ts index f2ded99a372..d9b4a07b87a 100644 --- a/packages/theme/src/cli/utilities/theme-fs.test.ts +++ b/packages/theme/src/cli/utilities/theme-fs.test.ts @@ -66,13 +66,14 @@ describe('theme-fs', () => { // Then expect(themeFileSystem.root).toBe(root) - expect(themeFileSystem.files.size).toBe(12) + expect(themeFileSystem.files.size).toBe(13) expect(themeFileSystem.unsyncedFileKeys).toEqual(new Set()) expect(themeFileSystem.uploadErrors).toEqual(new Map()) // Check that all expected files are present with correct checksums const expectedFiles = [ {checksum: '6e3520cc5a5c4cdb1267f36406c732a1', key: 'AGENTS.md'}, + {checksum: 'f5e9ce97aef578fc4e2e369a3c271234', key: 'DESIGN.md'}, {checksum: 'b7fbe0ecff2a6c1d6e697a13096e2b17', key: 'assets/base.css'}, {checksum: '7adcd48a3cc215a81fabd9dafb919507', key: 'assets/sparkle.gif'}, {checksum: '22e69af13b7953914563c60035a831bc', key: 'config/settings_data.json'}, @@ -520,6 +521,7 @@ describe('theme-fs', () => { {key: 'templates/404.liquid', checksum: '13'}, {key: 'blocks/block.liquid', checksum: '14'}, {key: 'AGENTS.md', checksum: '17'}, + {key: 'DESIGN.md', checksum: '18'}, ] // When const { @@ -534,7 +536,7 @@ describe('theme-fs', () => { contextualizedJsonFiles, blockLiquidFiles, layoutFiles, - agentInstructionFiles, + documentationFiles, } = partitionThemeFiles(files) // Then @@ -560,7 +562,10 @@ describe('theme-fs', () => { {key: 'layout/theme.liquid', checksum: '5'}, {key: 'layout/custom.liquid', checksum: '15'}, ]) - expect(agentInstructionFiles).toEqual([{key: 'AGENTS.md', checksum: '17'}]) + expect(documentationFiles).toEqual([ + {key: 'AGENTS.md', checksum: '17'}, + {key: 'DESIGN.md', checksum: '18'}, + ]) }) test('should handle empty file array', () => { @@ -577,7 +582,7 @@ describe('theme-fs', () => { configDataFile, configStylesheetFiles, staticAssetFiles, - agentInstructionFiles, + documentationFiles, } = partitionThemeFiles(files) // Then @@ -589,7 +594,7 @@ describe('theme-fs', () => { expect(configDataFile).toEqual([]) expect(configStylesheetFiles).toEqual([]) expect(staticAssetFiles).toEqual([]) - expect(agentInstructionFiles).toEqual([]) + expect(documentationFiles).toEqual([]) }) }) @@ -603,6 +608,7 @@ describe('theme-fs', () => { expect(isTextFile('sections/template.liquid')).toBeTruthy() expect(isTextFile('templates/cart.json')).toBeTruthy() expect(isTextFile('AGENTS.md')).toBeTruthy() + expect(isTextFile('DESIGN.md')).toBeTruthy() }) test(`returns false when it's not a text file`, async () => { diff --git a/packages/theme/src/cli/utilities/theme-fs.ts b/packages/theme/src/cli/utilities/theme-fs.ts index 4cc4e3c3f7e..436d2878903 100644 --- a/packages/theme/src/cli/utilities/theme-fs.ts +++ b/packages/theme/src/cli/utilities/theme-fs.ts @@ -30,6 +30,7 @@ const FILE_EVENT_DEBOUNCE_TIME_IN_MS = 250 const THEME_DIRECTORY_PATTERNS = [ 'AGENTS.md', + 'DESIGN.md', 'assets/**/*.*', 'config/**/*.json', 'config/styles.css', @@ -43,7 +44,7 @@ const THEME_DIRECTORY_PATTERNS = [ ] const THEME_PARTITION_REGEX = { - agentInstructionsRegex: /^AGENTS\.md$/, + documentationFilesRegex: /^(AGENTS|DESIGN)\.md$/, layoutLiquidRegex: /^layout\/.+\.liquid$/, sectionLiquidRegex: /^sections\/.+\.liquid$/, blockLiquidRegex: /^blocks\/.+\.liquid$/, @@ -476,12 +477,12 @@ export function partitionThemeFiles(files: T[]) { const staticAssetFiles: T[] = [] const blockLiquidFiles: T[] = [] const layoutFiles: T[] = [] - const agentInstructionFiles: T[] = [] + const documentationFiles: T[] = [] files.forEach((file) => { const fileKey = file.key - if (THEME_PARTITION_REGEX.agentInstructionsRegex.test(fileKey)) { - agentInstructionFiles.push(file) + if (THEME_PARTITION_REGEX.documentationFilesRegex.test(fileKey)) { + documentationFiles.push(file) } else if (fileKey.endsWith('.liquid')) { if (THEME_PARTITION_REGEX.sectionLiquidRegex.test(fileKey)) { sectionLiquidFiles.push(file) @@ -526,7 +527,7 @@ export function partitionThemeFiles(files: T[]) { staticAssetFiles, blockLiquidFiles, layoutFiles, - agentInstructionFiles, + documentationFiles, } } diff --git a/packages/theme/src/cli/utilities/theme-uploader.test.ts b/packages/theme/src/cli/utilities/theme-uploader.test.ts index 396c6b8b8f3..a70dcbe961f 100644 --- a/packages/theme/src/cli/utilities/theme-uploader.test.ts +++ b/packages/theme/src/cli/utilities/theme-uploader.test.ts @@ -257,6 +257,7 @@ describe('theme-uploader', () => { {key: 'config/settings_data.json', checksum: '6'}, {key: 'config/styles.css', checksum: '9'}, {key: 'AGENTS.md', checksum: '10'}, + {key: 'DESIGN.md', checksum: '11'}, {key: 'assets/image.png', checksum: '7'}, {key: 'layout/custom.liquid', checksum: '8'}, ] @@ -286,6 +287,7 @@ describe('theme-uploader', () => { 'config/settings_data.json', 'config/styles.css', 'AGENTS.md', + 'DESIGN.md', 'assets/image.png', ], adminSession, @@ -311,6 +313,7 @@ describe('theme-uploader', () => { ['layout/theme.liquid', {key: 'layout/theme.liquid', checksum: '10'}], ['config/styles.css', {key: 'config/styles.css', checksum: '11', value: ':root { --color-primary: #000; }'}], ['AGENTS.md', {key: 'AGENTS.md', checksum: '12', value: '# Theme instructions'}], + ['DESIGN.md', {key: 'DESIGN.md', checksum: '13', value: '# Theme design'}], ]), ) @@ -359,6 +362,10 @@ describe('theme-uploader', () => { key: 'AGENTS.md', value: '# Theme instructions', }, + { + key: 'DESIGN.md', + value: '# Theme design', + }, ], adminSession, ) diff --git a/packages/theme/src/cli/utilities/theme-uploader.ts b/packages/theme/src/cli/utilities/theme-uploader.ts index 6a4254cf248..49522d71faf 100644 --- a/packages/theme/src/cli/utilities/theme-uploader.ts +++ b/packages/theme/src/cli/utilities/theme-uploader.ts @@ -215,7 +215,7 @@ function orderFilesToBeDeleted(files: Checksum[]): Checksum[] { ...fileSets.otherLiquidFiles, ...fileSets.configDataFile, ...fileSets.configStylesheetFiles, - ...fileSets.agentInstructionFiles, + ...fileSets.documentationFiles, ...fileSets.configSchemaFile, ...fileSets.staticAssetFiles, ] @@ -337,7 +337,7 @@ function selectUploadableFiles(themeFileSystem: ThemeFileSystem, remoteChecksums * - The other JSON files (for example, locales) * - The static assets * - Config stylesheets - * - Agent instructions + * - Root documentation files * */ function orderFilesToBeUploaded(files: ChecksumWithSize[]): { @@ -353,7 +353,7 @@ function orderFilesToBeUploaded(files: ChecksumWithSize[]): { fileSets.otherJsonFiles, fileSets.staticAssetFiles, fileSets.configStylesheetFiles, - fileSets.agentInstructionFiles, + fileSets.documentationFiles, ], // Follow order of dependencies: dependentFiles: [