@el-j/magic-helix-core 4.0.0-beta.1 → 4.0.0-beta.3
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/index-B88j4AyE.js +13 -0
- package/dist/index-B88j4AyE.js.map +1 -0
- package/dist/index-CY-pQbuu.cjs +2 -0
- package/dist/index-CY-pQbuu.cjs.map +1 -0
- package/dist/index.cjs +75 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.mjs +2234 -51
- package/dist/index.mjs.map +1 -1
- package/dist/pattern-combiner.d.ts +1 -1
- package/dist/plugin-loader.d.ts +7 -1
- package/package.json +4 -4
- package/dist/BasePlugin-6wv0hYJ9.js +0 -98
- package/dist/BasePlugin-6wv0hYJ9.js.map +0 -1
- package/dist/BasePlugin-odQJAKA-.cjs +0 -2
- package/dist/BasePlugin-odQJAKA-.cjs.map +0 -1
- package/dist/builtin-plugins/base/BasePlugin.d.ts +0 -69
- package/dist/builtin-plugins/csharp/index.d.ts +0 -20
- package/dist/builtin-plugins/go/index.d.ts +0 -23
- package/dist/builtin-plugins/index.d.ts +0 -15
- package/dist/builtin-plugins/java/index.d.ts +0 -22
- package/dist/builtin-plugins/nodejs/index.d.ts +0 -44
- package/dist/builtin-plugins/php/index.d.ts +0 -20
- package/dist/builtin-plugins/python/index.d.ts +0 -27
- package/dist/builtin-plugins/ruby/index.d.ts +0 -20
- package/dist/builtin-plugins/rust/index.d.ts +0 -53
- package/dist/builtin-plugins/swift/index.d.ts +0 -22
- package/dist/default_templates/angular/angular-core.md +0 -19
- package/dist/default_templates/architecture/codeowners.md +0 -123
- package/dist/default_templates/architecture/monorepo.md +0 -146
- package/dist/default_templates/architecture/nx.md +0 -122
- package/dist/default_templates/architecture/turborepo.md +0 -114
- package/dist/default_templates/ci/github-actions.md +0 -268
- package/dist/default_templates/ci/gitlab-ci.md +0 -330
- package/dist/default_templates/containers/docker-multistage.md +0 -120
- package/dist/default_templates/containers/kubernetes-deploy.md +0 -210
- package/dist/default_templates/devops/docker-compose.md +0 -111
- package/dist/default_templates/devops/docker-dockerfile.md +0 -94
- package/dist/default_templates/devops/github-actions.md +0 -160
- package/dist/default_templates/devops/gitlab-ci.md +0 -210
- package/dist/default_templates/dotnet/framework-aspnetcore.md +0 -205
- package/dist/default_templates/dotnet/framework-blazor.md +0 -271
- package/dist/default_templates/dotnet/lang-csharp.md +0 -162
- package/dist/default_templates/generic/lang-typescript.md +0 -11
- package/dist/default_templates/generic/state-redux.md +0 -21
- package/dist/default_templates/generic/state-rxjs.md +0 -6
- package/dist/default_templates/generic/style-mui.md +0 -23
- package/dist/default_templates/generic/style-tailwind.md +0 -6
- package/dist/default_templates/generic/test-cypress.md +0 -21
- package/dist/default_templates/generic/test-jest.md +0 -20
- package/dist/default_templates/generic/test-playwright.md +0 -21
- package/dist/default_templates/generic/test-vitest.md +0 -6
- package/dist/default_templates/go/lang-go.md +0 -571
- package/dist/default_templates/java/build-gradle.md +0 -102
- package/dist/default_templates/java/build-maven.md +0 -86
- package/dist/default_templates/java/framework-spring-boot.md +0 -179
- package/dist/default_templates/java/lang-java.md +0 -78
- package/dist/default_templates/java/lang-kotlin.md +0 -88
- package/dist/default_templates/meta/magic-helix-meta.md +0 -213
- package/dist/default_templates/meta/meta-debug.md +0 -459
- package/dist/default_templates/meta/meta-implement.md +0 -450
- package/dist/default_templates/meta/meta-roadmap.md +0 -265
- package/dist/default_templates/nestjs/nestjs-core.md +0 -7
- package/dist/default_templates/patterns/architecture/clean-architecture.md +0 -469
- package/dist/default_templates/patterns/architecture/dependency-injection.md +0 -517
- package/dist/default_templates/patterns/architecture/domain-driven-design.md +0 -621
- package/dist/default_templates/patterns/architecture/layered-architecture.md +0 -382
- package/dist/default_templates/patterns/architecture/repository-pattern.md +0 -408
- package/dist/default_templates/patterns/domain-expertise/nextjs-rules.md +0 -115
- package/dist/default_templates/patterns/domain-expertise/react-patterns.md +0 -181
- package/dist/default_templates/patterns/domain-expertise/server-components.md +0 -212
- package/dist/default_templates/patterns/domain-expertise/shadcn-ui.md +0 -52
- package/dist/default_templates/patterns/domain-expertise/tailwind-patterns.md +0 -52
- package/dist/default_templates/patterns/environment/container-awareness.md +0 -17
- package/dist/default_templates/patterns/environment/ide-features.md +0 -17
- package/dist/default_templates/patterns/environment/os-commands.md +0 -17
- package/dist/default_templates/patterns/organization/heading-hierarchy.md +0 -103
- package/dist/default_templates/patterns/organization/sequential-workflows.md +0 -102
- package/dist/default_templates/patterns/organization/xml-rule-groups.md +0 -64
- package/dist/default_templates/patterns/reasoning/agent-loop.md +0 -151
- package/dist/default_templates/patterns/reasoning/confirmation-gates.md +0 -141
- package/dist/default_templates/patterns/reasoning/dependency-analysis.md +0 -132
- package/dist/default_templates/patterns/reasoning/one-tool-per-iteration.md +0 -152
- package/dist/default_templates/patterns/reasoning/preview-before-action.md +0 -194
- package/dist/default_templates/patterns/reasoning/reflection-checkpoints.md +0 -166
- package/dist/default_templates/patterns/reasoning/result-verification.md +0 -157
- package/dist/default_templates/patterns/reasoning/subtask-breakdown.md +0 -131
- package/dist/default_templates/patterns/reasoning/thinking-tags.md +0 -100
- package/dist/default_templates/patterns/role-definition/capability-declarations.md +0 -72
- package/dist/default_templates/patterns/role-definition/expert-identity.md +0 -45
- package/dist/default_templates/patterns/role-definition/scope-boundaries.md +0 -61
- package/dist/default_templates/patterns/safety/code-safety-rules.md +0 -17
- package/dist/default_templates/patterns/safety/credential-handling.md +0 -17
- package/dist/default_templates/patterns/safety/destructive-warnings.md +0 -17
- package/dist/default_templates/patterns/safety/refusal-messages.md +0 -17
- package/dist/default_templates/patterns/tone/adaptive-tone.md +0 -17
- package/dist/default_templates/patterns/tone/concise-communication.md +0 -17
- package/dist/default_templates/patterns/tone/forbidden-phrases.md +0 -17
- package/dist/default_templates/patterns/tool-guidelines/function-schemas.md +0 -143
- package/dist/default_templates/patterns/tool-guidelines/parameter-examples.md +0 -137
- package/dist/default_templates/patterns/tool-guidelines/usage-policies.md +0 -105
- package/dist/default_templates/php/framework-laravel.md +0 -112
- package/dist/default_templates/php/lang-php.md +0 -94
- package/dist/default_templates/python/lang-python.md +0 -508
- package/dist/default_templates/react/react-core.md +0 -677
- package/dist/default_templates/react/react-zustand.md +0 -7
- package/dist/default_templates/ruby/framework-rails.md +0 -309
- package/dist/default_templates/ruby/framework-sinatra.md +0 -227
- package/dist/default_templates/ruby/lang-ruby.md +0 -216
- package/dist/default_templates/rust/lang-rust.md +0 -89
- package/dist/default_templates/swift/framework-vapor.md +0 -352
- package/dist/default_templates/swift/lang-swift.md +0 -291
- package/dist/default_templates/vue/style-primevue.md +0 -6
- package/dist/default_templates/vue/style-quasar.md +0 -22
- package/dist/default_templates/vue/vue-core.md +0 -28
- package/dist/default_templates/vue/vue-pinia.md +0 -5
- package/dist/index-AkVwRl-r.js +0 -92
- package/dist/index-AkVwRl-r.js.map +0 -1
- package/dist/index-B6BeG1yT.cjs +0 -68
- package/dist/index-B6BeG1yT.cjs.map +0 -1
- package/dist/index-B8pyjKdF.js +0 -94
- package/dist/index-B8pyjKdF.js.map +0 -1
- package/dist/index-B_6W_RnJ.cjs +0 -76
- package/dist/index-B_6W_RnJ.cjs.map +0 -1
- package/dist/index-Bg8DD8ku.js +0 -216
- package/dist/index-Bg8DD8ku.js.map +0 -1
- package/dist/index-BkJhe5Af.js +0 -1748
- package/dist/index-BkJhe5Af.js.map +0 -1
- package/dist/index-Bv4Q1Pr7.cjs +0 -33
- package/dist/index-Bv4Q1Pr7.cjs.map +0 -1
- package/dist/index-CN8J45Nc.cjs +0 -24
- package/dist/index-CN8J45Nc.cjs.map +0 -1
- package/dist/index-CPbv2Od1.js +0 -62
- package/dist/index-CPbv2Od1.js.map +0 -1
- package/dist/index-Cf-MC6Al.js +0 -63
- package/dist/index-Cf-MC6Al.js.map +0 -1
- package/dist/index-DDPXXXDy.cjs +0 -19
- package/dist/index-DDPXXXDy.cjs.map +0 -1
- package/dist/index-DO30AzDe.cjs +0 -19
- package/dist/index-DO30AzDe.cjs.map +0 -1
- package/dist/index-Dm37u5ut.js +0 -2128
- package/dist/index-Dm37u5ut.js.map +0 -1
- package/dist/index-DqHvgoXJ.cjs +0 -19
- package/dist/index-DqHvgoXJ.cjs.map +0 -1
- package/dist/index-J1qAfsnO.cjs +0 -2
- package/dist/index-J1qAfsnO.cjs.map +0 -1
- package/dist/index-Jz0HYZ7B.js +0 -13
- package/dist/index-Jz0HYZ7B.js.map +0 -1
- package/dist/index-K39pdw94.cjs +0 -31
- package/dist/index-K39pdw94.cjs.map +0 -1
- package/dist/index-L3IVvhd1.cjs +0 -89
- package/dist/index-L3IVvhd1.cjs.map +0 -1
- package/dist/index-OT2XAJkc.js +0 -117
- package/dist/index-OT2XAJkc.js.map +0 -1
- package/dist/index-TPAX4XKg.cjs +0 -30
- package/dist/index-TPAX4XKg.cjs.map +0 -1
- package/dist/index-WmVSB57y.js +0 -107
- package/dist/index-WmVSB57y.js.map +0 -1
- package/dist/index-mYXvc3Fs.js +0 -68
- package/dist/index-mYXvc3Fs.js.map +0 -1
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
# Swift Language Instructions
|
|
2
|
-
|
|
3
|
-
## Project Type
|
|
4
|
-
- Language: Swift
|
|
5
|
-
- Package Manager: Swift Package Manager (SPM)
|
|
6
|
-
- Platform: {iOS|macOS|Linux|Server}
|
|
7
|
-
|
|
8
|
-
## Build Commands
|
|
9
|
-
|
|
10
|
-
### Swift Package Manager
|
|
11
|
-
```bash
|
|
12
|
-
swift build # Build project
|
|
13
|
-
swift test # Run tests
|
|
14
|
-
swift run # Run executable
|
|
15
|
-
swift package update # Update dependencies
|
|
16
|
-
swift package clean # Clean build artifacts
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Xcode
|
|
20
|
-
```bash
|
|
21
|
-
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15'
|
|
22
|
-
xcodebuild test -scheme MyApp
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Code Conventions
|
|
26
|
-
|
|
27
|
-
### Swift Basics
|
|
28
|
-
```swift
|
|
29
|
-
// Variables and constants
|
|
30
|
-
var mutableValue = 42
|
|
31
|
-
let constantValue = 100
|
|
32
|
-
|
|
33
|
-
// Optionals
|
|
34
|
-
var name: String? = "John"
|
|
35
|
-
if let unwrappedName = name {
|
|
36
|
-
print(unwrappedName)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Nil coalescing
|
|
40
|
-
let displayName = name ?? "Anonymous"
|
|
41
|
-
|
|
42
|
-
// Optional chaining
|
|
43
|
-
let length = user?.name?.count
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### Structs and Classes
|
|
47
|
-
```swift
|
|
48
|
-
struct User {
|
|
49
|
-
let id: UUID
|
|
50
|
-
var name: String
|
|
51
|
-
var email: String
|
|
52
|
-
|
|
53
|
-
func fullProfile() -> String {
|
|
54
|
-
"\(name) <\(email)>"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
class UserRepository {
|
|
59
|
-
private var users: [User] = []
|
|
60
|
-
|
|
61
|
-
func add(_ user: User) {
|
|
62
|
-
users.append(user)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
func find(by id: UUID) -> User? {
|
|
66
|
-
users.first { $0.id == id }
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Protocols and Extensions
|
|
72
|
-
```swift
|
|
73
|
-
protocol Identifiable {
|
|
74
|
-
var id: UUID { get }
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
extension User: Identifiable {}
|
|
78
|
-
|
|
79
|
-
extension String {
|
|
80
|
-
func toSnakeCase() -> String {
|
|
81
|
-
// Implementation
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Async/Await (Concurrency)
|
|
87
|
-
```swift
|
|
88
|
-
func fetchUser(id: UUID) async throws -> User {
|
|
89
|
-
let (data, _) = try await URLSession.shared.data(from: url)
|
|
90
|
-
return try JSONDecoder().decode(User.self, from: data)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Usage
|
|
94
|
-
Task {
|
|
95
|
-
do {
|
|
96
|
-
let user = try await fetchUser(id: userId)
|
|
97
|
-
print(user.name)
|
|
98
|
-
} catch {
|
|
99
|
-
print("Error: \(error)")
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Error Handling
|
|
105
|
-
```swift
|
|
106
|
-
enum UserError: Error {
|
|
107
|
-
case notFound
|
|
108
|
-
case invalidEmail
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
func getUser(id: UUID) throws -> User {
|
|
112
|
-
guard let user = findUser(id) else {
|
|
113
|
-
throw UserError.notFound
|
|
114
|
-
}
|
|
115
|
-
return user
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Usage
|
|
119
|
-
do {
|
|
120
|
-
let user = try getUser(id: userId)
|
|
121
|
-
} catch UserError.notFound {
|
|
122
|
-
print("User not found")
|
|
123
|
-
} catch {
|
|
124
|
-
print("Unknown error: \(error)")
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Testing with XCTest
|
|
129
|
-
|
|
130
|
-
```swift
|
|
131
|
-
import XCTest
|
|
132
|
-
@testable import MyApp
|
|
133
|
-
|
|
134
|
-
final class UserTests: XCTestCase {
|
|
135
|
-
func testUserFullProfile() {
|
|
136
|
-
let user = User(
|
|
137
|
-
id: UUID(),
|
|
138
|
-
name: "John",
|
|
139
|
-
email: "john@example.com"
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
XCTAssertEqual(user.fullProfile(), "John <john@example.com>")
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
func testAsyncFunction() async throws {
|
|
146
|
-
let user = try await fetchUser(id: testUserId)
|
|
147
|
-
XCTAssertEqual(user.name, "John")
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Docker for Server-Side Swift
|
|
153
|
-
|
|
154
|
-
### Multi-stage Dockerfile
|
|
155
|
-
```dockerfile
|
|
156
|
-
# Build stage
|
|
157
|
-
FROM swift:5.9-jammy AS build
|
|
158
|
-
WORKDIR /app
|
|
159
|
-
|
|
160
|
-
COPY Package.swift Package.resolved ./
|
|
161
|
-
RUN swift package resolve
|
|
162
|
-
|
|
163
|
-
COPY . .
|
|
164
|
-
RUN swift build -c release --static-swift-stdlib
|
|
165
|
-
|
|
166
|
-
# Runtime stage
|
|
167
|
-
FROM ubuntu:22.04
|
|
168
|
-
WORKDIR /app
|
|
169
|
-
|
|
170
|
-
RUN apt-get update && apt-get install -y \
|
|
171
|
-
libcurl4 \
|
|
172
|
-
libxml2 \
|
|
173
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
174
|
-
|
|
175
|
-
COPY --from=build /app/.build/release/MyApp ./
|
|
176
|
-
|
|
177
|
-
RUN useradd -m -u 1000 swift
|
|
178
|
-
USER swift
|
|
179
|
-
|
|
180
|
-
EXPOSE 8080
|
|
181
|
-
CMD ["./MyApp"]
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Docker Compose
|
|
185
|
-
```yaml
|
|
186
|
-
services:
|
|
187
|
-
app:
|
|
188
|
-
build: .
|
|
189
|
-
ports:
|
|
190
|
-
- "8080:8080"
|
|
191
|
-
environment:
|
|
192
|
-
- DATABASE_URL=postgresql://postgres:password@db/myapp
|
|
193
|
-
depends_on:
|
|
194
|
-
- db
|
|
195
|
-
|
|
196
|
-
db:
|
|
197
|
-
image: postgres:15-alpine
|
|
198
|
-
environment:
|
|
199
|
-
POSTGRES_PASSWORD: password
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## Package.swift Structure
|
|
203
|
-
|
|
204
|
-
```swift
|
|
205
|
-
// swift-tools-version: 5.9
|
|
206
|
-
import PackageDescription
|
|
207
|
-
|
|
208
|
-
let package = Package(
|
|
209
|
-
name: "MyApp",
|
|
210
|
-
platforms: [
|
|
211
|
-
.macOS(.v13),
|
|
212
|
-
.iOS(.v16),
|
|
213
|
-
.linux
|
|
214
|
-
],
|
|
215
|
-
products: [
|
|
216
|
-
.executable(name: "MyApp", targets: ["MyApp"]),
|
|
217
|
-
.library(name: "MyLibrary", targets: ["MyLibrary"])
|
|
218
|
-
],
|
|
219
|
-
dependencies: [
|
|
220
|
-
.package(url: "https://github.com/vapor/vapor.git", from: "4.89.0")
|
|
221
|
-
],
|
|
222
|
-
targets: [
|
|
223
|
-
.executableTarget(
|
|
224
|
-
name: "MyApp",
|
|
225
|
-
dependencies: [
|
|
226
|
-
.product(name: "Vapor", package: "vapor")
|
|
227
|
-
]
|
|
228
|
-
),
|
|
229
|
-
.testTarget(
|
|
230
|
-
name: "MyAppTests",
|
|
231
|
-
dependencies: ["MyApp"]
|
|
232
|
-
)
|
|
233
|
-
]
|
|
234
|
-
)
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
## Memory Management
|
|
238
|
-
|
|
239
|
-
```swift
|
|
240
|
-
// ARC (Automatic Reference Counting)
|
|
241
|
-
class User {
|
|
242
|
-
var name: String
|
|
243
|
-
init(name: String) { self.name = name }
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Weak references to avoid retain cycles
|
|
247
|
-
class ViewController {
|
|
248
|
-
weak var delegate: UserDelegate?
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Unowned for guaranteed non-nil references
|
|
252
|
-
class Order {
|
|
253
|
-
unowned let customer: Customer
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
## Performance Tips
|
|
258
|
-
|
|
259
|
-
- Use value types (structs) for immutable data
|
|
260
|
-
- Leverage copy-on-write for collections
|
|
261
|
-
- Use `lazy` for expensive computations
|
|
262
|
-
- Profile with Instruments
|
|
263
|
-
- Use `@inlinable` for small, frequently-called functions
|
|
264
|
-
- Prefer `async/await` over completion handlers
|
|
265
|
-
- Use actors for thread-safe state
|
|
266
|
-
|
|
267
|
-
## Common Frameworks
|
|
268
|
-
|
|
269
|
-
### iOS/macOS
|
|
270
|
-
- **SwiftUI**: Modern declarative UI
|
|
271
|
-
- **Combine**: Reactive programming
|
|
272
|
-
- **CoreData**: Persistence
|
|
273
|
-
- **URLSession**: Networking
|
|
274
|
-
|
|
275
|
-
### Server-Side
|
|
276
|
-
- **Vapor**: Web framework
|
|
277
|
-
- **Fluent**: ORM
|
|
278
|
-
- **PostgresNIO**: PostgreSQL driver
|
|
279
|
-
- **AsyncHTTPClient**: HTTP client
|
|
280
|
-
|
|
281
|
-
## Best Practices
|
|
282
|
-
|
|
283
|
-
- Use optionals appropriately
|
|
284
|
-
- Prefer value types over reference types
|
|
285
|
-
- Use guard statements for early returns
|
|
286
|
-
- Implement proper error handling
|
|
287
|
-
- Write unit tests
|
|
288
|
-
- Use protocols for abstraction
|
|
289
|
-
- Follow Swift naming conventions
|
|
290
|
-
- Use type inference wisely
|
|
291
|
-
- Leverage Swift's type safety
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
# UI Library: PrimeVue
|
|
2
|
-
- **ALWAYS** use PrimeVue components for UI elements (Button, InputText, DataTable).
|
|
3
|
-
- **STYLING**: Use PrimeVue's "pass-through" (PT) properties to apply Tailwind classes for customization.
|
|
4
|
-
- **NEVER** override PrimeVue styles with global CSS.
|
|
5
|
-
- **ICONS**: Use the icon library configured with PrimeVue (e.g., PrimeIcons or MDI).
|
|
6
|
-
- **FORMS**: Use `vee-validate` in combination with PrimeVue form components.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Styling: Quasar (Vue)
|
|
2
|
-
- **ALWAYS** use Quasar v2+ with Vue 3 Composition API.
|
|
3
|
-
- **ALWAYS** use `q-` prefixed classes for Quasar components.
|
|
4
|
-
- **ALWAYS** use `QLayout`, `QHeader`, `QDrawer`, `QPage` for app structure.
|
|
5
|
-
- **ALWAYS** use `QBtn` with appropriate color and size props.
|
|
6
|
-
- **ALWAYS** use `QInput` and `QSelect` for form inputs.
|
|
7
|
-
- **ALWAYS** use `QCard`, `QCardSection` for content containers.
|
|
8
|
-
- **ALWAYS** use `QTable` for data tables with proper column definitions.
|
|
9
|
-
- **ALWAYS** use `QDialog` for modals with `v-model` binding.
|
|
10
|
-
- **ALWAYS** use `QMenu` for context menus and dropdowns.
|
|
11
|
-
- **ALWAYS** use `QChip` for tags and status indicators.
|
|
12
|
-
- **ALWAYS** use `QAvatar` for user profile displays.
|
|
13
|
-
- **ALWAYS** use `QList` and `QItem` for navigation and lists.
|
|
14
|
-
- **ALWAYS** use `QStepper` for multi-step processes.
|
|
15
|
-
- **ALWAYS** use `QTabs` and `QTab` for tabbed interfaces.
|
|
16
|
-
- **ALWAYS** use `QExpansionItem` for collapsible content.
|
|
17
|
-
- **ALWAYS** use `QSpinner` for loading states.
|
|
18
|
-
- **ALWAYS** use `QNotify` for toast notifications.
|
|
19
|
-
- **ALWAYS** use `QLoading` for full-screen loading overlays.
|
|
20
|
-
- **ALWAYS** use `Dark` plugin for dark mode support.
|
|
21
|
-
- **ALWAYS** use `Quasar.lang` for internationalization.
|
|
22
|
-
- **ALWAYS** use `Quasar.iconSet` for custom icon sets.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Framework: Vue 3
|
|
2
|
-
- **ALWAYS** use Vue 3.
|
|
3
|
-
- **ALWAYS** use the Composition API.
|
|
4
|
-
- **NEVER** use the Options API.
|
|
5
|
-
- **ALWAYS** use `<script setup lang="ts">`.
|
|
6
|
-
- **WHEN POSSIBLE** use `<script setup lang="ts" generic="T">` with generic type interfaces.
|
|
7
|
-
- **ALWAYS** use TypeScript.
|
|
8
|
-
- **PREFER** `defineModel` where `defineProps` with `defineEmits` update is needed.
|
|
9
|
-
- **ALWAYS** Use single-file components (`.vue` files) but logic free
|
|
10
|
-
- **ALWAYS** Use composables to create the vue reactivity "bridge" using logic from utils.
|
|
11
|
-
- **ALWAYS** Use utility functions for **all** logic, without vue-dependency
|
|
12
|
-
- **ALWAYS** Use Vitest for unit tests of all utils and composables.
|
|
13
|
-
- **ALWAYS** create composable folders with the `composableName` and inside:
|
|
14
|
-
- `index.ts` for main composable export
|
|
15
|
-
- `types/` folder for types/interfaces with single files for each type and index.ts exporting them
|
|
16
|
-
- `utils/` for helper functions with single files for each util and index.ts exporting them
|
|
17
|
-
- `__tests__/` folder for unit tests with single test files for each unit test and index.ts exporting them
|
|
18
|
-
- **ALWAYS** Use templates only for rendering, avoid logic in templates.
|
|
19
|
-
- **ALWAYS** define Props and emits with `defineProps` and `defineEmits`
|
|
20
|
-
- **ALWAYS** Use `ref()` for primitive values and `reactive()` for objects.
|
|
21
|
-
- **ALWAYS** Use `computed` for derived state.
|
|
22
|
-
- **ALWAYS** Use `watch` or `watchEffect` for side effects. but **AVOID** overusing them.
|
|
23
|
-
- **ALWAYS** Use Vue Router for routing.
|
|
24
|
-
- **AVOID** Use Pinia for state management. Relay on props and emits for component communication.
|
|
25
|
-
- **ALWAYS** Use Vue's built-in directives (`v-if`, `v-for`, `v-show`, etc.) for conditional rendering and list rendering.
|
|
26
|
-
- **ALWAYS** Use slots for component composition.
|
|
27
|
-
- **ALWAYS** Use Vue Devtools for debugging and performance monitoring.
|
|
28
|
-
- **ALWAYS** Follow Vue's official style guide for best practices and conventions.
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# State: Pinia
|
|
2
|
-
- **ALWAYS** use Pinia for global state management.
|
|
3
|
-
- Define stores in the `src/stores` directory (e.g., `useUserStore.ts`).
|
|
4
|
-
- **ALWAYS** use the `setup` store syntax (function-based) instead of the `options` store syntax.
|
|
5
|
-
- **NEVER** access `localStorage` directly from a component. Encapsulate this logic within the Pinia store itself.
|
package/dist/index-AkVwRl-r.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { B as o } from "./BasePlugin-6wv0hYJ9.js";
|
|
2
|
-
class d extends o {
|
|
3
|
-
constructor() {
|
|
4
|
-
super(...arguments), this.name = "java", this.displayName = "Java", this.version = "3.0.0", this.priority = 75;
|
|
5
|
-
}
|
|
6
|
-
async detect(e) {
|
|
7
|
-
return this.fileExists(e, "pom.xml") ? this.detectMaven(e) : this.fileExists(e, "build.gradle") || this.fileExists(e, "build.gradle.kts") ? this.detectGradle(e) : null;
|
|
8
|
-
}
|
|
9
|
-
getTemplates() {
|
|
10
|
-
return [
|
|
11
|
-
{
|
|
12
|
-
name: "java-core",
|
|
13
|
-
tags: ["java"],
|
|
14
|
-
content: `# Java Development Guidelines
|
|
15
|
-
|
|
16
|
-
This project uses Java.
|
|
17
|
-
|
|
18
|
-
## Project Structure
|
|
19
|
-
- Follow Maven/Gradle conventions
|
|
20
|
-
- Organize in packages
|
|
21
|
-
- Use proper dependency management
|
|
22
|
-
|
|
23
|
-
## Code Style
|
|
24
|
-
- Follow Java naming conventions
|
|
25
|
-
- Use Google Java Style or similar
|
|
26
|
-
- Leverage IDE formatting
|
|
27
|
-
|
|
28
|
-
## Best Practices
|
|
29
|
-
- Use appropriate design patterns
|
|
30
|
-
- Handle exceptions properly
|
|
31
|
-
- Write Javadoc for public APIs
|
|
32
|
-
|
|
33
|
-
## Testing
|
|
34
|
-
- Write JUnit tests
|
|
35
|
-
- Use Mockito for mocking
|
|
36
|
-
- Aim for good test coverage`
|
|
37
|
-
}
|
|
38
|
-
];
|
|
39
|
-
}
|
|
40
|
-
getDependencyTagMap() {
|
|
41
|
-
return {
|
|
42
|
-
"org.springframework.boot:spring-boot": "spring-boot",
|
|
43
|
-
"spring-boot-starter": "spring-boot",
|
|
44
|
-
junit: "junit"
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
detectMaven(e) {
|
|
48
|
-
const t = this.readFile(e, "pom.xml");
|
|
49
|
-
if (!t)
|
|
50
|
-
return {
|
|
51
|
-
language: "Java",
|
|
52
|
-
name: this.getProjectName(e),
|
|
53
|
-
dependencies: {},
|
|
54
|
-
manifestFile: "pom.xml",
|
|
55
|
-
projectPath: e
|
|
56
|
-
};
|
|
57
|
-
const n = t.match(/<artifactId>([^<]+)<\/artifactId>/), s = t.match(/<description>([^<]+)<\/description>/), a = {}, i = t.matchAll(
|
|
58
|
-
/<dependency>[\s\S]*?<groupId>([^<]+)<\/groupId>[\s\S]*?<artifactId>([^<]+)<\/artifactId>[\s\S]*?(?:<version>([^<]+)<\/version>)?/g
|
|
59
|
-
);
|
|
60
|
-
for (const r of i)
|
|
61
|
-
a[`${r[1]}:${r[2]}`] = r[3] || "*";
|
|
62
|
-
return {
|
|
63
|
-
language: "Java",
|
|
64
|
-
name: n?.[1] || this.getProjectName(e),
|
|
65
|
-
description: s?.[1],
|
|
66
|
-
dependencies: a,
|
|
67
|
-
manifestFile: "pom.xml",
|
|
68
|
-
projectPath: e
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
detectGradle(e) {
|
|
72
|
-
const t = this.fileExists(e, "build.gradle") ? "build.gradle" : "build.gradle.kts", n = this.readFile(e, t), s = {};
|
|
73
|
-
if (n) {
|
|
74
|
-
const a = n.matchAll(
|
|
75
|
-
/(?:implementation|api|testImplementation)\s*['"]([^:'"]+):([^:'"]+):?([^'"]*)['"]/g
|
|
76
|
-
);
|
|
77
|
-
for (const i of a)
|
|
78
|
-
s[`${i[1]}:${i[2]}`] = i[3] || "*";
|
|
79
|
-
}
|
|
80
|
-
return {
|
|
81
|
-
language: "Java/Kotlin",
|
|
82
|
-
name: this.getProjectName(e),
|
|
83
|
-
dependencies: s,
|
|
84
|
-
manifestFile: t,
|
|
85
|
-
projectPath: e
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
export {
|
|
90
|
-
d as JavaPlugin
|
|
91
|
-
};
|
|
92
|
-
//# sourceMappingURL=index-AkVwRl-r.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-AkVwRl-r.js","sources":["../src/builtin-plugins/java/index.ts"],"sourcesContent":["/**\n * Java Language Plugin\n *\n * Detects Java projects via pom.xml (Maven) or build.gradle (Gradle)\n */\n\nimport type { ProjectMetadata, TemplateDefinition } from '../../types';\nimport { BasePlugin } from '../base/BasePlugin';\n\nexport class JavaPlugin extends BasePlugin {\n name = 'java';\n displayName = 'Java';\n version = '3.0.0';\n priority = 75;\n\n async detect(projectPath: string): Promise<ProjectMetadata | null> {\n // Check for Maven\n if (this.fileExists(projectPath, 'pom.xml')) {\n return this.detectMaven(projectPath);\n }\n\n // Check for Gradle\n if (\n this.fileExists(projectPath, 'build.gradle') ||\n this.fileExists(projectPath, 'build.gradle.kts')\n ) {\n return this.detectGradle(projectPath);\n }\n\n return null;\n }\n\n getTemplates(): TemplateDefinition[] {\n return [\n {\n name: 'java-core',\n tags: ['java'],\n content: `# Java Development Guidelines\n\nThis project uses Java.\n\n## Project Structure\n- Follow Maven/Gradle conventions\n- Organize in packages\n- Use proper dependency management\n\n## Code Style\n- Follow Java naming conventions\n- Use Google Java Style or similar\n- Leverage IDE formatting\n\n## Best Practices\n- Use appropriate design patterns\n- Handle exceptions properly\n- Write Javadoc for public APIs\n\n## Testing\n- Write JUnit tests\n- Use Mockito for mocking\n- Aim for good test coverage`,\n },\n ];\n }\n\n getDependencyTagMap() {\n return {\n 'org.springframework.boot:spring-boot': 'spring-boot',\n 'spring-boot-starter': 'spring-boot',\n junit: 'junit',\n };\n }\n\n private detectMaven(projectPath: string): ProjectMetadata {\n const content = this.readFile(projectPath, 'pom.xml');\n if (!content) {\n return {\n language: 'Java',\n name: this.getProjectName(projectPath),\n dependencies: {},\n manifestFile: 'pom.xml',\n projectPath,\n };\n }\n\n const artifactMatch = content.match(/<artifactId>([^<]+)<\\/artifactId>/);\n const descMatch = content.match(/<description>([^<]+)<\\/description>/);\n const deps: Record<string, string> = {};\n\n const depMatches = content.matchAll(\n /<dependency>[\\s\\S]*?<groupId>([^<]+)<\\/groupId>[\\s\\S]*?<artifactId>([^<]+)<\\/artifactId>[\\s\\S]*?(?:<version>([^<]+)<\\/version>)?/g,\n );\n for (const match of depMatches) {\n deps[`${match[1]}:${match[2]}`] = match[3] || '*';\n }\n\n return {\n language: 'Java',\n name: artifactMatch?.[1] || this.getProjectName(projectPath),\n description: descMatch?.[1],\n dependencies: deps,\n manifestFile: 'pom.xml',\n projectPath,\n };\n }\n\n private detectGradle(projectPath: string): ProjectMetadata {\n const manifestFile = this.fileExists(projectPath, 'build.gradle')\n ? 'build.gradle'\n : 'build.gradle.kts';\n\n const content = this.readFile(projectPath, manifestFile);\n const deps: Record<string, string> = {};\n\n if (content) {\n const depMatches = content.matchAll(\n /(?:implementation|api|testImplementation)\\s*['\"]([^:'\"]+):([^:'\"]+):?([^'\"]*)['\"]/g,\n );\n for (const match of depMatches) {\n deps[`${match[1]}:${match[2]}`] = match[3] || '*';\n }\n }\n\n return {\n language: 'Java/Kotlin',\n name: this.getProjectName(projectPath),\n dependencies: deps,\n manifestFile,\n projectPath,\n };\n }\n}\n"],"names":["JavaPlugin","BasePlugin","projectPath","content","artifactMatch","descMatch","deps","depMatches","match","manifestFile"],"mappings":";AASO,MAAMA,UAAmBC,EAAW;AAAA,EAApC,cAAA;AAAA,UAAA,GAAA,SAAA,GACL,KAAA,OAAO,QACP,KAAA,cAAc,QACd,KAAA,UAAU,SACV,KAAA,WAAW;AAAA,EAAA;AAAA,EAEX,MAAM,OAAOC,GAAsD;AAEjE,WAAI,KAAK,WAAWA,GAAa,SAAS,IACjC,KAAK,YAAYA,CAAW,IAKnC,KAAK,WAAWA,GAAa,cAAc,KAC3C,KAAK,WAAWA,GAAa,kBAAkB,IAExC,KAAK,aAAaA,CAAW,IAG/B;AAAA,EACT;AAAA,EAEA,eAAqC;AACnC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC,MAAM;AAAA,QACb,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA;AAAA,IAuBX;AAAA,EAEJ;AAAA,EAEA,sBAAsB;AACpB,WAAO;AAAA,MACL,wCAAwC;AAAA,MACxC,uBAAuB;AAAA,MACvB,OAAO;AAAA,IAAA;AAAA,EAEX;AAAA,EAEQ,YAAYA,GAAsC;AACxD,UAAMC,IAAU,KAAK,SAASD,GAAa,SAAS;AACpD,QAAI,CAACC;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,KAAK,eAAeD,CAAW;AAAA,QACrC,cAAc,CAAA;AAAA,QACd,cAAc;AAAA,QACd,aAAAA;AAAA,MAAA;AAIJ,UAAME,IAAgBD,EAAQ,MAAM,mCAAmC,GACjEE,IAAYF,EAAQ,MAAM,qCAAqC,GAC/DG,IAA+B,CAAA,GAE/BC,IAAaJ,EAAQ;AAAA,MACzB;AAAA,IAAA;AAEF,eAAWK,KAASD;AAClB,MAAAD,EAAK,GAAGE,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,EAAE,IAAIA,EAAM,CAAC,KAAK;AAGhD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAMJ,IAAgB,CAAC,KAAK,KAAK,eAAeF,CAAW;AAAA,MAC3D,aAAaG,IAAY,CAAC;AAAA,MAC1B,cAAcC;AAAA,MACd,cAAc;AAAA,MACd,aAAAJ;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,aAAaA,GAAsC;AACzD,UAAMO,IAAe,KAAK,WAAWP,GAAa,cAAc,IAC5D,iBACA,oBAEEC,IAAU,KAAK,SAASD,GAAaO,CAAY,GACjDH,IAA+B,CAAA;AAErC,QAAIH,GAAS;AACX,YAAMI,IAAaJ,EAAQ;AAAA,QACzB;AAAA,MAAA;AAEF,iBAAWK,KAASD;AAClB,QAAAD,EAAK,GAAGE,EAAM,CAAC,CAAC,IAAIA,EAAM,CAAC,CAAC,EAAE,IAAIA,EAAM,CAAC,KAAK;AAAA,IAElD;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,eAAeN,CAAW;AAAA,MACrC,cAAcI;AAAA,MACd,cAAAG;AAAA,MACA,aAAAP;AAAA,IAAA;AAAA,EAEJ;AACF;"}
|
package/dist/index-B6BeG1yT.cjs
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("node:path"),c=require("./BasePlugin-odQJAKA-.cjs");function p(n){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const t in n)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:()=>n[t]})}}return e.default=n,Object.freeze(e)}const s=p(o);class l extends c.BasePlugin{constructor(){super(...arguments),this.name="nodejs",this.displayName="Node.js",this.version="3.0.0",this.priority=100}async detect(e){if(!this.fileExists(e,"package.json"))return null;const t=this.readJSON(e,"package.json");if(!t)return{language:"JavaScript/TypeScript",name:this.getProjectName(e),dependencies:{},manifestFile:"package.json",projectPath:e};const a=this.parseDependencies(t,"dependencies","devDependencies"),i={language:"JavaScript/TypeScript",name:t.name||this.getProjectName(e),description:t.description,dependencies:a,manifestFile:"package.json",projectPath:e},r=this.extractWorkspaces(t);return r.length>0&&(i.workspaceMembers=r),i}getTemplates(){return[{name:"lang-typescript",tags:["typescript"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/lang-typescript.md")).then(e=>e||this.getTypescriptTemplate())},{name:"react-core",tags:["react"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/react-core.md")).then(e=>e||this.getReactTemplate())},{name:"react-zustand",tags:["zustand"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/react-zustand.md")).then(e=>e||this.getReactZustandTemplate())},{name:"vue-core",tags:["vue"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/vue-core.md")).then(e=>e||this.getVueTemplate())},{name:"vue-pinia",tags:["pinia"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/vue-pinia.md")).then(e=>e||this.getVuePiniaTemplate())},{name:"nestjs-core",tags:["nestjs"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/nestjs-core.md")).then(e=>e||this.getNestJSTemplate())},{name:"style-tailwind",tags:["tailwind"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/style-tailwind.md")).then(e=>e||this.getTailwindTemplate())},{name:"test-vitest",tags:["vitest"],content:()=>this.loadTemplateFromFile(s.join(__dirname,"templates/test-vitest.md")).then(e=>e||this.getVitestTemplate())}]}getDependencyTagMap(){return{react:"react","react-dom":"react",vue:"vue","@vue/runtime-core":"vue",pinia:"pinia","@nestjs/core":"nestjs",tailwindcss:"tailwind",vitest:"vitest",zustand:"zustand",typescript:"typescript"}}getConfigFileTagMap(){return{"tailwind.config.js":"tailwind","tailwind.config.ts":"tailwind","vitest.config.js":"vitest","vitest.config.ts":"vitest","tsconfig.json":"typescript"}}extractWorkspaces(e){return e.workspaces?(Array.isArray(e.workspaces)?e.workspaces:e.workspaces.packages||[]).map(a=>a.replace(/\/\*$/,"")):[]}getTypescriptTemplate(){return`# TypeScript Guidelines
|
|
2
|
-
|
|
3
|
-
This project uses TypeScript for type safety.
|
|
4
|
-
|
|
5
|
-
## Type Safety
|
|
6
|
-
- Use strict type checking
|
|
7
|
-
- Avoid \`any\` types
|
|
8
|
-
- Prefer interfaces over types for objects
|
|
9
|
-
|
|
10
|
-
## Best Practices
|
|
11
|
-
- Enable all strict compiler options
|
|
12
|
-
- Use proper type inference
|
|
13
|
-
- Leverage utility types`}getReactTemplate(){return`# React Development Guidelines
|
|
14
|
-
|
|
15
|
-
This project uses React.
|
|
16
|
-
|
|
17
|
-
## Component Structure
|
|
18
|
-
- Use functional components with hooks
|
|
19
|
-
- Keep components focused and reusable
|
|
20
|
-
- Follow React best practices
|
|
21
|
-
|
|
22
|
-
## State Management
|
|
23
|
-
- Use appropriate state management for complexity
|
|
24
|
-
- Consider component composition
|
|
25
|
-
- Leverage React context when needed`}getReactZustandTemplate(){return`# Zustand State Management
|
|
26
|
-
|
|
27
|
-
This project uses Zustand for state management.
|
|
28
|
-
|
|
29
|
-
## Store Structure
|
|
30
|
-
- Create focused, modular stores
|
|
31
|
-
- Use selectors to prevent unnecessary re-renders
|
|
32
|
-
- Follow Zustand best practices`}getVueTemplate(){return`# Vue.js Development Guidelines
|
|
33
|
-
|
|
34
|
-
This project uses Vue.js.
|
|
35
|
-
|
|
36
|
-
## Component Structure
|
|
37
|
-
- Use Composition API
|
|
38
|
-
- Follow Vue.js style guide
|
|
39
|
-
- Keep components composable and reusable`}getVuePiniaTemplate(){return`# Pinia State Management
|
|
40
|
-
|
|
41
|
-
This project uses Pinia for state management.
|
|
42
|
-
|
|
43
|
-
## Store Structure
|
|
44
|
-
- Create modular stores
|
|
45
|
-
- Use composition stores pattern
|
|
46
|
-
- Follow Pinia best practices`}getNestJSTemplate(){return`# NestJS Development Guidelines
|
|
47
|
-
|
|
48
|
-
This project uses NestJS framework.
|
|
49
|
-
|
|
50
|
-
## Architecture
|
|
51
|
-
- Follow modular architecture
|
|
52
|
-
- Use dependency injection
|
|
53
|
-
- Implement proper error handling`}getTailwindTemplate(){return`# Tailwind CSS Guidelines
|
|
54
|
-
|
|
55
|
-
This project uses Tailwind CSS.
|
|
56
|
-
|
|
57
|
-
## Styling Approach
|
|
58
|
-
- Use utility-first classes
|
|
59
|
-
- Create reusable components
|
|
60
|
-
- Follow Tailwind best practices`}getVitestTemplate(){return`# Vitest Testing Guidelines
|
|
61
|
-
|
|
62
|
-
This project uses Vitest for testing.
|
|
63
|
-
|
|
64
|
-
## Testing Strategy
|
|
65
|
-
- Write unit tests for utilities
|
|
66
|
-
- Use component testing
|
|
67
|
-
- Follow testing best practices`}}exports.NodeJSPlugin=l;
|
|
68
|
-
//# sourceMappingURL=index-B6BeG1yT.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-B6BeG1yT.cjs","sources":["../src/builtin-plugins/nodejs/index.ts"],"sourcesContent":["/**\n * Node.js Language Plugin\n *\n * Detects Node.js/JavaScript/TypeScript projects via package.json\n * Supports npm workspaces for monorepo detection\n */\n\nimport * as path from 'node:path';\nimport type { ProjectMetadata, TemplateDefinition } from '../../types';\nimport { BasePlugin } from '../base/BasePlugin';\n\ninterface PackageJson {\n name?: string;\n description?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n workspaces?: string[] | { packages: string[] };\n}\n\nexport class NodeJSPlugin extends BasePlugin {\n name = 'nodejs';\n displayName = 'Node.js';\n version = '3.0.0';\n priority = 100; // High priority - very common\n\n async detect(projectPath: string): Promise<ProjectMetadata | null> {\n if (!this.fileExists(projectPath, 'package.json')) {\n return null;\n }\n\n const pkg = this.readJSON<PackageJson>(projectPath, 'package.json');\n if (!pkg) {\n // package.json exists but couldn't parse - still consider it a Node.js project\n return {\n language: 'JavaScript/TypeScript',\n name: this.getProjectName(projectPath),\n dependencies: {},\n manifestFile: 'package.json',\n projectPath,\n };\n }\n\n const deps = this.parseDependencies(\n pkg as Record<string, unknown>,\n 'dependencies',\n 'devDependencies',\n );\n\n const metadata: ProjectMetadata = {\n language: 'JavaScript/TypeScript',\n name: pkg.name || this.getProjectName(projectPath),\n description: pkg.description,\n dependencies: deps,\n manifestFile: 'package.json',\n projectPath,\n };\n\n // Check for workspaces (monorepo support)\n const workspaces = this.extractWorkspaces(pkg);\n if (workspaces.length > 0) {\n metadata.workspaceMembers = workspaces;\n }\n\n return metadata;\n }\n\n getTemplates(): TemplateDefinition[] {\n return [\n {\n name: 'lang-typescript',\n tags: ['typescript'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/lang-typescript.md'),\n ).then((c) => c || this.getTypescriptTemplate()),\n },\n {\n name: 'react-core',\n tags: ['react'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/react-core.md'),\n ).then((c) => c || this.getReactTemplate()),\n },\n {\n name: 'react-zustand',\n tags: ['zustand'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/react-zustand.md'),\n ).then((c) => c || this.getReactZustandTemplate()),\n },\n {\n name: 'vue-core',\n tags: ['vue'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/vue-core.md'),\n ).then((c) => c || this.getVueTemplate()),\n },\n {\n name: 'vue-pinia',\n tags: ['pinia'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/vue-pinia.md'),\n ).then((c) => c || this.getVuePiniaTemplate()),\n },\n {\n name: 'nestjs-core',\n tags: ['nestjs'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/nestjs-core.md'),\n ).then((c) => c || this.getNestJSTemplate()),\n },\n {\n name: 'style-tailwind',\n tags: ['tailwind'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/style-tailwind.md'),\n ).then((c) => c || this.getTailwindTemplate()),\n },\n {\n name: 'test-vitest',\n tags: ['vitest'],\n content: () =>\n this.loadTemplateFromFile(\n path.join(__dirname, 'templates/test-vitest.md'),\n ).then((c) => c || this.getVitestTemplate()),\n },\n ];\n }\n\n getDependencyTagMap() {\n return {\n react: 'react',\n 'react-dom': 'react',\n vue: 'vue',\n '@vue/runtime-core': 'vue',\n pinia: 'pinia',\n '@nestjs/core': 'nestjs',\n tailwindcss: 'tailwind',\n vitest: 'vitest',\n zustand: 'zustand',\n typescript: 'typescript',\n };\n }\n\n getConfigFileTagMap() {\n return {\n 'tailwind.config.js': 'tailwind',\n 'tailwind.config.ts': 'tailwind',\n 'vitest.config.js': 'vitest',\n 'vitest.config.ts': 'vitest',\n 'tsconfig.json': 'typescript',\n };\n }\n\n // Private helper methods\n\n private extractWorkspaces(pkg: PackageJson): string[] {\n if (!pkg.workspaces) return [];\n\n const workspacePatterns = Array.isArray(pkg.workspaces)\n ? pkg.workspaces\n : pkg.workspaces.packages || [];\n\n // Convert glob patterns to actual paths (simplified - just remove wildcards)\n return workspacePatterns.map((pattern) => pattern.replace(/\\/\\*$/, ''));\n }\n\n // Fallback template content (if files don't exist)\n\n private getTypescriptTemplate(): string {\n return `# TypeScript Guidelines\n\nThis project uses TypeScript for type safety.\n\n## Type Safety\n- Use strict type checking\n- Avoid \\`any\\` types\n- Prefer interfaces over types for objects\n\n## Best Practices\n- Enable all strict compiler options\n- Use proper type inference\n- Leverage utility types`;\n }\n\n private getReactTemplate(): string {\n return `# React Development Guidelines\n\nThis project uses React.\n\n## Component Structure\n- Use functional components with hooks\n- Keep components focused and reusable\n- Follow React best practices\n\n## State Management\n- Use appropriate state management for complexity\n- Consider component composition\n- Leverage React context when needed`;\n }\n\n private getReactZustandTemplate(): string {\n return `# Zustand State Management\n\nThis project uses Zustand for state management.\n\n## Store Structure\n- Create focused, modular stores\n- Use selectors to prevent unnecessary re-renders\n- Follow Zustand best practices`;\n }\n\n private getVueTemplate(): string {\n return `# Vue.js Development Guidelines\n\nThis project uses Vue.js.\n\n## Component Structure\n- Use Composition API\n- Follow Vue.js style guide\n- Keep components composable and reusable`;\n }\n\n private getVuePiniaTemplate(): string {\n return `# Pinia State Management\n\nThis project uses Pinia for state management.\n\n## Store Structure\n- Create modular stores\n- Use composition stores pattern\n- Follow Pinia best practices`;\n }\n\n private getNestJSTemplate(): string {\n return `# NestJS Development Guidelines\n\nThis project uses NestJS framework.\n\n## Architecture\n- Follow modular architecture\n- Use dependency injection\n- Implement proper error handling`;\n }\n\n private getTailwindTemplate(): string {\n return `# Tailwind CSS Guidelines\n\nThis project uses Tailwind CSS.\n\n## Styling Approach\n- Use utility-first classes\n- Create reusable components\n- Follow Tailwind best practices`;\n }\n\n private getVitestTemplate(): string {\n return `# Vitest Testing Guidelines\n\nThis project uses Vitest for testing.\n\n## Testing Strategy\n- Write unit tests for utilities\n- Use component testing\n- Follow testing best practices`;\n }\n}\n"],"names":["NodeJSPlugin","BasePlugin","projectPath","pkg","deps","metadata","workspaces","path","c","pattern"],"mappings":"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"}
|
package/dist/index-B8pyjKdF.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { B as g } from "./BasePlugin-6wv0hYJ9.js";
|
|
2
|
-
class l extends g {
|
|
3
|
-
constructor() {
|
|
4
|
-
super(...arguments), this.name = "go", this.displayName = "Go", this.version = "3.0.0", this.priority = 90;
|
|
5
|
-
}
|
|
6
|
-
async detect(t) {
|
|
7
|
-
if (!this.fileExists(t, "go.mod"))
|
|
8
|
-
return null;
|
|
9
|
-
const i = this.readFile(t, "go.mod");
|
|
10
|
-
if (!i)
|
|
11
|
-
return {
|
|
12
|
-
language: "Go",
|
|
13
|
-
name: this.getProjectName(t),
|
|
14
|
-
dependencies: {},
|
|
15
|
-
manifestFile: "go.mod",
|
|
16
|
-
projectPath: t
|
|
17
|
-
};
|
|
18
|
-
const r = i.match(/module\s+([^\s\n]+)/), n = {}, a = i.split(`
|
|
19
|
-
`);
|
|
20
|
-
let s = !1;
|
|
21
|
-
for (const o of a) {
|
|
22
|
-
if (o.trim().startsWith("require (")) {
|
|
23
|
-
s = !0;
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
if (s) {
|
|
27
|
-
if (o.trim() === ")") break;
|
|
28
|
-
const e = o.match(/^\s*([^\s]+)\s+v([^\s]+)/);
|
|
29
|
-
e && (n[e[1]] = e[2]);
|
|
30
|
-
} else if (o.trim().startsWith("require ")) {
|
|
31
|
-
const e = o.match(/require\s+([^\s]+)\s+v([^\s]+)/);
|
|
32
|
-
e && (n[e[1]] = e[2]);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return {
|
|
36
|
-
language: "Go",
|
|
37
|
-
name: r?.[1] || this.getProjectName(t),
|
|
38
|
-
dependencies: n,
|
|
39
|
-
manifestFile: "go.mod",
|
|
40
|
-
projectPath: t
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
getTemplates() {
|
|
44
|
-
return [
|
|
45
|
-
{
|
|
46
|
-
name: "go-core",
|
|
47
|
-
tags: ["go"],
|
|
48
|
-
content: this.getGoTemplate()
|
|
49
|
-
}
|
|
50
|
-
];
|
|
51
|
-
}
|
|
52
|
-
getDependencyTagMap() {
|
|
53
|
-
return {
|
|
54
|
-
"github.com/gin-gonic/gin": "gin",
|
|
55
|
-
"github.com/gofiber/fiber": "fiber",
|
|
56
|
-
"github.com/labstack/echo": "echo",
|
|
57
|
-
"gorm.io/gorm": "gorm"
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
getGoTemplate() {
|
|
61
|
-
return `# Go Development Guidelines
|
|
62
|
-
|
|
63
|
-
This project uses Go.
|
|
64
|
-
|
|
65
|
-
## Project Structure
|
|
66
|
-
- Follow standard Go project layout
|
|
67
|
-
- Organize code in packages
|
|
68
|
-
- Use proper module management
|
|
69
|
-
|
|
70
|
-
## Code Style
|
|
71
|
-
- Follow Go conventions and idioms
|
|
72
|
-
- Use \`gofmt\` for formatting
|
|
73
|
-
- Run \`golint\` and \`go vet\`
|
|
74
|
-
|
|
75
|
-
## Error Handling
|
|
76
|
-
- Handle errors explicitly
|
|
77
|
-
- Don't ignore errors
|
|
78
|
-
- Provide meaningful error messages
|
|
79
|
-
|
|
80
|
-
## Testing
|
|
81
|
-
- Write table-driven tests
|
|
82
|
-
- Use \`testing\` package
|
|
83
|
-
- Aim for good test coverage
|
|
84
|
-
|
|
85
|
-
## Dependencies
|
|
86
|
-
- Use Go modules (\`go.mod\`)
|
|
87
|
-
- Keep dependencies minimal
|
|
88
|
-
- Review dependency licenses`;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
export {
|
|
92
|
-
l as GoPlugin
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=index-B8pyjKdF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-B8pyjKdF.js","sources":["../src/builtin-plugins/go/index.ts"],"sourcesContent":["/**\n * Go Language Plugin\n *\n * Detects Go projects via go.mod file\n * Parses module dependencies from go.mod\n */\n\nimport type { ProjectMetadata, TemplateDefinition } from '../../types';\nimport { BasePlugin } from '../base/BasePlugin';\n\nexport class GoPlugin extends BasePlugin {\n name = 'go';\n displayName = 'Go';\n version = '3.0.0';\n priority = 90;\n\n async detect(projectPath: string): Promise<ProjectMetadata | null> {\n if (!this.fileExists(projectPath, 'go.mod')) {\n return null;\n }\n\n const content = this.readFile(projectPath, 'go.mod');\n if (!content) {\n return {\n language: 'Go',\n name: this.getProjectName(projectPath),\n dependencies: {},\n manifestFile: 'go.mod',\n projectPath,\n };\n }\n\n const moduleMatch = content.match(/module\\s+([^\\s\\n]+)/);\n const deps: Record<string, string> = {};\n\n // Parse dependencies\n const lines = content.split('\\n');\n let inRequire = false;\n for (const line of lines) {\n if (line.trim().startsWith('require (')) {\n inRequire = true;\n continue;\n }\n if (inRequire) {\n if (line.trim() === ')') break;\n const depMatch = line.match(/^\\s*([^\\s]+)\\s+v([^\\s]+)/);\n if (depMatch) {\n deps[depMatch[1]] = depMatch[2];\n }\n } else if (line.trim().startsWith('require ')) {\n const depMatch = line.match(/require\\s+([^\\s]+)\\s+v([^\\s]+)/);\n if (depMatch) {\n deps[depMatch[1]] = depMatch[2];\n }\n }\n }\n\n return {\n language: 'Go',\n name: moduleMatch?.[1] || this.getProjectName(projectPath),\n dependencies: deps,\n manifestFile: 'go.mod',\n projectPath,\n };\n }\n\n getTemplates(): TemplateDefinition[] {\n return [\n {\n name: 'go-core',\n tags: ['go'],\n content: this.getGoTemplate(),\n },\n ];\n }\n\n getDependencyTagMap() {\n return {\n 'github.com/gin-gonic/gin': 'gin',\n 'github.com/gofiber/fiber': 'fiber',\n 'github.com/labstack/echo': 'echo',\n 'gorm.io/gorm': 'gorm',\n };\n }\n\n private getGoTemplate(): string {\n return `# Go Development Guidelines\n\nThis project uses Go.\n\n## Project Structure\n- Follow standard Go project layout\n- Organize code in packages\n- Use proper module management\n\n## Code Style\n- Follow Go conventions and idioms\n- Use \\`gofmt\\` for formatting\n- Run \\`golint\\` and \\`go vet\\`\n\n## Error Handling\n- Handle errors explicitly\n- Don't ignore errors\n- Provide meaningful error messages\n\n## Testing\n- Write table-driven tests\n- Use \\`testing\\` package\n- Aim for good test coverage\n\n## Dependencies\n- Use Go modules (\\`go.mod\\`)\n- Keep dependencies minimal\n- Review dependency licenses`;\n }\n}\n"],"names":["GoPlugin","BasePlugin","projectPath","content","moduleMatch","deps","lines","inRequire","line","depMatch"],"mappings":";AAUO,MAAMA,UAAiBC,EAAW;AAAA,EAAlC,cAAA;AAAA,UAAA,GAAA,SAAA,GACL,KAAA,OAAO,MACP,KAAA,cAAc,MACd,KAAA,UAAU,SACV,KAAA,WAAW;AAAA,EAAA;AAAA,EAEX,MAAM,OAAOC,GAAsD;AACjE,QAAI,CAAC,KAAK,WAAWA,GAAa,QAAQ;AACxC,aAAO;AAGT,UAAMC,IAAU,KAAK,SAASD,GAAa,QAAQ;AACnD,QAAI,CAACC;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,KAAK,eAAeD,CAAW;AAAA,QACrC,cAAc,CAAA;AAAA,QACd,cAAc;AAAA,QACd,aAAAA;AAAA,MAAA;AAIJ,UAAME,IAAcD,EAAQ,MAAM,qBAAqB,GACjDE,IAA+B,CAAA,GAG/BC,IAAQH,EAAQ,MAAM;AAAA,CAAI;AAChC,QAAII,IAAY;AAChB,eAAWC,KAAQF,GAAO;AACxB,UAAIE,EAAK,KAAA,EAAO,WAAW,WAAW,GAAG;AACvC,QAAAD,IAAY;AACZ;AAAA,MACF;AACA,UAAIA,GAAW;AACb,YAAIC,EAAK,KAAA,MAAW,IAAK;AACzB,cAAMC,IAAWD,EAAK,MAAM,0BAA0B;AACtD,QAAIC,MACFJ,EAAKI,EAAS,CAAC,CAAC,IAAIA,EAAS,CAAC;AAAA,MAElC,WAAWD,EAAK,KAAA,EAAO,WAAW,UAAU,GAAG;AAC7C,cAAMC,IAAWD,EAAK,MAAM,gCAAgC;AAC5D,QAAIC,MACFJ,EAAKI,EAAS,CAAC,CAAC,IAAIA,EAAS,CAAC;AAAA,MAElC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAML,IAAc,CAAC,KAAK,KAAK,eAAeF,CAAW;AAAA,MACzD,cAAcG;AAAA,MACd,cAAc;AAAA,MACd,aAAAH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,eAAqC;AACnC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM,CAAC,IAAI;AAAA,QACX,SAAS,KAAK,cAAA;AAAA,MAAc;AAAA,IAC9B;AAAA,EAEJ;AAAA,EAEA,sBAAsB;AACpB,WAAO;AAAA,MACL,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,MAC5B,4BAA4B;AAAA,MAC5B,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAAA,EAEQ,gBAAwB;AAC9B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BT;AACF;"}
|