Skip to content

Commit 0115522

Browse files
committed
chore: wip
1 parent 098af7d commit 0115522

File tree

15 files changed

+369
-50
lines changed

15 files changed

+369
-50
lines changed

.env

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
2+
#/ public-key encryption for .env files /
3+
#/ [how it works](https://stacksjs.org/encryption) /
4+
#/----------------------------------------------------------/
5+
DOTENV_PUBLIC_KEY="3f04b26669db3c04a643dfe348990dafa5c11ba3120b03b5a11a90513ba4a92a"
6+
7+
APP_NAME=Stacks
8+
APP_ENV=production
9+
APP_KEY=base64:OTYsNjYsMTY1LDE2OSwyNDMsNzQsMTYyLDEzNSwxMTcsNzYsMTE1LDE1MiwxMywyMzEsNzMsNDIsMjUxLDIzMCwxMTUsMjA4LDI0MiwyMDEsMTY4LDI1MSw2OCwxNzAsMTIwLDE1MywxNTcsMTMwLDIyMiwxNzU=
10+
APP_URL=https://stacksjs.org
11+
APP_MAINTENANCE=false
12+
SUDO_PASSWORD="encrypted:7PodDMbbrpZyE/zRVVI31YothRVjYugjL78Ap0xSeShYAYzBi3c="
13+
14+
PORT=3000
15+
DEBUG=false
16+
17+
DB_CONNECTION=sqlite
18+
DB_HOST=127.0.0.1
19+
DB_PORT=3306
20+
DB_DATABASE=stacks
21+
DB_USERNAME=root
22+
DB_PASSWORD=
23+
24+
GITHUB_TOKEN="encrypted:TuWJ2IbHnqxtxqhq3GenLPRmJy5DnoaKj4GTAT0rdUIsASzQdGu1g/rm+nlgxUDnw7RB2hZPYJmxsykPhykyY6fyaA3d+jgE"
25+
26+
AWS_ACCOUNT_ID=
27+
AWS_ACCESS_KEY_ID=
28+
AWS_SECRET_ACCESS_KEY=
29+
AWS_DEFAULT_PASSWORD="encrypted:EuvV2fHjX77QiFOGtuMWzRh1eevMeBIh5C+CI4HhHGLJYFh5jyS7CtZZ5I+nPA=="
30+
AWS_REGION=us-east-1
31+
AWS_PROFILE=stacks
32+
33+
MAIL_MAILER=smtp
34+
MAIL_HOST=mailpit
35+
MAIL_PORT=1025
36+
MAIL_USERNAME=null
37+
MAIL_PASSWORD=null
38+
MAIL_ENCRYPTION=null
39+
MAIL_FROM_NAME="${APP_NAME}"
40+
MAIL_FROM_ADDRESS="no-reply@stacksjs.org"
41+
42+
STRIPE_SECRET_KEY=
43+
STRIPE_PUBLIC_KEY=
44+
45+
SEARCH_ENGINE_DRIVER=meilisearch
46+
MEILISEARCH_HOST=http://127.0.0.1:7700
47+
MEILISEARCH_KEY=masterKey
48+
49+
# FRONTEND_* variables should not contain any sensitive information
50+
FRONTEND_APP_ENV="${APP_ENV}"
51+
FRONTEND_APP_URL="${APP_URL}"
52+
53+
FRONTEND_STRIPE_PUBLIC_KEY=

