ossplate 0.2.2__tar.gz → 0.2.4__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 (96) hide show
  1. {ossplate-0.2.2 → ossplate-0.2.4}/PKG-INFO +1 -1
  2. {ossplate-0.2.2 → ossplate-0.2.4}/ossplate/bin/linux-x64/ossplate +0 -0
  3. {ossplate-0.2.2 → ossplate-0.2.4}/pyproject.toml +1 -1
  4. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/bin/linux-x64/ossplate +0 -0
  5. ossplate-0.2.4/src/ossplate/scaffold/assets/illustrations/chestplate.svg +85 -0
  6. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/Cargo.lock +1 -1
  7. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/Cargo.toml +1 -1
  8. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/main_tests.rs +66 -7
  9. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/scaffold/identity_application.rs +11 -2
  10. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/sync/metadata.rs +61 -0
  11. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/release-state.mjs +32 -12
  12. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/package-lock.json +6 -6
  13. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/package.json +5 -5
  14. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-darwin-arm64/package.json +1 -1
  15. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-darwin-x64/package.json +1 -1
  16. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-linux-x64/package.json +1 -1
  17. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-win32-x64/package.json +1 -1
  18. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-py/pyproject.toml +1 -1
  19. ossplate-0.2.2/src/ossplate/scaffold/assets/illustrations/chestplate.svg +0 -6
  20. {ossplate-0.2.2 → ossplate-0.2.4}/.gitignore +0 -0
  21. {ossplate-0.2.2 → ossplate-0.2.4}/README.md +0 -0
  22. {ossplate-0.2.2 → ossplate-0.2.4}/hatch_build.py +0 -0
  23. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/__init__.py +0 -0
  24. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/cli.py +0 -0
  25. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.github/workflows/ci.yml +0 -0
  26. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.github/workflows/live-e2e-published.yml +0 -0
  27. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.github/workflows/publish-npm.yml +0 -0
  28. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.github/workflows/publish.yml +0 -0
  29. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.github/workflows/release.yml +0 -0
  30. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.gitignore +0 -0
  31. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/.pre-commit-config.yaml +0 -0
  32. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/CONTRIBUTING.md +0 -0
  33. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/LICENSE +0 -0
  34. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/README.md +0 -0
  35. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/runtime-targets.json +0 -0
  36. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/source-checkout.json +0 -0
  37. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/config.rs +0 -0
  38. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/main.rs +0 -0
  39. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/output.rs +0 -0
  40. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/release.rs +0 -0
  41. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/scaffold/projection.rs +0 -0
  42. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/scaffold/template_root.rs +0 -0
  43. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/scaffold.rs +0 -0
  44. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/scaffold_manifest.rs +0 -0
  45. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/source_checkout.rs +0 -0
  46. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/sync/text.rs +0 -0
  47. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/sync.rs +0 -0
  48. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/core-rs/src/test_support.rs +0 -0
  49. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/README.md +0 -0
  50. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0001-rust-core-thin-wrappers.md +0 -0
  51. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0002-sync-owns-bounded-identity.md +0 -0
  52. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0003-curated-scaffold-payload.md +0 -0
  53. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0004-release-orchestration-stays-core-owned.md +0 -0
  54. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0005-verification-enforces-source-and-installed-contracts.md +0 -0
  55. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0006-rust-core-uses-explicit-product-slices.md +0 -0
  56. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0007-split-scaffold-payload-and-source-checkout-contracts.md +0 -0
  57. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0008-stage-neutral-runtime-artifacts-for-wrapper-packaging.md +0 -0
  58. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0009-centralize-release-state-policy.md +0 -0
  59. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0010-scaffold-mirrors-are-generated-packaging-assets.md +0 -0
  60. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0011-consolidate-release-assertion-commands.md +0 -0
  61. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0012-dry-through-canonical-contracts-and-generation.md +0 -0
  62. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0013-pragmatic-solid-through-functional-core-and-thin-adapters.md +0 -0
  63. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/0014-one-hexagonal-product-shell-centered-in-rust.md +0 -0
  64. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/adrs/README.md +0 -0
  65. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/architecture.md +0 -0
  66. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/customizing-the-template.md +0 -0
  67. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/hexagonal-shell.md +0 -0
  68. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/live-e2e.md +0 -0
  69. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/releases.md +0 -0
  70. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/docs/testing.md +0 -0
  71. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/ossplate.toml +0 -0
  72. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/runtime-targets.json +0 -0
  73. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/assert-js-lockfile-state.mjs +0 -0
  74. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/bump-version.mjs +0 -0
  75. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/publish-local.mjs +0 -0
  76. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/release-check.mjs +0 -0
  77. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/release-plan.mjs +0 -0
  78. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/repair-js-lockfile.mjs +0 -0
  79. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/runtime-targets.mjs +0 -0
  80. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/verify-release.sh +0 -0
  81. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/verify.sh +0 -0
  82. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/scripts/wait-for-npm-versions.mjs +0 -0
  83. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/README.md +0 -0
  84. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/bin/ossplate.js +0 -0
  85. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-darwin-arm64/README.md +0 -0
  86. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-darwin-x64/README.md +0 -0
  87. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-linux-x64/README.md +0 -0
  88. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/platform-packages/ossplate-win32-x64/README.md +0 -0
  89. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/src/index.ts +0 -0
  90. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-js/tsconfig.json +0 -0
  91. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-py/README.md +0 -0
  92. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-py/hatch_build.py +0 -0
  93. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-py/src/ossplate/__init__.py +0 -0
  94. {ossplate-0.2.2 → ossplate-0.2.4}/src/ossplate/scaffold/wrapper-py/src/ossplate/cli.py +0 -0
  95. {ossplate-0.2.2 → ossplate-0.2.4}/tests/fixtures/ossplate-stub.sh +0 -0
  96. {ossplate-0.2.2 → ossplate-0.2.4}/tests/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ossplate
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Build one project, ship it everywhere.
5
5
  Project-URL: Homepage, https://github.com/stefdevscore/ossplate
