javi-forge 1.2.0 → 1.3.0

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.
Files changed (228) hide show
  1. package/ci-local/ci-local.sh +20 -8
  2. package/package.json +1 -1
  3. package/ai-config/.skillignore +0 -15
  4. package/ai-config/AUTO_INVOKE.md +0 -300
  5. package/ai-config/agents/_TEMPLATE.md +0 -93
  6. package/ai-config/agents/business/api-designer.md +0 -1657
  7. package/ai-config/agents/business/business-analyst.md +0 -1331
  8. package/ai-config/agents/business/product-strategist.md +0 -206
  9. package/ai-config/agents/business/project-manager.md +0 -178
  10. package/ai-config/agents/business/requirements-analyst.md +0 -1277
  11. package/ai-config/agents/business/technical-writer.md +0 -1679
  12. package/ai-config/agents/creative/ux-designer.md +0 -205
  13. package/ai-config/agents/data-ai/ai-engineer.md +0 -487
  14. package/ai-config/agents/data-ai/analytics-engineer.md +0 -953
  15. package/ai-config/agents/data-ai/data-engineer.md +0 -173
  16. package/ai-config/agents/data-ai/data-scientist.md +0 -672
  17. package/ai-config/agents/data-ai/mlops-engineer.md +0 -814
  18. package/ai-config/agents/data-ai/prompt-engineer.md +0 -772
  19. package/ai-config/agents/development/angular-expert.md +0 -620
  20. package/ai-config/agents/development/backend-architect.md +0 -795
  21. package/ai-config/agents/development/database-specialist.md +0 -212
  22. package/ai-config/agents/development/frontend-specialist.md +0 -686
  23. package/ai-config/agents/development/fullstack-engineer.md +0 -668
  24. package/ai-config/agents/development/golang-pro.md +0 -338
  25. package/ai-config/agents/development/java-enterprise.md +0 -400
  26. package/ai-config/agents/development/javascript-pro.md +0 -422
  27. package/ai-config/agents/development/nextjs-pro.md +0 -474
  28. package/ai-config/agents/development/python-pro.md +0 -570
  29. package/ai-config/agents/development/react-pro.md +0 -487
  30. package/ai-config/agents/development/rust-pro.md +0 -246
  31. package/ai-config/agents/development/spring-boot-4-expert.md +0 -326
  32. package/ai-config/agents/development/typescript-pro.md +0 -336
  33. package/ai-config/agents/development/vue-specialist.md +0 -605
  34. package/ai-config/agents/infrastructure/cloud-architect.md +0 -472
  35. package/ai-config/agents/infrastructure/deployment-manager.md +0 -358
  36. package/ai-config/agents/infrastructure/devops-engineer.md +0 -455
  37. package/ai-config/agents/infrastructure/incident-responder.md +0 -519
  38. package/ai-config/agents/infrastructure/kubernetes-expert.md +0 -705
  39. package/ai-config/agents/infrastructure/monitoring-specialist.md +0 -674
  40. package/ai-config/agents/infrastructure/performance-engineer.md +0 -658
  41. package/ai-config/agents/orchestrator.md +0 -241
  42. package/ai-config/agents/quality/accessibility-auditor.md +0 -1204
  43. package/ai-config/agents/quality/code-reviewer-compact.md +0 -123
  44. package/ai-config/agents/quality/code-reviewer.md +0 -363
  45. package/ai-config/agents/quality/dependency-manager.md +0 -743
  46. package/ai-config/agents/quality/e2e-test-specialist.md +0 -1005
  47. package/ai-config/agents/quality/performance-tester.md +0 -1086
  48. package/ai-config/agents/quality/security-auditor.md +0 -133
  49. package/ai-config/agents/quality/test-engineer.md +0 -453
  50. package/ai-config/agents/specialists/api-designer.md +0 -87
  51. package/ai-config/agents/specialists/backend-architect.md +0 -73
  52. package/ai-config/agents/specialists/code-reviewer.md +0 -77
  53. package/ai-config/agents/specialists/db-optimizer.md +0 -75
  54. package/ai-config/agents/specialists/devops-engineer.md +0 -83
  55. package/ai-config/agents/specialists/documentation-writer.md +0 -78
  56. package/ai-config/agents/specialists/frontend-developer.md +0 -75
  57. package/ai-config/agents/specialists/performance-analyst.md +0 -82
  58. package/ai-config/agents/specialists/refactor-specialist.md +0 -74
  59. package/ai-config/agents/specialists/security-auditor.md +0 -74
  60. package/ai-config/agents/specialists/test-engineer.md +0 -81
  61. package/ai-config/agents/specialists/ux-consultant.md +0 -76
  62. package/ai-config/agents/specialized/agent-generator.md +0 -1190
  63. package/ai-config/agents/specialized/blockchain-developer.md +0 -149
  64. package/ai-config/agents/specialized/code-migrator.md +0 -892
  65. package/ai-config/agents/specialized/context-manager.md +0 -978
  66. package/ai-config/agents/specialized/documentation-writer.md +0 -1078
  67. package/ai-config/agents/specialized/ecommerce-expert.md +0 -1756
  68. package/ai-config/agents/specialized/embedded-engineer.md +0 -1714
  69. package/ai-config/agents/specialized/error-detective.md +0 -1034
  70. package/ai-config/agents/specialized/fintech-specialist.md +0 -1659
  71. package/ai-config/agents/specialized/freelance-project-planner-v2.md +0 -1988
  72. package/ai-config/agents/specialized/freelance-project-planner-v3.md +0 -2136
  73. package/ai-config/agents/specialized/freelance-project-planner-v4.md +0 -4503
  74. package/ai-config/agents/specialized/freelance-project-planner.md +0 -722
  75. package/ai-config/agents/specialized/game-developer.md +0 -1963
  76. package/ai-config/agents/specialized/healthcare-dev.md +0 -1620
  77. package/ai-config/agents/specialized/mobile-developer.md +0 -188
  78. package/ai-config/agents/specialized/parallel-plan-executor.md +0 -506
  79. package/ai-config/agents/specialized/plan-executor.md +0 -485
  80. package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +0 -485
  81. package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +0 -3493
  82. package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +0 -778
  83. package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +0 -918
  84. package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +0 -1537
  85. package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +0 -2633
  86. package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +0 -5610
  87. package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +0 -335
  88. package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +0 -215
  89. package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +0 -260
  90. package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +0 -379
  91. package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +0 -355
  92. package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +0 -279
  93. package/ai-config/agents/specialized/template-writer.md +0 -347
  94. package/ai-config/agents/specialized/test-runner.md +0 -99
  95. package/ai-config/agents/specialized/vibekanban-smart-worker.md +0 -244
  96. package/ai-config/agents/specialized/wave-executor.md +0 -138
  97. package/ai-config/agents/specialized/workflow-optimizer.md +0 -1114
  98. package/ai-config/commands/git/changelog.md +0 -32
  99. package/ai-config/commands/git/ci-local.md +0 -70
  100. package/ai-config/commands/git/commit.md +0 -35
  101. package/ai-config/commands/git/fix-issue.md +0 -23
  102. package/ai-config/commands/git/pr-create.md +0 -42
  103. package/ai-config/commands/git/pr-review.md +0 -50
  104. package/ai-config/commands/git/worktree.md +0 -39
  105. package/ai-config/commands/refactoring/cleanup.md +0 -24
  106. package/ai-config/commands/refactoring/dead-code.md +0 -40
  107. package/ai-config/commands/refactoring/extract.md +0 -31
  108. package/ai-config/commands/testing/e2e.md +0 -30
  109. package/ai-config/commands/testing/tdd.md +0 -36
  110. package/ai-config/commands/testing/test-coverage.md +0 -30
  111. package/ai-config/commands/testing/test-fix.md +0 -24
  112. package/ai-config/commands/workflow/generate-agents-md.md +0 -85
  113. package/ai-config/commands/workflow/planning.md +0 -47
  114. package/ai-config/commands/workflows/compound.md +0 -89
  115. package/ai-config/commands/workflows/diagnose.md +0 -70
  116. package/ai-config/commands/workflows/discover.md +0 -86
  117. package/ai-config/commands/workflows/plan.md +0 -77
  118. package/ai-config/commands/workflows/review.md +0 -78
  119. package/ai-config/commands/workflows/work.md +0 -75
  120. package/ai-config/config.yaml +0 -18
  121. package/ai-config/hooks/_TEMPLATE.md +0 -96
  122. package/ai-config/hooks/block-dangerous-commands.md +0 -75
  123. package/ai-config/hooks/commit-guard.md +0 -90
  124. package/ai-config/hooks/context-loader.md +0 -73
  125. package/ai-config/hooks/improve-prompt.md +0 -91
  126. package/ai-config/hooks/learning-log.md +0 -72
  127. package/ai-config/hooks/model-router.md +0 -86
  128. package/ai-config/hooks/secret-scanner.md +0 -64
  129. package/ai-config/hooks/skill-validator.md +0 -102
  130. package/ai-config/hooks/task-artifact.md +0 -114
  131. package/ai-config/hooks/validate-workflow.md +0 -100
  132. package/ai-config/prompts/base.md +0 -71
  133. package/ai-config/prompts/modes/debug.md +0 -34
  134. package/ai-config/prompts/modes/deploy.md +0 -40
  135. package/ai-config/prompts/modes/research.md +0 -32
  136. package/ai-config/prompts/modes/review.md +0 -33
  137. package/ai-config/prompts/review-policy.md +0 -79
  138. package/ai-config/skills/_TEMPLATE.md +0 -157
  139. package/ai-config/skills/backend/api-gateway/SKILL.md +0 -254
  140. package/ai-config/skills/backend/bff-concepts/SKILL.md +0 -239
  141. package/ai-config/skills/backend/bff-spring/SKILL.md +0 -364
  142. package/ai-config/skills/backend/chi-router/SKILL.md +0 -396
  143. package/ai-config/skills/backend/error-handling/SKILL.md +0 -255
  144. package/ai-config/skills/backend/exceptions-spring/SKILL.md +0 -323
  145. package/ai-config/skills/backend/fastapi/SKILL.md +0 -302
  146. package/ai-config/skills/backend/gateway-spring/SKILL.md +0 -390
  147. package/ai-config/skills/backend/go-backend/SKILL.md +0 -457
  148. package/ai-config/skills/backend/gradle-multimodule/SKILL.md +0 -274
  149. package/ai-config/skills/backend/graphql-concepts/SKILL.md +0 -352
  150. package/ai-config/skills/backend/graphql-spring/SKILL.md +0 -398
  151. package/ai-config/skills/backend/grpc-concepts/SKILL.md +0 -283
  152. package/ai-config/skills/backend/grpc-spring/SKILL.md +0 -445
  153. package/ai-config/skills/backend/jwt-auth/SKILL.md +0 -412
  154. package/ai-config/skills/backend/notifications-concepts/SKILL.md +0 -259
  155. package/ai-config/skills/backend/recommendations-concepts/SKILL.md +0 -261
  156. package/ai-config/skills/backend/search-concepts/SKILL.md +0 -263
  157. package/ai-config/skills/backend/search-spring/SKILL.md +0 -375
  158. package/ai-config/skills/backend/spring-boot-4/SKILL.md +0 -172
  159. package/ai-config/skills/backend/websockets/SKILL.md +0 -532
  160. package/ai-config/skills/data-ai/ai-ml/SKILL.md +0 -423
  161. package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +0 -195
  162. package/ai-config/skills/data-ai/analytics-spring/SKILL.md +0 -340
  163. package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +0 -440
  164. package/ai-config/skills/data-ai/langchain/SKILL.md +0 -238
  165. package/ai-config/skills/data-ai/mlflow/SKILL.md +0 -302
  166. package/ai-config/skills/data-ai/onnx-inference/SKILL.md +0 -290
  167. package/ai-config/skills/data-ai/powerbi/SKILL.md +0 -352
  168. package/ai-config/skills/data-ai/pytorch/SKILL.md +0 -274
  169. package/ai-config/skills/data-ai/scikit-learn/SKILL.md +0 -321
  170. package/ai-config/skills/data-ai/vector-db/SKILL.md +0 -301
  171. package/ai-config/skills/database/graph-databases/SKILL.md +0 -218
  172. package/ai-config/skills/database/graph-spring/SKILL.md +0 -361
  173. package/ai-config/skills/database/pgx-postgres/SKILL.md +0 -512
  174. package/ai-config/skills/database/redis-cache/SKILL.md +0 -343
  175. package/ai-config/skills/database/sqlite-embedded/SKILL.md +0 -388
  176. package/ai-config/skills/database/timescaledb/SKILL.md +0 -320
  177. package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
  178. package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
  179. package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
  180. package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
  181. package/ai-config/skills/frontend/astro-ssr/SKILL.md +0 -441
  182. package/ai-config/skills/frontend/frontend-design/SKILL.md +0 -54
  183. package/ai-config/skills/frontend/frontend-web/SKILL.md +0 -368
  184. package/ai-config/skills/frontend/mantine-ui/SKILL.md +0 -396
  185. package/ai-config/skills/frontend/tanstack-query/SKILL.md +0 -439
  186. package/ai-config/skills/frontend/zod-validation/SKILL.md +0 -417
  187. package/ai-config/skills/frontend/zustand-state/SKILL.md +0 -350
  188. package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +0 -244
  189. package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +0 -378
  190. package/ai-config/skills/infrastructure/devops-infra/SKILL.md +0 -435
  191. package/ai-config/skills/infrastructure/docker-containers/SKILL.md +0 -420
  192. package/ai-config/skills/infrastructure/kubernetes/SKILL.md +0 -456
  193. package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +0 -546
  194. package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +0 -474
  195. package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +0 -315
  196. package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +0 -504
  197. package/ai-config/skills/mobile/mobile-ionic/SKILL.md +0 -448
  198. package/ai-config/skills/prompt-improver/SKILL.md +0 -125
  199. package/ai-config/skills/quality/ghagga-review/SKILL.md +0 -216
  200. package/ai-config/skills/references/hooks-patterns/SKILL.md +0 -238
  201. package/ai-config/skills/references/mcp-servers/SKILL.md +0 -275
  202. package/ai-config/skills/references/plugins-reference/SKILL.md +0 -110
  203. package/ai-config/skills/references/skills-reference/SKILL.md +0 -420
  204. package/ai-config/skills/references/subagent-templates/SKILL.md +0 -193
  205. package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +0 -410
  206. package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +0 -408
  207. package/ai-config/skills/systems-iot/rust-systems/SKILL.md +0 -386
  208. package/ai-config/skills/systems-iot/tokio-async/SKILL.md +0 -324
  209. package/ai-config/skills/testing/playwright-e2e/SKILL.md +0 -289
  210. package/ai-config/skills/testing/testcontainers/SKILL.md +0 -299
  211. package/ai-config/skills/testing/vitest-testing/SKILL.md +0 -381
  212. package/ai-config/skills/workflow/ci-local-guide/SKILL.md +0 -118
  213. package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +0 -299
  214. package/ai-config/skills/workflow/claude-md-improver/SKILL.md +0 -158
  215. package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +0 -117
  216. package/ai-config/skills/workflow/git-github/SKILL.md +0 -334
  217. package/ai-config/skills/workflow/git-github/references/examples.md +0 -160
  218. package/ai-config/skills/workflow/git-workflow/SKILL.md +0 -214
  219. package/ai-config/skills/workflow/ide-plugins/SKILL.md +0 -277
  220. package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +0 -401
  221. package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +0 -199
  222. package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +0 -100
  223. package/ai-config/skills/workflow/verification-before-completion/SKILL.md +0 -73
  224. package/ai-config/skills/workflow/wave-workflow/SKILL.md +0 -178
  225. package/schemas/agent.schema.json +0 -34
  226. package/schemas/ai-config.schema.json +0 -28
  227. package/schemas/plugin.schema.json +0 -62
  228. package/schemas/skill.schema.json +0 -44
