@@ -10,12 +10,19 @@ type RunResult = {
1010 stderr : string ;
1111} ;
1212
13- async function runCli ( args : string [ ] , cwd ?: string ) : Promise < RunResult > {
13+ async function runCli ( args : string [ ] , cwd ?: string , homeDir ?: string ) : Promise < RunResult > {
1414 let stdout = '' ;
1515 let stderr = '' ;
1616 const originalCwd = process . cwd ( ) ;
17+ const originalHome = process . env . HOME ;
18+ const originalUserProfile = process . env . USERPROFILE ;
1719
1820 if ( cwd ) process . chdir ( cwd ) ;
21+ if ( homeDir ) {
22+ process . env . HOME = homeDir ;
23+ process . env . USERPROFILE = homeDir ;
24+ }
25+
1926 try {
2027 const code = await run ( args , {
2128 stdout ( message : string ) {
@@ -31,6 +38,8 @@ async function runCli(args: string[], cwd?: string): Promise<RunResult> {
3138
3239 return { code, stdout, stderr } ;
3340 } finally {
41+ process . env . HOME = originalHome ;
42+ process . env . USERPROFILE = originalUserProfile ;
3443 process . chdir ( originalCwd ) ;
3544 }
3645}
@@ -49,89 +58,126 @@ describe('install and uninstall commands', () => {
4958 return testDir ;
5059 }
5160
61+ function createTestHome ( dir : string ) : string {
62+ const home = join ( dir , 'home' ) ;
63+ mkdirSync ( home , { recursive : true } ) ;
64+ return home ;
65+ }
66+
5267 test ( 'install --skills copies skill into .claude/' , async ( ) => {
5368 const dir = createTestDir ( ) ;
69+ const home = createTestHome ( dir ) ;
5470 mkdirSync ( join ( dir , '.claude' ) ) ;
5571
56- const result = await runCli ( [ 'install' , '--skills' ] , dir ) ;
72+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
5773 expect ( result . code ) . toBe ( 0 ) ;
5874 expect ( result . stdout ) . toContain ( '.claude/skills/superdoc/' ) ;
5975 expect ( existsSync ( join ( dir , '.claude' , 'skills' , 'superdoc' , 'SKILL.md' ) ) ) . toBe ( true ) ;
6076 } ) ;
6177
6278 test ( 'install --skills copies skill into .agents/' , async ( ) => {
6379 const dir = createTestDir ( ) ;
80+ const home = createTestHome ( dir ) ;
6481 mkdirSync ( join ( dir , '.agents' ) ) ;
6582
66- const result = await runCli ( [ 'install' , '--skills' ] , dir ) ;
83+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
6784 expect ( result . code ) . toBe ( 0 ) ;
6885 expect ( result . stdout ) . toContain ( '.agents/skills/superdoc/' ) ;
6986 expect ( existsSync ( join ( dir , '.agents' , 'skills' , 'superdoc' , 'SKILL.md' ) ) ) . toBe ( true ) ;
7087 } ) ;
7188
7289 test ( 'install --skills copies into both when both exist' , async ( ) => {
7390 const dir = createTestDir ( ) ;
91+ const home = createTestHome ( dir ) ;
7492 mkdirSync ( join ( dir , '.claude' ) ) ;
7593 mkdirSync ( join ( dir , '.agents' ) ) ;
7694
77- const result = await runCli ( [ 'install' , '--skills' ] , dir ) ;
95+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
7896 expect ( result . code ) . toBe ( 0 ) ;
7997 expect ( result . stdout ) . toContain ( '.claude/skills/superdoc/' ) ;
8098 expect ( result . stdout ) . toContain ( '.agents/skills/superdoc/' ) ;
8199 } ) ;
82100
101+ test ( 'install --skills falls back to home agent directories' , async ( ) => {
102+ const dir = createTestDir ( ) ;
103+ const home = createTestHome ( dir ) ;
104+ mkdirSync ( join ( home , '.claude' ) ) ;
105+
106+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
107+ expect ( result . code ) . toBe ( 0 ) ;
108+ expect ( result . stdout ) . toContain ( '~/.claude/skills/superdoc/' ) ;
109+ expect ( existsSync ( join ( home , '.claude' , 'skills' , 'superdoc' , 'SKILL.md' ) ) ) . toBe ( true ) ;
110+ } ) ;
111+
83112 test ( 'install --skills warns when no agent directories exist' , async ( ) => {
84113 const dir = createTestDir ( ) ;
114+ const home = createTestHome ( dir ) ;
85115
86- const result = await runCli ( [ 'install' , '--skills' ] , dir ) ;
116+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
87117 expect ( result . code ) . toBe ( 1 ) ;
88118 expect ( result . stderr ) . toContain ( 'No agent directories found' ) ;
89119 } ) ;
90120
91121 test ( 'install without --skills prints usage' , async ( ) => {
92122 const dir = createTestDir ( ) ;
123+ const home = createTestHome ( dir ) ;
93124
94- const result = await runCli ( [ 'install' ] , dir ) ;
125+ const result = await runCli ( [ 'install' ] , dir , home ) ;
95126 expect ( result . code ) . toBe ( 1 ) ;
96127 expect ( result . stderr ) . toContain ( 'Usage: superdoc install --skills' ) ;
97128 } ) ;
98129
99130 test ( 'install runtime failures return structured CLI errors' , async ( ) => {
100131 const dir = createTestDir ( ) ;
132+ const home = createTestHome ( dir ) ;
101133 mkdirSync ( join ( dir , '.claude' ) ) ;
102134 writeFileSync ( join ( dir , '.claude' , 'skills' ) , 'blocked' ) ;
103135
104- const result = await runCli ( [ 'install' , '--skills' ] , dir ) ;
136+ const result = await runCli ( [ 'install' , '--skills' ] , dir , home ) ;
105137 expect ( result . code ) . toBe ( 1 ) ;
106138 expect ( result . stderr ) . toContain ( '"ok":false' ) ;
107139 expect ( result . stderr ) . toContain ( '"code":"COMMAND_FAILED"' ) ;
108140 } ) ;
109141
110142 test ( 'uninstall --skills removes installed skill directories' , async ( ) => {
111143 const dir = createTestDir ( ) ;
144+ const home = createTestHome ( dir ) ;
112145 mkdirSync ( join ( dir , '.claude' , 'skills' , 'superdoc' ) , { recursive : true } ) ;
113146 mkdirSync ( join ( dir , '.agents' , 'skills' , 'superdoc' ) , { recursive : true } ) ;
114147
115- const result = await runCli ( [ 'uninstall' , '--skills' ] , dir ) ;
148+ const result = await runCli ( [ 'uninstall' , '--skills' ] , dir , home ) ;
116149 expect ( result . code ) . toBe ( 0 ) ;
117150 expect ( result . stdout ) . toContain ( '.claude/skills/superdoc/' ) ;
118151 expect ( result . stdout ) . toContain ( '.agents/skills/superdoc/' ) ;
119152 expect ( existsSync ( join ( dir , '.claude' , 'skills' , 'superdoc' ) ) ) . toBe ( false ) ;
120153 expect ( existsSync ( join ( dir , '.agents' , 'skills' , 'superdoc' ) ) ) . toBe ( false ) ;
121154 } ) ;
122155
156+ test ( 'uninstall --skills removes skills from home agent directories' , async ( ) => {
157+ const dir = createTestDir ( ) ;
158+ const home = createTestHome ( dir ) ;
159+ mkdirSync ( join ( home , '.agents' , 'skills' , 'superdoc' ) , { recursive : true } ) ;
160+
161+ const result = await runCli ( [ 'uninstall' , '--skills' ] , dir , home ) ;
162+ expect ( result . code ) . toBe ( 0 ) ;
163+ expect ( result . stdout ) . toContain ( '~/.agents/skills/superdoc/' ) ;
164+ expect ( existsSync ( join ( home , '.agents' , 'skills' , 'superdoc' ) ) ) . toBe ( false ) ;
165+ } ) ;
166+
123167 test ( 'uninstall --skills is no-op when nothing is installed' , async ( ) => {
124168 const dir = createTestDir ( ) ;
169+ const home = createTestHome ( dir ) ;
125170
126- const result = await runCli ( [ 'uninstall' , '--skills' ] , dir ) ;
171+ const result = await runCli ( [ 'uninstall' , '--skills' ] , dir , home ) ;
127172 expect ( result . code ) . toBe ( 0 ) ;
128173 expect ( result . stdout ) . toContain ( 'No installed skills found' ) ;
129174 } ) ;
130175
131176 test ( 'uninstall without --skills prints usage' , async ( ) => {
132177 const dir = createTestDir ( ) ;
178+ const home = createTestHome ( dir ) ;
133179
134- const result = await runCli ( [ 'uninstall' ] , dir ) ;
180+ const result = await runCli ( [ 'uninstall' ] , dir , home ) ;
135181 expect ( result . code ) . toBe ( 1 ) ;
136182 expect ( result . stderr ) . toContain ( 'Usage: superdoc uninstall --skills' ) ;
137183 } ) ;
0 commit comments