codepraxis 0.3.0__tar.gz → 0.3.1__tar.gz

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 (70) hide show
  1. {codepraxis-0.3.0 → codepraxis-0.3.1}/PKG-INFO +1 -1
  2. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/__init__.py +1 -1
  3. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/installer.py +6 -2
  4. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/test_validation_rules.py +30 -0
  5. {codepraxis-0.3.0 → codepraxis-0.3.1}/.gitignore +0 -0
  6. {codepraxis-0.3.0 → codepraxis-0.3.1}/CONTRIBUTING.md +0 -0
  7. {codepraxis-0.3.0 → codepraxis-0.3.1}/README.md +0 -0
  8. {codepraxis-0.3.0 → codepraxis-0.3.1}/RELEASING.md +0 -0
  9. {codepraxis-0.3.0 → codepraxis-0.3.1}/pyproject.toml +0 -0
  10. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/__main__.py +0 -0
  11. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/cli.py +0 -0
  12. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/__init__.py +0 -0
  13. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/example.py +0 -0
  14. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/lint.py +0 -0
  15. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/login.py +0 -0
  16. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/publish.py +0 -0
  17. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/commands/validate.py +0 -0
  18. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/domain/__init__.py +0 -0
  19. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/domain/contract.py +0 -0
  20. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/domain/pack.py +0 -0
  21. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/domain/results.py +0 -0
  22. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/errors.py +0 -0
  23. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/__init__.py +0 -0
  24. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/executor.py +0 -0
  25. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/local/__init__.py +0 -0
  26. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/local/backends.py +0 -0
  27. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/local/executor.py +0 -0
  28. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/local/worker.py +0 -0
  29. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/local/workspace.py +0 -0
  30. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/remote/__init__.py +0 -0
  31. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/remote/client.py +0 -0
  32. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/remote/config.py +0 -0
  33. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/execution/remote/executor.py +0 -0
  34. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/packio/__init__.py +0 -0
  35. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/packio/archive.py +0 -0
  36. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/packio/discovery.py +0 -0
  37. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/packio/loader.py +0 -0
  38. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/packio/toc.py +0 -0
  39. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/__init__.py +0 -0
  40. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/templates/commands/new.md +0 -0
  41. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/templates/commands/validate.md +0 -0
  42. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/templates/marketplace.json +0 -0
  43. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/templates/plugin.json +0 -0
  44. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/plugin/templates/skills/pack-authoring/SKILL.md +0 -0
  45. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/reporting/__init__.py +0 -0
  46. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/reporting/human.py +0 -0
  47. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/reporting/json_reporter.py +0 -0
  48. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/reporting/reporter.py +0 -0
  49. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/__init__.py +0 -0
  50. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/generator.py +0 -0
  51. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/README.md +0 -0
  52. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/backend.conf +0 -0
  53. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/course_toc.json +0 -0
  54. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/feature.md +0 -0
  55. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/main.py +0 -0
  56. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/metadata.json +0 -0
  57. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/solution.py +0 -0
  58. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/scaffold/templates/test_1.py +0 -0
  59. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/__init__.py +0 -0
  60. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/registry.py +0 -0
  61. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/rule.py +0 -0
  62. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/rules/__init__.py +0 -0
  63. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/rules/hygiene.py +0 -0
  64. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/rules/instructions.py +0 -0
  65. {codepraxis-0.3.0 → codepraxis-0.3.1}/src/codepraxis/validation/rules/testcases.py +0 -0
  66. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/conformance/test_corpus.py +0 -0
  67. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/conftest.py +0 -0
  68. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/test_classification.py +0 -0
  69. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/test_publish.py +0 -0
  70. {codepraxis-0.3.0 → codepraxis-0.3.1}/tests/test_toc.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codepraxis
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Author and validate CodePraxis challenge packs.
5
5
  Project-URL: Documentation, https://docs.codepraxis.com/authoring
6
6
  Author: CodePraxis
@@ -1,3 +1,3 @@
1
1
  """Author and validate CodePraxis challenge packs."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.3.1"
@@ -108,12 +108,16 @@ def describe(result: InstallResult) -> str:
108
108
  "",
109
109
  "Enable it in Claude Code:",
110
110
  "",
111
- f" /plugin marketplace add {relative}",
111
+ # The absolute path is deliberate. `/plugin marketplace add` reads a
112
+ # bare `foo/bar` as a GitHub owner/repo shorthand and tries to clone
113
+ # it, so a relative path here fails with "Repository not found". A
114
+ # leading slash cannot be parsed that way.
115
+ f" /plugin marketplace add {result.root}",
112
116
  f" /plugin install {PLUGIN_NAME}@{MARKETPLACE_NAME}",
113
117
  "",
114
118
  "Then:",
115
119
  "",
116
- " /codepraxis:new scaffold a pack from a description",
120
+ " /codepraxis:new scaffold a pack from a description",
117
121
  " /codepraxis:validate validate a pack and fix what fails",
118
122
  "",
119
123
  "The pack-authoring skill loads automatically when Claude touches a pack.",
@@ -219,3 +219,33 @@ class TestExampleCommand:
219
219
  monkeypatch.delenv("CODEPRAXIS_TOKEN", raising=False)
220
220
 
221
221
  assert RemoteConfig.resolve_public().token == ""
222
+
223
+
224
+ class TestPluginInstructions:
225
+ """`/plugin marketplace add` reads a bare `foo/bar` as a GitHub repo.
226
+
227
+ A relative path there fails with "Repository not found", so the printed
228
+ command must be one that cannot be parsed as owner/repo.
229
+ """
230
+
231
+ def test_marketplace_command_uses_an_absolute_path(self, tmp_path, monkeypatch):
232
+ from codepraxis.plugin import installer
233
+
234
+ monkeypatch.chdir(tmp_path)
235
+ result = installer.install(tmp_path)
236
+ line = next(
237
+ text for text in installer.describe(result).splitlines() if "marketplace add" in text
238
+ )
239
+
240
+ path = line.split("marketplace add", 1)[1].strip()
241
+ assert path.startswith("/"), f"{path!r} would be read as a GitHub owner/repo"
242
+ assert Path(path).is_dir()
243
+
244
+ def test_the_marketplace_manifest_is_where_the_command_points(self, tmp_path, monkeypatch):
245
+ from codepraxis.plugin import installer
246
+
247
+ monkeypatch.chdir(tmp_path)
248
+ result = installer.install(tmp_path)
249
+
250
+ assert (result.root / ".claude-plugin" / "marketplace.json").is_file()
251
+ assert (result.root / "codepraxis" / ".claude-plugin" / "plugin.json").is_file()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes