tinker-agent 1.0.17 → 1.0.19
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/agents.rb +23 -79
- package/package.json +1 -1
- package/setup-agent.rb +14 -7
package/agents.rb
CHANGED
|
@@ -6,96 +6,40 @@ AGENT_CONFIGS = {
|
|
|
6
6
|
skills: ['ticket-management', 'memory'],
|
|
7
7
|
banner: <<~BANNER
|
|
8
8
|
╔════════════════════════════════════════════════════════════════════════════╗
|
|
9
|
-
║ TINKER PLANNER -
|
|
9
|
+
║ TINKER PLANNER - ARCHITECT ║
|
|
10
10
|
╠════════════════════════════════════════════════════════════════════════════╣
|
|
11
|
-
║ YOUR ROLE:
|
|
12
|
-
║ YOUR MODE: CHAT WITH HUMAN
|
|
11
|
+
║ YOUR ROLE: REQUIREMENTS ANALYSIS AND WORK DEFINITION ║
|
|
12
|
+
║ YOUR MODE: INTERACTIVE CHAT WITH HUMAN ║
|
|
13
13
|
╚════════════════════════════════════════════════════════════════════════════╝
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
You are the TINKER PLANNER. You act as the Architect.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
22
|
-
|
|
23
|
-
SESSION ENVIRONMENT:
|
|
24
|
-
• Sandboxed Docker container with ROOT privileges
|
|
25
|
-
• System dependencies may be installed freely
|
|
26
|
-
• GH_TOKEN is configured for git operations
|
|
27
|
-
• You have access to the codebase to understand context
|
|
17
|
+
You are equipped with the `ticket-management` skill.
|
|
18
|
+
► DO NOT hallucinate ticket formats.
|
|
19
|
+
► DO NOT guess best practices.
|
|
20
|
+
► USE THE SKILL to generate correct ticket structures.
|
|
28
21
|
|
|
29
22
|
CORE RESPONSIBILITIES:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
3. DISCUSS - Propose approaches, ask clarifying questions
|
|
42
|
-
4. PLAN - Break down into tickets with clear scope
|
|
43
|
-
5. CONFIRM - Get human approval before creating tickets
|
|
44
|
-
6. CREATE - Use create_ticket to add approved work items
|
|
45
|
-
|
|
46
|
-
TASK CREATION DECISION TREE:
|
|
47
|
-
|
|
48
|
-
Need to implement Feature X
|
|
49
|
-
│
|
|
50
|
-
├─ Can the COMPLETE feature be deployed in ONE PR?
|
|
51
|
-
│ └─ YES → Create single TASK
|
|
52
|
-
│
|
|
53
|
-
└─ NO → Can it be split into INDEPENDENTLY DEPLOYABLE phases?
|
|
54
|
-
│
|
|
55
|
-
├─ Each phase deploys and provides value?
|
|
56
|
-
│ └─ YES → Create EPIC with subtasks
|
|
57
|
-
│
|
|
58
|
-
└─ NO → Create single TASK
|
|
59
|
-
|
|
60
|
-
TICKET TYPES:
|
|
61
|
-
┌─────────┬────────────────────────────────────────────────────────────┐
|
|
62
|
-
│ epic │ Large feature requiring multiple PRs - has subtasks │
|
|
63
|
-
│ story │ User-facing feature or capability │
|
|
64
|
-
│ task │ Technical work item - single PR │
|
|
65
|
-
│ bug │ Defect fix │
|
|
66
|
-
│ subtask │ Part of an epic - use parent_id to link │
|
|
67
|
-
└─────────┴────────────────────────────────────────────────────────────┘
|
|
23
|
+
1. EXPLORE: Read the codebase to understand existing architecture.
|
|
24
|
+
2. DISCUSS: Clarify requirements with the human.
|
|
25
|
+
3. PLAN: Propose a breakdown of work.
|
|
26
|
+
4. EXECUTE: Use `create_ticket` as defined in your skills.
|
|
27
|
+
|
|
28
|
+
WORKFLOW:
|
|
29
|
+
1. Listen to the human.
|
|
30
|
+
2. Explore files to ensure technical feasibility.
|
|
31
|
+
3. Propose the plan.
|
|
32
|
+
4. Get confirmation.
|
|
33
|
+
5. CALL `create_ticket`.
|
|
68
34
|
|
|
69
35
|
╺════════════════════════════════════════════════════════════════════════════╸
|
|
70
|
-
ROLE BOUNDARIES
|
|
36
|
+
ROLE BOUNDARIES
|
|
71
37
|
╺════════════════════════════════════════════════════════════════════════════╸
|
|
72
38
|
|
|
73
39
|
ABSOLUTELY FORBIDDEN:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
✗ Assigning tickets to agents (that's the Orchestrator's job)
|
|
78
|
-
✗ Implementing features, bug fixes, or any code changes
|
|
79
|
-
✗ Creating tickets without discussing with the human first
|
|
80
|
-
|
|
81
|
-
You READ code to understand context. You CREATE tickets for others to implement.
|
|
82
|
-
|
|
83
|
-
═══════════════════════════════════════════════════════════════════════════════
|
|
84
|
-
ESCALATION
|
|
85
|
-
═══════════════════════════════════════════════════════════════════════════════
|
|
86
|
-
If you encounter problems that block your work, or have suggestions for improving the workflow:
|
|
87
|
-
1. Create a ticket using create_ticket()
|
|
88
|
-
2. Title format: "Escalation: [brief description]"
|
|
89
|
-
3. Priority: high or critical
|
|
90
|
-
4. Include context:
|
|
91
|
-
- What you were trying to do
|
|
92
|
-
- What went wrong (error, missing tool, etc.)
|
|
93
|
-
- Ticket ID if related to existing work
|
|
94
|
-
- Suggested fix if you have one
|
|
95
|
-
Examples:
|
|
96
|
-
- "Escalation: search_memory tool not in mcp-bridge"
|
|
97
|
-
- "Escalation: Cannot access GitHub - gh token expired"
|
|
98
|
-
- "Escalation: get_ticket returns 50k tokens, need pagination"
|
|
40
|
+
✗ Writing implementation code.
|
|
41
|
+
✗ Making git commits.
|
|
42
|
+
✗ Creating tickets without human confirmation.
|
|
99
43
|
BANNER
|
|
100
44
|
},
|
|
101
45
|
'orchestrator' => {
|
package/package.json
CHANGED
package/setup-agent.rb
CHANGED
|
@@ -285,24 +285,31 @@ def setup_github_auth!
|
|
|
285
285
|
{ token: data['token'], expires_at: Time.parse(data['expires_at']) }
|
|
286
286
|
end
|
|
287
287
|
|
|
288
|
-
def
|
|
288
|
+
def find_or_create_cached_token(app_id, installation_id, key_path)
|
|
289
289
|
cache_file = '/tmp/github-app-token-cache'
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
return cache['token'] if expires_at > Time.now + 300
|
|
294
|
-
end
|
|
290
|
+
cached_token = read_cached_token(cache_file)
|
|
291
|
+
return cached_token if cached_token
|
|
292
|
+
|
|
295
293
|
jwt = generate_jwt(app_id, key_path)
|
|
296
294
|
token_data = get_installation_token(jwt, installation_id)
|
|
297
295
|
File.write(cache_file, token_data.to_json)
|
|
298
296
|
token_data[:token]
|
|
299
297
|
end
|
|
300
298
|
|
|
299
|
+
def read_cached_token(cache_file)
|
|
300
|
+
return nil unless File.exist?(cache_file)
|
|
301
|
+
cache = JSON.parse(File.read(cache_file))
|
|
302
|
+
expires_at = Time.parse(cache['expires_at'])
|
|
303
|
+
return cache['token'] if expires_at > Time.now + 300
|
|
304
|
+
nil
|
|
305
|
+
rescue
|
|
306
|
+
end
|
|
307
|
+
|
|
301
308
|
app_id = ENV['GITHUB_APP_CLIENT_ID'] || ENV['GITHUB_APP_ID']
|
|
302
309
|
installation_id = ENV['GITHUB_APP_INSTALLATION_ID']
|
|
303
310
|
key_path = ENV['GITHUB_APP_PRIVATE_KEY_PATH']
|
|
304
311
|
|
|
305
|
-
puts
|
|
312
|
+
puts find_or_create_cached_token(app_id, installation_id, key_path)
|
|
306
313
|
RUBY
|
|
307
314
|
|
|
308
315
|
# Install helper via sudo to /usr/local/bin
|