opencode-skills-collection 4.0.55 → 4.0.57

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.
@@ -0,0 +1,85 @@
1
+ """Temporary-local-fixture tests for complete bundles and write boundaries."""
2
+ import contextlib
3
+ import importlib.util
4
+ import io
5
+ import os
6
+ from pathlib import Path
7
+ import tempfile
8
+ import unittest
9
+ spec = importlib.util.spec_from_file_location('porter', Path(__file__).with_name('port_skill.py'))
10
+ porter = importlib.util.module_from_spec(spec)
11
+ spec.loader.exec_module(porter)
12
+
13
+ class PorterTests(unittest.TestCase):
14
+ def setUp(self):
15
+ self.temp = tempfile.TemporaryDirectory()
16
+ self.addCleanup(self.temp.cleanup)
17
+ self.base = Path(self.temp.name).resolve()
18
+ self.source = self.base / 'sample-skill'
19
+ self.source.mkdir()
20
+ self.original = b'---\nname: sample-skill\ndescription: "View: metadata"\n---\n`View` then `Bash`. View prose. CLAUDE.md.\n'
21
+ (self.source / 'SKILL.md').write_bytes(self.original)
22
+ (self.source / 'assets').mkdir()
23
+ (self.source / 'assets/binary.bin').write_bytes(b'\x00\xffpayload')
24
+ self.dest = self.base / 'output'
25
+ def port(self, dry=True):
26
+ with contextlib.redirect_stdout(io.StringIO()):
27
+ return porter.port(self.source, self.dest, dry)
28
+ def test_preview_writes_nothing(self):
29
+ self.port()
30
+ self.assertFalse(self.dest.exists())
31
+ self.assertEqual((self.source / 'SKILL.md').read_bytes(), self.original)
32
+ def test_copy_preserves_support_and_metadata(self):
33
+ self.port(False)
34
+ root = self.dest / 'sample-skill'
35
+ self.assertEqual((root / 'assets/binary.bin').read_bytes(), b'\x00\xffpayload')
36
+ s = (root / 'SKILL.md').read_text()
37
+ self.assertIn('description: "View: metadata"', s)
38
+ self.assertIn('`view_file` then `run_command`. View prose. CLAUDE.md.', s)
39
+ def test_existing_destination_untouched(self):
40
+ target = self.dest / 'sample-skill'
41
+ target.mkdir(parents=True)
42
+ (target / 'keep').write_text('unmanaged')
43
+ with self.assertRaisesRegex(ValueError, 'already exists'): self.port(False)
44
+ self.assertEqual((target / 'keep').read_text(), 'unmanaged')
45
+ def test_source_link_rejected(self):
46
+ (self.source / 'link').symlink_to(self.base)
47
+ with self.assertRaisesRegex(ValueError, 'links'): self.port(False)
48
+ self.assertFalse(self.dest.exists())
49
+ def test_destination_link_rejected(self):
50
+ self.dest.symlink_to(self.base, target_is_directory=True)
51
+ with self.assertRaisesRegex(ValueError, 'links'): self.port(False)
52
+ @unittest.skipUnless(hasattr(os, 'mkfifo'), 'POSIX')
53
+ def test_fifo_rejected(self):
54
+ os.mkfifo(self.source / 'pipe')
55
+ with self.assertRaisesRegex(ValueError, 'Non-regular'): self.port()
56
+ def test_remote_rejected(self):
57
+ with self.assertRaisesRegex(ValueError, 'Remote fetch'):
58
+ porter.port('https://github.com/example/repo', self.dest, False)
59
+ self.assertFalse(self.dest.exists())
60
+ def test_overlap_rejected(self):
61
+ with self.assertRaisesRegex(ValueError, 'overlap'):
62
+ porter.port(self.source, self.source / 'out', False)
63
+ def test_validate_all_bundles_before_writing(self):
64
+ repo = self.base / 'repo'
65
+ container = repo / 'skills'
66
+ container.mkdir(parents=True)
67
+ self.source.rename(container / 'sample-skill')
68
+ bad = container / 'bad-skill'
69
+ bad.mkdir()
70
+ (bad / 'SKILL.md').write_text('bad')
71
+ with self.assertRaisesRegex(ValueError, 'frontmatter'):
72
+ porter.port(repo, self.dest, False)
73
+ self.assertFalse(self.dest.exists())
74
+ def test_budget_rejects_before_writing(self):
75
+ old = porter.MAX_BYTES
76
+ porter.MAX_BYTES = 4
77
+ try:
78
+ with self.assertRaisesRegex(ValueError, 'budget'): self.port(False)
79
+ finally: porter.MAX_BYTES = old
80
+ self.assertFalse(self.dest.exists())
81
+ def test_file_source_keeps_support(self):
82
+ with contextlib.redirect_stdout(io.StringIO()):
83
+ porter.port(self.source / 'SKILL.md', self.dest, False)
84
+ self.assertEqual((self.dest / 'sample-skill/assets/binary.bin').read_bytes(), b'\x00\xffpayload')
85
+ if __name__ == '__main__': unittest.main()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skills-collection",
3
- "version": "4.0.55",
3
+ "version": "4.0.57",
4
4
  "description": "OpenCode CLI plugin that automatically downloads and keeps skills up to date.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/skills_index.json CHANGED
