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.
@@ -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('Usage: skimpyclaw sandbox <status|prune|init|doctor>');
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')) {