6
6
  Project-URL: Repository, https://github.com/stefdevscore/ossplate
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ossplate"
7
- version = "0.2.2"
7
+ version = "0.2.4"
8
8
  description = "Build one project, ship it everywhere."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,85 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
3
+ <title id="title">Ossplate chest armor</title>
4
+ <desc id="desc">A transparent-background chestplate silhouette constructed from binary digits with a small red OSS mark.</desc>
5
+ <defs>
6
+ <path id="armor-shape" d="M156.7 25.83L89 39.38c-.1 58.57-1.74 119.32-43.49 167.22C104.4 246.5 189 260.7 247 248.8v-99L108.3 88.22l7.4-16.44L256 134.2l140.3-62.42 7.4 16.44L265 149.8v99c58 11.9 142.6-2.3 201.5-42.2-41.8-47.9-43.4-108.65-43.5-167.22l-67.7-13.55c-12.9 13.88-20.6 28.15-32.9 40.53C308.9 79.78 289.5 89 256 89c-33.5 0-52.9-9.22-66.4-22.64-12.3-12.38-20-26.65-32.9-40.53zM53.88 232.9C75.96 281 96.07 336.6 102.7 392.8l65 22.8c4.2-52.7 28.2-104 63.7-146.1-55.1 6.3-122.7-5.8-177.52-36.6zm404.22 0c-54.8 30.8-122.4 42.9-177.5 36.6 35.5 42.1 59.5 93.4 63.7 146.1l65.2-22.9c6.6-56.8 26.6-111.8 48.6-159.8zM256 269c-40.5 43.1-67.7 97.9-70.7 152.7l61.7 21.6V336h18v107.3l61.7-21.6c-3.1-54.8-30.2-109.6-70.7-152.7zm151.7 143.4L297 451.1v18.8l110.2-44.1c.1-4.5.3-8.9.5-13.4zm-303.3.1c.3 4.5.4 8.9.5 13.4l110.1 44v-18.7l-110.6-38.7zM279 457.4l-23 8.1-23-8v19.6l23 9.2 23-9.2v-19.7z"/>
7
+ <clipPath id="armor-clip">
8
+ <use href="#armor-shape"/>
9
+ </clipPath>
10
+ <mask id="armor-binary-mask" maskUnits="userSpaceOnUse">
11
+ <rect x="0" y="0" width="512" height="512" fill="#000"/>
12
+ <use href="#armor-shape" fill="#fff"/>
13
+ <rect x="286" y="156" width="92" height="48" rx="4" ry="4" fill="#000"/>
14
+ </mask>
15
+ <linearGradient id="binary-ink" x1="92" y1="40" x2="410" y2="470" gradientUnits="userSpaceOnUse">
16
+ <stop offset="0" stop-color="#94A3B8"/>
17
+ <stop offset=".52" stop-color="#CBD5E1"/>
18
+ <stop offset="1" stop-color="#64748B"/>
19
+ </linearGradient>
20
+ <g id="glyph-zero" shape-rendering="crispEdges">
21
+ <rect x="4" y="0" width="4" height="4"/>
22
+ <rect x="8" y="0" width="4" height="4"/>
23
+ <rect x="0" y="4" width="4" height="4"/>
24
+ <rect x="12" y="4" width="4" height="4"/>
25
+ <rect x="0" y="8" width="4" height="4"/>
26
+ <rect x="12" y="8" width="4" height="4"/>
27
+ <rect x="0" y="12" width="4" height="4"/>
28
+ <rect x="12" y="12" width="4" height="4"/>
29
+ <rect x="4" y="16" width="4" height="4"/>
30
+ <rect x="8" y="16" width="4" height="4"/>
31
+ </g>
32
+ <g id="glyph-one" shape-rendering="crispEdges">
33
+ <rect x="6" y="0" width="4" height="4"/>
34
+ <rect x="2" y="4" width="4" height="4"/>
35
+ <rect x="6" y="4" width="4" height="4"/>
36
+ <rect x="6" y="8" width="4" height="4"/>
37
+ <rect x="6" y="12" width="4" height="4"/>
38
+ <rect x="2" y="16" width="4" height="4"/>
39
+ <rect x="6" y="16" width="4" height="4"/>
40
+ <rect x="10" y="16" width="4" height="4"/>
41
+ </g>
42
+ <pattern id="binary-pattern" width="144" height="24" patternUnits="userSpaceOnUse">
43
+ <g fill="url(#binary-ink)">
44
+ <use href="#glyph-one" x="0" y="2"/>
45
+ <use href="#glyph-zero" x="18" y="2"/>
46
+ <use href="#glyph-one" x="36" y="2"/>
47
+ <use href="#glyph-one" x="54" y="2"/>
48
+ <use href="#glyph-zero" x="72" y="2"/>
49
+ <use href="#glyph-one" x="90" y="2"/>
50
+ <use href="#glyph-zero" x="108" y="2"/>
51
+ <use href="#glyph-zero" x="126" y="2"/>
52
+ </g>
53
+ </pattern>
54
+ </defs>
55
+ <g clip-path="url(#armor-clip)">
56
+ <rect x="0" y="0" width="512" height="512" mask="url(#armor-binary-mask)" fill="url(#binary-pattern)"/>
57
+ <g fill="#DC2626" shape-rendering="crispEdges" transform="translate(304 166)">
58
+ <g transform="translate(0 0)">
59
+ <use href="#glyph-zero"/>
60
+ </g>
61
+ <g transform="translate(22 0)">
62
+ <rect x="4" y="0" width="4" height="4"/>
63
+ <rect x="8" y="0" width="4" height="4"/>
64
+ <rect x="0" y="4" width="4" height="4"/>
65
+ <rect x="4" y="8" width="4" height="4"/>
66
+ <rect x="8" y="8" width="4" height="4"/>
67
+ <rect x="12" y="8" width="4" height="4"/>
68
+ <rect x="12" y="12" width="4" height="4"/>
69
+ <rect x="4" y="16" width="4" height="4"/>
70
+ <rect x="8" y="16" width="4" height="4"/>
71
+ </g>
72
+ <g transform="translate(44 0)">
73
+ <rect x="4" y="0" width="4" height="4"/>
74
+ <rect x="8" y="0" width="4" height="4"/>
75
+ <rect x="0" y="4" width="4" height="4"/>
76
+ <rect x="4" y="8" width="4" height="4"/>
77
+ <rect x="8" y="8" width="4" height="4"/>
78
+ <rect x="12" y="8" width="4" height="4"/>
79
+ <rect x="12" y="12" width="4" height="4"/>
80
+ <rect x="4" y="16" width="4" height="4"/>
81
+ <rect x="8" y="16" width="4" height="4"/>
82
+ </g>
83
+ </g>
84
+ </g>
85
+ </svg>
@@ -158,7 +158,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
158
158
 