@@ -8820,6 +8820,39 @@
8820
8820
  "reasons": []
8821
8821
  }
8822
8822
  },
8823
+ {
8824
+ "id": "break-ai-fix-loops",
8825
+ "path": "skills/break-ai-fix-loops",
8826
+ "category": "code-quality",
8827
+ "name": "break-ai-fix-loops",
8828
+ "description": "Stop ineffective AI coding repair loops with stable failure fingerprints, a three-attempt budget, real-path proof, negative controls, and tested rollback.",
8829
+ "risk": "critical",
8830
+ "source": "community",
8831
+ "date_added": "2026-09-04",
8832
+ "plugin": {
8833
+ "targets": {
8834
+ "codex": "supported",
8835
+ "claude": "supported"
8836
+ },
8837
+ "setup": {
8838
+ "type": "none",
8839
+ "summary": "",
8840
+ "docs": null
8841
+ },
8842
+ "reasons": []
8843
+ },
8844
+ "source_type": "community",
8845
+ "source_repo": "twoicewoo/awesome-copilot",
8846
+ "license": "MIT",
8847
+ "license_source": "https://github.com/twoicewoo/awesome-copilot/blob/886bf799bb05501bfd1afa7aae9cc5a77dedb03e/LICENSE",
8848
+ "tags": [
8849
+ "ai-agents",
8850
+ "debugging",
8851
+ "verification",
8852
+ "negative-control",
8853
+ "rollback"
8854
+ ]
8855
+ },
8823
8856
  {
8824
8857
  "id": "brendangregg-use-tsa",
8825
8858
  "path": "skills/brendangregg-use-tsa",
@@ -27823,7 +27856,7 @@
27823
27856
  "path": "skills/linkedin-profile-optimizer",
27824
27857
  "category": "growth",
27825
27858
  "name": "linkedin-profile-optimizer",
27826
- "description": "High-intent expert for LinkedIn profile checks, authority building, and SEO optimization. Invoke to audit, rewrite, and enhance profiles for top 1% positioning.",
27859
+ "description": "High-intent expert for LinkedIn profile checks and SEO optimization. Silently audits and rewrites profiles, delivering only the finished, ready-to-paste result.",
27827
27860
  "risk": "safe",
27828
27861
  "source": "self",
27829
27862
  "date_added": "2026-04-13",
@@ -42695,6 +42728,39 @@
42695
42728
  "ci"
42696
42729
  ]
42697
42730
  },
42731
+ {
42732
+ "id": "skill-porter",
42733
+ "path": "skills/skill-porter",
42734
+ "category": "developer-tools",
42735
+ "name": "skill-porter",
42736
+ "description": "Preview conservative tool-name translations and copy complete local skill bundles for manual adaptation to Google Antigravity.",
42737
+ "risk": "critical",
42738
+ "source": "community",
42739
+ "date_added": "2026-09-07",
42740
+ "plugin": {
42741
+ "targets": {
42742
+ "codex": "supported",
42743
+ "claude": "supported"
42744
+ },
42745
+ "setup": {
42746
+ "type": "none",
42747
+ "summary": "",
42748
+ "docs": null
42749
+ },
42750
+ "reasons": []
42751
+ },
42752
+ "source_type": "community",
42753
+ "source_repo": "Pranav-Nexus/antigravity-skill-porter",
42754
+ "license": "MIT",
42755
+ "license_source": "https://github.com/Pranav-Nexus/antigravity-skill-porter/blob/7a5b42c0fe1be283ae9f5b5fe70792aa78733af7/LICENSE",
42756
+ "tags": [
42757
+ "antigravity",
42758
+ "claude",
42759
+ "skills",
42760
+ "migration",
42761
+ "agent"
42762
+ ]
42763
+ },
42698
42764
  {
42699
42765
  "id": "skill-rails-upgrade",
42700
42766
  "path": "skills/skill-rails-upgrade",