.env.local

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
2+
#/ public-key encryption for .env files /
3+
#/ [how it works](https://stacksjs.org/encryption) /
4+
#/----------------------------------------------------------/
5+
DOTENV_PUBLIC_KEY="3f04b26669db3c04a643dfe348990dafa5c11ba3120b03b5a11a90513ba4a92a"
6+
7+
# Local Development Environment Configuration
8+
APP_NAME=Stacks
9+
APP_ENV=local
10+
APP_KEY="encrypted:wx6j3jWhH19YmtD/FgbPuaGdrBLQpV96E0hRBugBa5zteS2dj7iOjIxauJTcv8W6Dul3i3dvtry1GLsvGFwlhShikTv026iaBoe7oqAy7t4gGLE/l28p/l21On1ZxghdSTiRckOkoNgyqzPKT+1ZaBM8BfWtMfVn2o0J1M9/jhHTzbgQUW4QtVBz4+A3NUKClXmyUTzQJbz347ZjNY+OymiO/SEUQep9ve57+vhLpZ7e4TMZDOTsb/JPC9/Bjs7a1FF91N4jcw=="
11+
APP_URL=http://stacks.localhost
12+
APP_MAINTENANCE=false
13+
SUDO_PASSWORD="encrypted:7PodDMbbrpZyE/zRVVI31YothRVjYugjL78Ap0xSeShYAYzBi3c="
14+
15+
PORT=3000
16+
DEBUG=true
17+
18+
DB_CONNECTION=sqlite
19+
DB_HOST=127.0.0.1
20+
DB_PORT=3306
21+
DB_DATABASE=stacks
22+
DB_USERNAME=root
23+
DB_PASSWORD=
24+
25+
GITHUB_TOKEN="encrypted:TuWJ2IbHnqxtxqhq3GenLPRmJy5DnoaKj4GTAT0rdUIsASzQdGu1g/rm+nlgxUDnw7RB2hZPYJmxsykPhykyY6fyaA3d+jgE"
26+
27+
AWS_ACCOUNT_ID=
28+
AWS_ACCESS_KEY_ID=
29+
AWS_SECRET_ACCESS_KEY=
30+
AWS_DEFAULT_PASSWORD="encrypted:EuvV2fHjX77QiFOGtuMWzRh1eevMeBIh5C+CI4HhHGLJYFh5jyS7CtZZ5I+nPA=="
31+
AWS_REGION=us-east-1
32+
AWS_PROFILE=stacks
33+
34+
MAIL_MAILER=smtp
35+
MAIL_HOST=mailpit
36+
MAIL_PORT=1025
37+
MAIL_USERNAME=null
38+
MAIL_PASSWORD=null
39+
MAIL_ENCRYPTION=null
40+
MAIL_FROM_NAME="${APP_NAME}"
41+
MAIL_FROM_ADDRESS="no-reply@stacksjs.org"
42+
43+
STRIPE_SECRET_KEY=
44+
STRIPE_PUBLIC_KEY=
45+
46+
SEARCH_ENGINE_DRIVER=meilisearch
47+
MEILISEARCH_HOST=http://127.0.0.1:7700
48+
MEILISEARCH_KEY=masterKey
49+
50+
# FRONTEND_* variables should not contain any sensitive information
51+
FRONTEND_APP_ENV="${APP_ENV}"
52+
FRONTEND_APP_URL="${APP_URL}"
53+
54+
FRONTEND_STRIPE_PUBLIC_KEY=

