speexor 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/API-REFERENCE.md +96 -1
  2. package/ARCHITECTURE.md +83 -32
  3. package/BENCHMARKS.md +73 -0
  4. package/CHANGELOG.md +59 -4
  5. package/CODE-OF-CONDUCT.md +83 -83
  6. package/CONTRIBUTING.md +92 -97
  7. package/FAQ.md +132 -105
  8. package/GLOSSARY.md +34 -0
  9. package/LICENSE.md +21 -21
  10. package/PUBLISH.md +82 -77
  11. package/README.md +220 -6
  12. package/REFACTOR-LOG.md +40 -40
  13. package/ROADMAP.md +31 -42
  14. package/SECURITY-DEFAULTS.md +118 -0
  15. package/SECURITY.md +80 -79
  16. package/SUMMARY.md +31 -8
  17. package/TESTING.md +140 -140
  18. package/dist/{agent-5D3BVWNK.js → agent-C64T66XT.js} +4 -4
  19. package/dist/agent-C64T66XT.js.map +1 -0
  20. package/dist/{chunk-B7WLHC4W.js → chunk-5OD5UWB5.js} +322 -121
  21. package/dist/chunk-5OD5UWB5.js.map +1 -0
  22. package/dist/chunk-GOGI3JQD.js +1637 -0
  23. package/dist/chunk-GOGI3JQD.js.map +1 -0
  24. package/dist/{chunk-2F66BZYJ.js → chunk-VEZQT5SX.js} +80 -8
  25. package/dist/chunk-VEZQT5SX.js.map +1 -0
  26. package/dist/cli/index.js +2058 -18
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/core/index.d.ts +682 -3
  29. package/dist/core/index.js +1 -1
  30. package/dist/index.d.ts +102 -14
  31. package/dist/index.js +55 -29
  32. package/dist/index.js.map +1 -1
  33. package/dist/plugins/index.d.ts +1 -1
  34. package/dist/plugins/index.js +1 -1
  35. package/dist/types-BOMap-tI.d.ts +389 -0
  36. package/docs/PRD03.md +119 -0
  37. package/docs/PRD06.md +125 -0
  38. package/docs/SETUP.md +94 -94
  39. package/docs/TROUBLESHOOTING.md +113 -113
  40. package/docs/adr/0001-record-architecture-decisions.md +44 -0
  41. package/docs/adr/0002-plugin-architecture.md +53 -0
  42. package/docs/adr/0003-recursive-task-decomposition.md +57 -0
  43. package/docs/adr/0004-local-first-security.md +58 -0
  44. package/docs/adr/0005-data-directory-layout.md +69 -0
  45. package/examples/basic.yaml +61 -61
  46. package/package.json +103 -102
  47. package/schema/config.schema.json +119 -119
  48. package/speexor.config.yaml.example +30 -30
  49. package/dist/agent-5D3BVWNK.js.map +0 -1
  50. package/dist/chunk-2F66BZYJ.js.map +0 -1
  51. package/dist/chunk-B7WLHC4W.js.map +0 -1
  52. package/dist/chunk-SXALZEOJ.js +0 -345
  53. package/dist/chunk-SXALZEOJ.js.map +0 -1
  54. package/dist/types-0q_okI2g.d.ts +0 -205
