@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
22import os from "node:os" ;
33import path from "node:path" ;
44import { afterAll , beforeAll , describe , expect , it } from "vitest" ;
5- import { loadExtraBootstrapFiles } from "./workspace.js" ;
5+ import { loadExtraBootstrapFiles , loadExtraBootstrapFilesWithDiagnostics } from "./workspace.js" ;
66
77describe ( "loadExtraBootstrapFiles" , ( ) => {
88 let fixtureRoot = "" ;
@@ -69,4 +69,43 @@ describe("loadExtraBootstrapFiles", () => {
6969 expect ( files [ 0 ] ?. name ) . toBe ( "AGENTS.md" ) ;
7070 expect ( files [ 0 ] ?. content ) . toBe ( "linked agents" ) ;
7171 } ) ;
72+
73+ it ( "rejects hardlinked aliases to files outside workspace" , async ( ) => {
74+ if ( process . platform === "win32" ) {
75+ return ;
76+ }
77+
78+ const rootDir = await createWorkspaceDir ( "hardlink" ) ;
79+ const workspaceDir = path . join ( rootDir , "workspace" ) ;
80+ const outsideDir = path . join ( rootDir , "outside" ) ;
81+ await fs . mkdir ( workspaceDir , { recursive : true } ) ;
82+ await fs . mkdir ( outsideDir , { recursive : true } ) ;
83+ const outsideFile = path . join ( outsideDir , "AGENTS.md" ) ;
84+ const linkedFile = path . join ( workspaceDir , "AGENTS.md" ) ;
85+ await fs . writeFile ( outsideFile , "outside" , "utf-8" ) ;
86+ try {
87+ await fs . link ( outsideFile , linkedFile ) ;
88+ } catch ( err ) {
89+ if ( ( err as NodeJS . ErrnoException ) . code === "EXDEV" ) {
90+ return ;
91+ }
92+ throw err ;
93+ }
94+
95+ const files = await loadExtraBootstrapFiles ( workspaceDir , [ "AGENTS.md" ] ) ;
96+ expect ( files ) . toHaveLength ( 0 ) ;
97+ } ) ;
98+
99+ it ( "skips oversized bootstrap files and reports diagnostics" , async ( ) => {
100+ const workspaceDir = await createWorkspaceDir ( "oversized" ) ;
101+ const payload = "x" . repeat ( 2 * 1024 * 1024 + 1 ) ;
102+ await fs . writeFile ( path . join ( workspaceDir , "AGENTS.md" ) , payload , "utf-8" ) ;
103+
104+ const { files, diagnostics } = await loadExtraBootstrapFilesWithDiagnostics ( workspaceDir , [
105+ "AGENTS.md" ,
106+ ] ) ;
107+
108+ expect ( files ) . toHaveLength ( 0 ) ;
109+ expect ( diagnostics . some ( ( d ) => d . reason === "security" ) ) . toBe ( true ) ;
110+ } ) ;
72111} ) ;
0 commit comments