@kata-sh/cli 0.1.0 → 0.1.2
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/LICENSE +21 -0
- package/README.md +156 -0
- package/dist/app-paths.d.ts +4 -0
- package/dist/app-paths.js +6 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +56 -0
- package/dist/loader.d.ts +2 -0
- package/dist/loader.js +95 -0
- package/dist/resource-loader.d.ts +18 -0
- package/dist/resource-loader.js +50 -0
- package/dist/wizard.d.ts +15 -0
- package/dist/wizard.js +159 -0
- package/package.json +50 -21
- package/pkg/dist/modes/interactive/theme/dark.json +85 -0
- package/pkg/dist/modes/interactive/theme/light.json +84 -0
- package/pkg/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts +78 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.js +949 -0
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -0
- package/pkg/package.json +8 -0
- package/scripts/postinstall.js +45 -0
- package/src/resources/AGENTS.md +108 -0
- package/src/resources/KATA-WORKFLOW.md +661 -0
- package/src/resources/agents/researcher.md +29 -0
- package/src/resources/agents/scout.md +56 -0
- package/src/resources/agents/worker.md +31 -0
- package/src/resources/extensions/ask-user-questions.ts +200 -0
- package/src/resources/extensions/bg-shell/index.ts +2758 -0
- package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
- package/src/resources/extensions/browser-tools/core.js +1057 -0
- package/src/resources/extensions/browser-tools/index.ts +4916 -0
- package/src/resources/extensions/browser-tools/package.json +20 -0
- package/src/resources/extensions/context7/index.ts +428 -0
- package/src/resources/extensions/context7/package.json +11 -0
- package/src/resources/extensions/get-secrets-from-user.ts +352 -0
- package/src/resources/extensions/github/formatters.ts +207 -0
- package/src/resources/extensions/github/gh-api.ts +537 -0
- package/src/resources/extensions/github/index.ts +778 -0
- package/src/resources/extensions/kata/activity-log.ts +88 -0
- package/src/resources/extensions/kata/auto.ts +2786 -0
- package/src/resources/extensions/kata/commands.ts +355 -0
- package/src/resources/extensions/kata/crash-recovery.ts +85 -0
- package/src/resources/extensions/kata/dashboard-overlay.ts +516 -0
- package/src/resources/extensions/kata/docs/preferences-reference.md +103 -0
- package/src/resources/extensions/kata/doctor.ts +683 -0
- package/src/resources/extensions/kata/files.ts +730 -0
- package/src/resources/extensions/kata/gitignore.ts +165 -0
- package/src/resources/extensions/kata/guided-flow.ts +976 -0
- package/src/resources/extensions/kata/index.ts +556 -0
- package/src/resources/extensions/kata/metrics.ts +397 -0
- package/src/resources/extensions/kata/observability-validator.ts +408 -0
- package/src/resources/extensions/kata/package.json +11 -0
- package/src/resources/extensions/kata/paths.ts +346 -0
- package/src/resources/extensions/kata/preferences.ts +695 -0
- package/src/resources/extensions/kata/prompt-loader.ts +50 -0
- package/src/resources/extensions/kata/prompts/complete-milestone.md +25 -0
- package/src/resources/extensions/kata/prompts/complete-slice.md +27 -0
- package/src/resources/extensions/kata/prompts/discuss.md +151 -0
- package/src/resources/extensions/kata/prompts/doctor-heal.md +29 -0
- package/src/resources/extensions/kata/prompts/execute-task.md +64 -0
- package/src/resources/extensions/kata/prompts/guided-complete-slice.md +1 -0
- package/src/resources/extensions/kata/prompts/guided-discuss-milestone.md +3 -0
- package/src/resources/extensions/kata/prompts/guided-discuss-slice.md +59 -0
- package/src/resources/extensions/kata/prompts/guided-execute-task.md +1 -0
- package/src/resources/extensions/kata/prompts/guided-plan-milestone.md +23 -0
- package/src/resources/extensions/kata/prompts/guided-plan-slice.md +1 -0
- package/src/resources/extensions/kata/prompts/guided-research-slice.md +11 -0
- package/src/resources/extensions/kata/prompts/guided-resume-task.md +1 -0
- package/src/resources/extensions/kata/prompts/plan-milestone.md +47 -0
- package/src/resources/extensions/kata/prompts/plan-slice.md +63 -0
- package/src/resources/extensions/kata/prompts/queue.md +85 -0
- package/src/resources/extensions/kata/prompts/reassess-roadmap.md +48 -0
- package/src/resources/extensions/kata/prompts/replan-slice.md +39 -0
- package/src/resources/extensions/kata/prompts/research-milestone.md +37 -0
- package/src/resources/extensions/kata/prompts/research-slice.md +28 -0
- package/src/resources/extensions/kata/prompts/run-uat.md +109 -0
- package/src/resources/extensions/kata/prompts/system.md +341 -0
- package/src/resources/extensions/kata/session-forensics.ts +550 -0
- package/src/resources/extensions/kata/skill-discovery.ts +137 -0
- package/src/resources/extensions/kata/state.ts +509 -0
- package/src/resources/extensions/kata/templates/context.md +76 -0
- package/src/resources/extensions/kata/templates/decisions.md +8 -0
- package/src/resources/extensions/kata/templates/milestone-summary.md +73 -0
- package/src/resources/extensions/kata/templates/plan.md +133 -0
- package/src/resources/extensions/kata/templates/preferences.md +15 -0
- package/src/resources/extensions/kata/templates/project.md +31 -0
- package/src/resources/extensions/kata/templates/reassessment.md +28 -0
- package/src/resources/extensions/kata/templates/requirements.md +81 -0
- package/src/resources/extensions/kata/templates/research.md +46 -0
- package/src/resources/extensions/kata/templates/roadmap.md +118 -0
- package/src/resources/extensions/kata/templates/slice-context.md +58 -0
- package/src/resources/extensions/kata/templates/slice-summary.md +99 -0
- package/src/resources/extensions/kata/templates/state.md +19 -0
- package/src/resources/extensions/kata/templates/task-plan.md +52 -0
- package/src/resources/extensions/kata/templates/task-summary.md +57 -0
- package/src/resources/extensions/kata/templates/uat.md +54 -0
- package/src/resources/extensions/kata/tests/activity-log-prune.test.ts +327 -0
- package/src/resources/extensions/kata/tests/auto-preflight.test.ts +97 -0
- package/src/resources/extensions/kata/tests/auto-supervisor.test.mjs +53 -0
- package/src/resources/extensions/kata/tests/complete-milestone.test.ts +317 -0
- package/src/resources/extensions/kata/tests/cost-projection.test.ts +160 -0
- package/src/resources/extensions/kata/tests/derive-state-deps.test.ts +477 -0
- package/src/resources/extensions/kata/tests/derive-state.test.ts +1013 -0
- package/src/resources/extensions/kata/tests/doctor.test.ts +718 -0
- package/src/resources/extensions/kata/tests/idle-recovery.test.ts +490 -0
- package/src/resources/extensions/kata/tests/metrics-io.test.ts +254 -0
- package/src/resources/extensions/kata/tests/metrics.test.ts +217 -0
- package/src/resources/extensions/kata/tests/must-have-parser.test.ts +309 -0
- package/src/resources/extensions/kata/tests/parsers.test.ts +1257 -0
- package/src/resources/extensions/kata/tests/plan-milestone.test.ts +185 -0
- package/src/resources/extensions/kata/tests/plan-quality-validator.test.ts +386 -0
- package/src/resources/extensions/kata/tests/reassess-prompt.test.ts +208 -0
- package/src/resources/extensions/kata/tests/replan-slice.test.ts +686 -0
- package/src/resources/extensions/kata/tests/requirements.test.ts +151 -0
- package/src/resources/extensions/kata/tests/resolve-ts-hooks.mjs +17 -0
- package/src/resources/extensions/kata/tests/resolve-ts.mjs +11 -0
- package/src/resources/extensions/kata/tests/run-uat.test.ts +383 -0
- package/src/resources/extensions/kata/tests/unit-runtime.test.ts +388 -0
- package/src/resources/extensions/kata/tests/workspace-index.test.ts +118 -0
- package/src/resources/extensions/kata/tests/worktree.test.ts +222 -0
- package/src/resources/extensions/kata/types.ts +159 -0
- package/src/resources/extensions/kata/unit-runtime.ts +163 -0
- package/src/resources/extensions/kata/workspace-index.ts +203 -0
- package/src/resources/extensions/kata/worktree.ts +182 -0
- package/src/resources/extensions/mac-tools/index.ts +852 -0
- package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
- package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
- package/src/resources/extensions/search-the-web/cache.ts +78 -0
- package/src/resources/extensions/search-the-web/format.ts +258 -0
- package/src/resources/extensions/search-the-web/http.ts +238 -0
- package/src/resources/extensions/search-the-web/index.ts +68 -0
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +519 -0
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +404 -0
- package/src/resources/extensions/search-the-web/tool-search.ts +503 -0
- package/src/resources/extensions/search-the-web/url-utils.ts +91 -0
- package/src/resources/extensions/shared/confirm-ui.ts +126 -0
- package/src/resources/extensions/shared/interview-ui.ts +822 -0
- package/src/resources/extensions/shared/next-action-ui.ts +235 -0
- package/src/resources/extensions/shared/progress-widget.ts +282 -0
- package/src/resources/extensions/shared/thinking-widget.ts +107 -0
- package/src/resources/extensions/shared/ui.ts +400 -0
- package/src/resources/extensions/shared/wizard-ui.ts +551 -0
- package/src/resources/extensions/slash-commands/audit.ts +92 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +375 -0
- package/src/resources/extensions/slash-commands/create-slash-command.ts +280 -0
- package/src/resources/extensions/slash-commands/index.ts +12 -0
- package/src/resources/extensions/slash-commands/kata-run.ts +34 -0
- package/src/resources/extensions/subagent/agents.ts +126 -0
- package/src/resources/extensions/subagent/index.ts +1293 -0
- package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
- package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
- package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
- package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
- package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
- package/src/resources/skills/frontend-design/SKILL.md +45 -0
- package/src/resources/skills/swiftui/SKILL.md +208 -0
- package/src/resources/skills/swiftui/references/animations.md +921 -0
- package/src/resources/skills/swiftui/references/architecture.md +1561 -0
- package/src/resources/skills/swiftui/references/layout-system.md +1186 -0
- package/src/resources/skills/swiftui/references/navigation.md +1492 -0
- package/src/resources/skills/swiftui/references/networking-async.md +214 -0
- package/src/resources/skills/swiftui/references/performance.md +1706 -0
- package/src/resources/skills/swiftui/references/platform-integration.md +204 -0
- package/src/resources/skills/swiftui/references/state-management.md +1443 -0
- package/src/resources/skills/swiftui/references/swiftdata.md +297 -0
- package/src/resources/skills/swiftui/references/testing-debugging.md +247 -0
- package/src/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
- package/src/resources/skills/swiftui/workflows/add-feature.md +191 -0
- package/src/resources/skills/swiftui/workflows/build-new-app.md +311 -0
- package/src/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
- package/src/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
- package/src/resources/skills/swiftui/workflows/ship-app.md +203 -0
- package/src/resources/skills/swiftui/workflows/write-tests.md +235 -0
- package/dist/commands/task.d.ts +0 -9
- package/dist/commands/task.d.ts.map +0 -1
- package/dist/commands/task.js +0 -129
- package/dist/commands/task.js.map +0 -1
- package/dist/commands/task.test.d.ts +0 -2
- package/dist/commands/task.test.d.ts.map +0 -1
- package/dist/commands/task.test.js +0 -169
- package/dist/commands/task.test.js.map +0 -1
- package/dist/e2e/task-e2e.test.d.ts +0 -2
- package/dist/e2e/task-e2e.test.d.ts.map +0 -1
- package/dist/e2e/task-e2e.test.js +0 -173
- package/dist/e2e/task-e2e.test.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -93
- package/dist/index.js.map +0 -1
- package/dist/slug.d.ts +0 -2
- package/dist/slug.d.ts.map +0 -1
- package/dist/slug.js +0 -12
- package/dist/slug.js.map +0 -1
- package/dist/slug.test.d.ts +0 -2
- package/dist/slug.test.d.ts.map +0 -1
- package/dist/slug.test.js +0 -32
- package/dist/slug.test.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
<overview>
|
|
2
|
+
SwiftUI networking in 2025 is built around Swift's structured concurrency (async/await) with the @Observable macro for state management. Combine is primarily used for specialized reactive scenarios.
|
|
3
|
+
|
|
4
|
+
**When to use async/await:**
|
|
5
|
+
- Loading data when views appear (.task modifier)
|
|
6
|
+
- Sequential API calls with dependencies
|
|
7
|
+
- Error handling with do-catch
|
|
8
|
+
- Any new code requiring async operations
|
|
9
|
+
|
|
10
|
+
**When Combine is still useful:**
|
|
11
|
+
- Complex reactive pipelines (debouncing, throttling)
|
|
12
|
+
- Form validation with multiple interdependent fields
|
|
13
|
+
- Real-time data streams (websockets, timers)
|
|
14
|
+
|
|
15
|
+
**Core principle:** Use async/await by default. Add Combine only when reactive operators provide clear value.
|
|
16
|
+
</overview>
|
|
17
|
+
|
|
18
|
+
<task_modifier>
|
|
19
|
+
## The .task Modifier
|
|
20
|
+
|
|
21
|
+
**Basic usage:**
|
|
22
|
+
```swift
|
|
23
|
+
struct ArticleView: View {
|
|
24
|
+
@State private var article: Article?
|
|
25
|
+
let articleID: String
|
|
26
|
+
|
|
27
|
+
var body: some View {
|
|
28
|
+
content
|
|
29
|
+
.task {
|
|
30
|
+
article = try? await fetchArticle(id: articleID)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**With dependency (.task(id:)):**
|
|
37
|
+
```swift
|
|
38
|
+
struct SearchView: View {
|
|
39
|
+
@State private var query = ""
|
|
40
|
+
@State private var results: [Result] = []
|
|
41
|
+
|
|
42
|
+
var body: some View {
|
|
43
|
+
List(results) { result in Text(result.name) }
|
|
44
|
+
.searchable(text: $query)
|
|
45
|
+
.task(id: query) {
|
|
46
|
+
guard !query.isEmpty else { return }
|
|
47
|
+
try? await Task.sleep(for: .milliseconds(300))
|
|
48
|
+
guard !Task.isCancelled else { return }
|
|
49
|
+
results = (try? await search(query: query)) ?? []
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Key behaviors:**
|
|
56
|
+
- Runs when view appears
|
|
57
|
+
- Auto-cancels on view disappear
|
|
58
|
+
- .task(id:) restarts when dependency changes
|
|
59
|
+
</task_modifier>
|
|
60
|
+
|
|
61
|
+
<async_await_patterns>
|
|
62
|
+
## Async/Await Patterns
|
|
63
|
+
|
|
64
|
+
**Loading with @Observable:**
|
|
65
|
+
```swift
|
|
66
|
+
@Observable
|
|
67
|
+
@MainActor
|
|
68
|
+
class ArticleViewModel {
|
|
69
|
+
private(set) var state: LoadingState<Article> = .idle
|
|
70
|
+
|
|
71
|
+
func load(id: String) async {
|
|
72
|
+
state = .loading
|
|
73
|
+
do {
|
|
74
|
+
let article = try await apiClient.fetchArticle(id: id)
|
|
75
|
+
state = .loaded(article)
|
|
76
|
+
} catch is CancellationError {
|
|
77
|
+
// Don't update state
|
|
78
|
+
} catch {
|
|
79
|
+
state = .failed(error)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Parallel calls:**
|
|
86
|
+
```swift
|
|
87
|
+
func loadProfile(id: String) async throws -> Profile {
|
|
88
|
+
let user = try await fetchUser(id: id)
|
|
89
|
+
async let posts = fetchPosts(userID: user.id)
|
|
90
|
+
async let followers = fetchFollowers(userID: user.id)
|
|
91
|
+
return Profile(user: user, posts: try await posts, followers: try await followers)
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
</async_await_patterns>
|
|
95
|
+
|
|
96
|
+
<api_client_design>
|
|
97
|
+
## API Client Architecture
|
|
98
|
+
|
|
99
|
+
```swift
|
|
100
|
+
protocol APIClient {
|
|
101
|
+
func request<T: Decodable>(_ endpoint: Endpoint) async throws -> T
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@MainActor
|
|
105
|
+
final class ProductionAPIClient: APIClient {
|
|
106
|
+
private let baseURL: URL
|
|
107
|
+
private let session: URLSession
|
|
108
|
+
|
|
109
|
+
func request<T: Decodable>(_ endpoint: Endpoint) async throws -> T {
|
|
110
|
+
let request = try buildRequest(endpoint)
|
|
111
|
+
let (data, response) = try await session.data(for: request)
|
|
112
|
+
|
|
113
|
+
guard let httpResponse = response as? HTTPURLResponse,
|
|
114
|
+
(200...299).contains(httpResponse.statusCode) else {
|
|
115
|
+
throw APIError.httpError((response as? HTTPURLResponse)?.statusCode ?? 0)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return try JSONDecoder().decode(T.self, from: data)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
</api_client_design>
|
|
123
|
+
|
|
124
|
+
<loading_states>
|
|
125
|
+
## Loading States
|
|
126
|
+
|
|
127
|
+
```swift
|
|
128
|
+
enum LoadingState<Value> {
|
|
129
|
+
case idle
|
|
130
|
+
case loading
|
|
131
|
+
case loaded(Value)
|
|
132
|
+
case failed(Error)
|
|
133
|
+
|
|
134
|
+
var isLoading: Bool {
|
|
135
|
+
if case .loading = self { return true }
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
struct AsyncContentView<Value, Content: View>: View {
|
|
141
|
+
let state: LoadingState<Value>
|
|
142
|
+
let retry: () async -> Void
|
|
143
|
+
@ViewBuilder let content: (Value) -> Content
|
|
144
|
+
|
|
145
|
+
var body: some View {
|
|
146
|
+
switch state {
|
|
147
|
+
case .idle: Color.clear
|
|
148
|
+
case .loading: ProgressView()
|
|
149
|
+
case .loaded(let value): content(value)
|
|
150
|
+
case .failed(let error):
|
|
151
|
+
ContentUnavailableView("Error", systemImage: "exclamationmark.triangle", description: Text(error.localizedDescription))
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
</loading_states>
|
|
157
|
+
|
|
158
|
+
<error_handling>
|
|
159
|
+
## Error Handling & Retry
|
|
160
|
+
|
|
161
|
+
**Basic retry:**
|
|
162
|
+
```swift
|
|
163
|
+
func fetchWithRetry<T>(maxRetries: Int = 3, operation: () async throws -> T) async throws -> T {
|
|
164
|
+
var lastError: Error?
|
|
165
|
+
for attempt in 0..<maxRetries {
|
|
166
|
+
do {
|
|
167
|
+
return try await operation()
|
|
168
|
+
} catch {
|
|
169
|
+
lastError = error
|
|
170
|
+
if error is CancellationError { throw error }
|
|
171
|
+
if attempt < maxRetries - 1 {
|
|
172
|
+
try await Task.sleep(for: .seconds(pow(2, Double(attempt))))
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
throw lastError!
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
</error_handling>
|
|
180
|
+
|
|
181
|
+
<decision_tree>
|
|
182
|
+
## Choosing the Right Approach
|
|
183
|
+
|
|
184
|
+
**Tied to view lifecycle?** → .task or .task(id:)
|
|
185
|
+
**User-triggered?** → Wrap in explicit Task {}
|
|
186
|
+
**Need reactive operators?** → Combine
|
|
187
|
+
**Loading data?** → Use LoadingState enum
|
|
188
|
+
**Sequential calls?** → async/await naturally
|
|
189
|
+
**Parallel calls?** → async let or TaskGroup
|
|
190
|
+
</decision_tree>
|
|
191
|
+
|
|
192
|
+
<anti_patterns>
|
|
193
|
+
## What NOT to Do
|
|
194
|
+
|
|
195
|
+
<anti_pattern name="Ignoring CancellationError">
|
|
196
|
+
**Problem:** Showing error UI when task is cancelled
|
|
197
|
+
**Instead:** Catch CancellationError separately, don't update state
|
|
198
|
+
</anti_pattern>
|
|
199
|
+
|
|
200
|
+
<anti_pattern name="Task in .task">
|
|
201
|
+
**Problem:** Task { await loadData() } inside .task
|
|
202
|
+
**Instead:** .task already creates a Task
|
|
203
|
+
</anti_pattern>
|
|
204
|
+
|
|
205
|
+
<anti_pattern name="Missing @MainActor">
|
|
206
|
+
**Problem:** View model updates from background thread
|
|
207
|
+
**Instead:** Mark @Observable view models with @MainActor
|
|
208
|
+
</anti_pattern>
|
|
209
|
+
|
|
210
|
+
<anti_pattern name="ObservableObject for new code">
|
|
211
|
+
**Problem:** Using ObservableObject/@Published
|
|
212
|
+
**Instead:** Use @Observable macro (iOS 17+)
|
|
213
|
+
</anti_pattern>
|
|
214
|
+
</anti_patterns>
|