opencode-pilot 0.6.0 → 0.6.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-pilot",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "type": "module",
5
5
  "main": "plugin/index.js",
6
6
  "description": "Automation daemon for OpenCode - polls for work and spawns sessions",
@@ -185,7 +185,7 @@ export async function pollOnce(options = {}) {
185
185
  if (result.success) {
186
186
  // Mark as processed to avoid re-triggering
187
187
  if (pollerInstance) {
188
- pollerInstance.markProcessed(item.id, { repoKey, command: result.command });
188
+ pollerInstance.markProcessed(item.id, { repoKey: item.repo_key, command: result.command });
189
189
  }
190
190
  console.log(`[poll] Started session for ${item.id}`);
191
191
  } else {
@@ -3,7 +3,9 @@
3
3
  # Provider-level config (applies to all GitHub presets)
4
4
  _provider:
5
5
  response_key: items
6
- mappings: {}
6
+ mappings:
7
+ # Extract repo full name from repository_url (e.g., "https://api.github.com/repos/owner/repo")
8
+ repository_full_name: "repository_url:/repos\\/([^/]+\\/[^/]+)$/"
7
9
 
8
10
  # Presets
9
11
  my-issues:
@@ -15,7 +17,7 @@ my-issues:
15
17
  q: "is:issue assignee:@me state:open"
16
18
  item:
17
19
  id: "{html_url}"
18
- repo: "{repository.full_name}"
20
+ repo: "{repository_full_name}"
19
21
 
20
22
  review-requests:
21
23
  name: review-requests
@@ -26,7 +28,7 @@ review-requests:
26
28
  q: "is:pr review-requested:@me state:open"
27
29
  item:
28
30
  id: "{html_url}"
29
- repo: "{repository.full_name}"
31
+ repo: "{repository_full_name}"
30
32
 
31
33
  my-prs-feedback:
32
34
  name: my-prs-feedback
@@ -37,4 +39,4 @@ my-prs-feedback:
37
39
  q: "is:pr author:@me state:open review:changes_requested"
38
40
  item:
39
41
  id: "{html_url}"
40
- repo: "{repository.full_name}"
42
+ repo: "{repository_full_name}"
@@ -159,14 +159,15 @@ sources:
159
159
  loadRepoConfig(configPath);
160
160
 
161
161
  const source = getSources()[0];
162
+ // Item with repository_full_name (mapped from repository_url by GitHub provider)
162
163
  const item = {
163
- repository: { full_name: 'myorg/backend' },
164
+ repository_full_name: 'myorg/backend',
164
165
  number: 123,
165
166
  html_url: 'https://github.com/myorg/backend/issues/123'
166
167
  };
167
168
 
168
- // Source should have repo field from preset
169
- assert.strictEqual(source.repo, '{repository.full_name}');
169
+ // Source should have repo field from preset (uses mapped field)
170
+ assert.strictEqual(source.repo, '{repository_full_name}');
170
171
 
171
172
  // resolveRepoForItem should extract repo key from item
172
173
  const repoKeys = resolveRepoForItem(source, item);
@@ -194,8 +195,9 @@ sources:
194
195
  loadRepoConfig(configPath);
195
196
 
196
197
  const source = getSources()[0];
198
+ // Item with repository_full_name (mapped from repository_url by GitHub provider)
197
199
  const item = {
198
- repository: { full_name: 'unknown/repo' },
200
+ repository_full_name: 'unknown/repo',
199
201
  number: 456
200
202
  };
201
203
 
@@ -352,7 +352,9 @@ sources: []
352
352
 
353
353
  // GitHub preset has response_key: items, user config doesn't override it
354
354
  assert.strictEqual(toolConfig.response_key, 'items');
355
- assert.deepStrictEqual(toolConfig.mappings, { url: 'html_url' });
355
+ // GitHub provider has mapping for repository_full_name extraction from URL
356
+ assert.strictEqual(toolConfig.mappings.url, 'html_url');
357
+ assert.ok(toolConfig.mappings.repository_full_name, 'Should have repository_full_name mapping');
356
358
  });
357
359
 
358
360
  test('getToolProviderConfig falls back to preset provider config', async () => {
@@ -628,11 +630,12 @@ sources:
628
630
  loadRepoConfig(configPath);
629
631
  const sources = getSources();
630
632
 
631
- // All GitHub presets should have repo field for automatic resolution
632
- const mockItem = { repository: { full_name: 'myorg/backend' } };
633
+ // All GitHub presets should have repo field that references repository_full_name
634
+ // (which is mapped from repository_url by the GitHub provider)
635
+ const mockItem = { repository_full_name: 'myorg/backend' };
633
636
 
634
637
  for (const source of sources) {
635
- assert.strictEqual(source.repo, '{repository.full_name}', `Preset ${source.name} should have repo field`);
638
+ assert.strictEqual(source.repo, '{repository_full_name}', `Preset ${source.name} should have repo field`);
636
639
  const repos = resolveRepoForItem(source, mockItem);
637
640
  assert.deepStrictEqual(repos, ['myorg/backend'], `Preset ${source.name} should resolve repo from item`);
638
641
  }
@@ -651,12 +654,12 @@ sources:
651
654
  loadRepoConfig(configPath);
652
655
  const source = getSources()[0];
653
656
 
654
- // Item from allowed repo should resolve
655
- const allowedItem = { repository: { full_name: 'myorg/backend' } };
657
+ // Item from allowed repo should resolve (repository_full_name is mapped from repository_url)
658
+ const allowedItem = { repository_full_name: 'myorg/backend' };
656
659
  assert.deepStrictEqual(resolveRepoForItem(source, allowedItem), ['myorg/backend']);
657
660
 
658
661
  // Item from non-allowed repo should return empty (filtered out)
659
- const filteredItem = { repository: { full_name: 'other/repo' } };
662
+ const filteredItem = { repository_full_name: 'other/repo' };
660
663
  assert.deepStrictEqual(resolveRepoForItem(source, filteredItem), []);
661
664
  });
662
665
  });