@@ -1,119 +1,119 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://speexjs.dev/schemas/speexor-config.json",
4
- "title": "Speexor Configuration",
5
- "description": "Configuration schema for Speexor — Agent Orchestrator",
6
- "type": "object",
7
- "required": ["version", "projects"],
8
- "properties": {
9
- "version": {
10
- "type": "string",
11
- "enum": ["1"],
12
- "description": "Config schema version"
13
- },
14
- "projects": {
15
- "type": "array",
16
- "minItems": 1,
17
- "items": {
18
- "type": "object",
19
- "required": ["name", "repository", "provider"],
20
- "properties": {
21
- "name": {
22
- "type": "string",
23
- "description": "Project display name"
24
- },
25
- "repository": {
26
- "type": "string",
27
- "description": "Git repository URL or local path"
28
- },
29
- "path": {
30
- "type": "string",
31
- "description": "Local path override for repository"
32
- },
33
- "branch": {
34
- "type": "string",
35
- "description": "Default base branch",
36
- "default": "main"
37
- },
38
- "provider": {
39
- "type": "object",
40
- "required": ["primary"],
41
- "properties": {
42
- "primary": {
43
- "type": "string",
44
- "enum": ["opencode", "claude-code", "aider", "codex"],
45
- "description": "Primary AI coding agent"
46
- },
47
- "fallback": {
48
- "type": "array",
49
- "items": {
50
- "type": "string",
51
- "enum": ["opencode", "claude-code", "aider", "codex"]
52
- },
53
- "description": "Fallback agents in priority order"
54
- },
55
- "concurrentLimit": {
56
- "type": "integer",
57
- "minimum": 1,
58
- "maximum": 20,
59
- "description": "Maximum parallel agents for this project"
60
- },
61
- "costLimit": {
62
- "type": "integer",
63
- "minimum": 0,
64
- "description": "Cost limit in cents per session"
65
- }
66
- }
67
- },
68
- "reactions": {
69
- "type": "object",
70
- "properties": {
71
- "ci-failed": { "$ref": "#/definitions/reactionRule" },
72
- "changes-requested": { "$ref": "#/definitions/reactionRule" },
73
- "approved-and-green": { "$ref": "#/definitions/reactionRule" }
74
- },
75
- "description": "Reaction rules for CI/PR events"
76
- },
77
- "plugins": {
78
- "type": "object",
79
- "properties": {
80
- "tracker": { "type": "string" },
81
- "scm": { "type": "string" },
82
- "runtime": { "type": "string" },
83
- "notifier": { "type": "string" }
84
- }
85
- }
86
- }
87
- }
88
- }
89
- },
90
- "definitions": {
91
- "reactionRule": {
92
- "type": "object",
93
- "required": ["auto", "action"],
94
- "properties": {
95
- "auto": {
96
- "type": "boolean",
97
- "description": "Auto-trigger reaction when event occurs"
98
- },
99
- "action": {
100
- "type": "string",
101
- "enum": ["fix", "notify", "escalate", "skip"],
102
- "description": "Action to take when reaction triggers"
103
- },
104
- "retries": {
105
- "type": "integer",
106
- "minimum": 0,
107
- "maximum": 10,
108
- "description": "Number of retry attempts"
109
- },
110
- "escalateAfter": {
111
- "type": "integer",
112
- "minimum": 1,
113
- "maximum": 1440,
114
- "description": "Minutes before escalating to human"
115
- }
116
- }
117
- }
118
- }
119
- }
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://speexjs.dev/schemas/speexor-config.json",
4
+ "title": "Speexor Configuration",
5
+ "description": "Configuration schema for Speexor — Agent Orchestrator",
6
+ "type": "object",
7
+ "required": ["version", "projects"],
8
+ "properties": {
9
+ "version": {
10
+ "type": "string",
11
+ "enum": ["1"],
12
+ "description": "Config schema version"
13
+ },
14
+ "projects": {
15
+ "type": "array",
16
+ "minItems": 1,
17
+ "items": {
18
+ "type": "object",
19
+ "required": ["name", "repository", "provider"],
20
+ "properties": {
21
+ "name": {
22
+ "type": "string",
23
+ "description": "Project display name"
24
+ },
25
+ "repository": {
26
+ "type": "string",
27
+ "description": "Git repository URL or local path"
28
+ },
29
+ "path": {
30
+ "type": "string",
31
+ "description": "Local path override for repository"
32
+ },
33
+ "branch": {
34
+ "type": "string",
35
+ "description": "Default base branch",
36
+ "default": "main"
37
+ },
38
+ "provider": {
39
+ "type": "object",
40
+ "required": ["primary"],
41
+ "properties": {
42
+ "primary": {
43
+ "type": "string",
44
+ "enum": ["opencode", "claude-code", "aider", "codex"],
45
+ "description": "Primary AI coding agent"
46
+ },
47
+ "fallback": {
48
+ "type": "array",
49
+ "items": {
50
+ "type": "string",
51
+ "enum": ["opencode", "claude-code", "aider", "codex"]
52
+ },
53
+ "description": "Fallback agents in priority order"
54
+ },
55
+ "concurrentLimit": {
56
+ "type": "integer",
57
+ "minimum": 1,
58
+ "maximum": 20,
59
+ "description": "Maximum parallel agents for this project"
60
+ },
61
+ "costLimit": {
62
+ "type": "integer",
63
+ "minimum": 0,
64
+ "description": "Cost limit in cents per session"
65
+ }
66
+ }
67
+ },
68
+ "reactions": {
69
+ "type": "object",
70
+ "properties": {
71
+ "ci-failed": { "$ref": "#/definitions/reactionRule" },
72
+ "changes-requested": { "$ref": "#/definitions/reactionRule" },
73
+ "approved-and-green": { "$ref": "#/definitions/reactionRule" }
74
+ },
75
+ "description": "Reaction rules for CI/PR events"
76
+ },
77
+ "plugins": {
78
+ "type": "object",
79
+ "properties": {
80
+ "tracker": { "type": "string" },
81
+ "scm": { "type": "string" },
82
+ "runtime": { "type": "string" },
83
+ "notifier": { "type": "string" }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ },
90
+ "definitions": {
91
+ "reactionRule": {
92
+ "type": "object",
93
+ "required": ["auto", "action"],
94
+ "properties": {
95
+ "auto": {
96
+ "type": "boolean",
97
+ "description": "Auto-trigger reaction when event occurs"
98
+ },
99
+ "action": {
100
+ "type": "string",
101
+ "enum": ["fix", "notify", "escalate", "skip"],
102
+ "description": "Action to take when reaction triggers"
103
+ },
104
+ "retries": {
105
+ "type": "integer",
106
+ "minimum": 0,
107
+ "maximum": 10,
108
+ "description": "Number of retry attempts"
109
+ },
110
+ "escalateAfter": {
111
+ "type": "integer",
112
+ "minimum": 1,
113
+ "maximum": 1440,
114
+ "description": "Minutes before escalating to human"
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
@@ -1,30 +1,30 @@
1
- # Speexor Configuration Example
2
- # Copy this file to your project root as speexor.config.yaml
3
-
4
- version: "1"
5
-
6
- projects:
7
- - name: my-project
8
- repository: https://github.com/your-username/your-repo
9
- provider:
10
- primary: opencode
11
- fallback:
12
- - claude-code
13
- concurrentLimit: 3
14
-
15
- reactions:
16
- ci-failed:
17
- auto: true
18
- action: fix
19
- retries: 3
20
- escalateAfter: 30
21
- changes-requested:
22
- auto: true
23
- action: fix
24
- retries: 2
25
- escalateAfter: 60
26
- approved-and-green:
27
- auto: false
28
- action: notify
29
- retries: 0
30
- escalateAfter: 0
1
+ # Speexor Configuration Example
2
+ # Copy this file to your project root as speexor.config.yaml
3
+
4
+ version: "1"
5
+
6
+ projects:
7
+ - name: my-project
8
+ repository: https://github.com/your-username/your-repo
9
+ provider:
10
+ primary: opencode
11
+ fallback:
12
+ - claude-code
13
+ concurrentLimit: 3
14
+
15
+ reactions:
16
+ ci-failed:
17
+ auto: true
18
+ action: fix
19
+ retries: 3
20
+ escalateAfter: 30
21
+ changes-requested:
22
+ auto: true
23
+ action: fix
24
+ retries: 2
25
+ escalateAfter: 60
26
+ approved-and-green:
27
+ auto: false
28
+ action: notify
29
+ retries: 0
30
+ escalateAfter: 0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/agent.ts"],"names":[],"mappings":";;;;AAMA,IAAM,KAAA,GAAQ,MAAM,eAAe,CAAA;AAOnC,eAAsB,kBAAkB,OAAA,EAAuB;AAC7D,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAM,CAAA;AAC7C,EAAA,MAAM,UAAU,UAAA,EAAW;AAE3B,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,SAAA,CAAU,eAAe,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,IAAI,OAAA,CAAQ,IAAA;AAAA,IACZ,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,WAAA,EAAa,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IACjC,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,IAC/B,QAAA,EAAW,OAAA,CAAQ,KAAA,IAA2B,OAAA,CAAQ,QAAA,CAAS;AAAA,GACjE;AAEA,EAAA,KAAA,CAAM,2BAA2B,IAAA,CAAK,EAAE,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,wBAAA,EAAwB,OAAA,CAAQ,EAAE,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAc,IAAA,CAAK,EAAE;AAAA,CAAI,CAAA;AACvC","file":"agent-5D3BVWNK.js","sourcesContent":["import { loadConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport type { AgentTask, AgentProvider } from '../core/types.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:agent')\n\ninterface SpawnOptions {\n task: string\n agent: string\n}\n\nexport async function agentSpawnCommand(options: SpawnOptions) {\n const config = loadConfig()\n const lifecycle = new SpeexorLifecycle(config)\n await lifecycle.initialize()\n\n const plugins = loadAllPlugins()\n for (const plugin of plugins) {\n lifecycle.registerPlugin(plugin)\n }\n\n const project = config.projects[0]\n if (!project) {\n throw new Error('No project configured')\n }\n\n const task: AgentTask = {\n id: options.task,\n title: options.task,\n description: `Task ${options.task}`,\n repository: project.repository,\n branch: `speexor/${options.task}`,\n provider: (options.agent as AgentProvider) || project.provider.primary,\n }\n\n debug(`Spawning agent for task ${task.id} using ${task.provider}`)\n\n const session = await lifecycle.spawnAgent(task)\n console.log(`\\n ✅ Agent spawned: ${session.id}`)\n console.log(` 🤖 Provider: ${session.provider}`)\n console.log(` 📋 Task: ${task.id}\\n`)\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/event-bus.ts","../src/core/config.ts","../src/core/lifecycle.ts"],"names":[],"mappings":";;;;;;;;AAGO,SAAS,cAAA,GAA2B;AACzC,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AAEjC,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,OAAO,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,EAAA,CAAG,OAAO,OAAA,EAAS;AACjB,MAAA,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,IAC3B,CAAA;AAAA,IACA,GAAA,CAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,IAAA,CAAK,OAAO,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC7B;AAAA,GACF;AACF;ACdA,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,EAChB,MAAA,EAAQ,EAAE,IAAA,CAAK,CAAC,OAAO,QAAA,EAAU,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,EACpD,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAAA,EACvC,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,IAAI;AACjD,CAAC,CAAA;AAED,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA,EACrC,OAAA,EAAS,EAAE,IAAA,CAAK,CAAC,YAAY,aAAA,EAAe,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EAC7D,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,aAAA,EAAe,OAAA,EAAS,OAAO,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAClF,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS;AAAA,EAC1D,WAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA;AAC9B,CAAC,CAAA;AAED,IAAM,aAAA,GAAgB,EAAE,MAAA,CAAO;AAAA,EAC7B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC5B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,QAAA,EAAU,qBAAA;AAAA,EACV,SAAA,EAAW,EACR,MAAA,CAAO;AAAA,IACN,WAAA,EAAa,mBAAmB,QAAA,EAAS;AAAA,IACzC,mBAAA,EAAqB,mBAAmB,QAAA,EAAS;AAAA,IACjD,oBAAA,EAAsB,mBAAmB,QAAA;AAAS,GACnD,EACA,QAAA,EAAS;AAAA,EACZ,OAAA,EAAS,EACN,MAAA,CAAO;AAAA,IACN,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACzB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC/B,EACA,QAAA;AACL,CAAC,CAAA;AAED,IAAM,YAAA,GAAe,EAAE,MAAA,CAAO;AAAA,EAC5B,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtB,UAAU,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAE,IAAI,CAAC;AACxC,CAAC,CAAA;AAEM,IAAM,sBAAA,GAAyC;AAAA,EACpD,WAAA,EAAa,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,aAAA,EAAe,EAAA,EAAG;AAAA,EACxE,mBAAA,EAAqB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,aAAA,EAAe,EAAA,EAAG;AAAA,EAChF,oBAAA,EAAsB,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,QAAA,EAAU,OAAA,EAAS,CAAA,EAAG,aAAA,EAAe,CAAA;AACpF;AAEO,SAAS,WAAW,GAAA,EAA6B;AACtD,EAAA,MAAM,GAAA,GAAM,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAE/B,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAAA,IAC/B,IAAA,CAAK,KAAK,oBAAoB,CAAA;AAAA,IAC9B,IAAA,CAAK,KAAK,eAAe,CAAA;AAAA,IACzB,IAAA,CAAK,KAAK,cAAc,CAAA;AAAA,IACxB,IAAA,CAAK,KAAK,cAAc;AAAA,GAC1B;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,UAAA,GAAa,SAAA;AACb,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,GAAG,CAAA,6CAAA,CAAkD,CAAA;AAAA,EAC3G;AAEA,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,MAAM,GAAG,CAAA;AAExB,EAAA,OAAO,eAAe,MAAM,CAAA;AAC9B;AAEO,SAAS,eAAe,GAAA,EAA6B;AAC1D,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,SAAA,CAAU,GAAG,CAAA;AACzC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAChG,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU;AAC1C,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACrB,MAAC,OAAA,CAA0C,SAAA,GAAY,EAAE,GAAG,sBAAA,EAAuB;AAAA,IACtF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,SAAA,GAAY;AAAA,QAClB,aAAa,OAAA,CAAQ,SAAA,CAAU,WAAW,CAAA,IAAK,uBAAuB,WAAW,CAAA;AAAA,QACjF,qBAAqB,OAAA,CAAQ,SAAA,CAAU,mBAAmB,CAAA,IAAK,uBAAuB,mBAAmB,CAAA;AAAA,QACzG,sBAAsB,OAAA,CAAQ,SAAA,CAAU,oBAAoB,CAAA,IAAK,uBAAuB,oBAAoB;AAAA,OAC9G;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAEO,SAAS,qBAAA,CAAsB,SAAiB,WAAA,EAAqC;AAC1F,EAAA,MAAM,IAAA,GAAO,WAAA,IAAe,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,YAAA;AAC7E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,GAAA;AAAA,IACT,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA;AAAA,QACA,UAAA,EAAY,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA,SAAA,EAAW,EAAE,GAAG,sBAAA;AAAuB;AACzC;AACF,GACF;AACF;ACzGA,IAAM,KAAA,GAAQ,MAAM,mBAAmB,CAAA;AAEhC,IAAM,mBAAN,MAAuB;AAAA,EACpB,MAAA;AAAA,EACD,QAAA;AAAA,EACC,OAAA,uBAA+C,GAAA,EAAI;AAAA,EACnD,QAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,MAAA,GAAwB,cAAA;AAAA,EAEhC,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,cAAA,EAAe;AAAA,EACjC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,KAAA,CAAM,gCAAgC,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,uBAAA,EAAyB,EAAE,2BAAW,IAAI,IAAA,IAAQ,CAAA;AAAA,EACvE;AAAA,EAEA,eAAe,MAAA,EAA4B;AACzC,IAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAI,KAAK,EAAC;AACnD,IAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AACtC,IAAA,KAAA,CAAM,sBAAsB,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5D;AAAA,EAEA,WAAmC,IAAA,EAAuB;AACxD,IAAA,OAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,KAAK,EAAC;AAAA,EACrC;AAAA,EAEA,eAAuC,IAAA,EAAiC;AACtE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAc,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,IAAA,EAAwC;AACvD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAA4B,OAAO,CAAA;AAC5D,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAE9D,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAgC,WAAW,CAAA;AACxE,IAAA,IAAI,CAAC,eAAA,EAAiB,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAEtE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAA8B,SAAS,CAAA;AAClE,IAAA,IAAI,CAAC,aAAA,EAAe,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAElE,IAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,cAAA,CAAe,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,CAAA;AAE/E,IAAA,MAAM,cAAA,GAAiB,MAAM,aAAA,CAAc,aAAA,CAAc,SAAS,IAAI,CAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,KAAA,CAAM,MAAM,cAAc,CAAA;AAC5D,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAErC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,MAAM,CAAA;AACvD,IAAA,KAAA,CAAM,kBAAkB,OAAA,CAAQ,EAAE,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AAExD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,SAAA,EAAkC;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAY,CAAA;AAE9D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAA4B,OAAO,CAAA;AAC5D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,mBAAA,EAAqB,EAAE,WAAW,CAAA;AACrD,IAAA,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,CAAA;AAAA,EACvC;AAAA,EAEA,WAAW,SAAA,EAA6C;AACtD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA,EAEA,YAAA,GAA+B;AAC7B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AAEd,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU;AAChC,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,KAAA,GAAsB,CAAC,UAAA,EAAY,UAAA,EAAY,OAAO,SAAA,EAAW,WAAA,EAAa,WAAW,OAAO,CAAA;AACtG,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,KAAK,EAAC;AAC3C,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,EAAQ,EAAG;AACtC,QAAA,MAAM,MAAA,CAAO,OAAA,EAAQ,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,qBAAA,EAAuB,EAAE,2BAAW,IAAI,IAAA,IAAQ,CAAA;AACnE,IAAA,KAAA,CAAM,qBAAqB,CAAA;AAAA,EAC7B;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF","file":"chunk-2F66BZYJ.js","sourcesContent":["import { EventEmitter } from 'eventemitter3'\nimport type { EventBus } from './types.js'\n\nexport function createEventBus(): EventBus {\n const emitter = new EventEmitter()\n\n return {\n emit(event, data) {\n emitter.emit(event, data)\n },\n on(event, handler) {\n emitter.on(event, handler)\n },\n off(event, handler) {\n emitter.off(event, handler)\n },\n once(event, handler) {\n emitter.once(event, handler)\n },\n }\n}\n","import { readFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { parse } from 'yaml'\nimport { z } from 'zod'\nimport type { SpeexorConfig, ReactionConfig } from './types.js'\n\nconst reactionRuleSchema = z.object({\n auto: z.boolean(),\n action: z.enum(['fix', 'notify', 'escalate', 'skip']),\n retries: z.number().int().min(0).max(10),\n escalateAfter: z.number().int().min(1).max(1440),\n})\n\nconst providerRoutingSchema = z.object({\n primary: z.enum(['opencode', 'claude-code', 'aider', 'codex']),\n fallback: z.array(z.enum(['opencode', 'claude-code', 'aider', 'codex'])).optional(),\n concurrentLimit: z.number().int().min(1).max(20).optional(),\n costLimit: z.number().int().optional(),\n})\n\nconst projectSchema = z.object({\n name: z.string().min(1),\n repository: z.string().min(1),\n path: z.string().optional(),\n branch: z.string().optional(),\n provider: providerRoutingSchema,\n reactions: z\n .object({\n 'ci-failed': reactionRuleSchema.optional(),\n 'changes-requested': reactionRuleSchema.optional(),\n 'approved-and-green': reactionRuleSchema.optional(),\n })\n .optional(),\n plugins: z\n .object({\n tracker: z.string().optional(),\n scm: z.string().optional(),\n runtime: z.string().optional(),\n notifier: z.string().optional(),\n })\n .optional(),\n})\n\nconst configSchema = z.object({\n version: z.literal('1'),\n projects: z.array(projectSchema).min(1),\n})\n\nexport const DEFAULT_REACTION_RULES: ReactionConfig = {\n 'ci-failed': { auto: true, action: 'fix', retries: 3, escalateAfter: 30 },\n 'changes-requested': { auto: true, action: 'fix', retries: 2, escalateAfter: 60 },\n 'approved-and-green': { auto: false, action: 'notify', retries: 0, escalateAfter: 0 },\n}\n\nexport function loadConfig(cwd?: string): SpeexorConfig {\n const dir = cwd ?? process.cwd()\n\n const candidates = [\n join(dir, 'speexor.config.yaml'),\n join(dir, 'speexor.config.yml'),\n join(dir, '.speexor.yaml'),\n join(dir, '.speexor.yml'),\n join(dir, 'speexor.yaml'),\n ]\n\n let configPath: string | undefined\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n configPath = candidate\n break\n }\n }\n\n if (!configPath) {\n throw new Error(`speexor.config.yaml not found in ${dir}. ` + 'Run `speexor start <repo>` to initialize.')\n }\n\n const raw = readFileSync(configPath, 'utf-8')\n const parsed = parse(raw)\n\n return validateConfig(parsed)\n}\n\nexport function validateConfig(raw: unknown): SpeexorConfig {\n const result = configSchema.safeParse(raw)\n if (!result.success) {\n const issues = result.error.issues.map((i) => ` - ${i.path.join('.')}: ${i.message}`).join('\\n')\n throw new Error(`Invalid speexor config:\\n${issues}`)\n }\n\n for (const project of result.data.projects) {\n if (!project.reactions) {\n ;(project as { reactions: ReactionConfig }).reactions = { ...DEFAULT_REACTION_RULES }\n } else {\n project.reactions = {\n 'ci-failed': project.reactions['ci-failed'] ?? DEFAULT_REACTION_RULES['ci-failed'],\n 'changes-requested': project.reactions['changes-requested'] ?? DEFAULT_REACTION_RULES['changes-requested'],\n 'approved-and-green': project.reactions['approved-and-green'] ?? DEFAULT_REACTION_RULES['approved-and-green'],\n }\n }\n }\n\n return result.data as SpeexorConfig\n}\n\nexport function generateDefaultConfig(repoUrl: string, projectName?: string): SpeexorConfig {\n const name = projectName ?? repoUrl.split('/').pop()?.replace('.git', '') ?? 'my-project'\n return {\n version: '1',\n projects: [\n {\n name,\n repository: repoUrl,\n provider: {\n primary: 'opencode',\n },\n reactions: { ...DEFAULT_REACTION_RULES },\n },\n ],\n }\n}\n","import type {\n SpeexorConfig,\n AgentPlugin,\n RuntimePlugin,\n WorkspacePlugin,\n AgentTask,\n AgentSession,\n SessionStatus,\n EventBus,\n PluginModule,\n PluginSlot,\n} from './types.js'\nimport { createEventBus } from './event-bus.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:lifecycle')\n\nexport class SpeexorLifecycle {\n private config: SpeexorConfig\n public eventBus: EventBus\n private plugins: Map<PluginSlot, PluginModule[]> = new Map()\n private sessions: Map<string, AgentSession> = new Map()\n private status: SessionStatus = 'initializing'\n\n constructor(config: SpeexorConfig) {\n this.config = config\n this.eventBus = createEventBus()\n }\n\n async initialize(): Promise<void> {\n debug('Initializing Speexor lifecycle')\n this.status = 'active'\n this.eventBus.emit('lifecycle:initialized', { timestamp: new Date() })\n }\n\n registerPlugin(plugin: PluginModule): void {\n const existing = this.plugins.get(plugin.type) ?? []\n existing.push(plugin)\n this.plugins.set(plugin.type, existing)\n debug(`Registered plugin: ${plugin.name} (${plugin.type})`)\n }\n\n getPlugins<T extends PluginModule>(slot: PluginSlot): T[] {\n return (this.plugins.get(slot) ?? []) as T[]\n }\n\n getFirstPlugin<T extends PluginModule>(slot: PluginSlot): T | undefined {\n return this.getPlugins<T>(slot)[0]\n }\n\n async spawnAgent(task: AgentTask): Promise<AgentSession> {\n const agentPlugin = this.getFirstPlugin<AgentPlugin>('agent')\n if (!agentPlugin) throw new Error('No agent plugin registered')\n\n const workspacePlugin = this.getFirstPlugin<WorkspacePlugin>('workspace')\n if (!workspacePlugin) throw new Error('No workspace plugin registered')\n\n const runtimePlugin = this.getFirstPlugin<RuntimePlugin>('runtime')\n if (!runtimePlugin) throw new Error('No runtime plugin registered')\n\n const worktree = await workspacePlugin.createWorktree(task)\n this.eventBus.emit('worktree:created', { taskId: task.id, path: worktree.path })\n\n const runtimeSession = await runtimePlugin.createSession(worktree.path)\n\n const session = await agentPlugin.spawn(task, runtimeSession)\n this.sessions.set(session.id, session)\n\n this.eventBus.emit('session:created', { session, task })\n debug(`Agent spawned: ${session.id} for task ${task.id}`)\n\n return session\n }\n\n async stopSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n\n const agentPlugin = this.getFirstPlugin<AgentPlugin>('agent')\n if (agentPlugin) {\n await agentPlugin.kill(sessionId)\n }\n\n this.sessions.delete(sessionId)\n this.eventBus.emit('session:completed', { sessionId })\n debug(`Session stopped: ${sessionId}`)\n }\n\n getSession(sessionId: string): AgentSession | undefined {\n return this.sessions.get(sessionId)\n }\n\n listSessions(): AgentSession[] {\n return Array.from(this.sessions.values())\n }\n\n async destroy(): Promise<void> {\n this.status = 'completed'\n\n for (const [id] of this.sessions) {\n await this.stopSession(id).catch(() => {})\n }\n\n const slots: PluginSlot[] = ['terminal', 'notifier', 'scm', 'tracker', 'workspace', 'runtime', 'agent']\n for (const slot of slots) {\n const plugins = this.plugins.get(slot) ?? []\n for (const plugin of plugins.reverse()) {\n await plugin.destroy().catch(() => {})\n }\n }\n\n this.eventBus.emit('lifecycle:destroyed', { timestamp: new Date() })\n debug('Lifecycle destroyed')\n }\n\n getConfig(): SpeexorConfig {\n return this.config\n }\n\n getStatus(): SessionStatus {\n return this.status\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/plugins/agent/opencode.ts","../src/plugins/agent/claude-code.ts","../src/plugins/agent/aider.ts","../src/plugins/agent/codex.ts","../src/plugins/runtime/tmux.ts","../src/plugins/runtime/process.ts","../src/plugins/workspace/git-worktree.ts","../src/plugins/tracker/github.ts","../src/plugins/scm/github.ts","../src/plugins/notifier/desktop.ts","../src/plugins/index.ts"],"names":["debug","Debug","randomUUID","join","existsSync","mkdirSync","execSync"],"mappings":"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","file":"chunk-B7WLHC4W.js","sourcesContent":["import type { AgentPlugin, AgentTask, AgentSession, AgentStatus, PluginContext, RuntimeSession } from '../../core/types.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:agent:opencode')\n\nexport class OpenCodeAgent implements AgentPlugin {\n name = 'opencode-agent'\n version = '0.1.0'\n type = 'agent' as const\n\n private sessions = new Map<string, { task: AgentTask; runtime: RuntimeSession }>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n debug('OpenCode agent initialized')\n }\n\n async destroy(): Promise<void> {\n this.sessions.clear()\n debug('OpenCode agent destroyed')\n }\n\n async spawn(task: AgentTask, runtime: RuntimeSession): Promise<AgentSession> {\n const session: AgentSession = {\n id: `oc-${task.id}-${Date.now()}`,\n taskId: task.id,\n provider: 'opencode',\n status: 'running',\n startedAt: new Date(),\n runtimeSessionId: runtime.id,\n }\n\n this.sessions.set(session.id, { task, runtime })\n\n await this.context.eventBus.emit('agent:spawned', { sessionId: session.id, task: task.id })\n debug(`OpenCode agent spawned: ${session.id}`)\n\n return session\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {\n const session = this.sessions.get(sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n debug(`Input sent to session ${sessionId}: ${input.substring(0, 100)}...`)\n }\n\n async getStatus(sessionId: string): Promise<AgentStatus> {\n const session = this.sessions.get(sessionId)\n if (!session) return 'error'\n return 'running'\n }\n\n async kill(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId)\n debug(`OpenCode agent killed: ${sessionId}`)\n }\n}\n","import type { AgentPlugin, AgentTask, AgentSession, AgentStatus, PluginContext, RuntimeSession } from '../../core/types.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:agent:claude-code')\n\nexport class ClaudeCodeAgent implements AgentPlugin {\n name = 'claude-code-agent'\n version = '0.1.0'\n type = 'agent' as const\n\n private sessions = new Map<string, { task: AgentTask; runtime: RuntimeSession }>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n debug('Claude Code agent initialized')\n }\n\n async destroy(): Promise<void> {\n this.sessions.clear()\n }\n\n async spawn(task: AgentTask, runtime: RuntimeSession): Promise<AgentSession> {\n const session: AgentSession = {\n id: `cc-${task.id}-${Date.now()}`,\n taskId: task.id,\n provider: 'claude-code',\n status: 'running',\n startedAt: new Date(),\n runtimeSessionId: runtime.id,\n }\n\n this.sessions.set(session.id, { task, runtime })\n\n await this.context.eventBus.emit('agent:spawned', { sessionId: session.id, task: task.id })\n debug(`Claude Code agent spawned: ${session.id}`)\n\n return session\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {\n const session = this.sessions.get(sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n }\n\n async getStatus(sessionId: string): Promise<AgentStatus> {\n return this.sessions.has(sessionId) ? 'running' : 'error'\n }\n\n async kill(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId)\n }\n}\n","import type { AgentPlugin, AgentTask, AgentSession, AgentStatus, PluginContext, RuntimeSession } from '../../core/types.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:agent:aider')\n\nexport class AiderAgent implements AgentPlugin {\n name = 'aider-agent'\n version = '0.1.0'\n type = 'agent' as const\n\n private sessions = new Map<string, { task: AgentTask; runtime: RuntimeSession }>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n debug('Aider agent initialized')\n }\n\n async destroy(): Promise<void> {\n this.sessions.clear()\n }\n\n async spawn(task: AgentTask, runtime: RuntimeSession): Promise<AgentSession> {\n const session: AgentSession = {\n id: `ai-${task.id}-${Date.now()}`,\n taskId: task.id,\n provider: 'aider',\n status: 'running',\n startedAt: new Date(),\n runtimeSessionId: runtime.id,\n }\n this.sessions.set(session.id, { task, runtime })\n debug(`Aider agent spawned: ${session.id}`)\n return session\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {}\n async getStatus(sessionId: string): Promise<AgentStatus> {\n return this.sessions.has(sessionId) ? 'running' : 'error'\n }\n async kill(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId)\n }\n}\n","import type { AgentPlugin, AgentTask, AgentSession, AgentStatus, PluginContext, RuntimeSession } from '../../core/types.js'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:agent:codex')\n\nexport class CodexAgent implements AgentPlugin {\n name = 'codex-agent'\n version = '0.1.0'\n type = 'agent' as const\n\n private sessions = new Map<string, { task: AgentTask; runtime: RuntimeSession }>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n debug('Codex agent initialized')\n }\n\n async destroy(): Promise<void> {\n this.sessions.clear()\n }\n\n async spawn(task: AgentTask, runtime: RuntimeSession): Promise<AgentSession> {\n const session: AgentSession = {\n id: `cx-${task.id}-${Date.now()}`,\n taskId: task.id,\n provider: 'codex',\n status: 'running',\n startedAt: new Date(),\n runtimeSessionId: runtime.id,\n }\n this.sessions.set(session.id, { task, runtime })\n debug(`Codex agent spawned: ${session.id}`)\n return session\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {}\n async getStatus(sessionId: string): Promise<AgentStatus> {\n return this.sessions.has(sessionId) ? 'running' : 'error'\n }\n async kill(sessionId: string): Promise<void> {\n this.sessions.delete(sessionId)\n }\n}\n","import type { RuntimePlugin, RuntimeSession, PluginContext } from '../../core/types.js'\nimport { execSync } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:runtime:tmux')\n\nexport class TmuxRuntime implements RuntimePlugin {\n name = 'tmux-runtime'\n version = '0.1.0'\n type = 'runtime' as const\n\n private sessions = new Map<string, RuntimeSession>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n // Verify tmux is available\n try {\n execSync('tmux -V', { stdio: 'ignore' })\n debug('tmux available')\n } catch {\n console.warn('tmux not found — will fall back to process runtime')\n throw new Error('tmux not available on this system')\n }\n }\n\n async destroy(): Promise<void> {\n for (const [id] of this.sessions) {\n await this.destroySession(id).catch(() => {})\n }\n }\n\n async createSession(worktreePath: string): Promise<RuntimeSession> {\n const id = `tmux-${randomUUID().slice(0, 8)}`\n const sessionName = `speexor-${id}`\n\n try {\n execSync(`tmux new-session -d -s ${sessionName} -c ${worktreePath}`, { stdio: 'pipe' })\n } catch (error) {\n throw new Error(`Failed to create tmux session: ${error}`)\n }\n\n const session: RuntimeSession = {\n id,\n type: 'tmux',\n worktreePath,\n createdAt: new Date(),\n }\n\n this.sessions.set(id, session)\n debug(`tmux session created: ${id} at ${worktreePath}`)\n\n return session\n }\n\n async destroySession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId)\n if (!session) return\n\n try {\n execSync(`tmux kill-session -t speexor-${sessionId}`, { stdio: 'ignore' })\n } catch {}\n\n this.sessions.delete(sessionId)\n debug(`tmux session destroyed: ${sessionId}`)\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {\n const escaped = input.replace(/'/g, \"'\\\\''\")\n execSync(`tmux send-keys -t speexor-${sessionId} '${escaped}' Enter`, { stdio: 'ignore' })\n }\n\n async getOutput(sessionId: string): Promise<string> {\n try {\n return execSync(`tmux capture-pane -t speexor-${sessionId} -p`, { encoding: 'utf-8' })\n } catch {\n return ''\n }\n }\n\n getLiveStream(sessionId: string): AsyncIterable<string> {\n throw new Error('Live stream not implemented for tmux')\n }\n\n async getStatus(sessionId: string): Promise<'running' | 'stopped' | 'error'> {\n try {\n execSync(`tmux has-session -t speexor-${sessionId}`, { stdio: 'ignore' })\n return 'running'\n } catch {\n return 'stopped'\n }\n }\n}\n","import type { RuntimePlugin, RuntimeSession, PluginContext } from '../../core/types.js'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport { randomUUID } from 'node:crypto'\nimport { createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:runtime:process')\n\nexport class ProcessRuntime implements RuntimePlugin {\n name = 'process-runtime'\n version = '0.1.0'\n type = 'runtime' as const\n\n private sessions = new Map<string, { session: RuntimeSession; process: ChildProcess }>()\n private context!: PluginContext\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n debug('Process runtime initialized')\n }\n\n async destroy(): Promise<void> {\n for (const [id] of this.sessions) {\n await this.destroySession(id).catch(() => {})\n }\n }\n\n async createSession(worktreePath: string): Promise<RuntimeSession> {\n const id = `proc-${randomUUID().slice(0, 8)}`\n\n // Ensure log directory exists\n const logsDir = join(process.cwd(), '.speexor', 'logs')\n if (!existsSync(logsDir)) {\n mkdirSync(logsDir, { recursive: true })\n }\n\n const logStream = createWriteStream(join(logsDir, `${id}.log`), { flags: 'a' })\n\n const child = spawn(process.env.SHELL || 'bash', [], {\n cwd: worktreePath,\n stdio: ['pipe', 'pipe', 'pipe'],\n env: { ...process.env, TERM: 'xterm-256color' },\n })\n\n child.stdout?.on('data', (data: Buffer) => {\n logStream.write(`[stdout] ${data.toString()}`)\n })\n\n child.stderr?.on('data', (data: Buffer) => {\n logStream.write(`[stderr] ${data.toString()}`)\n })\n\n child.on('exit', (code) => {\n logStream.write(`[exit] Process exited with code ${code}\\n`)\n logStream.end()\n })\n\n const session: RuntimeSession = {\n id,\n type: 'process',\n worktreePath,\n pid: child.pid,\n createdAt: new Date(),\n }\n\n this.sessions.set(id, { session, process: child })\n debug(`Process session created: ${id} (PID: ${child.pid})`)\n\n return session\n }\n\n async destroySession(sessionId: string): Promise<void> {\n const entry = this.sessions.get(sessionId)\n if (!entry) return\n\n entry.process.kill('SIGTERM')\n // Force kill after 5s\n setTimeout(() => {\n try {\n entry.process.kill('SIGKILL')\n } catch {}\n }, 5000)\n\n this.sessions.delete(sessionId)\n debug(`Process session destroyed: ${sessionId}`)\n }\n\n async sendInput(sessionId: string, input: string): Promise<void> {\n const entry = this.sessions.get(sessionId)\n if (!entry) throw new Error(`Session ${sessionId} not found`)\n entry.process.stdin?.write(`${input}\\n`)\n }\n\n async getOutput(sessionId: string): Promise<string> {\n const entry = this.sessions.get(sessionId)\n if (!entry) return ''\n return `Session ${sessionId} (PID: ${entry.process.pid})`\n }\n\n getLiveStream(sessionId: string): AsyncIterable<string> {\n throw new Error('Live stream not implemented for process runtime')\n }\n\n async getStatus(sessionId: string): Promise<'running' | 'stopped' | 'error'> {\n const entry = this.sessions.get(sessionId)\n if (!entry) return 'stopped'\n\n const exited = entry.process.exitCode !== null\n return exited ? 'stopped' : 'running'\n }\n}\n","import type { WorkspacePlugin, WorkspaceSession, AgentTask, PluginContext } from '../../core/types.js'\nimport { execSync } from 'node:child_process'\nimport { existsSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:workspace:git-worktree')\n\nexport class GitWorktreeWorkspace implements WorkspacePlugin {\n name = 'git-worktree-workspace'\n version = '0.1.0'\n type = 'workspace' as const\n\n private sessions = new Map<string, WorkspaceSession>()\n private context!: PluginContext\n private worktreesDir = '.speexor/worktrees'\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n\n const dir = join(process.cwd(), this.worktreesDir)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n // Verify we're in a git repo\n try {\n execSync('git rev-parse --git-dir', { stdio: 'ignore' })\n } catch {\n throw new Error('Not a git repository. Run `speexor start <repo>` first.')\n }\n\n debug('Git worktree workspace initialized')\n }\n\n async destroy(): Promise<void> {\n const stale = await this.cleanupStale()\n if (stale.length > 0) {\n debug(`Cleaned up ${stale.length} stale worktree(s)`)\n }\n }\n\n async createWorktree(task: AgentTask): Promise<WorkspaceSession> {\n const branch = `speexor/${task.id}`\n const worktreePath = join(process.cwd(), this.worktreesDir, task.id)\n\n // Ensure branch exists\n try {\n execSync(`git show-ref --verify --quiet refs/heads/${branch}`, { stdio: 'ignore' })\n } catch {\n // Create branch from current HEAD\n execSync(`git branch ${branch}`, { stdio: 'pipe' })\n }\n\n // Add worktree\n try {\n execSync(`git worktree add ${worktreePath} ${branch}`, { stdio: 'pipe' })\n } catch (error) {\n throw new Error(`Failed to create worktree at ${worktreePath}: ${error}`)\n }\n\n const session: WorkspaceSession = {\n id: `wt-${task.id}-${randomUUID().slice(0, 8)}`,\n taskId: task.id,\n repository: task.repository,\n branch,\n path: worktreePath,\n createdAt: new Date(),\n }\n\n this.sessions.set(session.id, session)\n debug(`Worktree created: ${branch} at ${worktreePath}`)\n\n return session\n }\n\n async removeWorktree(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId)\n if (!session) return\n\n try {\n execSync(`git worktree remove ${session.path}`, { stdio: 'pipe' })\n } catch {\n // Force remove if clean fails\n try {\n execSync(`git worktree remove --force ${session.path}`, { stdio: 'pipe' })\n } catch {}\n }\n\n this.sessions.delete(sessionId)\n debug(`Worktree removed: ${sessionId}`)\n }\n\n getWorktreePath(sessionId: string): string {\n const session = this.sessions.get(sessionId)\n if (!session) throw new Error(`Session ${sessionId} not found`)\n return session.path\n }\n\n async listActive(): Promise<WorkspaceSession[]> {\n return Array.from(this.sessions.values())\n }\n\n async cleanupStale(): Promise<string[]> {\n const cleaned: string[] = []\n\n try {\n const output = execSync('git worktree list --porcelain', { encoding: 'utf-8' })\n const lines = output.split('\\n')\n\n for (const line of lines) {\n if (line.startsWith('worktree ')) {\n const path = line.slice(9).trim()\n if (path.includes(this.worktreesDir)) {\n // Check if session still active\n const isActive = Array.from(this.sessions.values()).some((s) => s.path === path)\n if (!isActive && existsSync(path)) {\n try {\n execSync(`git worktree remove --force \"${path}\"`, { stdio: 'pipe' })\n cleaned.push(path)\n } catch {}\n }\n }\n }\n }\n } catch {}\n\n return cleaned\n }\n}\n","import type { TrackerPlugin, TrackerIssue, TrackerFilter, TrackerEvent, PluginContext } from '../../core/types.js'\nimport { execSync } from 'node:child_process'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:tracker:github')\n\nexport class GitHubTracker implements TrackerPlugin {\n name = 'github-tracker'\n version = '0.1.0'\n type = 'tracker' as const\n\n private context!: PluginContext\n private handlers: Array<(event: TrackerEvent) => void> = []\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n // Verify gh CLI\n try {\n execSync('gh --version', { stdio: 'ignore' })\n debug('GitHub CLI available')\n } catch {\n throw new Error('GitHub CLI (gh) not found. Install from https://cli.github.com/')\n }\n }\n\n async destroy(): Promise<void> {\n this.handlers = []\n }\n\n async fetchIssues(filter?: TrackerFilter): Promise<TrackerIssue[]> {\n const state = filter?.state ?? 'open'\n const labels = filter?.labels?.length ? `--label \"${filter.labels.join(',')}\"` : ''\n const limit = filter?.limit ?? 30\n\n try {\n const output = execSync(\n `gh issue list --state ${state} ${labels} --limit ${limit} --json number,title,body,state,labels,url,createdAt,updatedAt`,\n { encoding: 'utf-8' },\n )\n\n const issues: TrackerIssue[] = JSON.parse(output).map((i: Record<string, unknown>) => ({\n id: String((i as { number: number }).number),\n title: i.title as string,\n description: (i.body as string) ?? '',\n state: i.state as 'open' | 'closed',\n labels: (i.labels as Array<{ name: string }>)?.map((l: { name: string }) => l.name) ?? [],\n url: i.url as string,\n createdAt: new Date(i.createdAt as string),\n updatedAt: new Date(i.updatedAt as string),\n }))\n\n return issues\n } catch (error) {\n debug('Failed to fetch issues:', error)\n return []\n }\n }\n\n async getIssue(id: string): Promise<TrackerIssue | null> {\n try {\n const output = execSync(`gh issue view ${id} --json number,title,body,state,labels,url,createdAt,updatedAt`, { encoding: 'utf-8' })\n\n const i = JSON.parse(output)\n return {\n id: String(i.number),\n title: i.title,\n description: i.body ?? '',\n state: i.state,\n labels: i.labels?.map((l: { name: string }) => l.name) ?? [],\n url: i.url,\n createdAt: new Date(i.createdAt),\n updatedAt: new Date(i.updatedAt),\n }\n } catch {\n return null\n }\n }\n\n onEvent(handler: (event: TrackerEvent) => void): void {\n this.handlers.push(handler)\n }\n\n private emit(event: TrackerEvent): void {\n for (const handler of this.handlers) {\n handler(event)\n }\n }\n}\n","import type { SCMPlugin, PRInfo, PRStatus, PRComment, CIRun, TrackerEvent, PluginContext } from '../../core/types.js'\nimport { execSync } from 'node:child_process'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:scm:github')\n\nexport class GitHubSCM implements SCMPlugin {\n name = 'github-scm'\n version = '0.1.0'\n type = 'scm' as const\n\n private context!: PluginContext\n private handlers: Array<(event: TrackerEvent) => void> = []\n\n async initialize(context: PluginContext): Promise<void> {\n this.context = context\n try {\n execSync('gh --version', { stdio: 'ignore' })\n debug('GitHub CLI available')\n } catch {\n throw new Error('GitHub CLI (gh) not found')\n }\n }\n\n async destroy(): Promise<void> {\n this.handlers = []\n }\n\n async createBranch(baseBranch: string, newBranch: string): Promise<void> {\n execSync(`git fetch origin ${baseBranch}`, { stdio: 'pipe' })\n execSync(`git checkout -b ${newBranch} origin/${baseBranch}`, { stdio: 'pipe' })\n }\n\n async commitAndPush(branch: string, message: string): Promise<string> {\n execSync('git add -A', { stdio: 'pipe' })\n execSync(`git commit -m \"${message.replace(/\"/g, '\\\\\"')}\"`, { stdio: 'pipe' })\n execSync(`git push origin ${branch}`, { stdio: 'pipe' })\n\n const sha = execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim()\n return sha\n }\n\n async createPullRequest(title: string, description: string, head: string, base: string): Promise<PRInfo> {\n const escapedBody = description.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')\n const output = execSync(\n `gh pr create --title \"${title}\" --body \"${escapedBody}\" --head ${head} --base ${base} --json number,title,url,state,headRefName,baseRefName,createdAt`,\n { encoding: 'utf-8' },\n )\n\n const pr = JSON.parse(output)\n return {\n id: String(pr.number),\n url: pr.url,\n title: pr.title,\n state: pr.state,\n headBranch: pr.headRefName,\n baseBranch: pr.baseRefName,\n createdAt: new Date(pr.createdAt),\n }\n }\n\n async getPRStatus(prId: string): Promise<PRStatus> {\n const output = execSync(\n `gh pr view ${prId} --json number,state,mergeable,reviews,statusCheckRollup --jq '{state,mergeable,reviews,checks: .statusCheckRollup}'`,\n { encoding: 'utf-8' },\n )\n\n const data = JSON.parse(output)\n\n return {\n id: prId,\n state: data.state,\n mergeable: data.mergeable === 'MERGEABLE',\n ciStatus: this.determineCIStatus(data.checks),\n reviewStatus: this.determineReviewStatus(data.reviews),\n }\n }\n\n async getPRComments(prId: string): Promise<PRComment[]> {\n const output = execSync(\n `gh pr view ${prId} --json comments --jq '.comments[] | {id: .id, author: .author.name, body: .body, createdAt: .createdAt}'`,\n { encoding: 'utf-8' },\n )\n\n // gh returns multiple JSON objects, need to parse as array\n const lines = output.trim().split('\\n')\n return lines\n .filter((l) => l.trim())\n .map((line) => {\n try {\n return JSON.parse(line) as PRComment\n } catch {\n return null\n }\n })\n .filter((c): c is PRComment => c !== null)\n }\n\n async getCIRuns(prId: string): Promise<CIRun[]> {\n const output = execSync(\n `gh pr view ${prId} --json statusCheckRollup --jq '.statusCheckRollup[] | {id: .databaseId, name: .name, status: .status, conclusion: .conclusion, url: .detailsUrl}'`,\n { encoding: 'utf-8' },\n )\n\n const lines = output.trim().split('\\n')\n return lines\n .filter((l) => l.trim())\n .map((line) => {\n try {\n return JSON.parse(line) as CIRun\n } catch {\n return null\n }\n })\n .filter((c): c is CIRun => c !== null)\n }\n\n async mergePR(prId: string, method: 'merge' | 'squash' | 'rebase' = 'squash'): Promise<void> {\n execSync(`gh pr merge ${prId} --${method}`, { stdio: 'pipe' })\n }\n\n onEvent(handler: (event: TrackerEvent) => void): void {\n this.handlers.push(handler)\n }\n\n private determineCIStatus(checks: Array<{ status: string; conclusion: string | null }>): 'pending' | 'passing' | 'failing' | 'unknown' {\n if (!checks || checks.length === 0) return 'unknown'\n\n const allPassed = checks.every((c) => c.conclusion === 'success')\n const anyFailed = checks.some((c) => c.conclusion === 'failure' || c.conclusion === 'cancelled')\n const anyPending = checks.some((c) => c.status === 'in_progress' || c.status === 'queued')\n\n if (anyFailed) return 'failing'\n if (anyPending) return 'pending'\n if (allPassed) return 'passing'\n return 'unknown'\n }\n\n private determineReviewStatus(reviews: Array<{ state: string }>): 'approved' | 'changes-requested' | 'pending' | 'none' {\n if (!reviews || reviews.length === 0) return 'none'\n\n const latestState = reviews[reviews.length - 1]?.state\n if (latestState === 'APPROVED') return 'approved'\n if (latestState === 'CHANGES_REQUESTED') return 'changes-requested'\n if (latestState === 'PENDING') return 'pending'\n return 'none'\n }\n}\n","import type { NotifierPlugin, PluginContext } from '../../core/types.js'\nimport { execSync } from 'node:child_process'\nimport Debug from 'debug'\n\nconst debug = Debug('speexor:notifier:desktop')\n\nexport class DesktopNotifier implements NotifierPlugin {\n name = 'desktop-notifier'\n version = '0.1.0'\n type = 'notifier' as const\n\n async initialize(_context: PluginContext): Promise<void> {\n debug('Desktop notifier initialized')\n }\n\n async destroy(): Promise<void> {}\n\n async notify(level: 'info' | 'warn' | 'error' | 'success', title: string, message: string): Promise<void> {\n const platform = process.platform\n\n try {\n if (platform === 'darwin') {\n const icon = level === 'error' ? '⚠️' : level === 'success' ? '✅' : level === 'warn' ? '⚠️' : 'ℹ️'\n execSync(\n `osascript -e 'display notification \"${message.replace(/\"/g, '\\\\\"')}\" with title \"${icon} ${title.replace(/\"/g, '\\\\\"')}\"'`,\n { stdio: 'ignore' },\n )\n } else if (platform === 'win32') {\n // Windows -- use PowerShell\n const icon = level === 'error' ? 'Warning' : 'Information'\n execSync(`powershell -c \"New-BurntToastNotification -Text '${title}', '${message}'\"`, { stdio: 'ignore' })\n } else if (platform === 'linux') {\n execSync(`notify-send \"${title}\" \"${message}\"`, { stdio: 'ignore' })\n }\n\n debug(`Desktop notification: ${title} - ${message}`)\n } catch (error) {\n // Fail silently -- desktop notifications are non-critical\n debug(`Failed to send notification: ${error}`)\n }\n }\n}\n","import type { PluginModule } from '../core/types.js'\nimport { OpenCodeAgent } from './agent/opencode.js'\nimport { ClaudeCodeAgent } from './agent/claude-code.js'\nimport { AiderAgent } from './agent/aider.js'\nimport { CodexAgent } from './agent/codex.js'\nimport { TmuxRuntime } from './runtime/tmux.js'\nimport { ProcessRuntime } from './runtime/process.js'\nimport { GitWorktreeWorkspace } from './workspace/git-worktree.js'\nimport { GitHubTracker } from './tracker/github.js'\nimport { GitHubSCM } from './scm/github.js'\nimport { DesktopNotifier } from './notifier/desktop.js'\n\nexport function loadAllPlugins(): PluginModule[] {\n const plugins: PluginModule[] = [\n // Agent adapters\n new OpenCodeAgent(),\n new ClaudeCodeAgent(),\n new AiderAgent(),\n new CodexAgent(),\n\n // Runtime\n new TmuxRuntime(),\n new ProcessRuntime(),\n\n // Workspace\n new GitWorktreeWorkspace(),\n\n // Tracker\n new GitHubTracker(),\n\n // SCM\n new GitHubSCM(),\n\n // Notifier\n new DesktopNotifier(),\n ]\n\n return plugins\n}\n\nexport function loadPluginByType(type: string): PluginModule | undefined {\n return loadAllPlugins().find((p) => p.type === type)\n}\n"]}