{"_id":"@alashi/apps-sdk","_rev":"12-eb52f2689425e79c343bf5f800d6dc7c","name":"@alashi/apps-sdk","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"@alashi/apps-sdk","version":"0.1.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.1.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"db513e87aa36fa9487a55c54941e2452dc63ff99","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.1.0.tgz","fileCount":3,"integrity":"sha512-h/8unRgyw5RDTy7sgOYOHe8iSV29RMUFtlv0XUct8zU8TiW2/CyGFNsdaWcEiiS3o6E4RukIYFVxux9CsTrJXA==","signatures":[{"sig":"MEQCIEFqEpnJb84dNtxJ09QKaPxuHhbPWIhk/n8ECABtFPekAiARq+9KsCW6QUk4A9iFXOjI6KILJoXsYlsAkGH0HGcGZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16879},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.1.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/0439f91d46d5a1f6eae1e2bdfe635ca7/alashi-apps-sdk-0.1.0.tgz","_integrity":"sha512-h/8unRgyw5RDTy7sgOYOHe8iSV29RMUFtlv0XUct8zU8TiW2/CyGFNsdaWcEiiS3o6E4RukIYFVxux9CsTrJXA==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.1.0_1786744305847_0.12888093285014146","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alashi/apps-sdk","version":"0.1.1","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.1.1","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"44a351848faf481e810fd8fa7840ee91b6daf4f9","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.1.1.tgz","fileCount":3,"integrity":"sha512-CrZpmR6CCjP4j0prSUdyZ3G8LerjMr287YK3koDkjGuyNWb4lcGDiV2mwU8SeH067cSmLLh6Sqw9JHW7tfKWrg==","signatures":[{"sig":"MEQCIAp6+dy2z7LGTQ46jY38t1Y7hrAKHMR5YYT49ngmeX1cAiBvb2hAT0iSgSJ4J6e10RguPC6orLBXLjLWPAsCd+8jOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17431},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.1.1.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/28b323b3deedb8a21f0ff70b5e69c691/alashi-apps-sdk-0.1.1.tgz","_integrity":"sha512-CrZpmR6CCjP4j0prSUdyZ3G8LerjMr287YK3koDkjGuyNWb4lcGDiV2mwU8SeH067cSmLLh6Sqw9JHW7tfKWrg==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.1.1_1786802086688_0.06877813804382593","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alashi/apps-sdk","version":"0.1.2","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.1.2","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"9d63e965a3ae526612b66180db03155c934fc4a8","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.1.2.tgz","fileCount":3,"integrity":"sha512-YNKfmTVBJ875N4KynfExJPY6DOB4gkO6yEU2WAEgCtEohVQuKrq9BxZluX3xKDR54hKGyjUn6zxGxfGJDeTBZQ==","signatures":[{"sig":"MEUCIE+GnkmsuObn7Fm57gAAV5Plgn6tiTk0cnTQdYKNr5MFAiEAwGkXTAQHyRJY5UUeAySauki/CKZML2u0dY7CyRH8ngA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23912},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.1.2.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/dd749abeab35a5aa46b8099181a71d5f/alashi-apps-sdk-0.1.2.tgz","_integrity":"sha512-YNKfmTVBJ875N4KynfExJPY6DOB4gkO6yEU2WAEgCtEohVQuKrq9BxZluX3xKDR54hKGyjUn6zxGxfGJDeTBZQ==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.1.2_1787079837964_0.4553041472108139","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alashi/apps-sdk","version":"0.1.3","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.1.3","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"b92b5a2ede8903d0ec8570d78f349d73fa81c1e4","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.1.3.tgz","fileCount":3,"integrity":"sha512-0MzVpJLCGk933Mj/1uzPBEYrac95ruHc0fRlPB5Z6SEGYxUnklH2HfEcQHKg36Kcm9DQF0v5aTavucw4rcZ9Gw==","signatures":[{"sig":"MEUCIQCjaZjdeaMf4YkzGm8U7nR/NvYxZMSXLErKYOozL/kqOwIgBVtqmQy5nfm6hri/yZ3Ll9jM92XAEf/TyHRF5jod66c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24042},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.1.3.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/7bdc1b97233a6c2f9709e6b19390d504/alashi-apps-sdk-0.1.3.tgz","_integrity":"sha512-0MzVpJLCGk933Mj/1uzPBEYrac95ruHc0fRlPB5Z6SEGYxUnklH2HfEcQHKg36Kcm9DQF0v5aTavucw4rcZ9Gw==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.1.3_1787242885564_0.5356363145753722","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alashi/apps-sdk","version":"0.2.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.2.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"3897a55207748fe2956222a240d66e4b89a927c2","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.2.0.tgz","fileCount":4,"integrity":"sha512-V80Ib1STXo1Cnaa8MswtOppzzN0Y7hcc7+r8OhchUwH2qYgYezxI9OV5FNx3tWzrI1fUe0OBubgY5G+BntN0/g==","signatures":[{"sig":"MEUCIGhPkhbLndW4INHutqC+GvFh8vM3bDQdse3TIu6j8lZQAiEAscGK37jQDw2ZkWMvk2FE3/feVFcOkYH6QBE1ltdNWKc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31736},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.2.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/c17ab629461b934f6f3601976a95fd2f/alashi-apps-sdk-0.2.0.tgz","_integrity":"sha512-V80Ib1STXo1Cnaa8MswtOppzzN0Y7hcc7+r8OhchUwH2qYgYezxI9OV5FNx3tWzrI1fUe0OBubgY5G+BntN0/g==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.2.0_1787280630490_0.34222464333744984","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alashi/apps-sdk","version":"0.3.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.3.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"4ac84071356d8ec3b6e4ec12a710080e27e4ccbe","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.3.0.tgz","fileCount":4,"integrity":"sha512-cdoQ+W4IQb6WYkPVWqXibz/CrJFIyov8daISmFQNgNqiDBjYp29T97cO7ek1C4KrhiAW6kAbFE2PioOQn+B4zA==","signatures":[{"sig":"MEQCIAHbckQ+sHrOFPW4xvkPBx6y8PCusp82rRtpwjqBba7YAiBOvb/ssjUrfE9ccNU+An8eJuhLV9p5LAanBjNzgabJ/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32457},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.3.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/ae22bbaf884f66825d1653d0cd367093/alashi-apps-sdk-0.3.0.tgz","_integrity":"sha512-cdoQ+W4IQb6WYkPVWqXibz/CrJFIyov8daISmFQNgNqiDBjYp29T97cO7ek1C4KrhiAW6kAbFE2PioOQn+B4zA==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.3.0_1787311617960_0.543793792865154","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alashi/apps-sdk","version":"0.4.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.4.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"106ae4805017b584b526f16dc1f4a63b2c611b05","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.4.0.tgz","fileCount":4,"integrity":"sha512-VoTYC+8OBeeaZmdwyH0+s27XZcznA3sHvYmvCX2GsjySInco/8yO+g8H1ff5D1A4mxmPndh9T4bT7z6YucE0ag==","signatures":[{"sig":"MEQCIG1Sig7n+HeSGQBKK2a7nQ/LQyAA2AmgdgfJSw9b8V/TAiBy6kFj81pZwD/SRXXvd5bf24KBRztDMYum0AuAw85ORA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34959},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.4.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/772ea1b9480ef87e4ee446882089457e/alashi-apps-sdk-0.4.0.tgz","_integrity":"sha512-VoTYC+8OBeeaZmdwyH0+s27XZcznA3sHvYmvCX2GsjySInco/8yO+g8H1ff5D1A4mxmPndh9T4bT7z6YucE0ag==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.4.0_1787367502285_0.6671407279068171","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alashi/apps-sdk","version":"0.5.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.5.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"5a1be8057960aaa6603abe2c65bdf7582417f2fc","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.5.0.tgz","fileCount":4,"integrity":"sha512-jpYPUK2vPOSeJ9gHE70ocrRxOlSK8Mcto5DQ28ZPOlPywOihcz+Ed1FnvMt3Bcrq6Gj5fceFQVQRd63QiOjKWQ==","signatures":[{"sig":"MEUCIQDKG93WYKqSLgApnU+YUr3nsxJSqG557R0uscdvyO5riQIgds4SF7TlzdfE9v5BVfpXyjweoJbauLrIwsZtZcGP/e4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34959},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.5.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/3cb6b2495136cf7302b0418c964e4bc0/alashi-apps-sdk-0.5.0.tgz","_integrity":"sha512-jpYPUK2vPOSeJ9gHE70ocrRxOlSK8Mcto5DQ28ZPOlPywOihcz+Ed1FnvMt3Bcrq6Gj5fceFQVQRd63QiOjKWQ==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.5.0_1787572377211_0.8158677131935737","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alashi/apps-sdk","version":"0.6.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.6.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"a7aeb8c190ec39f6cab67860f8adf8c03101b98c","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.6.0.tgz","fileCount":4,"integrity":"sha512-6XnR/jnZD0Yrnr7PVpoEP8BFNuIDPvLFzTQfDsyuQtmGLpG1CNrYSI4h1OOkQWSTbI1/yewf6nDpKPlIKaFtDA==","signatures":[{"sig":"MEUCIQDOjDzGFyaUDDsOtu98UHhz4O8eVcYrCDVZWwotYREbWgIgSThoxLdd0B6m8UEan/JculBgvTtDePOG5PPyBNFY2ro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43810},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.6.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/4817c51e40cf6bcedd7db19cfe6c06e5/alashi-apps-sdk-0.6.0.tgz","_integrity":"sha512-6XnR/jnZD0Yrnr7PVpoEP8BFNuIDPvLFzTQfDsyuQtmGLpG1CNrYSI4h1OOkQWSTbI1/yewf6nDpKPlIKaFtDA==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.6.0_1787584060846_0.43352921366877295","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@alashi/apps-sdk","version":"0.7.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.7.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"8c158c59918db4282302ba687f5e47172c6fe327","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.7.0.tgz","fileCount":4,"integrity":"sha512-VhE/esSNa/0uPAF5j4PBZqLk+VKxH+5debEipphc+XHnIoe2MeY+jhEIPug7nWCNfEqnGbwXVxN4RwNM+l0Jgw==","signatures":[{"sig":"MEQCIAFBd8nGcTEW85IO4t6Pa1qHnJwGlvPqPeV2bgwrCUehAiAabeDpvFuHhNjfM9VimJmZX+z/IuYmgQUyTBdl+fdDRA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51206},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.7.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/938c554b223b8dbdf80d5b9840bb4a38/alashi-apps-sdk-0.7.0.tgz","_integrity":"sha512-VhE/esSNa/0uPAF5j4PBZqLk+VKxH+5debEipphc+XHnIoe2MeY+jhEIPug7nWCNfEqnGbwXVxN4RwNM+l0Jgw==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.7.0_1787637334731_0.6769905072335494","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@alashi/apps-sdk","version":"0.8.0","keywords":["alashi","claude","claude-code","apps","sdk"],"license":"MIT","_id":"@alashi/apps-sdk@0.8.0","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"dist":{"shasum":"58fe25966b519c9a9ecd4b55980a94ab967d1378","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.8.0.tgz","fileCount":4,"integrity":"sha512-0wvm6B1vczJHbclA/Jv9gOPBWAj2O0qYnovGxj5RIIuzzE4LKYCng2XoywxJ1gNOGC6v5K3OQqaAKiyEe3JjVg==","signatures":[{"sig":"MEUCIQC7qTHTi2Hvtz8Im8UG4sNj51jIzd/LXasCFOLJrWw5/wIgFKpMMoAhX3RZbd5DCo4g6Qo26oHNjjWm43Vp8ZHgBRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":52096},"main":"./dist/index.mjs","type":"module","_from":"file:alashi-apps-sdk-0.8.0.tgz","types":"./dist/index.d.mts","engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsdown","check":"pnpm lint && pnpm typecheck && pnpm test","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/23431130e536aa4c67ccc2a6bd388971/alashi-apps-sdk-0.8.0.tgz","_integrity":"sha512-0wvm6B1vczJHbclA/Jv9gOPBWAj2O0qYnovGxj5RIIuzzE4LKYCng2XoywxJ1gNOGC6v5K3OQqaAKiyEe3JjVg==","repository":{"url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git","type":"git"},"_npmVersion":"11.5.1","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","directories":{},"_nodeVersion":"24.6.0","dependencies":{"zod":"^4.4.3"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.22.14","vitest":"^4.1.10","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"^2.5.8"},"_npmOperationalInternal":{"tmp":"tmp/apps-sdk_0.8.0_1787673903251_0.4882231812323614","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@alashi/apps-sdk","version":"0.9.0","description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git"},"homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"keywords":["alashi","claude","claude-code","apps","sdk"],"engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"main":"./dist/index.mjs","types":"./dist/index.d.mts","dependencies":{"zod":"^4.4.3"},"devDependencies":{"@biomejs/biome":"^2.5.8","@types/node":"^26.2.0","tsdown":"^0.22.14","typescript":"^7.0.2","vitest":"^4.1.10"},"scripts":{"build":"tsdown","test":"vitest run","test:watch":"vitest","lint":"biome check .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","check":"pnpm lint && pnpm typecheck && pnpm test"},"_id":"@alashi/apps-sdk@0.9.0","_integrity":"sha512-aQ+RQvWoZnkChE6lnHl8wIwVHrQa3CXYCJPcMWg+/UuijDV9HMWavIp0fs3U071GMvnrZuRtl/O1S4zlkk9hmQ==","_resolved":"/private/var/folders/z9/kqyjy9js7jj7xs2h65kh3lph0000gn/T/f84a8440acb12712cf9fc6fc7754cea4/alashi-apps-sdk-0.9.0.tgz","_from":"file:alashi-apps-sdk-0.9.0.tgz","_nodeVersion":"24.6.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-aQ+RQvWoZnkChE6lnHl8wIwVHrQa3CXYCJPcMWg+/UuijDV9HMWavIp0fs3U071GMvnrZuRtl/O1S4zlkk9hmQ==","shasum":"9944ac0c823f272425662e8ffc3de6f9c639eb13","tarball":"https://registry.npmjs.org/@alashi/apps-sdk/-/apps-sdk-0.9.0.tgz","fileCount":4,"unpackedSize":55742,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDEi7hBZ2SH+x+dxr/HsRSOwLaq/vd9n2MIOhN0ijxo8QIhAJ/AO1YQk9RY5gNtSwfH+m1h3Iqvli7UPC0UrB0tx6fV"}]},"_npmUser":{"name":"navinpai","email":"lifeofnavin@gmail.com"},"directories":{},"maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/apps-sdk_0.9.0_1787712978901_0.6883239380708519"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-14T21:51:45.599Z","modified":"2026-08-26T02:56:19.251Z","0.1.0":"2026-08-14T21:51:45.990Z","0.1.1":"2026-08-15T13:54:46.812Z","0.1.2":"2026-08-18T19:03:58.139Z","0.1.3":"2026-08-20T16:21:25.703Z","0.2.0":"2026-08-21T02:50:30.649Z","0.3.0":"2026-08-21T11:26:58.103Z","0.4.0":"2026-08-22T02:58:22.419Z","0.5.0":"2026-08-24T11:52:57.351Z","0.6.0":"2026-08-24T15:07:40.986Z","0.7.0":"2026-08-25T05:55:34.860Z","0.8.0":"2026-08-25T16:05:03.388Z","0.9.0":"2026-08-26T02:56:19.074Z"},"bugs":{"url":"https://github.com/alashi-dev/alashi-apps-sdk/issues"},"license":"MIT","homepage":"https://github.com/alashi-dev/alashi-apps-sdk#readme","keywords":["alashi","claude","claude-code","apps","sdk"],"repository":{"type":"git","url":"git+https://github.com/alashi-dev/alashi-apps-sdk.git"},"description":"SDK for building alashi apps: local, portable, Claude Code-powered applications","maintainers":[{"name":"navinpai","email":"lifeofnavin@gmail.com"}],"readme":"# @alashi/apps-sdk\n\nSDK for building [alashi](https://github.com/alashi-dev/alashi) apps:\nlocal, portable, Claude-powered applications. An app is a plain npm package —\na manifest, optional HTTP routes, optional job handlers, and a static UI.\nThe alashi host runs it, gives it a private data directory, renders a\nsettings page from its declared config, schedules its jobs, and mediates\nall AI access.\n\n## Build an app in five steps\n\n```bash\nnpm i -g @alashi/cli\nalashi create my-app && cd my-app   # scaffold from the basic template\nnpm install\nalashi install .                    # local installs are symlinked — live dev loop\nalashi                              # dashboard at http://localhost:4141\n```\n\nThen edit `index.mjs` (manifest, routes, jobs) and `ui/index.html` (your page).\nRestart `alashi` after manifest changes; UI/route edits just need a refresh.\n\n## Anatomy\n\n```js\n// index.mjs\nimport { defineApp } from '@alashi/apps-sdk';\n\nexport default defineApp({\n  name: 'my-app',              // lowercase letters, digits, hyphens\n  version: '0.1.0',\n  sdkVersion: '^0.1.3',        // SDK contract range; host refuses incompatible installs\n  ui: 'ui',                    // static dir served at /app/my-app/\n  instructions: 'instructions.md',  // .md file = system prompt for every AI session\n\n  config: {\n    apiUrl: {\n      label: 'API URL',                  // settings-page label (derived from key if omitted)\n      description: 'Where to send things', // help text\n      required: true,                    // app is unready until set\n    },\n    apiToken: { secret: true, group: 'Backend' }, // masked, never echoed by host APIs\n    verbose: { default: false },         // boolean default → rendered as a checkbox\n  },\n\n  mcpServers: {\n    grafana: {\n      command: 'uvx',\n      args: ['mcp-grafana'],\n      env: { GRAFANA_URL: '${config.apiUrl}' }, // ${config.*} interpolation\n      optional: true,   // silently absent until its config keys are set\n    },\n  },\n\n  skills: ['skills/my-runbook'],          // dirs with SKILL.md\n  agents: ['agents/helper.md'],           // agent files; name = filename minus .md\n  permissions: { allowedTools: ['mcp__grafana__*'] },\n\n  jobs: [{ name: 'sweep', schedule: '*/10 * * * *', description: 'retry stragglers' }],\n  jobHandlers: {\n    sweep: async (ctx) => { /* runs on the cron schedule, and on demand from the UI */ },\n  },\n\n  routes: (ctx) => async (req) => {\n    // Standard fetch handler. Mounted at /app/my-app/api/* (prefix stripped).\n    const url = new URL(req.url);\n    if (url.pathname === '/hello') return Response.json({ hi: ctx.appName });\n    return Response.json({ error: 'Not found' }, { status: 404 });\n  },\n});\n```\n\n### Unknown manifest keys are stripped, not fatal\n\nEvery app bundles its own copy of this SDK, so a manifest written against a\nnewer SDK will sooner or later be read by an older one. When that happens the\nunknown keys are **dropped from the parsed manifest and reported**, never\nrejected — old kernels ignore syscall flags they don't know. The only\nincompatibility that is fatal is `sdkVersion`: if the host's SDK falls outside\nthat range it refuses the install outright.\n\n```js\nimport { parseManifestWithWarnings } from '@alashi/apps-sdk';\n\nconst { manifest, unknownKeys } = parseManifestWithWarnings(input);\n// unknownKeys → ['jobs.0.retries', 'mcpServer', 'mcpServers.grafana.timeout']\n```\n\n`parseManifest(input)` is the same call with the warnings discarded, and\n`manifest` contains only keys this SDK knows, so nothing downstream ever sees\nan unrecognized field. Genuine mistakes are still hard failures that throw\n`ManifestValidationError`: a bad `name` pattern, a non-semver `version`, a\nwrong type, path traversal, a non-`.md` `instructions` or agent file. An input\nwith both unknown keys and real errors throws on the real errors.\n\nTypo protection moves with it: a misspelled `mcpServer` is now a warning\n(and, later, an `alashi validate` error) rather than a failed load. To keep\nthe newer field reachable from an older app, `defineApp()` also returns\n`rawManifest` — the manifest portion of your input, untouched. Hosts should\nre-validate `rawManifest` with their own SDK when it is present and fall back\nto `manifest` when it is not.\n\nTypeScript apps still get excess-property checking on `defineApp({…})`, which\nis deliberate: it is the typo protection that survives at author time. If you\nneed a field that is newer than your pinned SDK's types, cast it:\n\n```ts\nexport default defineApp({\n  name: 'my-app',\n  version: '0.1.0',\n  futureField: true,\n} as AppDefinitionInput & { futureField: boolean });\n```\n\n## AppContext\n\nRoutes and job handlers receive the same `ctx`:\n\n| Field | What |\n|---|---|\n| `ctx.appName` | The app's name |\n| `ctx.dataDir` | Private writable directory — put your SQLite DB and files here |\n| `ctx.config` | Merged config: defaults ← user settings. Secrets included |\n| `ctx.state` | Small JSON key/value store (`get`/`set`), persisted in `dataDir` |\n| `ctx.logger` | `info`/`warn`/`error`, tagged with the app name |\n| `ctx.ai` | The syscall interface — see below |\n| `ctx.usage` | Read-only ledger of this app's metered AI spend — see below |\n\n### `ctx.usage`\n\nThe host meters every AI turn and keeps the books; the app only reads them.\n\n```js\n// Per-turn records, oldest first. Both filters are optional.\nconst turns = await ctx.usage.turns({ since, sessionId });\n// → [{ at, sessionId?, model?, costUsd, modelUsage? }, ...]\n\nconst summary = await ctx.usage.summary();\n// → { date, todayCostUsd, todayTurns, todayModels, totalCostUsd, models,\n//     retentionDays, recorded, days, months }\n```\n\n`days` and `months` are oldest first: days with no spend are absent and are\npruned after `retentionDays`, while months are never pruned, so long-run\ntrends outlive the daily window. `recorded: false` means *no data at all* —\nnot a measured zero, so don't render it as `$0.0000`.\n\nOnly sessions opened through `ctx.ai` are metered. The view is app-scoped and\nread-only: an app can read its own spend, but never another app's ledger, and\nnever its own cap.\n\n## Migrations\n\nApps that keep a SQLite DB in `ctx.dataDir` can put ordered `.sql` files next\nto their code instead of hand-rolling `CREATE TABLE IF NOT EXISTS` blobs and\n`try {} catch {}` `ALTER TABLE`s:\n\n```\nmy-app/\n  migrations/\n    001-init.sql\n    002-add-status-column.sql\n```\n\n```js\nimport { DatabaseSync } from 'node:sqlite';\nimport { runMigrations } from '@alashi/apps-sdk';\n\nfunction openDb(ctx) {\n  const db = new DatabaseSync(join(ctx.dataDir, 'app.db'));\n  db.exec('PRAGMA journal_mode = WAL');   // pragmas go HERE, before migrating\n  db.exec('PRAGMA foreign_keys = ON');\n  runMigrations(db, new URL('migrations/', import.meta.url), { logger: ctx.logger });\n  return db;\n}\n```\n\n`runMigrations(db, dir, options?)` is synchronous — like `node:sqlite` itself,\nso your `openDb()` stays synchronous — and returns\n`{ applied: string[], version: number }`: the filenames it just ran, and the\nresulting `PRAGMA user_version`.\n\n- **Filenames** must start with digits and a separator (`001-init.sql`,\n  `2_init.sql`). Files are sorted by that number, so `2-x.sql` runs before\n  `10-x.sql`. A `.sql` file with no numeric prefix, or two files sharing one,\n  is an error — ambiguous order is not worth guessing at. Everything else in\n  the directory (`README.md`, subdirectories, dotfiles) is ignored.\n- **Progress is `PRAGMA user_version`**, the count of applied files. Files\n  already applied are never re-read, so calling this on every DB open is cheap.\n- **One transaction per file.** A failure rolls that file back and rethrows\n  naming it; `user_version` is part of the DB header and transactional, so a\n  crash or error mid-run leaves the DB at the previous version and the next\n  call resumes from there.\n- **Downgrade guard.** If `user_version` is higher than the number of files on\n  disk, the DB was migrated by a newer build of the app and the call throws\n  rather than pretending it can be opened safely.\n- **A missing directory throws** — a typo'd path silently doing nothing is\n  worse than a loud error. An existing empty directory is a no-op.\n\n> **Statements that cannot run inside a transaction must not live in a\n> migration file.** Notably `PRAGMA journal_mode = WAL` — set it on the\n> connection before calling `runMigrations`, as in the snippet above.\n\nForward-only by design: there are no down-migrations, because rolling a schema\nbackwards is how you lose local user data. Roll forward with a new file\ninstead. There is also no automatic backup (`node:sqlite`'s `backup()` isn't\navailable on the SDK's minimum Node, `>=22.12`) — if you want a safety net,\ncopy the DB file before calling.\n\nAll of this is opt-in: plain `DatabaseSync` with your own schema setup keeps\nworking exactly as before.\n\n## AI sessions\n\n```js\nconst session = await ctx.ai.createSession(); // pre-scoped: your MCP servers,\ntry {                                         // allowedTools, agents, skills,\n  for await (const event of session.send('Investigate this: …')) {\n    if (event.type === 'text') out += event.text;\n    if (event.type === 'result') ok = event.ok;   // also: costUsd, error\n  }\n} finally {\n  await session.close();\n}\n```\n\nEvents: `session` (carries the id — persist it to resume later), `text`,\n`thinking`, `tool_use`, `tool_result`, `result`. Pass `{ resume: sessionId }`\nto `createSession` to continue an earlier session. The host's chat UI can\nadopt any session id into a conversation, so users can pick up where a\nbackground session left off.\n\n### Transcripts live in engine space\n\nConversations are owned by the AI engine, not by your app: the app container\nonly stores session id pointers. `AIProvider` therefore exposes optional\ncapability methods for reading and moving that state. Providers implement\nonly what they can support, so always feature-check before calling.\n\n| Method | What |\n|---|---|\n| `history?(sessionId)` | Past messages of one session as `ChatMessage[]` (`role`, `text`, optional `timestamp`). Returns `[]` for unknown ids |\n| `exportTranscripts?(sessionIds)` | Raw transcripts as `SessionTranscript[]` — `{ sessionId, content }`, where `content` is the provider's own serialization (JSONL for Claude Code), opaque to the host. Unknown session ids are omitted rather than erroring |\n| `importTranscripts?(transcripts, { cwd })` | Restores transcripts into provider storage, keyed to `cwd` — the app's data dir on *this* machine, which may differ from where they were exported. Never clobbers a transcript the provider already has for that session id |\n\n`exportTranscripts`/`importTranscripts` are what lets a tool snapshot an app\ncontainer *together with* its conversations and rehydrate it elsewhere. Both\nare JSON-serializable in and out — strings only, no filesystem paths — so the\ncontract still holds once a provider lives behind RPC.\n\n```js\nconst transcripts = (await ctx.ai.exportTranscripts?.(sessionIds)) ?? [];\nawait ctx.ai.importTranscripts?.(transcripts, { cwd: ctx.dataDir });\n```\n\n## Agents\n\nSubagents live in `.md` files (the same format Claude Code uses): YAML\nfrontmatter plus a markdown body that becomes the agent's prompt. The agent's\nname is the filename without the extension.\n\n```markdown\n---\ndescription: Queries monitoring tools around an alert window\ntools:\n  - mcp__grafana__*\nmodel: sonnet          # optional\n---\n\nYou are a metrics analyst. Report concrete numbers and timestamps…\n```\n\nDeclare them in the manifest as paths relative to the app root:\n`agents: ['agents/helper.md']`. `parseAgentFile` (exported) is the parser\nthe host uses.\n\n## UI\n\nLink the system stylesheet and you inherit the host's look and feel —\nsidebar, cards, tables, badges, chat components:\n\n```html\n<link rel=\"stylesheet\" href=\"/assets/v1/system.css\">\n<style>:root { --accent: #dc2626; }</style>  <!-- theme via tokens only -->\n```\n\nFrom the UI, call your own routes at `/app/<name>/api/*` and host services\nat `/api/apps/<name>/{chat,jobs,config}` (streaming chat, job status +\nmanual runs). Render external data with `textContent`, never `innerHTML`.\n\n## Ship it\n\nPush the app to a git repo; anyone with alashi runs:\n\n```bash\nalashi install https://github.com/you/my-app.git\n```\n\nRequired config keys show up as install hints and in the settings page;\noptional MCP integrations light up when their keys are set.\n\n## Examples\n\n- [simple-chat-app](https://github.com/alashi-dev/simple-chat-app) — minimal: one config key, two routes, host chat.\n- [sre-app](https://github.com/alashi-dev/sre-app) — full reference: webhook ingest, SQLite, AI investigations, cron sweeps, optional Grafana/Datadog MCP integrations.\n","readmeFilename":"README.md"}