159
159
  [[package]]
160
160
  name = "ossplate"
161
- version = "0.2.2"
161
+ version = "0.2.4"
162
162
  dependencies = [
163
163
  "anyhow",
164
164
  "clap",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "ossplate"
3
- version = "0.2.2"
3
+ version = "0.2.4"
4
4
  edition = "2021"
5
5
  authors = ["Stef <stefdevscore@github.com>"]
6
6
  description = "Build one project, ship it everywhere."
@@ -71,6 +71,7 @@ fn sync_check_detects_drift_and_sync_fixes_it() {
71
71
  #[test]
72
72
  fn sync_owns_runtime_package_metadata() {
73
73
  let root = make_fixture_root();
74
+ let config = load_config(&root).unwrap();
74
75
  fs::write(
75
76
  root.join("wrapper-js/platform-packages/ossplate-darwin-arm64/package.json"),
76
77
  "{\n \"name\": \"bad-runtime\"\n}\n",
@@ -84,7 +85,10 @@ fn sync_owns_runtime_package_metadata() {
84
85
  root.join("wrapper-js/platform-packages/ossplate-darwin-arm64/package.json"),
85
86
  )
86
87
  .unwrap();
87
- assert!(synced.contains("\"name\": \"ossplate-darwin-arm64\""));
88
+ assert!(synced.contains(&format!(
89
+ "\"name\": \"{}-darwin-arm64\"",
90
+ config.packages.npm_package
91
+ )));
88
92
  assert!(validate_repo(&root).unwrap().ok);
89
93
  }
90
94
 
@@ -287,6 +291,62 @@ fn create_applies_identity_overrides_before_sync() {
287
291
  fs::remove_dir_all(&target).unwrap();
288
292
  }
289
293
 
294
+ #[test]
295
+ fn create_with_non_default_package_identity_is_valid_immediately() {
296
+ let source_root = make_source_checkout_root();
297
+ let target = unique_temp_path("ossplate-bootstrap-agentcode");
298
+ if target.exists() {
299
+ fs::remove_dir_all(&target).unwrap();
300
+ }
301
+
302
+ create_scaffold_from(
303
+ &source_root,
304
+ &target,
305
+ &IdentityOverrides {
306
+ name: Some("Agentcode".to_string()),
307
+ description: Some(
308
+ "Build and ship the agentcode CLI through Rust, npm, and PyPI.".to_string(),
309
+ ),
310
+ repository: Some("https://github.com/stefdevscore/agentcode".to_string()),
311
+ license: Some("Apache-2.0".to_string()),
312
+ author_name: Some("Azk".to_string()),
313
+ author_email: Some("azk@example.com".to_string()),
314
+ rust_crate: None,
315
+ npm_package: None,
316
+ python_package: None,
317
+ command: Some("agentcode".to_string()),
318
+ },
319
+ )
320
+ .unwrap();
321
+
322
+ assert!(validate_repo(&target).unwrap().ok);
323
+ assert!(sync_repo(&target, true).is_ok());
324
+
325
+ let cargo_toml = fs::read_to_string(target.join("core-rs/Cargo.toml")).unwrap();
326
+ assert!(cargo_toml.contains("name = \"agentcode\""));
327
+ assert!(cargo_toml.contains("default-run = \"agentcode\""));
328
+ assert!(cargo_toml.contains("[[bin]]"));
329
+
330
+ let wrapper_package: serde_json::Value =
331
+ serde_json::from_str(&fs::read_to_string(target.join("wrapper-js/package.json")).unwrap())
332
+ .unwrap();
333
+ assert_eq!(wrapper_package["name"], "agentcode");
334
+
335
+ let runtime_package: serde_json::Value = serde_json::from_str(
336
+ &fs::read_to_string(
337
+ target.join("wrapper-js/platform-packages/ossplate-darwin-arm64/package.json"),
338
+ )
339
+ .unwrap(),
340
+ )
341
+ .unwrap();
342
+ assert_eq!(runtime_package["name"], "agentcode-darwin-arm64");
343
+
344
+ let pyproject = fs::read_to_string(target.join("wrapper-py/pyproject.toml")).unwrap();
345
+ assert!(pyproject.contains("name = \"agentcode\""));
346
+
347
+ fs::remove_dir_all(&target).unwrap();
348
+ }
349
+
290
350
  #[test]
291
351
  fn create_fails_when_target_directory_is_not_empty() {
292
352
  let source_root = make_source_checkout_root();
@@ -324,20 +384,18 @@ fn create_fails_when_target_is_inside_source_tree() {
324
384
  #[test]
325
385
  fn sync_preserves_unowned_root_readme_content() {
326
386
  let root = make_fixture_root();
387
+ let config = load_config(&root).unwrap();
327
388
  let original = fs::read_to_string(root.join("README.md")).unwrap();
328
389
  fs::write(
329
390
  root.join("README.md"),
330
- original.replace(
331
- "Build one project, ship it everywhere",
332
- "Changed identity text",
333
- ),
391
+ original.replace(&config.project.description, "Changed identity text"),
334
392
  )
335
393
  .unwrap();
336
394
 
337
395
  sync_repo(&root, false).unwrap();
338
396
  let synced = fs::read_to_string(root.join("README.md")).unwrap();
339
397
  assert!(synced.contains("## What It Does"));
340
- assert!(synced.contains("Build one project, ship it everywhere"));
398
+ assert!(synced.contains(&config.project.description));
341
399
  }
342
400
 
343
401
  #[test]
@@ -357,7 +415,8 @@ fn github_link_helpers_render_absolute_main_urls() {
357
415
  fn rendered_wrapper_readmes_use_absolute_doc_links() {
358
416
  let config = load_config(&make_fixture_root()).unwrap();
359
417
  let rendered = render_wrapper_readme("Python", &config);
360
- assert!(rendered.contains("https://github.com/stefdevscore/ossplate/blob/main/docs/README.md"));
418
+ assert!(rendered
419
+ .contains(&github_blob_url(&config.project.repository, "main", "docs/README.md").unwrap()));
361
420
  assert!(!rendered.contains("../docs/README.md"));
362
421
  assert!(!rendered.contains("../docs/testing.md"));
363
422
  assert!(!rendered.contains("../docs/architecture.md"));
@@ -36,6 +36,9 @@ fn apply_overrides(config: &mut ToolConfig, overrides: &IdentityOverrides) {
36
36
  if let Some(value) = &overrides.author_email {
37
37
  config.author.email = value.clone();
38
38
  }
39
+ if let Some(value) = &overrides.command {
40
+ config.packages.command = value.clone();
41
+ }
39
42
  if let Some(value) = &overrides.rust_crate {
40
43
  config.packages.rust_crate = value.clone();
41
44
  }
@@ -45,7 +48,13 @@ fn apply_overrides(config: &mut ToolConfig, overrides: &IdentityOverrides) {
45
48
  if let Some(value) = &overrides.python_package {
46
49
  config.packages.python_package = value.clone();
47
50
  }
48
- if let Some(value) = &overrides.command {
49
- config.packages.command = value.clone();
51
+ if overrides.command.is_some() && overrides.rust_crate.is_none() {
52
+ config.packages.rust_crate = config.packages.command.clone();
53
+ }
54
+ if overrides.command.is_some() && overrides.npm_package.is_none() {
55
+ config.packages.npm_package = config.packages.command.clone();
56
+ }
57
+ if overrides.command.is_some() && overrides.python_package.is_none() {
58
+ config.packages.python_package = config.packages.command.clone();
50
59
  }
51
60
  }
@@ -27,6 +27,10 @@ fn runtime_package_specs() -> Vec<RuntimePackageSpec> {
27
27
  .targets
28
28
  }
29
29
 
30
+ fn rust_bin_file_path() -> &'static str {
31
+ "src/main.rs"
32
+ }
33
+
30
34
  pub(crate) fn validate_cargo_toml(
31
35
  config: &ToolConfig,
32
36
  content: &str,
@@ -45,6 +49,13 @@ pub(crate) fn validate_cargo_toml(
45
49
  package.get("name"),
46
50
  &config.packages.rust_crate,
47
51
  );
52
+ check_string_field(
53
+ &mut issues,
54
+ "core-rs/Cargo.toml",
55
+ "package.default-run",
56
+ package.get("default-run"),
57
+ &config.packages.command,
58
+ );
48
59
  check_string_field(
49
60
  &mut issues,
50
61
  "core-rs/Cargo.toml",
@@ -90,6 +101,39 @@ pub(crate) fn validate_cargo_toml(
90
101
  Some(actual_author),
91
102
  ));
92
103
  }
104
+ if let Some(bin) = value
105
+ .get("bin")
106
+ .and_then(TomlValue::as_array)
107
+ .and_then(|bins| bins.first())
108
+ .and_then(TomlValue::as_table)
109
+ {
110
+ check_string_field(
111
+ &mut issues,
112
+ "core-rs/Cargo.toml",
113
+ "bin[0].name",
114
+ bin.get("name"),
115
+ &config.packages.command,
116
+ );
117
+ check_string_field(
118
+ &mut issues,
119
+ "core-rs/Cargo.toml",
120
+ "bin[0].path",
121
+ bin.get("path"),
122
+ rust_bin_file_path(),
123
+ );
124
+ } else {
125
+ issues.push(issue(
126
+ "core-rs/Cargo.toml",
127
+ "bin",
128
+ "owned metadata differs from the canonical project identity",
129
+ Some(format!(
130
+ "[[bin]] name={}, path={}",
131
+ config.packages.command,
132
+ rust_bin_file_path()
133
+ )),
134
+ None,
135
+ ));
136
+ }
93
137
  Ok(issues)
94
138
  }
95
139
 
@@ -104,6 +148,10 @@ pub(crate) fn sync_cargo_toml(config: &ToolConfig, content: &str) -> Result<Stri
104
148
  "name".into(),
105
149
  TomlValue::String(config.packages.rust_crate.clone()),
106
150
  );
151
+ package.insert(
152
+ "default-run".into(),
153
+ TomlValue::String(config.packages.command.clone()),
154
+ );
107
155
  package.insert(
108
156
  "authors".into(),
109
157
  TomlValue::Array(vec![TomlValue::String(format!(
@@ -127,6 +175,19 @@ pub(crate) fn sync_cargo_toml(config: &ToolConfig, content: &str) -> Result<Stri
127
175
  "homepage".into(),
128
176
  TomlValue::String(config.project.repository.clone()),
129
177
  );
178
+ let mut bin = toml::map::Map::new();
179
+ bin.insert(
180
+ "name".into(),
181
+ TomlValue::String(config.packages.command.clone()),
182
+ );
183
+ bin.insert(
184
+ "path".into(),
185
+ TomlValue::String(rust_bin_file_path().to_string()),
186
+ );
187
+ value
188
+ .as_table_mut()
189
+ .ok_or_else(|| anyhow!("core-rs/Cargo.toml must be a TOML table"))?
190
+ .insert("bin".into(), TomlValue::Array(vec![TomlValue::Table(bin)]));
130
191
  Ok(toml::to_string(&value)?)
131
192
  }
132
193
 
@@ -23,21 +23,16 @@ export function readScaffoldPayload() {
23
23
  }
24
24
 
25
25
  export function readCargoVersion() {
26
- const cargoToml = readText("core-rs/Cargo.toml");
27
- const match = cargoToml.match(/^version = "([^"]+)"$/m);
28
- if (!match) {
29
- fail("failed to read version from core-rs/Cargo.toml");
30
- }
31
- return match[1];
26
+ return readTomlSectionValue(readText("core-rs/Cargo.toml"), "package", "version", "core-rs/Cargo.toml");
32
27
  }
33
28
 
34
29
  export function readPyprojectVersion() {
35
- const pyproject = readText("wrapper-py/pyproject.toml");
36
- const match = pyproject.match(/^version = "([^"]+)"$/m);
37
- if (!match) {
38
- fail("failed to read version from wrapper-py/pyproject.toml");
39
- }
40
- return match[1];
30
+ return readTomlSectionValue(
31
+ readText("wrapper-py/pyproject.toml"),
32
+ "project",
33
+ "version",
34
+ "wrapper-py/pyproject.toml"
35
+ );
41
36
  }
42
37
 
43
38
  export function readVersions(rootPackage = readRootPackage()) {
@@ -260,6 +255,27 @@ function execNpm(args, options = {}) {
260
255
  return execFileSync(npmCommand(), args, options);
261
256
  }
262
257
 
258
+ export function readTomlSectionValue(content, sectionName, key, fileLabel) {
259
+ const sectionPattern = new RegExp(`^\\[${escapeRegExp(sectionName)}\\]\\s*$`, "m");
260
+ const sectionMatch = sectionPattern.exec(content);
261
+ if (!sectionMatch) {
262
+ fail(`failed to read ${key} from ${fileLabel}`);
263
+ }
264
+
265
+ const sectionStart = sectionMatch.index + sectionMatch[0].length;
266
+ const nextSectionOffset = content.slice(sectionStart).search(/^\[[^\]]+\]\s*$/m);
267
+ const sectionBody =
268
+ nextSectionOffset === -1
269
+ ? content.slice(sectionStart)
270
+ : content.slice(sectionStart, sectionStart + nextSectionOffset);
271
+ const valuePattern = new RegExp(`^${escapeRegExp(key)}\\s*=\\s*"([^"]+)"\\s*$`, "m");
272
+ const valueMatch = valuePattern.exec(sectionBody);
273
+ if (!valueMatch) {
274
+ fail(`failed to read ${key} from ${fileLabel}`);
275
+ }
276
+ return valueMatch[1];
277
+ }
278
+
263
279
  function assertAllEqual(entries, message) {
264
280
  const values = new Set(entries.map(([, value]) => value));
265
281
  if (values.size !== 1) {
@@ -280,3 +296,7 @@ function assertDeepEqual(actual, expected, message) {
280
296
  function fail(message) {
281
297
  throw new Error(message);
282
298
  }
299
+
300
+ function escapeRegExp(value) {
301
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
302
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "ossplate",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "ossplate",
9
- "version": "0.2.2",
9
+ "version": "0.2.4",
10
10
  "license": "Unlicense",
11
11
  "bin": {
12
12
  "ossplate": "bin/ossplate.js"
@@ -16,10 +16,10 @@
16
16
  "typescript": "^5.9.3"
17
17
  },
18
18
  "optionalDependencies": {
19
- "ossplate-darwin-arm64": "0.2.2",
20
- "ossplate-darwin-x64": "0.2.2",
21
- "ossplate-linux-x64": "0.2.2",
22
- "ossplate-windows-x64": "0.2.2"
19
+ "ossplate-darwin-arm64": "0.2.4",
20
+ "ossplate-darwin-x64": "0.2.4",
21
+ "ossplate-linux-x64": "0.2.4",
22
+ "ossplate-windows-x64": "0.2.4"
23
23
  }
24
24
  },
25
25
  "node_modules/@types/node": {
@@ -24,10 +24,10 @@
24
24
  "main": "./dist/index.js",
25
25
  "name": "ossplate",
26
26
  "optionalDependencies": {
27
- "ossplate-darwin-arm64": "0.2.2",
28
- "ossplate-darwin-x64": "0.2.2",
29
- "ossplate-linux-x64": "0.2.2",
30
- "ossplate-windows-x64": "0.2.2"
27
+ "ossplate-darwin-arm64": "0.2.4",
28
+ "ossplate-darwin-x64": "0.2.4",
29
+ "ossplate-linux-x64": "0.2.4",
30
+ "ossplate-windows-x64": "0.2.4"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
@@ -45,5 +45,5 @@
45
45
  "test": "npm run build && node --test test/cli.test.js"
46
46
  },
47
47
  "type": "module",
48
- "version": "0.2.2"
48
+ "version": "0.2.4"
49
49
  }
@@ -24,5 +24,5 @@
24
24
  "scripts": {
25
25
  "prepack": "node ../../../scripts/stage-distribution-assets.mjs runtime-package darwin-arm64"
26
26
  },
27
- "version": "0.2.2"
27
+ "version": "0.2.4"
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "scripts": {
25
25
  "prepack": "node ../../../scripts/stage-distribution-assets.mjs runtime-package darwin-x64"
26
26
  },
27
- "version": "0.2.2"
27
+ "version": "0.2.4"
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "scripts": {
25
25
  "prepack": "node ../../../scripts/stage-distribution-assets.mjs runtime-package linux-x64"
26
26
  },
27
- "version": "0.2.2"
27
+ "version": "0.2.4"
28
28
  }
@@ -24,5 +24,5 @@
24
24
  "scripts": {
25
25
  "prepack": "node ../../../scripts/stage-distribution-assets.mjs runtime-package win32-x64"
26
26
  },
27
- "version": "0.2.2"
27
+ "version": "0.2.4"
28
28
  }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ossplate"
7
- version = "0.2.2"
7
+ version = "0.2.4"
8
8
  description = "Build one project, ship it everywhere."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
3
- <title id="title">Ossplate chest armor</title>
4
- <desc id="desc">A charcoal gray chestplate with shoulder guards.</desc>
5
- <path fill="#4B5563" d="M156.7 25.83L89 39.38c-.1 58.57-1.74 119.32-43.49 167.22C104.4 246.5 189 260.7 247 248.8v-99L108.3 88.22l7.4-16.44L256 134.2l140.3-62.42 7.4 16.44L265 149.8v99c58 11.9 142.6-2.3 201.5-42.2-41.8-47.9-43.4-108.65-43.5-167.22l-67.7-13.55c-12.9 13.88-20.6 28.15-32.9 40.53C308.9 79.78 289.5 89 256 89c-33.5 0-52.9-9.22-66.4-22.64-12.3-12.38-20-26.65-32.9-40.53zM53.88 232.9C75.96 281 96.07 336.6 102.7 392.8l65 22.8c4.2-52.7 28.2-104 63.7-146.1-55.1 6.3-122.7-5.8-177.52-36.6zm404.22 0c-54.8 30.8-122.4 42.9-177.5 36.6 35.5 42.1 59.5 93.4 63.7 146.1l65.2-22.9c6.6-56.8 26.6-111.8 48.6-159.8zM256 269c-40.5 43.1-67.7 97.9-70.7 152.7l61.7 21.6V336h18v107.3l61.7-21.6c-3.1-54.8-30.2-109.6-70.7-152.7zm151.7 143.4L297 451.1v18.8l110.2-44.1c.1-4.5.3-8.9.5-13.4zm-303.3.1c.3 4.5.4 8.9.5 13.4l110.1 44v-18.7l-110.6-38.7zM279 457.4l-23 8.1-23-8v19.6l23 9.2 23-9.2v-19.7z"/>
6
- </svg>
File without changes
File without changes
File without changes
File without changes
File without changes