feat(projects): add interactive AI app scaffold skill

This commit is contained in:
2026-09-04 20:36:28 +08:00
parent 336e0bb0ca
commit 959b6333b5
40 changed files with 2647 additions and 65 deletions

View File

@@ -469,7 +469,11 @@ describe('Pi worker process', () => {
it('inherits only the worker-safe environment allowlist', () => {
const env = buildPiWorkerEnvironment(
'D:\\managed-pi',
{ MAKELore_PI_SELECTED_API_KEY: 'selected-secret' },
'D:\\Makelore App\\Makelore.exe',
{
MAKELore_PI_SELECTED_API_KEY: 'selected-secret',
MAKELORE_NODE_EXECUTABLE: 'D:\\spoofed-node.exe',
},
{
PATH: 'D:\\tools',
OPENAI_API_KEY: 'unrelated-openai-secret',
@@ -484,12 +488,24 @@ describe('Pi worker process', () => {
PI_OFFLINE: '1',
PI_TELEMETRY: '0',
ELECTRON_RUN_AS_NODE: '1',
MAKELORE_NODE_EXECUTABLE: 'D:\\Makelore App\\Makelore.exe',
});
expect(env).not.toHaveProperty('OPENAI_API_KEY');
expect(env).not.toHaveProperty('ANTHROPIC_API_KEY');
expect(env).not.toHaveProperty('CUSTOM_APPLICATION_SECRET');
});
it('exposes the direct worker executable to Skill scripts', async () => {
const worker = await makeWorker({
env: { MAKELORE_NODE_EXECUTABLE: 'spoofed-node' },
});
await expect(worker.request<{ makeloreNodeExecutable: string }>({ type: 'environment' }))
.resolves.toMatchObject({
data: { makeloreNodeExecutable: process.execPath },
});
});
it('refuses to put a selected worker credential in argv', async () => {
const secret = 'argv-secret-value';
await expect(makeWorker({