{"_id":"@edv4h/spire-gen","_rev":"2-21325321ef59b5d831c2d278b34a3d22","name":"@edv4h/spire-gen","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@edv4h/spire-gen","version":"0.1.0","license":"MIT","_id":"@edv4h/spire-gen@0.1.0","maintainers":[{"name":"myuske","email":"circlemountain.ym@gmail.com"}],"homepage":"https://github.com/EdV4H/spire#readme","bugs":{"url":"https://github.com/EdV4H/spire/issues"},"dist":{"shasum":"50066f33127c84373acbb189b51203ddf5ba222a","tarball":"https://registry.npmjs.org/@edv4h/spire-gen/-/spire-gen-0.1.0.tgz","fileCount":55,"integrity":"sha512-yKlwlGrSqP36TMIl8K4P5imKqASxYlXPQpwF23m4hW6osMaM9EP2r4gJrH51nTDo4gJizoDXMdJPSPJhjLKgrg==","signatures":[{"sig":"MEYCIQC07KqlBmO+Xa8h+RW4a8+bc7paQyVPSBiMMOA9yekIugIhAOr9x101KMEffP+9h/H+gt63CID69SnVdz6Mw+GCm5RK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146954},"main":"./dist/index.js","type":"module","_from":"file:edv4h-spire-gen-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"}},"scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"myuske","email":"circlemountain.ym@gmail.com"},"_resolved":"/private/var/folders/kk/49kmw6n10s3f_vj3y1_rjd2h0000gn/T/a348656b708893d8d07c9cf456508694/edv4h-spire-gen-0.1.0.tgz","_integrity":"sha512-yKlwlGrSqP36TMIl8K4P5imKqASxYlXPQpwF23m4hW6osMaM9EP2r4gJrH51nTDo4gJizoDXMdJPSPJhjLKgrg==","repository":{"url":"git+https://github.com/EdV4H/spire.git","type":"git","directory":"packages/gen"},"_npmVersion":"11.16.0","description":"Deterministic lane-based DAG map generation for Spire","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"4.4.3","@edv4h/spire-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","fast-check":"4.4.0","typescript":"7.0.2"},"_npmOperationalInternal":{"tmp":"tmp/spire-gen_0.1.0_1788760686398_0.5226492160360794","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"_id":"@edv4h/spire-gen@0.2.0","bugs":{"url":"https://github.com/EdV4H/spire/issues"},"dist":{"shasum":"7e10bca06e65b28480d6791cde9a588f3518717f","tarball":"https://registry.npmjs.org/@edv4h/spire-gen/-/spire-gen-0.2.0.tgz","fileCount":55,"integrity":"sha512-yb3OXsy93E2MCQ8IVP4InMnjM2frcPeXYzRkYYgbXuJDEWr1HHva5kaKpKSuFvwuDL1YLBQAjMqZDiF4vcx/Hg==","signatures":[{"sig":"MEUCIBQyuynK93Me+CgEuBkUDrlJwDX29PXfzy+7MbfwYCtjAiEAlnrIST0Pfdh6fQEND8AIQiBCy5ttxjokyzEduYEY5lQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGFq6MkOyWfDFhv0lMa7hrRl9iP4YYrp/G71F+0oPe/xAiEAm6NlFh3IvF0LRpoDG5DOF1MLvOwMk0IkJKkVu9uw4d0="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@edv4h%2fspire-gen@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154955},"main":"./dist/index.js","name":"@edv4h/spire-gen","type":"module","_from":"file:edv4h-spire-gen-0.2.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","source":"./src/index.ts"}},"license":"MIT","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"0.2.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8c3e893a-8a3f-4814-95ee-73fc2df7d1af"}},"homepage":"https://github.com/EdV4H/spire#readme","_resolved":"/tmp/b14735c53f465f8f1afc58381d11acb3/edv4h-spire-gen-0.2.0.tgz","_integrity":"sha512-yb3OXsy93E2MCQ8IVP4InMnjM2frcPeXYzRkYYgbXuJDEWr1HHva5kaKpKSuFvwuDL1YLBQAjMqZDiF4vcx/Hg==","repository":{"url":"git+https://github.com/EdV4H/spire.git","type":"git","directory":"packages/gen"},"_npmVersion":"12.0.2","description":"Deterministic lane-based DAG map generation for Spire","directories":{},"maintainers":[{"name":"myuske","email":"circlemountain.ym@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"zod":"4.4.3","@edv4h/spire-core":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","fast-check":"4.4.0","typescript":"7.0.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spire-gen_0.2.0_1789713287041_0.08820814356223527"}}},"time":{"created":"2026-09-07T05:58:06.249Z","modified":"2026-09-18T06:34:47.502Z","0.1.0":"2026-09-07T05:58:06.560Z","0.2.0":"2026-09-18T06:34:47.170Z"},"bugs":{"url":"https://github.com/EdV4H/spire/issues"},"license":"MIT","homepage":"https://github.com/EdV4H/spire#readme","repository":{"url":"git+https://github.com/EdV4H/spire.git","type":"git","directory":"packages/gen"},"description":"Deterministic lane-based DAG map generation for Spire","maintainers":[{"name":"myuske","email":"circlemountain.ym@gmail.com"}],"readme":"# @edv4h/spire-gen\n\n決定的なマップ生成。同じ GenSpec + シードなら常に同じ `MapDocument` になる。\n\n```\nGenSpec ─▶ ① skeleton  グリッド + ウォークで DAG 骨格（StS 型）\n        ─▶ ② assign    制約充足でノードタイプ割当\n        ─▶ ③ populate  ContentProvider で node.data に注入（任意）\n        ─▶ ④ validate  位相不変条件 + GenSpec 制約の最終検証\n        ─▶ MapDocument\n```\n\n各段は個別にも公開している（`buildSkeleton` / `assignTypes`）。\n\n## GenSpec は純粋な JSON\n\n振る舞いはすべて登録済み ID で参照する。関数はどこにも入らないので、spec はそのまま保存・共有・再生できる。\n\n```jsonc\n{\n  \"seed\": 42,\n  \"skeleton\": { \"algorithm\": \"sts-walks\", \"grid\": { \"cols\": 5, \"rows\": 12 }, \"walks\": 4, \"minStarts\": 2 },\n  \"types\": {\n    \"assigner\": \"rejection\",\n    \"distribution\": { \"step\": 0.7, \"gate\": 0.2, \"bonus\": 0.1 },\n    \"constraints\": [{ \"rule\": \"fixedRow\", \"row\": -1, \"type\": \"final\" }]\n  },\n  \"populate\": null\n}\n```\n\n## 組み込みの制約ルール\n\n| id | 意味 |\n|---|---|\n| `fixedRow` | その行はその型、かつその型はその行だけ（`row: -1` は終端行） |\n| `minRow` | その型は指定行以降にのみ現れる |\n| `noAdjacentSame` | 指定型は隣接ノード同士で連続しない |\n| `branchDistinct` | 同じ親からの分岐先は異なる型（`exempt` で除外可） |\n| `maxPerRow` | 1行あたりの同型上限 |\n\n追加のルール・骨格アルゴリズム・割当戦略・コンテンツプロバイダはプラグインで登録する。\n\n## 始端と終端の数\n\n**既定は入口1つ・ゴール1つ。** 何も書かなければ目標マップの形になる。\n\n| | 既定 | 意味 |\n|---|---|---|\n| `minStarts` | `1` | row 0 の入口の最小数 |\n| `maxStarts` | （省略） | 省略すると `minStarts` に固定。数値で範囲、`null` で上限なし |\n| `maxEnds` | `1` | 終端行のノードの最大数。`null` で上限なし |\n\n```jsonc\n// 既定のまま — 入口1つ、ゴール1つ\n\"skeleton\": { \"grid\": { \"cols\": 5, \"rows\": 12 }, \"walks\": 6 }\n\n// 入口3つ、終端は絞らない\n\"skeleton\": { \"grid\": { \"cols\": 5, \"rows\": 12 }, \"walks\": 6,\n              \"minStarts\": 3, \"maxEnds\": null }\n```\n\n`maxStarts` を省略したときに上限なしではなく `minStarts` 固定にしているのは、\n下限だけ指定する意図はたいてい「この数だけ」だから。上限を外したいときは `null` を明示する。\n\n`maxEnds` は「1歩で1列しか動けない」性質を使い、終端に近づくほど**ウォークが居られる列を\n狭める**ことで実現している。全ウォークが同じ区間に制約されるので左右の順序が入れ替わらず、\n絞り込みが交差を生むことがない。\n\n## 停止性\n\n割当は rejection sampling で、試行上限（既定 1000）と早期打ち切り（同一ノードが同一理由で25回連続ブロック）を持つ。矛盾する GenSpec は無限に回らず、**どのノードがどのルールに阻まれたか**を含むエラーで返る。\n\n## マップの編集\n\n| | |\n|---|---|\n| `insertNode(map, { type, row, col? })` | 空きセルにノードを追加する。骨格生成が `walks < cols` で列に空きを残しているのはこのため。不変条件を壊さずに繋げられなければ `no_space` を返し、勝手に壊れたマップを返さない |\n| `regenerate(map, spec, { keepCompleted })` | 未完了ノードのタイプを再割当する。**構造は据え置き**。完了済みノードは type と data を保持したまま固定され、新しい spec の制約に反する場合は `map.meta.regenerateWarnings` で報告する（エラーにはしない） |\n","readmeFilename":"README.md"}