@hexidecibel/companion 0.0.1
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__/task-parser.test.d.ts +2 -0
- package/dist/__tests__/task-parser.test.d.ts.map +1 -0
- package/dist/__tests__/task-parser.test.js +79 -0
- package/dist/__tests__/task-parser.test.js.map +1 -0
- package/dist/anthropic-usage.d.ts +5 -0
- package/dist/anthropic-usage.d.ts.map +1 -0
- package/dist/anthropic-usage.js +112 -0
- package/dist/anthropic-usage.js.map +1 -0
- package/dist/cert-generator.d.ts +15 -0
- package/dist/cert-generator.d.ts.map +1 -0
- package/dist/cert-generator.js +298 -0
- package/dist/cert-generator.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +122 -0
- package/dist/config.js.map +1 -0
- package/dist/encryption.d.ts +28 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +95 -0
- package/dist/encryption.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +211 -0
- package/dist/index.js.map +1 -0
- package/dist/input-injector.d.ts +21 -0
- package/dist/input-injector.d.ts.map +1 -0
- package/dist/input-injector.js +126 -0
- package/dist/input-injector.js.map +1 -0
- package/dist/mdns.d.ts +11 -0
- package/dist/mdns.d.ts.map +1 -0
- package/dist/mdns.js +93 -0
- package/dist/mdns.js.map +1 -0
- package/dist/parser.d.ts +43 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +800 -0
- package/dist/parser.js.map +1 -0
- package/dist/push.d.ts +38 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +359 -0
- package/dist/push.js.map +1 -0
- package/dist/qr-server.d.ts +13 -0
- package/dist/qr-server.d.ts.map +1 -0
- package/dist/qr-server.js +421 -0
- package/dist/qr-server.js.map +1 -0
- package/dist/scaffold/generator.d.ts +11 -0
- package/dist/scaffold/generator.d.ts.map +1 -0
- package/dist/scaffold/generator.js +206 -0
- package/dist/scaffold/generator.js.map +1 -0
- package/dist/scaffold/templates/index.d.ts +5 -0
- package/dist/scaffold/templates/index.d.ts.map +1 -0
- package/dist/scaffold/templates/index.js +22 -0
- package/dist/scaffold/templates/index.js.map +1 -0
- package/dist/scaffold/templates/node-express.d.ts +3 -0
- package/dist/scaffold/templates/node-express.d.ts.map +1 -0
- package/dist/scaffold/templates/node-express.js +218 -0
- package/dist/scaffold/templates/node-express.js.map +1 -0
- package/dist/scaffold/templates/python-fastapi.d.ts +3 -0
- package/dist/scaffold/templates/python-fastapi.d.ts.map +1 -0
- package/dist/scaffold/templates/python-fastapi.js +302 -0
- package/dist/scaffold/templates/python-fastapi.js.map +1 -0
- package/dist/scaffold/templates/react-mui-website.d.ts +3 -0
- package/dist/scaffold/templates/react-mui-website.d.ts.map +1 -0
- package/dist/scaffold/templates/react-mui-website.js +405 -0
- package/dist/scaffold/templates/react-mui-website.js.map +1 -0
- package/dist/scaffold/templates/react-typescript.d.ts +3 -0
- package/dist/scaffold/templates/react-typescript.d.ts.map +1 -0
- package/dist/scaffold/templates/react-typescript.js +275 -0
- package/dist/scaffold/templates/react-typescript.js.map +1 -0
- package/dist/scaffold/types.d.ts +55 -0
- package/dist/scaffold/types.d.ts.map +1 -0
- package/dist/scaffold/types.js +3 -0
- package/dist/scaffold/types.js.map +1 -0
- package/dist/subagent-watcher.d.ts +24 -0
- package/dist/subagent-watcher.d.ts.map +1 -0
- package/dist/subagent-watcher.js +307 -0
- package/dist/subagent-watcher.js.map +1 -0
- package/dist/tls.d.ts +10 -0
- package/dist/tls.d.ts.map +1 -0
- package/dist/tls.js +77 -0
- package/dist/tls.js.map +1 -0
- package/dist/tmux-manager.d.ts +71 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +243 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/tool-config.d.ts +33 -0
- package/dist/tool-config.d.ts.map +1 -0
- package/dist/tool-config.js +211 -0
- package/dist/tool-config.js.map +1 -0
- package/dist/types.d.ts +218 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +63 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +596 -0
- package/dist/watcher.js.map +1 -0
- package/dist/watcher.test.d.ts +2 -0
- package/dist/watcher.test.d.ts.map +1 -0
- package/dist/watcher.test.js +110 -0
- package/dist/watcher.test.js.map +1 -0
- package/dist/websocket.d.ts +62 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +1695 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +71 -0
- package/scripts/build.sh +23 -0
- package/scripts/install-remote.sh +18 -0
- package/scripts/install.sh +558 -0
- package/scripts/uninstall.sh +113 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { StackTemplate } from '../types';
|
|
2
|
+
export declare const templates: StackTemplate[];
|
|
3
|
+
export declare function getTemplate(id: string): StackTemplate | undefined;
|
|
4
|
+
export declare function getTemplatesByType(type: StackTemplate['type']): StackTemplate[];
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,eAAO,MAAM,SAAS,EAAE,aAAa,EAKpC,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE,CAE/E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.templates = void 0;
|
|
4
|
+
exports.getTemplate = getTemplate;
|
|
5
|
+
exports.getTemplatesByType = getTemplatesByType;
|
|
6
|
+
const react_typescript_1 = require("./react-typescript");
|
|
7
|
+
const react_mui_website_1 = require("./react-mui-website");
|
|
8
|
+
const node_express_1 = require("./node-express");
|
|
9
|
+
const python_fastapi_1 = require("./python-fastapi");
|
|
10
|
+
exports.templates = [
|
|
11
|
+
react_typescript_1.reactTypescriptTemplate,
|
|
12
|
+
react_mui_website_1.reactMuiWebsiteTemplate,
|
|
13
|
+
node_express_1.nodeExpressTemplate,
|
|
14
|
+
python_fastapi_1.pythonFastapiTemplate,
|
|
15
|
+
];
|
|
16
|
+
function getTemplate(id) {
|
|
17
|
+
return exports.templates.find(t => t.id === id);
|
|
18
|
+
}
|
|
19
|
+
function getTemplatesByType(type) {
|
|
20
|
+
return exports.templates.filter(t => t.type === type);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scaffold/templates/index.ts"],"names":[],"mappings":";;;AAaA,kCAEC;AAED,gDAEC;AAlBD,yDAA6D;AAC7D,2DAA8D;AAC9D,iDAAqD;AACrD,qDAAyD;AAE5C,QAAA,SAAS,GAAoB;IACxC,0CAAuB;IACvB,2CAAuB;IACvB,kCAAmB;IACnB,sCAAqB;CACtB,CAAC;AAEF,SAAgB,WAAW,CAAC,EAAU;IACpC,OAAO,iBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAA2B;IAC5D,OAAO,iBAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-express.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/node-express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,mBAAmB,EAAE,aAqNjC,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nodeExpressTemplate = void 0;
|
|
4
|
+
exports.nodeExpressTemplate = {
|
|
5
|
+
id: 'node-express',
|
|
6
|
+
name: 'Node.js + Express + TypeScript',
|
|
7
|
+
description: 'REST API with Express, TypeScript, and best practices',
|
|
8
|
+
type: 'backend',
|
|
9
|
+
icon: '🟢',
|
|
10
|
+
tags: ['node', 'express', 'typescript', 'backend', 'api'],
|
|
11
|
+
files: [
|
|
12
|
+
{
|
|
13
|
+
path: 'package.json',
|
|
14
|
+
template: `{
|
|
15
|
+
"name": "{{projectName}}",
|
|
16
|
+
"version": "1.0.0",
|
|
17
|
+
"description": "{{projectDescription}}",
|
|
18
|
+
"main": "dist/index.js",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "tsx watch src/index.ts",
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"start": "node dist/index.js",
|
|
23
|
+
"test": "vitest",
|
|
24
|
+
"lint": "eslint src/"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"express": "^4.21.0",
|
|
28
|
+
"cors": "^2.8.5",
|
|
29
|
+
"dotenv": "^16.4.5"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/cors": "^2.8.17",
|
|
33
|
+
"@types/express": "^4.17.21",
|
|
34
|
+
"@types/node": "^22.7.5",
|
|
35
|
+
"tsx": "^4.19.1",
|
|
36
|
+
"typescript": "^5.6.3",
|
|
37
|
+
"vitest": "^2.1.4",
|
|
38
|
+
"eslint": "^9.13.0",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
|
40
|
+
"@typescript-eslint/parser": "^8.11.0"
|
|
41
|
+
}
|
|
42
|
+
}`,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: 'tsconfig.json',
|
|
46
|
+
template: `{
|
|
47
|
+
"compilerOptions": {
|
|
48
|
+
"target": "ES2022",
|
|
49
|
+
"module": "NodeNext",
|
|
50
|
+
"moduleResolution": "NodeNext",
|
|
51
|
+
"outDir": "./dist",
|
|
52
|
+
"rootDir": "./src",
|
|
53
|
+
"strict": true,
|
|
54
|
+
"esModuleInterop": true,
|
|
55
|
+
"skipLibCheck": true,
|
|
56
|
+
"forceConsistentCasingInFileNames": true,
|
|
57
|
+
"resolveJsonModule": true,
|
|
58
|
+
"declaration": true,
|
|
59
|
+
"declarationMap": true,
|
|
60
|
+
"sourceMap": true
|
|
61
|
+
},
|
|
62
|
+
"include": ["src/**/*"],
|
|
63
|
+
"exclude": ["node_modules", "dist"]
|
|
64
|
+
}`,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
path: 'src/index.ts',
|
|
68
|
+
template: `import express from 'express';
|
|
69
|
+
import cors from 'cors';
|
|
70
|
+
import { config } from 'dotenv';
|
|
71
|
+
import { router } from './routes/index.js';
|
|
72
|
+
|
|
73
|
+
config();
|
|
74
|
+
|
|
75
|
+
const app = express();
|
|
76
|
+
const port = process.env.PORT || 3000;
|
|
77
|
+
|
|
78
|
+
app.use(cors());
|
|
79
|
+
app.use(express.json());
|
|
80
|
+
|
|
81
|
+
app.use('/api', router);
|
|
82
|
+
|
|
83
|
+
app.get('/health', (req, res) => {
|
|
84
|
+
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
app.listen(port, () => {
|
|
88
|
+
console.log(\`Server running on http://localhost:\${port}\`);
|
|
89
|
+
});`,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
path: 'src/routes/index.ts',
|
|
93
|
+
template: `import { Router } from 'express';
|
|
94
|
+
|
|
95
|
+
export const router = Router();
|
|
96
|
+
|
|
97
|
+
router.get('/', (req, res) => {
|
|
98
|
+
res.json({ message: 'Welcome to {{projectName}} API' });
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Add your routes here
|
|
102
|
+
// router.use('/users', usersRouter);`,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
path: 'src/types/index.ts',
|
|
106
|
+
template: `// Add your types here
|
|
107
|
+
|
|
108
|
+
export interface ApiResponse<T> {
|
|
109
|
+
success: boolean;
|
|
110
|
+
data?: T;
|
|
111
|
+
error?: string;
|
|
112
|
+
}`,
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
path: '.env',
|
|
116
|
+
template: `PORT=3000
|
|
117
|
+
NODE_ENV=development`,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
path: '.env.example',
|
|
121
|
+
template: `PORT=3000
|
|
122
|
+
NODE_ENV=development`,
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
path: '.gitignore',
|
|
126
|
+
template: `# Dependencies
|
|
127
|
+
node_modules
|
|
128
|
+
|
|
129
|
+
# Build
|
|
130
|
+
dist
|
|
131
|
+
|
|
132
|
+
# Environment
|
|
133
|
+
.env
|
|
134
|
+
.env.local
|
|
135
|
+
.env.*.local
|
|
136
|
+
|
|
137
|
+
# Logs
|
|
138
|
+
*.log
|
|
139
|
+
npm-debug.log*
|
|
140
|
+
|
|
141
|
+
# Editor
|
|
142
|
+
.vscode/*
|
|
143
|
+
!.vscode/extensions.json
|
|
144
|
+
.idea
|
|
145
|
+
|
|
146
|
+
# OS
|
|
147
|
+
.DS_Store`,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
path: 'CLAUDE.md',
|
|
151
|
+
template: `# {{projectName}}
|
|
152
|
+
|
|
153
|
+
{{projectDescription}}
|
|
154
|
+
|
|
155
|
+
## Tech Stack
|
|
156
|
+
- Node.js with TypeScript
|
|
157
|
+
- Express.js for HTTP server
|
|
158
|
+
- tsx for development (hot reload)
|
|
159
|
+
|
|
160
|
+
## Project Structure
|
|
161
|
+
\`\`\`
|
|
162
|
+
src/
|
|
163
|
+
├── index.ts # Entry point, server setup
|
|
164
|
+
├── routes/ # API route handlers
|
|
165
|
+
│ └── index.ts # Route definitions
|
|
166
|
+
└── types/ # TypeScript types
|
|
167
|
+
└── index.ts
|
|
168
|
+
\`\`\`
|
|
169
|
+
|
|
170
|
+
## Commands
|
|
171
|
+
- \`npm run dev\` - Start dev server with hot reload
|
|
172
|
+
- \`npm run build\` - Build TypeScript to dist/
|
|
173
|
+
- \`npm start\` - Run production build
|
|
174
|
+
- \`npm test\` - Run tests
|
|
175
|
+
- \`npm run lint\` - Run linter
|
|
176
|
+
|
|
177
|
+
## API Endpoints
|
|
178
|
+
- \`GET /health\` - Health check
|
|
179
|
+
- \`GET /api\` - API root
|
|
180
|
+
|
|
181
|
+
## Development Notes
|
|
182
|
+
- Add routes in \`src/routes/\`
|
|
183
|
+
- Add middleware in \`src/middleware/\`
|
|
184
|
+
- Add services/business logic in \`src/services/\`
|
|
185
|
+
- Environment variables in \`.env\``,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
path: 'README.md',
|
|
189
|
+
template: `# {{projectName}}
|
|
190
|
+
|
|
191
|
+
{{projectDescription}}
|
|
192
|
+
|
|
193
|
+
## Getting Started
|
|
194
|
+
|
|
195
|
+
\`\`\`bash
|
|
196
|
+
npm install
|
|
197
|
+
npm run dev
|
|
198
|
+
\`\`\`
|
|
199
|
+
|
|
200
|
+
Server will start at http://localhost:3000
|
|
201
|
+
|
|
202
|
+
## Scripts
|
|
203
|
+
|
|
204
|
+
- \`npm run dev\` - Start development server
|
|
205
|
+
- \`npm run build\` - Build for production
|
|
206
|
+
- \`npm start\` - Run production server
|
|
207
|
+
- \`npm test\` - Run tests`,
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
postCreate: [
|
|
211
|
+
{
|
|
212
|
+
command: 'npm install',
|
|
213
|
+
description: 'Installing dependencies',
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
recommendedSkills: ['test', 'build', 'dev'],
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=node-express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-express.js","sourceRoot":"","sources":["../../../src/scaffold/templates/node-express.ts"],"names":[],"mappings":";;;AAEa,QAAA,mBAAmB,GAAkB;IAChD,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,gCAAgC;IACtC,WAAW,EAAE,uDAAuD;IACpE,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC;IACzD,KAAK,EAAE;QACL;YACE,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4Bd;SACG;QACD;YACE,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;EAkBd;SACG;QACD;YACE,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;IAqBZ;SACC;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE;;;;;;;;;sCASsB;SACjC;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE;;;;;;EAMd;SACG;QACD;YACE,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE;qBACK;SAChB;QACD;YACE,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE;qBACK;SAChB;QACD;YACE,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;UAqBN;SACL;QACD;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAkCoB;SAC/B;QACD;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;2BAkBW;SACtB;KACF;IACD,UAAU,EAAE;QACV;YACE,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,yBAAyB;SACvC;KACF;IACD,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;CAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-fastapi.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/python-fastapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,qBAAqB,EAAE,aAySnC,CAAC"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pythonFastapiTemplate = void 0;
|
|
4
|
+
exports.pythonFastapiTemplate = {
|
|
5
|
+
id: 'python-fastapi',
|
|
6
|
+
name: 'Python + FastAPI',
|
|
7
|
+
description: 'Modern Python API with FastAPI, async support, and auto-generated docs',
|
|
8
|
+
type: 'backend',
|
|
9
|
+
icon: '🐍',
|
|
10
|
+
tags: ['python', 'fastapi', 'backend', 'api', 'async'],
|
|
11
|
+
files: [
|
|
12
|
+
{
|
|
13
|
+
path: 'pyproject.toml',
|
|
14
|
+
template: `[project]
|
|
15
|
+
name = "{{projectName}}"
|
|
16
|
+
version = "0.1.0"
|
|
17
|
+
description = "{{projectDescription}}"
|
|
18
|
+
requires-python = ">=3.11"
|
|
19
|
+
dependencies = [
|
|
20
|
+
"fastapi>=0.115.0",
|
|
21
|
+
"uvicorn[standard]>=0.32.0",
|
|
22
|
+
"pydantic>=2.9.0",
|
|
23
|
+
"python-dotenv>=1.0.0",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.optional-dependencies]
|
|
27
|
+
dev = [
|
|
28
|
+
"pytest>=8.3.0",
|
|
29
|
+
"pytest-asyncio>=0.24.0",
|
|
30
|
+
"httpx>=0.27.0",
|
|
31
|
+
"ruff>=0.7.0",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[tool.ruff]
|
|
35
|
+
line-length = 88
|
|
36
|
+
target-version = "py311"
|
|
37
|
+
|
|
38
|
+
[tool.ruff.lint]
|
|
39
|
+
select = ["E", "F", "I", "N", "W"]
|
|
40
|
+
|
|
41
|
+
[tool.pytest.ini_options]
|
|
42
|
+
asyncio_mode = "auto"`,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
path: 'app/__init__.py',
|
|
46
|
+
template: `"""{{projectName}} - {{projectDescription}}"""
|
|
47
|
+
|
|
48
|
+
__version__ = "0.1.0"`,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
path: 'app/main.py',
|
|
52
|
+
template: `from fastapi import FastAPI
|
|
53
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
54
|
+
|
|
55
|
+
from app.routers import api
|
|
56
|
+
|
|
57
|
+
app = FastAPI(
|
|
58
|
+
title="{{projectName}}",
|
|
59
|
+
description="{{projectDescription}}",
|
|
60
|
+
version="0.1.0",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
app.add_middleware(
|
|
64
|
+
CORSMiddleware,
|
|
65
|
+
allow_origins=["*"],
|
|
66
|
+
allow_credentials=True,
|
|
67
|
+
allow_methods=["*"],
|
|
68
|
+
allow_headers=["*"],
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
app.include_router(api.router, prefix="/api")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@app.get("/health")
|
|
75
|
+
async def health_check():
|
|
76
|
+
"""Health check endpoint."""
|
|
77
|
+
return {"status": "ok"}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@app.get("/")
|
|
81
|
+
async def root():
|
|
82
|
+
"""Root endpoint."""
|
|
83
|
+
return {"message": "Welcome to {{projectName}}"}`,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
path: 'app/routers/__init__.py',
|
|
87
|
+
template: `"""API routers."""`,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
path: 'app/routers/api.py',
|
|
91
|
+
template: `from fastapi import APIRouter
|
|
92
|
+
|
|
93
|
+
router = APIRouter()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@router.get("/")
|
|
97
|
+
async def api_root():
|
|
98
|
+
"""API root endpoint."""
|
|
99
|
+
return {"message": "API v1"}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Add your routes here
|
|
103
|
+
# @router.get("/items")
|
|
104
|
+
# async def get_items():
|
|
105
|
+
# return {"items": []}`,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
path: 'app/models/__init__.py',
|
|
109
|
+
template: `"""Pydantic models."""`,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
path: 'app/models/schemas.py',
|
|
113
|
+
template: `from pydantic import BaseModel
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class HealthResponse(BaseModel):
|
|
117
|
+
"""Health check response."""
|
|
118
|
+
status: str
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class MessageResponse(BaseModel):
|
|
122
|
+
"""Generic message response."""
|
|
123
|
+
message: str
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# Add your models here
|
|
127
|
+
# class Item(BaseModel):
|
|
128
|
+
# id: int
|
|
129
|
+
# name: str
|
|
130
|
+
# description: str | None = None`,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
path: 'app/services/__init__.py',
|
|
134
|
+
template: `"""Business logic services."""`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
path: 'tests/__init__.py',
|
|
138
|
+
template: `"""Tests for {{projectName}}."""`,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
path: 'tests/test_main.py',
|
|
142
|
+
template: `import pytest
|
|
143
|
+
from httpx import ASGITransport, AsyncClient
|
|
144
|
+
|
|
145
|
+
from app.main import app
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@pytest.fixture
|
|
149
|
+
async def client():
|
|
150
|
+
async with AsyncClient(
|
|
151
|
+
transport=ASGITransport(app=app),
|
|
152
|
+
base_url="http://test"
|
|
153
|
+
) as ac:
|
|
154
|
+
yield ac
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@pytest.mark.asyncio
|
|
158
|
+
async def test_health(client: AsyncClient):
|
|
159
|
+
response = await client.get("/health")
|
|
160
|
+
assert response.status_code == 200
|
|
161
|
+
assert response.json() == {"status": "ok"}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@pytest.mark.asyncio
|
|
165
|
+
async def test_root(client: AsyncClient):
|
|
166
|
+
response = await client.get("/")
|
|
167
|
+
assert response.status_code == 200
|
|
168
|
+
assert "message" in response.json()`,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
path: '.env',
|
|
172
|
+
template: `# Environment variables
|
|
173
|
+
DEBUG=true
|
|
174
|
+
HOST=0.0.0.0
|
|
175
|
+
PORT=8000`,
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
path: '.env.example',
|
|
179
|
+
template: `# Environment variables
|
|
180
|
+
DEBUG=true
|
|
181
|
+
HOST=0.0.0.0
|
|
182
|
+
PORT=8000`,
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
path: '.gitignore',
|
|
186
|
+
template: `# Python
|
|
187
|
+
__pycache__/
|
|
188
|
+
*.py[cod]
|
|
189
|
+
*$py.class
|
|
190
|
+
*.so
|
|
191
|
+
.Python
|
|
192
|
+
build/
|
|
193
|
+
dist/
|
|
194
|
+
*.egg-info/
|
|
195
|
+
.eggs/
|
|
196
|
+
|
|
197
|
+
# Virtual environments
|
|
198
|
+
venv/
|
|
199
|
+
.venv/
|
|
200
|
+
ENV/
|
|
201
|
+
|
|
202
|
+
# Environment
|
|
203
|
+
.env
|
|
204
|
+
.env.local
|
|
205
|
+
|
|
206
|
+
# IDE
|
|
207
|
+
.idea/
|
|
208
|
+
.vscode/
|
|
209
|
+
*.swp
|
|
210
|
+
*.swo
|
|
211
|
+
|
|
212
|
+
# Testing
|
|
213
|
+
.pytest_cache/
|
|
214
|
+
.coverage
|
|
215
|
+
htmlcov/
|
|
216
|
+
|
|
217
|
+
# OS
|
|
218
|
+
.DS_Store`,
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
path: 'CLAUDE.md',
|
|
222
|
+
template: `# {{projectName}}
|
|
223
|
+
|
|
224
|
+
{{projectDescription}}
|
|
225
|
+
|
|
226
|
+
## Tech Stack
|
|
227
|
+
- Python 3.11+
|
|
228
|
+
- FastAPI for async web framework
|
|
229
|
+
- Pydantic for data validation
|
|
230
|
+
- Uvicorn for ASGI server
|
|
231
|
+
|
|
232
|
+
## Project Structure
|
|
233
|
+
\`\`\`
|
|
234
|
+
app/
|
|
235
|
+
├── __init__.py
|
|
236
|
+
├── main.py # FastAPI app setup
|
|
237
|
+
├── routers/ # API route handlers
|
|
238
|
+
│ └── api.py
|
|
239
|
+
├── models/ # Pydantic schemas
|
|
240
|
+
│ └── schemas.py
|
|
241
|
+
└── services/ # Business logic
|
|
242
|
+
tests/
|
|
243
|
+
└── test_main.py # API tests
|
|
244
|
+
\`\`\`
|
|
245
|
+
|
|
246
|
+
## Commands
|
|
247
|
+
- \`uv run uvicorn app.main:app --reload\` - Start dev server
|
|
248
|
+
- \`uv run pytest\` - Run tests
|
|
249
|
+
- \`uv run ruff check .\` - Lint code
|
|
250
|
+
- \`uv run ruff format .\` - Format code
|
|
251
|
+
|
|
252
|
+
## API Docs
|
|
253
|
+
- Swagger UI: http://localhost:8000/docs
|
|
254
|
+
- ReDoc: http://localhost:8000/redoc
|
|
255
|
+
|
|
256
|
+
## Development Notes
|
|
257
|
+
- Add routes in \`app/routers/\`
|
|
258
|
+
- Add Pydantic models in \`app/models/\`
|
|
259
|
+
- Add business logic in \`app/services/\`
|
|
260
|
+
- Environment variables in \`.env\``,
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
path: 'README.md',
|
|
264
|
+
template: `# {{projectName}}
|
|
265
|
+
|
|
266
|
+
{{projectDescription}}
|
|
267
|
+
|
|
268
|
+
## Getting Started
|
|
269
|
+
|
|
270
|
+
\`\`\`bash
|
|
271
|
+
# Create virtual environment
|
|
272
|
+
python -m venv venv
|
|
273
|
+
source venv/bin/activate # or venv\\Scripts\\activate on Windows
|
|
274
|
+
|
|
275
|
+
# Install dependencies
|
|
276
|
+
pip install -e ".[dev]"
|
|
277
|
+
|
|
278
|
+
# Run server
|
|
279
|
+
uvicorn app.main:app --reload
|
|
280
|
+
\`\`\`
|
|
281
|
+
|
|
282
|
+
Server will start at http://localhost:8000
|
|
283
|
+
|
|
284
|
+
API docs available at http://localhost:8000/docs
|
|
285
|
+
|
|
286
|
+
## Scripts
|
|
287
|
+
|
|
288
|
+
- \`uvicorn app.main:app --reload\` - Development server
|
|
289
|
+
- \`pytest\` - Run tests
|
|
290
|
+
- \`ruff check .\` - Lint code
|
|
291
|
+
- \`ruff format .\` - Format code`,
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
postCreate: [
|
|
295
|
+
{
|
|
296
|
+
command: 'python -m venv venv && . venv/bin/activate && pip install -e ".[dev]"',
|
|
297
|
+
description: 'Creating virtual environment and installing dependencies',
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
recommendedSkills: ['test', 'dev'],
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=python-fastapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-fastapi.js","sourceRoot":"","sources":["../../../src/scaffold/templates/python-fastapi.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAkB;IAClD,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,wEAAwE;IACrF,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC;IACtD,KAAK,EAAE;QACL;YACE,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA4BM;SACjB;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE;;sBAEM;SACjB;QACD;YACE,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDA+BqC;SAChD;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,oBAAoB;SAC/B;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE;;;;;;;;;;;;;;2BAcW;SACtB;QACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,wBAAwB;SACnC;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE;;;;;;;;;;;;;;;;;qCAiBqB;SAChC;QACD;YACE,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,gCAAgC;SAC3C;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,kCAAkC;SAC7C;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;wCA0BwB;SACnC;QACD;YACE,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE;;;UAGN;SACL;QACD;YACE,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE;;;UAGN;SACL;QACD;YACE,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAgCN;SACL;QACD;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAsCoB;SAC/B;QACD;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;kCA2BkB;SAC7B;KACF;IACD,UAAU,EAAE;QACV;YACE,OAAO,EAAE,uEAAuE;YAChF,WAAW,EAAE,0DAA0D;SACxE;KACF;IACD,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;CACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-mui-website.d.ts","sourceRoot":"","sources":["../../../src/scaffold/templates/react-mui-website.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,uBAAuB,EAAE,aAgZrC,CAAC"}
|