.env.production

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#/-------------------[DOTENV_PUBLIC_KEY]--------------------/
2+
#/ public-key encryption for .env files /
3+
#/ [how it works](https://stacksjs.org/encryption) /
4+
#/----------------------------------------------------------/
5+
DOTENV_PUBLIC_KEY="3f04b26669db3c04a643dfe348990dafa5c11ba3120b03b5a11a90513ba4a92a"
6+
7+
# Production Environment Configuration
8+
APP_NAME=Stacks
9+
APP_ENV=production
10+
APP_KEY="encrypted:wx6j3jWhH19YmtD/FgbPuaGdrBLQpV96E0hRBugBa5zteS2dj7iOjIxauJTcv8W6Dul3i3dvtry1GLsvGFwlhShikTv026iaBoe7oqAy7t4gGLE/l28p/l21On1ZxghdSTiRckOkoNgyqzPKT+1ZaBM8BfWtMfVn2o0J1M9/jhHTzbgQUW4QtVBz4+A3NUKClXmyUTzQJbz347ZjNY+OymiO/SEUQep9ve57+vhLpZ7e4TMZDOTsb/JPC9/Bjs7a1FF91N4jcw=="
11+
APP_URL=https://stacksjs.org
12+
APP_MAINTENANCE=false
13+
SUDO_PASSWORD="encrypted:7PodDMbbrpZyE/zRVVI31YothRVjYugjL78Ap0xSeShYAYzBi3c="
14+
15+
PORT=3000
16+
DEBUG=false
17+
18+
DB_CONNECTION=sqlite
19+
DB_HOST=127.0.0.1
20+
DB_PORT=3306
21+
DB_DATABASE=stacks
22+
DB_USERNAME=root
23+
DB_PASSWORD=
24+
25+
GITHUB_TOKEN="encrypted:TuWJ2IbHnqxtxqhq3GenLPRmJy5DnoaKj4GTAT0rdUIsASzQdGu1g/rm+nlgxUDnw7RB2hZPYJmxsykPhykyY6fyaA3d+jgE"
26+
27+
AWS_ACCOUNT_ID=
28+
AWS_ACCESS_KEY_ID=
29+
AWS_SECRET_ACCESS_KEY=
30+
AWS_DEFAULT_PASSWORD="encrypted:EuvV2fHjX77QiFOGtuMWzRh1eevMeBIh5C+CI4HhHGLJYFh5jyS7CtZZ5I+nPA=="
31+
AWS_REGION=us-east-1
32+
AWS_PROFILE=stacks
33+
34+
MAIL_MAILER=smtp
35+
MAIL_HOST=mailpit
36+
MAIL_PORT=1025
37+
MAIL_USERNAME=null
38+
MAIL_PASSWORD=null
39+
MAIL_ENCRYPTION=null
40+
MAIL_FROM_NAME="${APP_NAME}"
41+
MAIL_FROM_ADDRESS="no-reply@stacksjs.org"
42+
43+
STRIPE_SECRET_KEY=
44+
STRIPE_PUBLIC_KEY=
45+
46+
SEARCH_ENGINE_DRIVER=meilisearch
47+
MEILISEARCH_HOST=http://127.0.0.1:7700
48+
MEILISEARCH_KEY=masterKey
49+
50+
# FRONTEND_* variables should not contain any sensitive information
51+
FRONTEND_APP_ENV="${APP_ENV}"
52+
FRONTEND_APP_URL="${APP_URL}"
53+
54+
FRONTEND_STRIPE_PUBLIC_KEY=

.gitignore

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,16 @@ node_modules
55
.cache
66
temp
77
.temp
8-
.env
9-
.env.keys
10-
*.local
8+
# Environment files
9+
.env # Local environment (not committed)
10+
.env.keys # Encryption keys (NEVER commit!)
11+
*.local # Local overrides (not committed)
12+
13+
# Encrypted environment files (safe to commit)
14+
# These can be committed because they're encrypted
15+
!.env.production
16+
!.env.staging
17+
!.env.ci
1118
updates
1219
tests/unit/coverage
1320
dist*
@@ -33,3 +40,4 @@ stacks.log
3340
/pantry_modules
3441
.stx
3542
.stx-serve
43+
.env.keys