@@ -1,448 +0,0 @@
1
- ---
2
- name: mobile-ionic
3
- description: >
4
- Cross-platform mobile development with Ionic 8, Capacitor 6, and offline-first SQLite patterns.
5
- Trigger: Ionic, Capacitor, mobile app, React Native alternative, SQLite mobile, offline sync, push notifications
6
- tools:
7
- - Read
8
- - Write
9
- - Bash
10
- - Grep
11
- metadata:
12
- author: plataforma-industrial
13
- version: "2.0"
14
- tags: [ionic, capacitor, mobile, react, sqlite, offline-first]
15
- updated: "2026-02"
16
- ---
17
-
18
- # Mobile Development with Ionic
19
-
20
- Cross-platform mobile apps with Ionic 8, Capacitor 6, and offline-first architecture.
21
-
22
- ## Stack
23
-
24
- ```json
25
- {
26
- "@ionic/react": "8.0.1",
27
- "@ionic/react-router": "8.0.1",
28
- "react": "18.2.0",
29
- "@capacitor/core": "6.0.0",
30
- "@capacitor/camera": "6.0.0",
31
- "@capacitor/filesystem": "6.0.0",
32
- "@capacitor/network": "6.0.0",
33
- "@capacitor/preferences": "6.0.0",
34
- "@capacitor/push-notifications": "6.0.0",
35
- "@capacitor-community/sqlite": "6.0.0",
36
- "@tanstack/react-query": "5.28.4",
37
- "zustand": "4.5.2",
38
- "zod": "3.22.4"
39
- }
40
- ```
41
-
42
- ## Capacitor Config
43
-
44
- ```typescript
45
- // capacitor.config.ts
46
- import type { CapacitorConfig } from '@capacitor/cli';
47
-
48
- const config: CapacitorConfig = {
49
- appId: 'com.example.app',
50
- appName: 'My App',
51
- webDir: 'dist',
52
- server: { androidScheme: 'https' },
53
- plugins: {
54
- SplashScreen: {
55
- launchShowDuration: 2000,
56
- backgroundColor: '#1890ff',
57
- },
58
- PushNotifications: {
59
- presentationOptions: ['badge', 'sound', 'alert'],
60
- },
61
- CapacitorSQLite: {
62
- iosDatabaseLocation: 'Library/CapacitorDatabase',
63
- },
64
- },
65
- };
66
-
67
- export default config;
68
- ```
69
-
70
- ## App Setup
71
-
72
- ```typescript
73
- // src/App.tsx
74
- import { useEffect } from 'react';
75
- import { IonApp, setupIonicReact } from '@ionic/react';
76
- import { IonReactRouter } from '@ionic/react-router';
77
- import { Capacitor } from '@capacitor/core';
78
- import { StatusBar, Style } from '@capacitor/status-bar';
79
- import { SplashScreen } from '@capacitor/splash-screen';
80
- import { Routes } from './routes';
81
- import { initDatabase } from '@lib/db/database';
82
-
83
- setupIonicReact({ mode: 'ios' });
84
-
85
- export function App() {
86
- useEffect(() => {
87
- const initApp = async () => {
88
- await initDatabase();
89
-
90
- if (Capacitor.isNativePlatform()) {
91
- await StatusBar.setStyle({ style: Style.Light });
92
- await SplashScreen.hide();
93
- }
94
- };
95
- initApp();
96
- }, []);
97
-
98
- return (
99
- <IonApp>
100
- <IonReactRouter>
101
- <Routes />
102
- </IonReactRouter>
103
- </IonApp>
104
- );
105
- }
106
- ```
107
-
108
- ## SQLite Database
109
-
110
- ```typescript
111
- // src/lib/db/database.ts
112
- import { CapacitorSQLite, SQLiteConnection, SQLiteDBConnection } from '@capacitor-community/sqlite';
113
- import { Capacitor } from '@capacitor/core';
114
-
115
- const DB_NAME = 'app_db';
116
- let db: SQLiteDBConnection | null = null;
117
- const sqlite = new SQLiteConnection(CapacitorSQLite);
118
-
119
- export async function initDatabase(): Promise<void> {
120
- if (!Capacitor.isNativePlatform()) return;
121
-
122
- const isConn = (await sqlite.isConnection(DB_NAME, false)).result;
123
-
124
- if (isConn) {
125
- db = await sqlite.retrieveConnection(DB_NAME, false);
126
- } else {
127
- db = await sqlite.createConnection(DB_NAME, false, 'no-encryption', 1, false);
128
- }
129
-
130
- await db.open();
131
- await runMigrations(db);
132
- }
133
-
134
- export function getDatabase(): SQLiteDBConnection {
135
- if (!db) throw new Error('Database not initialized');
136
- return db;
137
- }
138
-
139
- async function runMigrations(db: SQLiteDBConnection): Promise<void> {
140
- await db.execute(`
141
- CREATE TABLE IF NOT EXISTS items (
142
- id TEXT PRIMARY KEY,
143
- name TEXT NOT NULL,
144
- status TEXT DEFAULT 'active',
145
- synced_at TEXT,
146
- created_at TEXT DEFAULT CURRENT_TIMESTAMP
147
- );
148
-
149
- CREATE TABLE IF NOT EXISTS sync_queue (
150
- id INTEGER PRIMARY KEY AUTOINCREMENT,
151
- entity_type TEXT NOT NULL,
152
- entity_id TEXT NOT NULL,
153
- operation TEXT NOT NULL,
154
- payload TEXT NOT NULL,
155
- created_at TEXT DEFAULT CURRENT_TIMESTAMP
156
- );
157
- `);
158
- }
159
- ```
160
-
161
- ## Repository Pattern
162
-
163
- ```typescript
164
- // src/lib/db/repositories/itemRepo.ts
165
- import { getDatabase } from '../database';
166
- import type { Item } from '@lib/types/item';
167
-
168
- export const itemRepo = {
169
- async getAll(): Promise<Item[]> {
170
- const db = getDatabase();
171
- const result = await db.query('SELECT * FROM items ORDER BY created_at DESC');
172
- return (result.values || []).map(mapRowToItem);
173
- },
174
-
175
- async upsert(item: Item): Promise<void> {
176
- const db = getDatabase();
177
- await db.run(
178
- `INSERT OR REPLACE INTO items (id, name, status, synced_at)
179
- VALUES (?, ?, ?, ?)`,
180
- [item.id, item.name, item.status, new Date().toISOString()]
181
- );
182
- },
183
-
184
- async getUnsynced(): Promise<Item[]> {
185
- const db = getDatabase();
186
- const result = await db.query(
187
- 'SELECT * FROM items WHERE synced_at IS NULL'
188
- );
189
- return (result.values || []).map(mapRowToItem);
190
- },
191
- };
192
-
193
- function mapRowToItem(row: Record<string, unknown>): Item {
194
- return {
195
- id: row.id as string,
196
- name: row.name as string,
197
- status: row.status as string,
198
- createdAt: row.created_at as string,
199
- };
200
- }
201
- ```
202
-
203
- ## Offline Sync Hook
204
-
205
- ```typescript
206
- // src/lib/hooks/useOfflineSync.ts
207
- import { useEffect, useCallback } from 'react';
208
- import { useQueryClient } from '@tanstack/react-query';
209
- import { Network } from '@capacitor/network';
210
- import { useOfflineStore } from '@lib/stores/offlineStore';
211
- import { itemRepo } from '@lib/db/repositories/itemRepo';
212
- import { itemsApi } from '@lib/api/items';
213
-
214
- export function useOfflineSync() {
215
- const queryClient = useQueryClient();
216
- const { isOnline, setOnline, pendingSync, clearPendingSync } = useOfflineStore();
217
-
218
- useEffect(() => {
219
- Network.getStatus().then((s) => setOnline(s.connected));
220
-
221
- const listener = Network.addListener('networkStatusChange', (status) => {
222
- setOnline(status.connected);
223
- });
224
-
225
- return () => { listener.remove(); };
226
- }, [setOnline]);
227
-
228
- useEffect(() => {
229
- if (isOnline && pendingSync.length > 0) {
230
- syncPendingChanges();
231
- }
232
- }, [isOnline]);
233
-
234
- const syncPendingChanges = useCallback(async () => {
235
- // Sync pending changes to server
236
- for (const item of pendingSync) {
237
- await itemsApi.sync(item);
238
- }
239
- clearPendingSync();
240
-
241
- // Pull latest from server
242
- const items = await itemsApi.list();
243
- for (const item of items.data) {
244
- await itemRepo.upsert(item);
245
- }
246
-
247
- queryClient.invalidateQueries({ queryKey: ['items'] });
248
- }, [queryClient, pendingSync, clearPendingSync]);
249
-
250
- return { isOnline, syncNow: syncPendingChanges };
251
- }
252
- ```
253
-
254
- ## Camera Hook
255
-
256
- ```typescript
257
- // src/lib/hooks/useCamera.ts
258
- import { useState, useCallback } from 'react';
259
- import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
260
- import { Filesystem, Directory } from '@capacitor/filesystem';
261
-
262
- export function useCamera() {
263
- const [isLoading, setIsLoading] = useState(false);
264
-
265
- const takePhoto = useCallback(async (): Promise<string | null> => {
266
- setIsLoading(true);
267
- try {
268
- const photo = await Camera.getPhoto({
269
- quality: 80,
270
- resultType: CameraResultType.Base64,
271
- source: CameraSource.Camera,
272
- width: 1200,
273
- });
274
-
275
- const fileName = `photo_${Date.now()}.${photo.format}`;
276
- const savedFile = await Filesystem.writeFile({
277
- path: fileName,
278
- data: photo.base64String!,
279
- directory: Directory.Data,
280
- });
281
-
282
- return savedFile.uri;
283
- } catch {
284
- return null;
285
- } finally {
286
- setIsLoading(false);
287
- }
288
- }, []);
289
-
290
- return { takePhoto, isLoading };
291
- }
292
- ```
293
-
294
- ## Page Pattern
295
-
296
- ```typescript
297
- // src/pages/ItemsPage.tsx
298
- import {
299
- IonContent,
300
- IonHeader,
301
- IonPage,
302
- IonTitle,
303
- IonToolbar,
304
- IonRefresher,
305
- IonRefresherContent,
306
- IonList,
307
- IonSpinner,
308
- RefresherEventDetail,
309
- } from '@ionic/react';
310
- import { useItems } from '@lib/hooks/useItems';
311
- import { ItemCard } from '@components/items/ItemCard';
312
- import { NetworkStatus } from '@components/common/NetworkStatus';
313
-
314
- export function ItemsPage() {
315
- const { data: items, isLoading, refetch } = useItems();
316
-
317
- const handleRefresh = async (event: CustomEvent<RefresherEventDetail>) => {
318
- await refetch();
319
- event.detail.complete();
320
- };
321
-
322
- return (
323
- <IonPage>
324
- <IonHeader>
325
- <IonToolbar>
326
- <IonTitle>Items</IonTitle>
327
- </IonToolbar>
328
- </IonHeader>
329
-
330
- <IonContent fullscreen>
331
- <NetworkStatus />
332
-
333
- <IonRefresher slot="fixed" onIonRefresh={handleRefresh}>
334
- <IonRefresherContent />
335
- </IonRefresher>
336
-
337
- {isLoading && (
338
- <div className="ion-text-center ion-padding">
339
- <IonSpinner />
340
- </div>
341
- )}
342
-
343
- {items && (
344
- <IonList>
345
- {items.map((item) => (
346
- <ItemCard key={item.id} item={item} />
347
- ))}
348
- </IonList>
349
- )}
350
- </IonContent>
351
- </IonPage>
352
- );
353
- }
354
- ```
355
-
356
- ## Tab Routes
357
-
358
- ```typescript
359
- // src/routes/index.tsx
360
- import { IonRouterOutlet, IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/react';
361
- import { Route, Redirect } from 'react-router-dom';
362
- import { home, list, settings } from 'ionicons/icons';
363
-
364
- export function Routes() {
365
- return (
366
- <IonTabs>
367
- <IonRouterOutlet>
368
- <Route exact path="/home" component={HomePage} />
369
- <Route exact path="/items" component={ItemsPage} />
370
- <Route exact path="/items/:id" component={ItemDetailPage} />
371
- <Route exact path="/settings" component={SettingsPage} />
372
- <Route exact path="/">
373
- <Redirect to="/home" />
374
- </Route>
375
- </IonRouterOutlet>
376
-
377
- <IonTabBar slot="bottom">
378
- <IonTabButton tab="home" href="/home">
379
- <IonIcon icon={home} />
380
- <IonLabel>Home</IonLabel>
381
- </IonTabButton>
382
- <IonTabButton tab="items" href="/items">
383
- <IonIcon icon={list} />
384
- <IonLabel>Items</IonLabel>
385
- </IonTabButton>
386
- <IonTabButton tab="settings" href="/settings">
387
- <IonIcon icon={settings} />
388
- <IonLabel>Settings</IonLabel>
389
- </IonTabButton>
390
- </IonTabBar>
391
- </IonTabs>
392
- );
393
- }
394
- ```
395
-
396
- ## Push Notifications
397
-
398
- ```typescript
399
- // src/lib/services/pushService.ts
400
- import { PushNotifications, Token } from '@capacitor/push-notifications';
401
- import { Capacitor } from '@capacitor/core';
402
- import { authApi } from '@lib/api/auth';
403
-
404
- export async function setupPushNotifications(): Promise<void> {
405
- if (!Capacitor.isNativePlatform()) return;
406
-
407
- const permStatus = await PushNotifications.checkPermissions();
408
- if (permStatus.receive !== 'granted') {
409
- const result = await PushNotifications.requestPermissions();
410
- if (result.receive !== 'granted') return;
411
- }
412
-
413
- await PushNotifications.register();
414
-
415
- PushNotifications.addListener('registration', async (token: Token) => {
416
- await authApi.registerPushToken(token.value);
417
- });
418
-
419
- PushNotifications.addListener('pushNotificationReceived', (notification) => {
420
- console.log('Push received:', notification);
421
- });
422
-
423
- PushNotifications.addListener('pushNotificationActionPerformed', (action) => {
424
- const { data } = action.notification;
425
- if (data?.route) {
426
- window.location.href = data.route;
427
- }
428
- });
429
- }
430
- ```
431
-
432
- ## Conventions
433
-
434
- | Element | Convention | Example |
435
- |---------|------------|---------|
436
- | Pages | PascalCase + Page | `ItemsPage.tsx` |
437
- | Components | PascalCase | `ItemCard.tsx` |
438
- | Hooks | camelCase, `use` prefix | `useOfflineSync.ts` |
439
- | Services | camelCase + Service | `pushService.ts` |
440
- | Repositories | camelCase + Repo | `itemRepo.ts` |
441
- | Stores | camelCase + Store | `useOfflineStore` |
442
-
443
- ## Related Skills
444
-
445
- - `ionic-capacitor`: Native plugin patterns
446
- - `sqlite-embedded`: Offline data storage
447
- - `tanstack-query`: Data synchronization
448
- - `playwright-e2e`: Mobile E2E testing
@@ -1,125 +0,0 @@
1
- ---
2
- name: prompt-improver
3
- description: >
4
- Improves vague prompts before execution using a 4-phase Analyze→Research→Question→Execute flow.
5
- Trigger: vague prompt, unclear request, improve prompt, clarify, enhance prompt
6
- tools:
7
- - Read
8
- - Grep
9
- - Bash
10
- metadata:
11
- author: project-starter-framework
12
- version: "1.0"
13
- tags: [prompt-engineering, quality, workflow, clarification]
14
- updated: "2026-02"
15
- ---
16
-
17
- # Prompt Improver Skill
18
-
19
- Turn vague, under-specified prompts into actionable, high-quality instructions using a structured 4-phase process.
20
-
21
- ## Bypass
22
-
23
- Prefix your prompt with `*` to skip all enrichment and execute immediately:
24
- ```
25
- * just do it
26
- * create the file without asking
27
- ```
28
-
29
- ---
30
-
31
- ## Phase 1 — Analyze
32
-
33
- **Goal**: Determine if the prompt needs enrichment.
34
-
35
- Detect vagueness by checking:
36
- - Word count < 15
37
- - No clear action verb present (`create`, `fix`, `refactor`, `add`, `remove`, `update`, `write`, `build`, `test`, `explain`, `analyze`, `generate`, `implement`, `debug`, `review`, `deploy`, `configure`)
38
- - No context clues (file names, component names, tech stack keywords)
39
- - Ambiguous scope (could mean many different things)
40
-
41
- **If the prompt is clear → skip to Phase 4 (Execute).**
42
-
43
- **If vague → proceed to Phase 2.**
44
-
45
- ---
46
-
47
- ## Phase 2 — Research
48
-
49
- **Goal**: Gather context from the codebase to ask smarter questions.
50
-
51
- Run targeted searches to understand what already exists:
52
-
53
- ```bash
54
- # Find related files based on keywords in the prompt
55
- grep -r "<keyword>" --include="*.ts" --include="*.py" --include="*.go" -l | head -10
56
-
57
- # Check for existing patterns or similar implementations
58
- grep -r "<concept>" --include="*.md" -l | head -5
59
-
60
- # Understand project structure
61
- ls -1 src/ 2>/dev/null || ls -1 | head -20
62
- ```
63
-
64
- Use research findings to make the clarifying questions specific, not generic.
65
-
66
- ---
67
-
68
- ## Phase 3 — Question
69
-
70
- **Goal**: Ask max 3 targeted questions. Wait for user answers before proceeding.
71
-
72
- Select only the most impactful questions from these categories:
73
-
74
- | Category | Question |
75
- |----------|----------|
76
- | **Output** | What is the expected output or deliverable? (file, endpoint, component, report…) |
77
- | **Constraints** | What constraints apply? (language, framework, style guide, existing patterns to follow) |
78
- | **Context** | What already exists that I should build on or avoid duplicating? |
79
-
80
- **Rules:**
81
- - Ask at most 3 questions, ideally fewer if research answered some already
82
- - Make questions specific: "Should this use the existing `AuthService` or a new one?" not "What should I use?"
83
- - Present findings from Phase 2 to show you've already looked
84
- - Wait for answers before starting any code or file changes
85
-
86
- **Example output:**
87
- ```
88
- I found 2 existing auth handlers in src/api/auth.ts.
89
-
90
- Before I proceed, 2 quick questions:
91
- 1. Should the new endpoint extend AuthService or create a separate flow?
92
- 2. What error format should failures return — current JSON schema or HTTP exceptions?
93
- ```
94
-
95
- ---
96
-
97
- ## Phase 4 — Execute
98
-
99
- **Goal**: Proceed with full context, producing high-quality output.
100
-
101
- With enriched context from the user's answers:
102
- 1. Restate the refined task in 1-2 sentences to confirm understanding
103
- 2. Execute with specificity — reference exact files, functions, and patterns found in Phase 2
104
- 3. Follow existing conventions from the codebase (naming, error handling, structure)
105
- 4. If anything is still ambiguous, make a reasonable decision and state the assumption explicitly
106
-
107
- ---
108
-
109
- ## Quick Reference
110
-
111
- ```
112
- Vague prompt detected
113
-
114
- Phase 1: Analyze → Is it vague?
115
- ↓ yes
116
- Phase 2: Research → grep codebase for context
117
-
118
- Phase 3: Question → ask ≤3 targeted questions → wait for answers
119
-
120
- Phase 4: Execute → proceed with enriched context
121
- ```
122
-
123
- ## Notes
124
-
125
- This skill is triggered automatically by the `improve-prompt` hook in `.ai-config/hooks/improve-prompt.md`. You can also invoke it manually when a user seems uncertain about what they want.