@@ -8,21 +8,9 @@ import { loadWorkspaceHookEntries } from "./workspace.js";
88
99const { warnMock } = vi . hoisted ( ( ) => ( { warnMock : vi . fn ( ) } ) ) ;
1010
11- vi . mock ( "../logging/subsystem.js" , ( ) => {
12- const makeLogger = ( ) => ( {
13- subsystem : "hooks/workspace" ,
14- isEnabled : ( ) => true ,
15- trace : vi . fn ( ) ,
16- debug : vi . fn ( ) ,
17- info : vi . fn ( ) ,
18- warn : warnMock ,
19- error : vi . fn ( ) ,
20- fatal : vi . fn ( ) ,
21- raw : vi . fn ( ) ,
22- child : ( ) => makeLogger ( ) ,
23- } ) ;
24- return { createSubsystemLogger : ( ) => makeLogger ( ) } ;
25- } ) ;
11+ vi . mock ( "../logging/subsystem.js" , ( ) => ( {
12+ createSubsystemLogger : ( ) => ( { warn : warnMock } ) ,
13+ } ) ) ;
2614
2715function writeHookPackageManifest ( pkgDir : string , hooks : string [ ] ) : void {
2816 fs . writeFileSync (
@@ -82,6 +70,14 @@ function loadWorkspaceEntriesFromHooksRoot(hooksRoot: string) {
8270
8371const METADATA_MAX_BYTES = 1024 * 1024 ;
8472
73+ function writePlainHook ( hooksRoot : string , name : string , content ?: string ) : string {
74+ const hookDir = path . join ( hooksRoot , name ) ;
75+ fs . mkdirSync ( hookDir , { recursive : true } ) ;
76+ fs . writeFileSync ( path . join ( hookDir , "HOOK.md" ) , content ?? `---\nname: ${ name } \n---\n` ) ;
77+ fs . writeFileSync ( path . join ( hookDir , "handler.js" ) , "export default async () => {};\n" ) ;
78+ return hookDir ;
79+ }
80+
8581function oversizedMetadataWarnings ( filePath : string ) : string [ ] {
8682 return warnMock . mock . calls
8783 . map ( ( [ message ] ) => String ( message ) )
@@ -141,55 +137,23 @@ describe("hooks workspace", () => {
141137 expect ( hookNames ( entries ) ) . toContain ( "nested" ) ;
142138 } ) ;
143139
144- it ( "warns and skips hook packages with an oversized package.json" , ( ) => {
145- const root = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "openclaw-hooks-oversized-manifest-" ) ) ;
146- const hooksRoot = path . join ( root , "hooks" ) ;
147- fs . mkdirSync ( hooksRoot , { recursive : true } ) ;
148-
149- const pkgDir = path . join ( hooksRoot , "pkg" ) ;
150- fs . mkdirSync ( pkgDir , { recursive : true } ) ;
151- const manifestPath = path . join ( pkgDir , "package.json" ) ;
152- fs . writeFileSync ( manifestPath , "x" . repeat ( METADATA_MAX_BYTES + 1 ) , "utf8" ) ;
153-
154- const entries = loadWorkspaceEntriesFromHooksRoot ( hooksRoot ) ;
155- expect ( hookNames ( entries ) ) . toHaveLength ( 0 ) ;
156- expect ( oversizedMetadataWarnings ( manifestPath ) ) . toHaveLength ( 1 ) ;
157- } ) ;
158-
159- it ( "warns and skips hooks with an oversized HOOK.md" , ( ) => {
160- const root = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "openclaw-hooks-oversized-md-" ) ) ;
161- const hooksRoot = path . join ( root , "hooks" ) ;
162- fs . mkdirSync ( hooksRoot , { recursive : true } ) ;
163-
164- const hookDir = path . join ( hooksRoot , "big-hook" ) ;
165- fs . mkdirSync ( hookDir , { recursive : true } ) ;
166- const hookMdPath = path . join ( hookDir , "HOOK.md" ) ;
167- fs . writeFileSync ( hookMdPath , "x" . repeat ( METADATA_MAX_BYTES + 1 ) , "utf8" ) ;
168- fs . writeFileSync ( path . join ( hookDir , "handler.js" ) , "export default async () => {};\n" ) ;
169-
170- const entries = loadWorkspaceEntriesFromHooksRoot ( hooksRoot ) ;
171- expect ( hookNames ( entries ) ) . toHaveLength ( 0 ) ;
172- expect ( oversizedMetadataWarnings ( hookMdPath ) ) . toHaveLength ( 1 ) ;
173- } ) ;
174-
175- it ( "continues discovering other hooks after skipping oversized metadata" , ( ) => {
140+ it ( "warns, skips oversized metadata, and continues discovering other hooks" , ( ) => {
176141 const root = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , "openclaw-hooks-oversized-mixed-" ) ) ;
177142 const hooksRoot = path . join ( root , "hooks" ) ;
178143 fs . mkdirSync ( hooksRoot , { recursive : true } ) ;
179144
180- const bigHookDir = path . join ( hooksRoot , "big-hook" ) ;
181- fs . mkdirSync ( bigHookDir , { recursive : true } ) ;
182- const bigHookMdPath = path . join ( bigHookDir , "HOOK.md" ) ;
183- fs . writeFileSync ( bigHookMdPath , "x" . repeat ( METADATA_MAX_BYTES + 1 ) , "utf8" ) ;
184- fs . writeFileSync ( path . join ( bigHookDir , "handler.js" ) , "export default async () => {};\n" ) ;
145+ const packageDir = path . join ( hooksRoot , "big-package" ) ;
146+ fs . mkdirSync ( packageDir ) ;
147+ const manifestPath = path . join ( packageDir , "package.json" ) ;
148+ fs . writeFileSync ( manifestPath , "x" . repeat ( METADATA_MAX_BYTES + 1 ) ) ;
185149
186- const smallHookDir = path . join ( hooksRoot , "small-hook" ) ;
187- fs . mkdirSync ( smallHookDir , { recursive : true } ) ;
188- fs . writeFileSync ( path . join ( smallHookDir , "HOOK.md" ) , "---\nname: small-hook\n---\n" ) ;
189- fs . writeFileSync ( path . join ( smallHookDir , "handler.js" ) , "export default async () => {};\n" ) ;
150+ const bigHookDir = writePlainHook ( hooksRoot , "big-hook" , "x" . repeat ( METADATA_MAX_BYTES + 1 ) ) ;
151+ const bigHookMdPath = path . join ( bigHookDir , "HOOK.md" ) ;
152+ writePlainHook ( hooksRoot , "small-hook" ) ;
190153
191154 const entries = loadWorkspaceEntriesFromHooksRoot ( hooksRoot ) ;
192155 expect ( hookNames ( entries ) ) . toEqual ( [ "small-hook" ] ) ;
156+ expect ( oversizedMetadataWarnings ( manifestPath ) ) . toHaveLength ( 1 ) ;
193157 expect ( oversizedMetadataWarnings ( bigHookMdPath ) ) . toHaveLength ( 1 ) ;
194158 } ) ;
195159
@@ -221,12 +185,9 @@ describe("hooks workspace", () => {
221185 const hooksRoot = path . join ( root , "hooks" ) ;
222186 fs . mkdirSync ( hooksRoot , { recursive : true } ) ;
223187
224- const hookDir = path . join ( hooksRoot , "compat-hook" ) ;
225- fs . mkdirSync ( hookDir , { recursive : true } ) ;
188+ const hookDir = writePlainHook ( hooksRoot , "compat-hook" ) ;
226189 const manifestPath = path . join ( hookDir , "package.json" ) ;
227190 fs . writeFileSync ( manifestPath , "x" . repeat ( METADATA_MAX_BYTES + 1 ) , "utf8" ) ;
228- fs . writeFileSync ( path . join ( hookDir , "HOOK.md" ) , "---\nname: compat-hook\n---\n" ) ;
229- fs . writeFileSync ( path . join ( hookDir , "handler.js" ) , "export default async () => {};\n" ) ;
230191
231192 const entries = loadWorkspaceEntriesFromHooksRoot ( hooksRoot ) ;
232193 expect ( hookNames ( entries ) ) . toContain ( "compat-hook" ) ;
0 commit comments