buddy.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#!/usr/bin/env bun
2+
// Ultra-fast clapp-based router - uses clapp APIs for all commands
3+
import { cli } from '@stacksjs/clapp'
4+
import { dim, gray } from '@stacksjs/cli'
5+
6+
const args = process.argv.slice(2)
7+
const command = args[0] || ''
8+
const startTime = performance.now()
9+
10+
// Helper to show execution time
11+
function showExecutionTime() {
12+
const elapsed = performance.now() - startTime
13+
const timeMs = Math.round(elapsed)
14+
15+
// Only show for commands that take >100ms (skip instant ones)
16+
if (timeMs > 100) {
17+
console.log(dim(gray(`\n⏱ Execution time: ${timeMs}ms`)))
18+
}
19+
}
20+
21+
// Create lightweight clapp instance
22+
const buddy = cli('buddy')
23+
24+
// Add version
25+
const pkg = require('./package.json')
26+
buddy.version(pkg.version)
27+
28+
// Fast path commands - register with minimal overhead
29+
buddy
30+
.command('dev', 'Start development server (ultra-fast)')
31+
.alias('serve')
32+
.example('buddy dev')
33+
.example('buddy serve')
34+
.action(async () => {
35+
const { serve } = await import('bun-plugin-stx/serve')
36+
console.log('🚀 Starting STX development server on http://localhost:3456\n')
37+
await serve({
38+
patterns: ['resources/views'],
39+
port: 3456,
40+
})
41+
})
42+
43+
buddy
44+
.command('build', 'Bundle your project for production')
45+
.example('buddy build')
46+
.action(async () => {
47+
const { build } = await import('./storage/framework/core/actions/src/build')
48+
await build({})
49+
showExecutionTime()
50+
})
51+
52+
buddy
53+
.command('test [filter]', 'Run your test suite')
54+
.alias('t')
55+
.example('buddy test')
56+
.example('buddy test --filter=unit')
57+
.action(async () => {
58+
const { runAction } = await import('@stacksjs/actions')
59+
await runAction('test')
60+
showExecutionTime()
61+
})
62+
63+
buddy
64+
.command('lint', 'Lint and format your code')
65+
.example('buddy lint')
66+
.example('buddy lint --fix')
67+
.action(async () => {
68+
const { runAction } = await import('@stacksjs/actions')
69+
await runAction('lint')
70+
showExecutionTime()
71+
})
72+
73+
// For all other commands, lazy load the full CLI
74+
const fastCommands = ['version', 'dev', 'serve', 'build', 'test', 't', 'lint', '-v', '--version', '-h', '--help', 'help']
75+
if (command && !fastCommands.includes(command)) {
76+
// Load full CLI for other commands
77+
await import('./storage/framework/core/buddy/src/cli')
78+
showExecutionTime()
79+
} else {
80+
// Use lightweight clapp for fast commands
81+
buddy.help()
82+
await buddy.parse()
83+
}

build-binary.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env bun
2+
/**
3+
* Build script for compiling the Buddy CLI to a native binary.
4+
*
5+
* The key to making this work is marking all @stacksjs/* packages and
6+
* local storage/* imports as external. This prevents the bundler from
7+
* inlining top-level await from config loading logic.
8+
*/
9+
10+
console.log('🔨 Building Buddy binary...\n')
11+
12+
const result = await Bun.spawn([
13+
'bun',
14+
'build',
15+
'./buddy.ts',
16+
'--compile',
17+
'--outfile',
18+
'./buddy-bin',
19+
'--external',
20+
'@stacksjs/*',
21+
'--external',
22+
'./storage/*',
23+
'--external',
24+
'bun-plugin-stx/*',
25+
], {
26+
stdout: 'inherit',
27+
stderr: 'inherit',
28+
}).exited
29+
30+
if (result === 0) {
31+
console.log('\n✅ Binary compiled successfully to ./buddy-bin')
32+
console.log('\nTest it with:')
33+
console.log(' ./buddy-bin --version')
34+
console.log(' ./buddy-bin --help')
35+
} else {
36+
console.error('\n❌ Binary compilation failed')
37+
process.exit(1)
38+
}

