@leejungkiin/awkit 1.1.0 → 1.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/README.md +3 -3
- package/VERSION +1 -1
- package/bin/awf.js +1 -1
- package/bin/awk.js +237 -26
- package/core/AGENTS.md +8 -9
- package/core/GEMINI.md +74 -199
- package/package.json +3 -2
- package/skill-packs/neural-memory/skills/nm-memory-sync/SKILL.md +2 -2
- package/skills/CATALOG.md +3 -2
- package/skills/README.md +109 -0
- package/skills/android-re-analyzer/SKILL.md +238 -0
- package/skills/android-re-analyzer/references/api-extraction-patterns.md +119 -0
- package/skills/android-re-analyzer/references/call-flow-analysis.md +176 -0
- package/skills/android-re-analyzer/references/fernflower-usage.md +115 -0
- package/skills/android-re-analyzer/references/jadx-usage.md +116 -0
- package/skills/android-re-analyzer/references/setup-guide.md +221 -0
- package/skills/android-re-analyzer/scripts/check-deps.sh +129 -0
- package/skills/android-re-analyzer/scripts/decompile.sh +375 -0
- package/skills/android-re-analyzer/scripts/find-api-calls.sh +118 -0
- package/skills/android-re-analyzer/scripts/install-dep.sh +448 -0
- package/skills/awf-session-restore/SKILL.md +108 -184
- package/skills/beads-manager/SKILL.md +2 -2
- package/skills/brainstorm-agent/SKILL.md +47 -2
- package/skills/gemini-conductor/SKILL.md +234 -0
- package/skills/memory-sync/SKILL.md +29 -1
- package/skills/nm-memory-sync/SKILL.md +2 -2
- package/skills/orchestrator/SKILL.md +29 -155
- package/skills/skills/nm-memory-sync/SKILL.md +2 -2
- package/skills/smali-to-kotlin/SKILL.md +1 -1
- package/skills/smali-to-swift/SKILL.md +1 -1
- package/skills/swiftui-pro/SKILL.md +108 -0
- package/skills/swiftui-pro/agents/openai.yaml +10 -0
- package/skills/swiftui-pro/assets/swiftui-pro-icon.png +0 -0
- package/skills/swiftui-pro/assets/swiftui-pro-icon.svg +29 -0
- package/skills/swiftui-pro/references/accessibility.md +13 -0
- package/skills/swiftui-pro/references/api.md +39 -0
- package/skills/swiftui-pro/references/data.md +43 -0
- package/skills/swiftui-pro/references/design.md +31 -0
- package/skills/swiftui-pro/references/hygiene.md +9 -0
- package/skills/swiftui-pro/references/navigation.md +14 -0
- package/skills/swiftui-pro/references/performance.md +46 -0
- package/skills/swiftui-pro/references/swift.md +56 -0
- package/skills/swiftui-pro/references/views.md +35 -0
- package/skills/symphony-enforcer/SKILL.md +362 -0
- package/skills/symphony-orchestrator/SKILL.md +301 -0
- package/skills/telegram-notify/SKILL.md +57 -0
- package/symphony/LICENSE +21 -0
- package/symphony/README.md +178 -0
- package/symphony/app/api/agents/route.js +152 -0
- package/symphony/app/api/events/route.js +22 -0
- package/symphony/app/api/knowledge/route.js +253 -0
- package/symphony/app/api/locks/route.js +29 -0
- package/symphony/app/api/notes/route.js +125 -0
- package/symphony/app/api/preflight/route.js +23 -0
- package/symphony/app/api/projects/route.js +116 -0
- package/symphony/app/api/roles/route.js +134 -0
- package/symphony/app/api/skills/route.js +82 -0
- package/symphony/app/api/status/route.js +18 -0
- package/symphony/app/api/tasks/route.js +157 -0
- package/symphony/app/api/workflows/route.js +61 -0
- package/symphony/app/api/workspaces/route.js +15 -0
- package/symphony/app/globals.css +2605 -0
- package/symphony/app/layout.js +20 -0
- package/symphony/app/page.js +2122 -0
- package/symphony/cli/index.js +1060 -0
- package/symphony/core/agent-manager.js +357 -0
- package/symphony/core/context-bus.js +100 -0
- package/symphony/core/db.js +223 -0
- package/symphony/core/file-lock-manager.js +154 -0
- package/symphony/core/merge-pipeline.js +234 -0
- package/symphony/core/orchestrator.js +236 -0
- package/symphony/core/task-manager.js +335 -0
- package/symphony/core/workspace-manager.js +168 -0
- package/symphony/jsconfig.json +7 -0
- package/symphony/lib/core.mjs +1034 -0
- package/symphony/mcp/index.js +29 -0
- package/symphony/mcp/server.js +110 -0
- package/symphony/mcp/tools/context.js +80 -0
- package/symphony/mcp/tools/locks.js +99 -0
- package/symphony/mcp/tools/status.js +82 -0
- package/symphony/mcp/tools/tasks.js +216 -0
- package/symphony/mcp/tools/workspace.js +143 -0
- package/symphony/next.config.mjs +7 -0
- package/symphony/package.json +53 -0
- package/symphony/scripts/postinstall.js +49 -0
- package/symphony/symphony.config.js +41 -0
- package/templates/conductor-tracks.md +38 -0
- package/templates/specs/PROJECT.md +50 -0
- package/templates/specs/ROADMAP.md +79 -0
- package/templates/specs/TECH-SPEC.md +81 -0
- package/templates/specs/task-spec-template.xml +65 -0
- package/templates/workflow_dual_mode_template.md +5 -5
- package/workflows/_uncategorized/AGENTS.md +38 -0
- package/workflows/_uncategorized/decompile.md +67 -0
- package/workflows/_uncategorized/skill-health.md +7 -7
- package/workflows/ads/ads-audit.md +5 -5
- package/workflows/ads/ads-optimize.md +10 -10
- package/workflows/ads/adsExpert.md +7 -7
- package/workflows/conductor.md +97 -0
- package/workflows/context/auto-implement.md +4 -4
- package/workflows/context/codebase-sync.md +19 -8
- package/workflows/context/next.md +27 -27
- package/workflows/context/user-intent-analysis-workflow.md +4 -4
- package/workflows/expert/codeExpert.md +28 -31
- package/workflows/expert/debugExpert.md +11 -11
- package/workflows/expert/planExpert.md +21 -36
- package/workflows/git/smart-git-ops.md +49 -6
- package/workflows/lifecycle/debug.md +7 -7
- package/workflows/lifecycle/deploy.md +10 -10
- package/workflows/lifecycle/init.md +103 -91
- package/workflows/lifecycle/master-code-workflow.md +3 -3
- package/workflows/lifecycle/plan.md +19 -21
- package/workflows/quality/audit.md +1 -1
- package/workflows/quality/project-audit.md +1 -1
- package/workflows/roles/vibe-coding-master-workflow.md +2 -2
- package/workflows/smart-git-ops.md +146 -0
- package/workflows/ui/app-screen-analyzer.md +4 -4
- package/workflows/ui/create-feature.md +8 -8
- package/workflows/ui/create-spec-architect.md +11 -11
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symphony MCP Tools — Workspace Management
|
|
3
|
+
*
|
|
4
|
+
* Tools for workspace/git operations:
|
|
5
|
+
* - symphony_workspace_status: Get workspace info + diff stats
|
|
6
|
+
* - symphony_merge_task: Trigger auto-merge pipeline
|
|
7
|
+
*/
|
|
8
|
+
const { z } = require('zod');
|
|
9
|
+
const workspaceManager = require('../../core/workspace-manager');
|
|
10
|
+
const mergePipeline = require('../../core/merge-pipeline');
|
|
11
|
+
|
|
12
|
+
const tools = [];
|
|
13
|
+
|
|
14
|
+
// ─── symphony_workspace_status ──────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
tools.push({
|
|
17
|
+
name: 'symphony_workspace_status',
|
|
18
|
+
description: 'Get workspace info for a task — branch, path, diff stats, and commit log.',
|
|
19
|
+
schema: {
|
|
20
|
+
task_id: z.string().describe('Task ID to check workspace for'),
|
|
21
|
+
},
|
|
22
|
+
handler: async ({ task_id }) => {
|
|
23
|
+
try {
|
|
24
|
+
const ws = workspaceManager.getWorkspace(task_id);
|
|
25
|
+
|
|
26
|
+
if (!ws) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: JSON.stringify({
|
|
31
|
+
exists: false,
|
|
32
|
+
message: `No active workspace for task ${task_id}`,
|
|
33
|
+
}),
|
|
34
|
+
}],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Get repo path from workspace path
|
|
39
|
+
const path = require('path');
|
|
40
|
+
const repoPath = getRepoPath(ws.path);
|
|
41
|
+
|
|
42
|
+
const diff = mergePipeline.getDiff(task_id, repoPath);
|
|
43
|
+
const log = mergePipeline.getBranchLog(task_id, repoPath);
|
|
44
|
+
const conflicts = mergePipeline.checkConflicts(task_id, repoPath);
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
content: [{
|
|
48
|
+
type: 'text',
|
|
49
|
+
text: JSON.stringify({
|
|
50
|
+
exists: true,
|
|
51
|
+
workspace: {
|
|
52
|
+
id: ws.id,
|
|
53
|
+
path: ws.path,
|
|
54
|
+
branch: ws.branch,
|
|
55
|
+
type: ws.type,
|
|
56
|
+
created_at: ws.created_at,
|
|
57
|
+
},
|
|
58
|
+
diff: {
|
|
59
|
+
files: diff.files,
|
|
60
|
+
insertions: diff.insertions,
|
|
61
|
+
deletions: diff.deletions,
|
|
62
|
+
},
|
|
63
|
+
commits: log.length,
|
|
64
|
+
commitLog: log.slice(0, 10),
|
|
65
|
+
hasConflicts: conflicts.hasConflicts,
|
|
66
|
+
conflictingFiles: conflicts.conflictingFiles,
|
|
67
|
+
}),
|
|
68
|
+
}],
|
|
69
|
+
};
|
|
70
|
+
} catch (error) {
|
|
71
|
+
return {
|
|
72
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// ─── symphony_merge_task ────────────────────────────────────────────────────
|
|
80
|
+
|
|
81
|
+
tools.push({
|
|
82
|
+
name: 'symphony_merge_task',
|
|
83
|
+
description: 'Run auto-merge pipeline for a completed task: rebase → merge → cleanup.',
|
|
84
|
+
schema: {
|
|
85
|
+
task_id: z.string().describe('Task ID to merge'),
|
|
86
|
+
repo_path: z.string().optional().describe('Repository path (auto-detected if omitted)'),
|
|
87
|
+
},
|
|
88
|
+
handler: async ({ task_id, repo_path }) => {
|
|
89
|
+
try {
|
|
90
|
+
const ws = workspaceManager.getWorkspace(task_id);
|
|
91
|
+
if (!ws) {
|
|
92
|
+
return {
|
|
93
|
+
content: [{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: JSON.stringify({
|
|
96
|
+
status: 'error',
|
|
97
|
+
message: `No active workspace for task ${task_id}`,
|
|
98
|
+
}),
|
|
99
|
+
}],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const repoPath = repo_path || getRepoPath(ws.path);
|
|
105
|
+
const result = mergePipeline.autoMerge(task_id, repoPath);
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
content: [{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: JSON.stringify(result),
|
|
111
|
+
}],
|
|
112
|
+
isError: result.status === 'error',
|
|
113
|
+
};
|
|
114
|
+
} catch (error) {
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: 'text', text: JSON.stringify({ error: error.message }) }],
|
|
117
|
+
isError: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// ─── Helper ─────────────────────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Derive the main repo path from a workspace path.
|
|
127
|
+
* Workspaces are typically in .symphony/workspaces/<task-id> relative to repo.
|
|
128
|
+
*/
|
|
129
|
+
function getRepoPath(wsPath) {
|
|
130
|
+
const path = require('path');
|
|
131
|
+
// Walk up from workspace to find .git
|
|
132
|
+
let current = path.dirname(wsPath);
|
|
133
|
+
for (let i = 0; i < 5; i++) {
|
|
134
|
+
const gitDir = path.join(current, '.git');
|
|
135
|
+
const fs = require('fs');
|
|
136
|
+
if (fs.existsSync(gitDir)) return current;
|
|
137
|
+
current = path.dirname(current);
|
|
138
|
+
}
|
|
139
|
+
// Fallback: assume workspace is in .symphony/workspaces/ under repo root
|
|
140
|
+
return path.resolve(wsPath, '..', '..', '..');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
module.exports = tools;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "awkit-symphony",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Multi-Agent Orchestration for AI Coding Assistants — task management, git isolation, file locking, and real-time dashboard",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"multi-agent",
|
|
8
|
+
"orchestration",
|
|
9
|
+
"mcp",
|
|
10
|
+
"git",
|
|
11
|
+
"worktree",
|
|
12
|
+
"dashboard",
|
|
13
|
+
"coding-assistant"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"main": "core/orchestrator.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"symphony": "./cli/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"core/",
|
|
22
|
+
"cli/",
|
|
23
|
+
"mcp/",
|
|
24
|
+
"lib/",
|
|
25
|
+
"app/",
|
|
26
|
+
"scripts/",
|
|
27
|
+
"symphony.config.js",
|
|
28
|
+
"next.config.mjs",
|
|
29
|
+
"jsconfig.json",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=20.0.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"dev": "next dev -p 3100",
|
|
37
|
+
"build": "next build",
|
|
38
|
+
"start": "next start -p 3100",
|
|
39
|
+
"postinstall": "node scripts/postinstall.js",
|
|
40
|
+
"cli": "node cli/index.js",
|
|
41
|
+
"mcp": "node mcp/server.js"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
45
|
+
"better-sqlite3": "^12.6.2",
|
|
46
|
+
"commander": "^14.0.3",
|
|
47
|
+
"nanoid": "^3.3.11",
|
|
48
|
+
"next": "16.1.6",
|
|
49
|
+
"react": "19.2.3",
|
|
50
|
+
"react-dom": "19.2.3",
|
|
51
|
+
"zod": "^4.3.6"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Symphony Postinstall Script
|
|
5
|
+
* Automatically builds the Next.js dashboard after `npm install`.
|
|
6
|
+
* Skips build during development (when running from source directory).
|
|
7
|
+
*/
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const fs = require('fs');
|
|
11
|
+
|
|
12
|
+
const ROOT = path.join(__dirname, '..');
|
|
13
|
+
|
|
14
|
+
// Skip if .next/ already exists (already built)
|
|
15
|
+
if (fs.existsSync(path.join(ROOT, '.next'))) {
|
|
16
|
+
console.log('✅ Symphony dashboard already built — skipping.');
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Skip if we're in a CI environment that doesn't need the dashboard
|
|
21
|
+
if (process.env.CI || process.env.SYMPHONY_SKIP_BUILD) {
|
|
22
|
+
console.log('⏭️ Skipping Symphony build (CI or SYMPHONY_SKIP_BUILD set).');
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log('🎼 Symphony — Building dashboard...');
|
|
28
|
+
console.log(' This only happens once after installation.');
|
|
29
|
+
console.log('');
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
execSync('npx next build', {
|
|
33
|
+
cwd: ROOT,
|
|
34
|
+
stdio: 'inherit',
|
|
35
|
+
env: { ...process.env, NODE_ENV: 'production' },
|
|
36
|
+
});
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log('✅ Symphony dashboard built successfully!');
|
|
39
|
+
console.log(' Run `symphony start` to launch.');
|
|
40
|
+
console.log('');
|
|
41
|
+
} catch (err) {
|
|
42
|
+
console.error('');
|
|
43
|
+
console.error('⚠️ Symphony dashboard build failed.');
|
|
44
|
+
console.error(' You can manually build later with: symphony build');
|
|
45
|
+
console.error(' The CLI commands will still work without the dashboard.');
|
|
46
|
+
console.error('');
|
|
47
|
+
// Don't fail the install — CLI/MCP still work without dashboard
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symphony Configuration
|
|
3
|
+
* Default settings for the AWKit Symphony orchestration platform.
|
|
4
|
+
*/
|
|
5
|
+
module.exports = {
|
|
6
|
+
// Server
|
|
7
|
+
port: 3100,
|
|
8
|
+
|
|
9
|
+
// Concurrency
|
|
10
|
+
maxAgents: 3,
|
|
11
|
+
|
|
12
|
+
// Workspace
|
|
13
|
+
workspace: {
|
|
14
|
+
root: '.symphony/workspaces',
|
|
15
|
+
type: 'hybrid', // 'worktree' | 'clone' | 'hybrid'
|
|
16
|
+
cloneThreshold: 30, // files > 30 → full clone instead of worktree
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
// Git
|
|
20
|
+
git: {
|
|
21
|
+
autoMerge: true,
|
|
22
|
+
targetBranch: 'main',
|
|
23
|
+
branchPrefix: 'symphony/',
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
// File Locks
|
|
27
|
+
locks: {
|
|
28
|
+
strategy: 'pessimistic',
|
|
29
|
+
autoRelease: 3600, // seconds — auto-release stuck locks
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// Dashboard
|
|
33
|
+
dashboard: {
|
|
34
|
+
theme: 'dark',
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
// Database
|
|
38
|
+
db: {
|
|
39
|
+
path: null, // null = auto-detect (~/.symphony/symphony.db or .symphony/symphony.db)
|
|
40
|
+
},
|
|
41
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 🎼 Strategic Tracks — Conductor Roadmap
|
|
2
|
+
|
|
3
|
+
> This file is managed by the Conductor (Gemini CLI).
|
|
4
|
+
> Antigravity IDE reads this for context. CLI writes strategic updates.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Active Tracks
|
|
9
|
+
|
|
10
|
+
### Track 1: [Track Name]
|
|
11
|
+
- **Goal:** [What we're trying to achieve]
|
|
12
|
+
- **Status:** 🔵 Planning | 🟢 In Progress | ✅ Done
|
|
13
|
+
- **Milestones:**
|
|
14
|
+
- [ ] Milestone 1
|
|
15
|
+
- [ ] Milestone 2
|
|
16
|
+
- [ ] Milestone 3
|
|
17
|
+
- **Key Decisions:**
|
|
18
|
+
- [Decision 1 — rationale]
|
|
19
|
+
- **Notes:**
|
|
20
|
+
- [Any important context]
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Completed Tracks
|
|
25
|
+
|
|
26
|
+
<!-- Move completed tracks here for reference -->
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Decision Log
|
|
31
|
+
|
|
32
|
+
| Date | Decision | Rationale | Track |
|
|
33
|
+
|------|----------|-----------|-------|
|
|
34
|
+
| YYYY-MM-DD | ... | ... | #1 |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
*Last updated by Conductor: [timestamp]*
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Project Spec
|
|
2
|
+
|
|
3
|
+
> Created: {{DATE}} | Last Updated: {{DATE}}
|
|
4
|
+
|
|
5
|
+
## Vision
|
|
6
|
+
|
|
7
|
+
[1-2 sentences describing the core purpose and value proposition of this project.]
|
|
8
|
+
|
|
9
|
+
## Goals
|
|
10
|
+
|
|
11
|
+
1. **Primary Goal:** [What is the #1 thing this project must achieve?]
|
|
12
|
+
2. **Secondary Goal:** [What else matters?]
|
|
13
|
+
3. **Stretch Goal:** [Nice-to-have if time permits]
|
|
14
|
+
|
|
15
|
+
## Target Audience
|
|
16
|
+
|
|
17
|
+
| Segment | Description | Pain Point |
|
|
18
|
+
|---------|-------------|------------|
|
|
19
|
+
| Primary | [Who is the main user?] | [What problem do they face?] |
|
|
20
|
+
| Secondary | [Other user group] | [Their specific need] |
|
|
21
|
+
|
|
22
|
+
## Success Metrics
|
|
23
|
+
|
|
24
|
+
- [ ] **Metric 1:** [e.g., 1000 DAU within 3 months]
|
|
25
|
+
- [ ] **Metric 2:** [e.g., 4.5+ App Store rating]
|
|
26
|
+
- [ ] **Metric 3:** [e.g., < 2s cold start time]
|
|
27
|
+
|
|
28
|
+
## Scope
|
|
29
|
+
|
|
30
|
+
### In Scope (v1)
|
|
31
|
+
- Feature A
|
|
32
|
+
- Feature B
|
|
33
|
+
- Feature C
|
|
34
|
+
|
|
35
|
+
### Out of Scope (v1)
|
|
36
|
+
- Feature X (deferred to v2)
|
|
37
|
+
- Feature Y (requires further research)
|
|
38
|
+
|
|
39
|
+
## Key Decisions
|
|
40
|
+
|
|
41
|
+
| Decision | Choice | Rationale |
|
|
42
|
+
|----------|--------|-----------|
|
|
43
|
+
| [e.g., Backend] | [e.g., Firebase] | [Why this choice] |
|
|
44
|
+
| [e.g., State Mgmt] | [e.g., SwiftUI @Observable] | [Why] |
|
|
45
|
+
|
|
46
|
+
## References
|
|
47
|
+
|
|
48
|
+
- [Design inspiration link]
|
|
49
|
+
- [Competitor analysis link]
|
|
50
|
+
- [Technical reference]
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Roadmap
|
|
2
|
+
|
|
3
|
+
> Created: {{DATE}} | Last Updated: {{DATE}}
|
|
4
|
+
> Source of truth: PROJECT.md
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
| Phase | Title | Status | Priority |
|
|
9
|
+
|-------|-------|--------|----------|
|
|
10
|
+
| 1 | [Phase title] | 🔲 Not Started | P0 |
|
|
11
|
+
| 2 | [Phase title] | 🔲 Not Started | P1 |
|
|
12
|
+
| 3 | [Phase title] | 🔲 Not Started | P2 |
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Phase 1: [Title] — [Target Date]
|
|
17
|
+
|
|
18
|
+
**Goal:** [What this phase delivers in 1 sentence]
|
|
19
|
+
|
|
20
|
+
**Requirements Covered:** REQUIREMENTS.md § R1, R2
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
- [ ] Feature 1.1 — [Short description]
|
|
24
|
+
- [ ] Feature 1.2 — [Short description]
|
|
25
|
+
- [ ] Feature 1.3 — [Short description]
|
|
26
|
+
|
|
27
|
+
### Dependencies
|
|
28
|
+
- [External service / API / library needed]
|
|
29
|
+
|
|
30
|
+
### Definition of Done
|
|
31
|
+
- [ ] All features functional
|
|
32
|
+
- [ ] Core tests passing
|
|
33
|
+
- [ ] No P0 bugs
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Phase 2: [Title] — [Target Date]
|
|
38
|
+
|
|
39
|
+
**Goal:** [What this phase delivers]
|
|
40
|
+
|
|
41
|
+
**Requirements Covered:** REQUIREMENTS.md § R3, R4
|
|
42
|
+
|
|
43
|
+
### Features
|
|
44
|
+
- [ ] Feature 2.1
|
|
45
|
+
- [ ] Feature 2.2
|
|
46
|
+
|
|
47
|
+
### Dependencies
|
|
48
|
+
- Phase 1 complete
|
|
49
|
+
|
|
50
|
+
### Definition of Done
|
|
51
|
+
- [ ] All features functional
|
|
52
|
+
- [ ] Integration tests passing
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Phase 3: [Title] — [Target Date]
|
|
57
|
+
|
|
58
|
+
**Goal:** [What this phase delivers]
|
|
59
|
+
|
|
60
|
+
**Requirements Covered:** REQUIREMENTS.md § R5+
|
|
61
|
+
|
|
62
|
+
### Features
|
|
63
|
+
- [ ] Feature 3.1
|
|
64
|
+
- [ ] Feature 3.2
|
|
65
|
+
|
|
66
|
+
### Definition of Done
|
|
67
|
+
- [ ] All features functional
|
|
68
|
+
- [ ] Performance benchmarks met
|
|
69
|
+
- [ ] Ready for production release
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Milestone Tracking
|
|
74
|
+
|
|
75
|
+
| Milestone | Target | Actual | Status |
|
|
76
|
+
|-----------|--------|--------|--------|
|
|
77
|
+
| MVP (Phase 1) | [Date] | — | 🔲 |
|
|
78
|
+
| Beta (Phase 2) | [Date] | — | 🔲 |
|
|
79
|
+
| Launch (Phase 3) | [Date] | — | 🔲 |
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Technical Specification
|
|
2
|
+
|
|
3
|
+
> Created: {{DATE}} | Last Updated: {{DATE}}
|
|
4
|
+
> Companion to: PROJECT.md, REQUIREMENTS.md
|
|
5
|
+
|
|
6
|
+
## Architecture Overview
|
|
7
|
+
|
|
8
|
+
[1-2 sentences describing the high-level architecture pattern being used.]
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
[Simple ASCII diagram of the system architecture]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Tech Stack
|
|
15
|
+
|
|
16
|
+
| Layer | Technology | Version | Rationale |
|
|
17
|
+
|-------|-----------|---------|-----------|
|
|
18
|
+
| Language | [e.g., Swift] | [e.g., 6.0] | [Why] |
|
|
19
|
+
| Framework | [e.g., SwiftUI] | [e.g., iOS 17+] | [Why] |
|
|
20
|
+
| Backend | [e.g., Firebase] | [e.g., v11] | [Why] |
|
|
21
|
+
| Database | [e.g., GRDB] | [e.g., 7.x] | [Why] |
|
|
22
|
+
| AI/ML | [e.g., Gemini 2.5] | — | [Why] |
|
|
23
|
+
| Analytics | [e.g., Firebase Analytics] | — | [Why] |
|
|
24
|
+
|
|
25
|
+
## Architecture Decisions
|
|
26
|
+
|
|
27
|
+
### AD-1: [Decision Title]
|
|
28
|
+
|
|
29
|
+
**Context:** [What problem or question prompted this decision?]
|
|
30
|
+
**Decision:** [What was decided]
|
|
31
|
+
**Consequences:** [What trade-offs or implications does this have?]
|
|
32
|
+
**Alternatives Considered:** [What else was evaluated?]
|
|
33
|
+
|
|
34
|
+
### AD-2: [Decision Title]
|
|
35
|
+
|
|
36
|
+
**Context:** [...]
|
|
37
|
+
**Decision:** [...]
|
|
38
|
+
**Consequences:** [...]
|
|
39
|
+
|
|
40
|
+
## Patterns & Conventions
|
|
41
|
+
|
|
42
|
+
### Code Organization
|
|
43
|
+
```
|
|
44
|
+
[Folder structure with descriptions]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Naming Conventions
|
|
48
|
+
- Files: [e.g., PascalCase for types, camelCase for functions]
|
|
49
|
+
- Modules: [e.g., feature-based grouping]
|
|
50
|
+
- Tests: [e.g., Test suffix, describe/it pattern]
|
|
51
|
+
|
|
52
|
+
### Error Handling
|
|
53
|
+
[Standard error handling approach for the project]
|
|
54
|
+
|
|
55
|
+
### State Management
|
|
56
|
+
[How state is managed across the app]
|
|
57
|
+
|
|
58
|
+
## Constraints & Non-Negotiables
|
|
59
|
+
|
|
60
|
+
> [!CAUTION]
|
|
61
|
+
> These constraints MUST be followed in ALL implementation plans.
|
|
62
|
+
|
|
63
|
+
1. **[Constraint 1]:** [e.g., All network calls must have offline fallback]
|
|
64
|
+
2. **[Constraint 2]:** [e.g., No hardcoded strings — use localization]
|
|
65
|
+
3. **[Constraint 3]:** [e.g., All AI calls must respect quota limits]
|
|
66
|
+
4. **[Constraint 4]:** [e.g., Minimum iOS 17 / Android 14 support]
|
|
67
|
+
|
|
68
|
+
## Security Requirements
|
|
69
|
+
|
|
70
|
+
- Authentication: [e.g., Firebase Auth with Apple/Google Sign-In]
|
|
71
|
+
- Data at rest: [e.g., Keychain for sensitive data]
|
|
72
|
+
- API keys: [e.g., Firebase Remote Config, never hardcoded]
|
|
73
|
+
|
|
74
|
+
## Performance Targets
|
|
75
|
+
|
|
76
|
+
| Metric | Target | How to Measure |
|
|
77
|
+
|--------|--------|----------------|
|
|
78
|
+
| Cold start | < [X]s | Instruments / Profiler |
|
|
79
|
+
| API response | < [X]ms | Network logs |
|
|
80
|
+
| Memory | < [X]MB | Memory profiler |
|
|
81
|
+
| App size | < [X]MB | Archive build |
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
AWF Task Spec Template (XML Format)
|
|
3
|
+
|
|
4
|
+
Usage: Copy this structure into implementation_plan.md for each task.
|
|
5
|
+
AI parses these blocks precisely during EXECUTION mode.
|
|
6
|
+
|
|
7
|
+
Attributes:
|
|
8
|
+
type="auto" → AI executes without user interaction
|
|
9
|
+
type="manual" → Requires user action (e.g., config, credentials)
|
|
10
|
+
|
|
11
|
+
Elements:
|
|
12
|
+
<name> → Short task title
|
|
13
|
+
<files> → Comma-separated list of files to create/modify
|
|
14
|
+
<spec_ref> → Reference to REQUIREMENTS.md or TECH-SPEC.md section
|
|
15
|
+
<depends_on> → Task names this depends on (for wave grouping)
|
|
16
|
+
<action> → Specific implementation instructions
|
|
17
|
+
<verify> → Command or check to verify task completion
|
|
18
|
+
<done> → Expected final state description
|
|
19
|
+
-->
|
|
20
|
+
|
|
21
|
+
<!-- Example: Single independent task -->
|
|
22
|
+
<task type="auto">
|
|
23
|
+
<name>Create User model</name>
|
|
24
|
+
<files>Models/User.swift, Models/UserRepository.swift</files>
|
|
25
|
+
<spec_ref>REQUIREMENTS.md § R1, TECH-SPEC.md § AD-1</spec_ref>
|
|
26
|
+
<depends_on>none</depends_on>
|
|
27
|
+
<action>
|
|
28
|
+
Create User struct with Codable conformance.
|
|
29
|
+
Implement UserRepository with GRDB persistence.
|
|
30
|
+
Follow offline-first pattern from TECH-SPEC.md.
|
|
31
|
+
</action>
|
|
32
|
+
<verify>Unit test: UserRepositoryTests — insert, fetch, delete pass</verify>
|
|
33
|
+
<done>User model persists to local DB with full CRUD</done>
|
|
34
|
+
</task>
|
|
35
|
+
|
|
36
|
+
<!-- Example: Dependent task -->
|
|
37
|
+
<task type="auto">
|
|
38
|
+
<name>Create login endpoint</name>
|
|
39
|
+
<files>Services/AuthService.swift, ViewModels/LoginViewModel.swift</files>
|
|
40
|
+
<spec_ref>REQUIREMENTS.md § R2</spec_ref>
|
|
41
|
+
<depends_on>Create User model</depends_on>
|
|
42
|
+
<action>
|
|
43
|
+
Use Firebase Auth for authentication.
|
|
44
|
+
Store session in Keychain per TECH-SPEC.md § Security.
|
|
45
|
+
Handle offline: queue login attempt, retry on connectivity.
|
|
46
|
+
</action>
|
|
47
|
+
<verify>Login with test credentials returns valid session token</verify>
|
|
48
|
+
<done>User can log in; session persists across app restarts</done>
|
|
49
|
+
</task>
|
|
50
|
+
|
|
51
|
+
<!-- Example: Manual task -->
|
|
52
|
+
<task type="manual">
|
|
53
|
+
<name>Configure Firebase project</name>
|
|
54
|
+
<files>GoogleService-Info.plist</files>
|
|
55
|
+
<spec_ref>TECH-SPEC.md § Tech Stack</spec_ref>
|
|
56
|
+
<depends_on>none</depends_on>
|
|
57
|
+
<action>
|
|
58
|
+
User must:
|
|
59
|
+
1. Create Firebase project at console.firebase.google.com
|
|
60
|
+
2. Download GoogleService-Info.plist
|
|
61
|
+
3. Add to Xcode project root
|
|
62
|
+
</action>
|
|
63
|
+
<verify>FirebaseApp.configure() succeeds without crash</verify>
|
|
64
|
+
<done>Firebase SDK initialized on app launch</done>
|
|
65
|
+
</task>
|
|
@@ -34,7 +34,7 @@ description: [Short description of the workflow]
|
|
|
34
34
|
### Phase 1: Context & Setup
|
|
35
35
|
1. **Understand Intent:**
|
|
36
36
|
- "Bạn muốn làm gì với [Command]?"
|
|
37
|
-
- (AI analyzes context from `.project-identity` & `.
|
|
37
|
+
- (AI analyzes context from `.project-identity` & `.symphony`)
|
|
38
38
|
|
|
39
39
|
2. **Configuration:**
|
|
40
40
|
- [Question 1]
|
|
@@ -68,7 +68,7 @@ description: [Short description of the workflow]
|
|
|
68
68
|
- Locations of artifacts.
|
|
69
69
|
|
|
70
70
|
2. **Memory Sync:**
|
|
71
|
-
- Auto-sync with
|
|
71
|
+
- Auto-sync with Symphony (Task) & Brain (Knowledge).
|
|
72
72
|
|
|
73
73
|
3. **Next Steps Menu:**
|
|
74
74
|
```markdown
|
|
@@ -79,9 +79,9 @@ description: [Short description of the workflow]
|
|
|
79
79
|
|
|
80
80
|
---
|
|
81
81
|
|
|
82
|
-
## 🧠 Brain &
|
|
82
|
+
## 🧠 Brain & Symphony Integration
|
|
83
83
|
|
|
84
|
-
- **Input:** Check `
|
|
84
|
+
- **Input:** Check `symphony_available_tasks(filter="my")` to resume context.
|
|
85
85
|
- **Output:**
|
|
86
|
-
- Create/Update
|
|
86
|
+
- Create/Update Symphony task.
|
|
87
87
|
- Create Brain memory file if knowledge is valuable.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
This project uses **Symphony** for task management and issue tracking.
|
|
4
|
+
|
|
5
|
+
## Quick Reference
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
symphony_available_tasks # Find available work
|
|
9
|
+
symphony_claim_task <id> # Claim a task
|
|
10
|
+
symphony_report_progress <id> # Report progress
|
|
11
|
+
symphony_complete_task <id> # Complete work
|
|
12
|
+
symphony_status # Check system status
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Landing the Plane (Session Completion)
|
|
16
|
+
|
|
17
|
+
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
|
|
18
|
+
|
|
19
|
+
**MANDATORY WORKFLOW:**
|
|
20
|
+
|
|
21
|
+
1. **File issues for remaining work** — Create tasks for anything that needs follow-up
|
|
22
|
+
2. **Run quality gates** (if code changed) — Tests, linters, builds
|
|
23
|
+
3. **Update task status** — Complete finished work, update in-progress items
|
|
24
|
+
4. **PUSH TO REMOTE** — This is MANDATORY:
|
|
25
|
+
```bash
|
|
26
|
+
git pull --rebase
|
|
27
|
+
git push
|
|
28
|
+
git status # MUST show "up to date with origin"
|
|
29
|
+
```
|
|
30
|
+
5. **Clean up** — Clear stashes, prune remote branches
|
|
31
|
+
6. **Verify** — All changes committed AND pushed
|
|
32
|
+
7. **Hand off** — Provide context for next session
|
|
33
|
+
|
|
34
|
+
**CRITICAL RULES:**
|
|
35
|
+
- Work is NOT complete until `git push` succeeds
|
|
36
|
+
- NEVER stop before pushing — that leaves work stranded locally
|
|
37
|
+
- NEVER say "ready to push when you are" — YOU must push
|
|
38
|
+
- If push fails, resolve and retry until it succeeds
|