skimpyclaw 0.3.5 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/api.test.js +0 -19
- package/dist/__tests__/setup.test.js +3 -2
- package/dist/api.js +0 -27
- package/dist/cli.js +35 -1
- package/dist/dashboard/assets/index-CkonC7Cd.js +65 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/setup.d.ts +2 -1
- package/dist/setup.js +44 -20
- package/dist/tools/browser-tool.js +1 -1
- package/package.json +1 -1
- package/dist/dashboard/assets/index-UVAjSXCG.js +0 -107
|
@@ -1225,22 +1225,3 @@ describe('Skills endpoints', () => {
|
|
|
1225
1225
|
expect(res.json()).toHaveProperty('deleted', true);
|
|
1226
1226
|
});
|
|
1227
1227
|
});
|
|
1228
|
-
describe('Office endpoints', () => {
|
|
1229
|
-
it('GET /api/dashboard/office-status returns office status', async () => {
|
|
1230
|
-
const res = await inject({ method: 'GET', url: '/api/dashboard/office-status' });
|
|
1231
|
-
expect(res.statusCode).toBe(200);
|
|
1232
|
-
const json = res.json();
|
|
1233
|
-
expect(json).toHaveProperty('state');
|
|
1234
|
-
expect(json).toHaveProperty('currentTask');
|
|
1235
|
-
expect(json).toHaveProperty('updatedAt');
|
|
1236
|
-
expect(['working', 'thinking', 'waiting', 'offline']).toContain(json.state);
|
|
1237
|
-
});
|
|
1238
|
-
it('GET /api/dashboard/office-scene.png returns image or 404', async () => {
|
|
1239
|
-
const res = await inject({ method: 'GET', url: '/api/dashboard/office-scene.png' });
|
|
1240
|
-
// In test env the image file may not exist, so accept 200 or 404
|
|
1241
|
-
expect([200, 404]).toContain(res.statusCode);
|
|
1242
|
-
if (res.statusCode === 200) {
|
|
1243
|
-
expect(res.headers['content-type']).toBe('image/png');
|
|
1244
|
-
}
|
|
1245
|
-
});
|
|
1246
|
-
});
|
|
@@ -128,8 +128,9 @@ describe('setup config generation', () => {
|
|
|
128
128
|
cronWeather: true,
|
|
129
129
|
timezone: 'America/New_York',
|
|
130
130
|
weatherLocation: 'Austin, TX',
|
|
131
|
-
skillCodeReview: true,
|
|
132
131
|
skillDailyNotes: true,
|
|
132
|
+
skillWeather: true,
|
|
133
|
+
skillWebSearch: false,
|
|
133
134
|
},
|
|
134
135
|
});
|
|
135
136
|
expect(config.cron.jobs).toHaveLength(2);
|
|
@@ -138,7 +139,7 @@ describe('setup config generation', () => {
|
|
|
138
139
|
expect(config.cron.jobs[1].schedule.tz).toBe('America/New_York');
|
|
139
140
|
expect(config.cron.jobs[1].payload.message).toContain('Austin, TX');
|
|
140
141
|
expect(config.skills.enabled).toBe(true);
|
|
141
|
-
expect(config.skills.entries['code-review']).toBe(true);
|
|
142
142
|
expect(config.skills.entries['daily-notes']).toBe(true);
|
|
143
|
+
expect(config.skills.entries['weather']).toBe(true);
|
|
143
144
|
});
|
|
144
145
|
});
|
package/dist/api.js
CHANGED
|
@@ -785,33 +785,6 @@ export function registerDashboardAPI(fastify, config) {
|
|
|
785
785
|
}
|
|
786
786
|
return { denied: true, id, command: approval.command };
|
|
787
787
|
});
|
|
788
|
-
// --- Office Status ---
|
|
789
|
-
fastify.get('/api/dashboard/office-status', async (request) => {
|
|
790
|
-
// Phase 1: return mock data
|
|
791
|
-
return {
|
|
792
|
-
state: 'working',
|
|
793
|
-
currentTask: 'Processing dashboard updates',
|
|
794
|
-
updatedAt: new Date().toISOString(),
|
|
795
|
-
};
|
|
796
|
-
});
|
|
797
|
-
// --- Office Scene Image ---
|
|
798
|
-
fastify.get('/api/dashboard/office-scene.png', async (_request, reply) => {
|
|
799
|
-
const home = homedir();
|
|
800
|
-
const candidates = [
|
|
801
|
-
join(home, '.skimpyclaw', 'office-preview-check.png'),
|
|
802
|
-
join(home, '.skimpyclaw', 'office-offline.png'),
|
|
803
|
-
// Container/workspace fallbacks (e.g. Codespaces, Docker where HOME=/workspace)
|
|
804
|
-
'/workspace/.skimpyclaw/office-preview-check.png',
|
|
805
|
-
'/workspace/.skimpyclaw/office-offline.png',
|
|
806
|
-
].filter((p, i, arr) => arr.indexOf(p) === i); // dedupe if home IS /workspace
|
|
807
|
-
for (const candidate of candidates) {
|
|
808
|
-
if (existsSync(candidate)) {
|
|
809
|
-
const buffer = readFileSync(candidate);
|
|
810
|
-
return reply.type('image/png').send(buffer);
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
return reply.code(404).send({ error: 'Office scene image not found' });
|
|
814
|
-
});
|
|
815
788
|
// --- Digests ---
|
|
816
789
|
fastify.get('/api/dashboard/digests', async () => {
|
|
817
790
|
const digests = getDigests();
|
package/dist/cli.js
CHANGED
|
@@ -950,7 +950,30 @@ async function commandSandbox(args) {
|
|
|
950
950
|
}
|
|
951
951
|
return failed ? 1 : 0;
|
|
952
952
|
}
|
|
953
|
-
console.log(
|
|
953
|
+
console.log(`Usage: skimpyclaw sandbox <command>
|
|
954
|
+
|
|
955
|
+
Commands:
|
|
956
|
+
init Build sandbox image and enable in config
|
|
957
|
+
status List active sandbox containers
|
|
958
|
+
prune Remove orphaned sandbox containers
|
|
959
|
+
doctor Run targeted sandbox diagnostics
|
|
960
|
+
|
|
961
|
+
Init options:
|
|
962
|
+
--runtime <container|docker> Container runtime (default: auto-detect)
|
|
963
|
+
--profile <minimal|dev|full> Package set (default: minimal)
|
|
964
|
+
--image <name> Image name (default: skimpyclaw-sandbox:latest)
|
|
965
|
+
--network <name> Network name (default: auto per runtime)
|
|
966
|
+
|
|
967
|
+
Profiles:
|
|
968
|
+
minimal bash, curl, git, gh, jq, python3, ripgrep, pnpm
|
|
969
|
+
dev minimal + gcc, g++, make
|
|
970
|
+
full dev + pip3, sqlite3, unzip, less
|
|
971
|
+
|
|
972
|
+
Which runtime?
|
|
973
|
+
Apple Containers (macOS 26+) — lighter, faster startup, no daemon.
|
|
974
|
+
Docker — cross-platform, use if you already run Docker.
|
|
975
|
+
Auto-detect prefers Apple Containers, falls back to Docker.
|
|
976
|
+
`);
|
|
954
977
|
return 1;
|
|
955
978
|
}
|
|
956
979
|
export async function runCli(argv = process.argv.slice(2)) {
|
|
@@ -959,6 +982,17 @@ export async function runCli(argv = process.argv.slice(2)) {
|
|
|
959
982
|
printHelp();
|
|
960
983
|
return 0;
|
|
961
984
|
}
|
|
985
|
+
if (command === '--version' || command === '-v' || command === 'version') {
|
|
986
|
+
const pkgPath = join(fileURLToPath(import.meta.url), '..', '..', 'package.json');
|
|
987
|
+
try {
|
|
988
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
989
|
+
console.log(`skimpyclaw v${pkg.version}`);
|
|
990
|
+
}
|
|
991
|
+
catch {
|
|
992
|
+
console.log('skimpyclaw (version unknown)');
|
|
993
|
+
}
|
|
994
|
+
return 0;
|
|
995
|
+
}
|
|
962
996
|
try {
|
|
963
997
|
if (command === 'start') {
|
|
964
998
|
if (args.includes('--daemon')) {
|