bun.lock

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"": {
55
"name": "stacks",
66
"dependencies": {
7+
"@stacksjs/clarity": "^0.3.24",
78
"@stacksjs/stx": "link:@stacksjs/stx",
89
"bun-plugin-stx": "link:bun-plugin-stx",
910
"stacks": "workspace:*",
@@ -568,7 +569,7 @@
568569
"@stacksjs/tinker": "^0.70.23",
569570
"@stacksjs/tunnel": "^0.70.23",
570571
"@stacksjs/types": "^0.70.23",
571-
"bun-plugin-dtsx": "^0.21.12",
572+
"bun-plugin-dtsx": "0.9.9",
572573
"typescript": "^5.9.2",
573574
},
574575
"devDependencies": {
@@ -2101,7 +2102,7 @@
21012102

21022103
"@stacksjs/docs": ["@stacksjs/docs@workspace:storage/framework/core/docs"],
21032104

2104-
"@stacksjs/dtsx": ["@stacksjs/dtsx@0.9.9", "", { "dependencies": { "@stacksjs/clapp": "^0.2.0" }, "bin": { "dtsx": "dist/bin/cli.js" } }, "sha512-6wQThnw5KkZUVYf6aROl74w0LvAqoQ+3H9unogYS2wcrWCtY9I2asAtSuU0Oc1Y7XVs5X+mOxqChAg5Cxh9STQ=="],
2105+
"@stacksjs/dtsx": ["@stacksjs/dtsx@0.9.7", "", { "dependencies": { "@stacksjs/clapp": "^0.2.0" }, "bin": { "dtsx": "dist/bin/cli.js" } }, "sha512-fB/T/hwrn6iITumk1plDlcGAV7A1IygsG5MgZ0Zwcu5Yr8mSesThhYC5ORlPat7/7t5FfWCDT6bEtufU+1dO0g=="],
21052106

21062107
"@stacksjs/email": ["@stacksjs/email@workspace:storage/framework/core/email"],
21072108

@@ -2727,7 +2728,7 @@
27272728

27282729
"bun-plugin-auto-imports": ["bun-plugin-auto-imports@0.3.1", "", { "dependencies": { "unimport": "^3.14.6" } }, "sha512-rWgCe/C4yQ31R1MIwhtVgKWwpGN2OFUIkAdvAgX0TxbS2X8kt5Tc5QN8d7NpaeNjbT/v/rEJ1NmqauQjIB9WLQ=="],
27292730

2730-
"bun-plugin-dtsx": ["bun-plugin-dtsx@0.21.17", "", { "dependencies": { "@stacksjs/dtsx": "^0.9.8" } }, "sha512-gikZdPs8f7aFPREb+gBn7kaDdjpfQSLIPpVbUI+I5dusAlENvlJmKQj06aq1oS3mP7yg3gdQJBRg+PlzUV5h9g=="],
2731+
"bun-plugin-dtsx": ["bun-plugin-dtsx@0.9.9", "", { "dependencies": { "@stacksjs/dtsx": "0.9.7" } }, "sha512-5OIQBbunwgrrIl8CFm1X+u+23RExwMgtZEAhjuwsEUiK5fwfXXi7SFyC9ljuk5lMRIa7+N057gwhAyIOx5VXdA=="],
27312732

27322733
"bun-plugin-stx": ["bun-plugin-stx@link:bun-plugin-stx", { "bin": { "serve": "./dist/serve.js", "stx-serve": "./dist/serve.js" } }],
27332734

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@
5555
"stx": "./buddy"
5656
},
5757
"dependencies": {
58-
"stacks": "workspace:*",
58+
"@stacksjs/clarity": "^0.3.24",
5959
"@stacksjs/stx": "link:@stacksjs/stx",
60-
"bun-plugin-stx": "link:bun-plugin-stx"
60+
"bun-plugin-stx": "link:bun-plugin-stx",
61+
"stacks": "workspace:*"
6162
},
6263
"workspaces": [
6364
"storage/framework/**",

storage/framework/core/actions/build.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ const result = await Bun.build({
5656
'./src/make.ts',
5757
'./src/prepublish.ts',
5858
'./src/release.ts',
59+
'./src/run-action.ts',
5960
'./src/typecheck.ts',
6061
'./src/types.ts',
6162
'./src/upgrade.ts',

storage/framework/core/actions/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
"types": "./dist/index.d.ts",
3131
"import": "./dist/index.js"
3232
},
33+
"./run-action": {
34+
"types": "./dist/run-action.d.ts",
35+
"import": "./dist/run-action.js"
36+
},
3337
"./*": {
3438
"import": "./dist/*"
3539
}

0 commit comments

Comments
 (0)