skilldrop-cli 1.5.0 → 1.7.0

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 (133) hide show
  1. package/README.md +4 -1
  2. package/catalogue.json +25 -2
  3. package/model-routing.json +20 -0
  4. package/package.json +1 -1
  5. package/packs/civil-architect/pack.json +60 -0
  6. package/packs/civil-architect/skills/floor-plan-layout/SKILL.md +103 -0
  7. package/packs/civil-architect/skills/floor-plan-layout/evals/eval_queries.json +30 -0
  8. package/packs/civil-architect/skills/floor-plan-layout/evals/evals.json +57 -0
  9. package/packs/civil-architect/skills/floor-plan-layout/evals/files/4/adu-programme.md +12 -0
  10. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.md +65 -0
  11. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.svg +135 -0
  12. package/packs/civil-architect/skills/floor-plan-layout/manifest.json +34 -0
  13. package/packs/civil-architect/skills/floor-plan-layout/scripts/plan_check.py +449 -0
  14. package/packs/civil-architect/skills/floor-plan-layout/templates/plan.json +38 -0
  15. package/packs/event-planner/pack.json +61 -0
  16. package/packs/event-planner/skills/run-of-show/SKILL.md +141 -0
  17. package/packs/event-planner/skills/run-of-show/evals/eval_queries.json +30 -0
  18. package/packs/event-planner/skills/run-of-show/evals/evals.json +103 -0
  19. package/packs/event-planner/skills/run-of-show/evals/files/1/agenda.md +16 -0
  20. package/packs/event-planner/skills/run-of-show/evals/files/2/schedule.csv +8 -0
  21. package/packs/event-planner/skills/run-of-show/evals/files/3/notes.txt +3 -0
  22. package/packs/event-planner/skills/run-of-show/evals/files/4/sessions_export.csv +25 -0
  23. package/packs/event-planner/skills/run-of-show/evals/files/4/venue_and_crew.txt +27 -0
  24. package/packs/event-planner/skills/run-of-show/evals/files/5/runsheet_v4.csv +28 -0
  25. package/packs/event-planner/skills/run-of-show/evals/files/5/venue_and_suppliers.txt +22 -0
  26. package/packs/event-planner/skills/run-of-show/evals/files/6/acts_from_booker.csv +26 -0
  27. package/packs/event-planner/skills/run-of-show/evals/files/6/venue_rooms_and_crew.txt +14 -0
  28. package/packs/event-planner/skills/run-of-show/evals/files/7/runsheet_draft_v4.csv +25 -0
  29. package/packs/event-planner/skills/run-of-show/evals/files/7/venue_and_fixed_times.txt +24 -0
  30. package/packs/event-planner/skills/run-of-show/examples/product-launch.md +77 -0
  31. package/packs/event-planner/skills/run-of-show/examples/product-launch.svg +58 -0
  32. package/packs/event-planner/skills/run-of-show/manifest.json +44 -0
  33. package/packs/event-planner/skills/run-of-show/scripts/show_check.py +295 -0
  34. package/packs/event-planner/skills/run-of-show/templates/show.json +15 -0
  35. package/packs/event-planner/skills/seating-plan/SKILL.md +152 -0
  36. package/packs/event-planner/skills/seating-plan/evals/eval_queries.json +30 -0
  37. package/packs/event-planner/skills/seating-plan/evals/evals.json +134 -0
  38. package/packs/event-planner/skills/seating-plan/evals/files/1/guests.csv +31 -0
  39. package/packs/event-planner/skills/seating-plan/evals/files/2/table-plan.txt +8 -0
  40. package/packs/event-planner/skills/seating-plan/evals/files/3/brief.txt +4 -0
  41. package/packs/event-planner/skills/seating-plan/evals/files/3/guests.csv +49 -0
  42. package/packs/event-planner/skills/seating-plan/evals/files/4/rsvp_export.csv +127 -0
  43. package/packs/event-planner/skills/seating-plan/evals/files/4/seating_notes.txt +21 -0
  44. package/packs/event-planner/skills/seating-plan/evals/files/5/organiser_notes.txt +10 -0
  45. package/packs/event-planner/skills/seating-plan/evals/files/5/registrations.csv +93 -0
  46. package/packs/event-planner/skills/seating-plan/evals/files/5/table_plan_v3.csv +94 -0
  47. package/packs/event-planner/skills/seating-plan/evals/files/6/bridgets_notes.txt +30 -0
  48. package/packs/event-planner/skills/seating-plan/evals/files/6/ticket_export.csv +117 -0
  49. package/packs/event-planner/skills/seating-plan/evals/files/6/venue_floorplan_notes.txt +14 -0
  50. package/packs/event-planner/skills/seating-plan/evals/files/7/keep_apart_CONFIDENTIAL.txt +9 -0
  51. package/packs/event-planner/skills/seating-plan/evals/files/7/prom_seating_v3.csv +101 -0
  52. package/packs/event-planner/skills/seating-plan/evals/files/7/ticket_list.csv +101 -0
  53. package/packs/event-planner/skills/seating-plan/evals/files/7/venue_info.txt +16 -0
  54. package/packs/event-planner/skills/seating-plan/evals/files/8/registrations_export.csv +147 -0
  55. package/packs/event-planner/skills/seating-plan/evals/files/8/room_layout.md +22 -0
  56. package/packs/event-planner/skills/seating-plan/evals/files/8/seating_requests.txt +31 -0
  57. package/packs/event-planner/skills/seating-plan/evals/files/9/guest_list.csv +84 -0
  58. package/packs/event-planner/skills/seating-plan/evals/files/9/notes.txt +16 -0
  59. package/packs/event-planner/skills/seating-plan/evals/files/9/table_plan.csv +85 -0
  60. package/packs/event-planner/skills/seating-plan/examples/wedding-dinner.md +61 -0
  61. package/packs/event-planner/skills/seating-plan/examples/wedding-dinner.svg +39 -0
  62. package/packs/event-planner/skills/seating-plan/manifest.json +44 -0
  63. package/packs/event-planner/skills/seating-plan/scripts/seating_check.py +324 -0
  64. package/packs/event-planner/skills/seating-plan/templates/seating.json +28 -0
  65. package/packs/experience-design/pack.json +5 -0
  66. package/packs/experience-design/skills/locale-check/SKILL.md +139 -0
  67. package/packs/experience-design/skills/locale-check/evals/eval_queries.json +38 -0
  68. package/packs/experience-design/skills/locale-check/evals/evals.json +104 -0
  69. package/packs/experience-design/skills/locale-check/evals/files/1/budget.json +1 -0
  70. package/packs/experience-design/skills/locale-check/evals/files/1/locales/ar.json +16 -0
  71. package/packs/experience-design/skills/locale-check/evals/files/1/locales/de.json +12 -0
  72. package/packs/experience-design/skills/locale-check/evals/files/1/locales/en.json +12 -0
  73. package/packs/experience-design/skills/locale-check/evals/files/1/locales/pl.json +12 -0
  74. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values/strings.xml +12 -0
  75. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values-es/strings.xml +11 -0
  76. package/packs/experience-design/skills/locale-check/evals/files/2/app/src/main/res/values-fr/strings.xml +12 -0
  77. package/packs/experience-design/skills/locale-check/evals/files/3/po/ja.po +20 -0
  78. package/packs/experience-design/skills/locale-check/evals/files/3/po/messages.pot +23 -0
  79. package/packs/experience-design/skills/locale-check/evals/files/3/po/ru.po +22 -0
  80. package/packs/experience-design/skills/locale-check/evals/files/4/budgets.json +15 -0
  81. package/packs/experience-design/skills/locale-check/evals/files/4/locales/ar.json +265 -0
  82. package/packs/experience-design/skills/locale-check/evals/files/4/locales/de.json +265 -0
  83. package/packs/experience-design/skills/locale-check/evals/files/4/locales/en.json +265 -0
  84. package/packs/experience-design/skills/locale-check/evals/files/4/locales/fr.json +265 -0
  85. package/packs/experience-design/skills/locale-check/evals/files/4/locales/pl.json +265 -0
  86. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values/strings.xml +77 -0
  87. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values-es/strings.xml +63 -0
  88. package/packs/experience-design/skills/locale-check/evals/files/5/app/src/main/res/values-ja/strings.xml +61 -0
  89. package/packs/experience-design/skills/locale-check/evals/files/6/po/cs.po +605 -0
  90. package/packs/experience-design/skills/locale-check/evals/files/6/po/marlin.pot +602 -0
  91. package/packs/experience-design/skills/locale-check/evals/files/6/po/pt_BR.po +602 -0
  92. package/packs/experience-design/skills/locale-check/evals/files/6/po/ru.po +608 -0
  93. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/en.lproj/Localizable.strings +160 -0
  94. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/en.lproj/Localizable.stringsdict +70 -0
  95. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/he.lproj/Localizable.strings +157 -0
  96. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/he.lproj/Localizable.stringsdict +86 -0
  97. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/it.lproj/Localizable.strings +160 -0
  98. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/it.lproj/Localizable.stringsdict +68 -0
  99. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/ko.lproj/Localizable.strings +160 -0
  100. package/packs/experience-design/skills/locale-check/evals/files/7/Tidewatch/Resources/ko.lproj/Localizable.stringsdict +62 -0
  101. package/packs/experience-design/skills/locale-check/examples/settings-release.md +107 -0
  102. package/packs/experience-design/skills/locale-check/manifest.json +45 -0
  103. package/packs/experience-design/skills/locale-check/scripts/locale_check.py +1105 -0
  104. package/packs/operations-manager/pack.json +60 -0
  105. package/packs/operations-manager/skills/shift-roster/SKILL.md +166 -0
  106. package/packs/operations-manager/skills/shift-roster/evals/eval_queries.json +38 -0
  107. package/packs/operations-manager/skills/shift-roster/evals/evals.json +135 -0
  108. package/packs/operations-manager/skills/shift-roster/evals/files/1/shifts.csv +3 -0
  109. package/packs/operations-manager/skills/shift-roster/evals/files/1/staff.csv +8 -0
  110. package/packs/operations-manager/skills/shift-roster/evals/files/2/rota.csv +22 -0
  111. package/packs/operations-manager/skills/shift-roster/evals/files/2/staff.csv +6 -0
  112. package/packs/operations-manager/skills/shift-roster/evals/files/3/team.md +14 -0
  113. package/packs/operations-manager/skills/shift-roster/evals/files/4/availability_export_wk47.csv +23 -0
  114. package/packs/operations-manager/skills/shift-roster/evals/files/4/rota_notes.txt +20 -0
  115. package/packs/operations-manager/skills/shift-roster/evals/files/5/rota_draft_16-29nov.csv +107 -0
  116. package/packs/operations-manager/skills/shift-roster/evals/files/5/staff_list.csv +17 -0
  117. package/packs/operations-manager/skills/shift-roster/evals/files/6/availability_notes.txt +24 -0
  118. package/packs/operations-manager/skills/shift-roster/evals/files/6/peoplehub_staff_export.csv +14 -0
  119. package/packs/operations-manager/skills/shift-roster/evals/files/6/rota_template.csv +25 -0
  120. package/packs/operations-manager/skills/shift-roster/evals/files/7/leave_and_availability.txt +18 -0
  121. package/packs/operations-manager/skills/shift-roster/evals/files/7/rota_wc_30nov.csv +47 -0
  122. package/packs/operations-manager/skills/shift-roster/evals/files/7/staff_list.csv +15 -0
  123. package/packs/operations-manager/skills/shift-roster/evals/files/8/availability_form_responses.csv +22 -0
  124. package/packs/operations-manager/skills/shift-roster/evals/files/8/cover_requirements.csv +15 -0
  125. package/packs/operations-manager/skills/shift-roster/evals/files/8/staff_export.csv +29 -0
  126. package/packs/operations-manager/skills/shift-roster/evals/files/9/leave_and_restrictions.txt +16 -0
  127. package/packs/operations-manager/skills/shift-roster/evals/files/9/rota_export_07-13Dec.csv +85 -0
  128. package/packs/operations-manager/skills/shift-roster/evals/files/9/staff_list.csv +27 -0
  129. package/packs/operations-manager/skills/shift-roster/examples/cafe-week.md +72 -0
  130. package/packs/operations-manager/skills/shift-roster/examples/cafe-week.svg +123 -0
  131. package/packs/operations-manager/skills/shift-roster/manifest.json +34 -0
  132. package/packs/operations-manager/skills/shift-roster/scripts/roster_check.py +633 -0
  133. package/packs/operations-manager/skills/shift-roster/templates/roster.json +22 -0
package/README.md CHANGED
@@ -51,7 +51,7 @@ A good result runs your lint, typecheck and tests through a gate script, then a
51
51
  In Claude Code you can use the plugin marketplace instead: run `/plugin marketplace add sananthanarayan/skilldrop`, then `/plugin install dev-team@skilldrop`. [Every install route](guides/how-to/install.md) covers single skills, other IDEs, loops, reviewer subagents, profiles and updates.
52
52
 
53
53
  <details>
54
- <summary><b>Choose your role:</b> 19 packs, from product management and architecture to SRE, GRC and job applications</summary>
54
+ <summary><b>Choose your role:</b> 20 packs, from product management and architecture to SRE, GRC, job applications and building design</summary>
55
55
 
56
56
  Install one pack. Every role pack also brings `core` (intake, critique, review council, output hygiene, and the decisions behind a codebase). Each pack page has a starter prompt to paste and says what a good result looks like.
57
57
 
@@ -73,6 +73,9 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
73
73
  - **Frontend:** `frontend` — what makes a page slow for real users, what makes a bundle heavy, and how each route should be rendered. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/frontend/)
74
74
  - **Writing agent skills:** `skill-engineering` — author a portable skill with evals, and review one before it ships. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/skill-engineering/)
75
75
  - **Applying for a job:** `career` — an honest fit check against the posting, a tailored resume and cover letter that claim nothing you didn't, and the application form's answers. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/career/)
76
+ - **Designing buildings:** `civil-architect` — a dimensioned concept floor plan from a room list and a footprint, checked for overlapping rooms, doors on no wall and rooms no one can reach. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/civil-architect/)
77
+ - **Running a team on shifts:** `operations-manager` — a weekly rota checked for cover, hours, rest between shifts and days in a row, handed back in your own sheet. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/operations-manager/)
78
+ - **Running events:** `event-planner` — a seating plan where every together, keep-apart and access request holds, and a run of show with no room or person booked twice, both checked and drawn. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/event-planner/)
76
79
  - **Everyone:** `core` on its own. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/core/)
77
80
 
78
81
  </details>
package/catalogue.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0034. The catalogue index: pack display order and the outcome browse axis (RFC-0026). Pack metadata lives in packs/<pack>/pack.json; membership is the folders — a skill is in a pack because it sits at packs/<pack>/skills/<name>/.",
3
3
  "version": "1.0.0",
4
- "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career"],
4
+ "packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "frontend", "skill-engineering", "career", "civil-architect", "operations-manager", "event-planner"],
5
5
  "outcomes": {
6
6
  "decide-what-to-build": {
7
7
  "for": "Product managers · founders · strategists",
@@ -157,7 +157,8 @@
157
157
  "design-system-spec",
158
158
  "information-architecture",
159
159
  "service-blueprint",
160
- "ux-writing"
160
+ "ux-writing",
161
+ "locale-check"
161
162
  ]
162
163
  },
163
164
  "research-a-question": {
@@ -205,6 +206,28 @@
205
206
  "cover-letter",
206
207
  "application-form-answers"
207
208
  ]
209
+ },
210
+ "design-a-building": {
211
+ "for": "Architects · building designers · owners planning a build",
212
+ "description": "Go from a room list and a footprint to a first floor plan: every room at its size, doors on real walls, every room reachable, drawn to scale and checked before anyone sees it.",
213
+ "skills": [
214
+ "floor-plan-layout"
215
+ ]
216
+ },
217
+ "staff-the-shifts": {
218
+ "for": "Operations managers · shop, hotel, leisure-centre and care-home managers",
219
+ "description": "Turn who is available and what each shift needs into a rota with every shift covered by the right people, and nobody double-booked, over their hours or short of rest.",
220
+ "skills": [
221
+ "shift-roster"
222
+ ]
223
+ },
224
+ "plan-an-event": {
225
+ "for": "Event planners · wedding planners · conference organisers",
226
+ "description": "Seat every guest with the people they should and shouldn't be near, and run the day with no room or person booked twice.",
227
+ "skills": [
228
+ "seating-plan",
229
+ "run-of-show"
230
+ ]
208
231
  }
209
232
  },
210
233
  "retired": {
@@ -287,6 +287,26 @@
287
287
  "tier": "light",
288
288
  "rationale": "A deterministic stdlib script does the extraction; the model runs it, relays the dropped-content report and hands off. No generation beyond a short summary of losses."
289
289
  },
290
+ "shift-roster": {
291
+ "tier": "standard",
292
+ "rationale": "Assigning people to shifts is constraint-heavy but bounded: the script checks every rule and summarises the final rota, so the model's job is a good first assignment, fixing what the check reports and returning the person's own file."
293
+ },
294
+ "seating-plan": {
295
+ "tier": "standard",
296
+ "rationale": "Assigning guests against overlapping rules is bounded judgment; the script decides whether every rule holds."
297
+ },
298
+ "run-of-show": {
299
+ "tier": "standard",
300
+ "rationale": "Ordering a day around rooms and people is bounded judgment; the script decides whether anything clashes."
301
+ },
302
+ "locale-check": {
303
+ "tier": "standard",
304
+ "rationale": "The script finds every mechanical defect; the model ranks them by what breaks first, writes the mechanical fixes and reads reordered and named-screen strings for meaning."
305
+ },
306
+ "floor-plan-layout": {
307
+ "tier": "heavy",
308
+ "rationale": "Spatial layout is design judgment: zoning, adjacencies, daylight and circulation traded against areas, with a checker to iterate against."
309
+ },
290
310
  "guide-builder": {
291
311
  "tier": "standard",
292
312
  "rationale": "Shapes notes into a guide without adding to them. Generation, not adversarial review."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -0,0 +1,60 @@
1
+ {
2
+ "description": "Building design from a client's room list and a footprint: a schematic floor plan placed at real sizes and drawn as a dimensioned SVG, shown only once a script has checked it for overlapping rooms, rooms outside the footprint, doors on no shared wall, rooms no one can reach and habitable rooms with no window.",
3
+ "display_name": "Civil architect",
4
+ "keywords": [
5
+ "architecture",
6
+ "architect",
7
+ "floor plan",
8
+ "test fit",
9
+ "concept plan",
10
+ "zoning",
11
+ "layout",
12
+ "dimensions",
13
+ "svg"
14
+ ],
15
+ "links": {
16
+ "documentation": "https://sananthanarayan.github.io/skilldrop/packs/civil-architect/"
17
+ },
18
+ "maintainers": [
19
+ {
20
+ "name": "sananthanarayan"
21
+ }
22
+ ],
23
+ "first-value": {
24
+ "audience-posture": "non-technical",
25
+ "prerequisites": [
26
+ "The rooms you need with their sizes, and the footprint's width and depth",
27
+ "Python 3 on the machine, which the checker and drawing script run on"
28
+ ],
29
+ "starter-task": "Get a checked, dimensioned concept plan from a room list and a footprint",
30
+ "starter-prompt": "Draw a ground floor plan for a 10 m wide × 9 m deep footprint, road on the south, front door from the road. Rooms: foyer 6 m², living 26 m², dining 14 m², kitchen 12.6 m², utility 4 m² next to the kitchen, prayer room 4.5 m² not next to the kitchen or the toilet, guest toilet 3.2 m², and a stair. Living, dining, kitchen and prayer room need windows.",
31
+ "verification": "floor-plan-layout states its zoning in a few lines, writes an SVG plan with overall dimensions, room sizes and areas, door swings, windows, a scale bar and a north arrow, and shows a room table from a checker that reported no overlaps, every door on a shared wall and every room reachable.",
32
+ "recovery": "If floor-plan-layout does not activate, ask for it by name (\"use floor-plan-layout\"). If the plan is too tight, ask for a second option with the rooms it may shrink named."
33
+ },
34
+ "requires": [
35
+ "core"
36
+ ],
37
+ "journey": {
38
+ "when": "You have a client's room list and a footprint, and want a first plan to discuss.",
39
+ "you_bring": [
40
+ "the rooms, with their sizes or areas",
41
+ "the footprint's width and depth, or its corner coordinates",
42
+ "the road or entrance side, and north",
43
+ "what must sit next to what, and what must be kept apart"
44
+ ],
45
+ "steps": [
46
+ {
47
+ "skill": "floor-plan-layout",
48
+ "you_do": "Give it the rooms, the footprint and the entrance side.",
49
+ "you_get": "Zoning in a few lines, then a dimensioned SVG plan per floor that has passed the checker, with every room's size and area.",
50
+ "decide": "Take the plan to the client, or ask for another option."
51
+ },
52
+ {
53
+ "skill": "floor-plan-layout",
54
+ "you_do": "Ask for a second option, naming what may change (a smaller hall, the stair moved).",
55
+ "you_get": "Another checked plan, with each room that changed against its target."
56
+ }
57
+ ],
58
+ "you_end_with": "A checked concept plan, ready to develop in your CAD or BIM tool."
59
+ }
60
+ }
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: floor-plan-layout
3
+ description: Lay out a schematic floor plan from a space programme and a footprint, and draw it as a dimensioned SVG — rooms placed as rectangles at real sizes, doors and windows on real walls, overall dimensions, a scale bar and north arrow — with a script that fails the plan when rooms overlap, a room spills outside the footprint, a door sits on no shared wall or a room can't be reached from the entrance. Use when an architect asks to "draw a floor plan", "lay out these rooms", "make a plan for a 10 × 9 m footprint", for a concept plan, a test fit, a zoning diagram or a dimensioned layout from room sizes.
4
+ ---
5
+
6
+ # floor-plan-layout
7
+
8
+ A concept floor plan: every room from the programme placed at its real size inside the
9
+ footprint, connected by doors, lit by windows on outside walls, and drawn to scale. The
10
+ agent does the design reasoning (what goes where and why); a script checks the geometry and
11
+ draws it, so a plan that looks right but has a room overlapping its neighbour or a bedroom
12
+ reachable only through a bathroom never reaches the client. Its inputs are the
13
+ client's room list and the footprint the site allows.
14
+
15
+ ## How to respond
16
+
17
+ 1. **Gather the three inputs.** Take them from the conversation or the files the user names:
18
+ - **Rooms and target areas,** with adjacencies: an area schedule or the user's list
19
+ - **The outline** of the floor: footprint width × depth, or corner coordinates, inside the site's envelope
20
+ - **Fixed points:** the road side and entrance, north, a stair or core position, an existing wall to keep
21
+
22
+ Ask at most two questions, only for a missing outline or entrance side. A plan with no
23
+ footprint and no plot to derive one from is `BLOCKED`.
24
+
25
+ 2. **Decide the zoning before any coordinates.** Write three to six lines:
26
+ - public rooms (living, reception) on the entrance side; private rooms (bedrooms) away from it
27
+ - wet rooms (kitchen, toilets, bathrooms) grouped so plumbing stacks, and stacked over each other across floors
28
+ - every `near` from the programme met by a shared wall, every `apart` by at least one room between
29
+ - daylight: every habitable room on an outside wall; north or south as the climate wants, stated
30
+ - the stair in the same place on every floor
31
+
32
+ Then place rooms as rectangles on a grid of 0.3 m (1 ft) or its multiples, starting from a
33
+ corner, so shared walls line up exactly. An L-shaped room is two or three rectangles under
34
+ one name.
35
+
36
+ 3. **Write `plan.json`** in the shape of [`templates/plan.json`](templates/plan.json): `outline`,
37
+ each room's `rect` `[x, y, width, depth]` (or `rects`) with `target_area`, `min_width` and
38
+ `habitable`, every door as `between` two rooms (or `"outside"`) `at` a point on the shared
39
+ wall, and windows `at` a point on an outside wall. x runs left to right, y from the front
40
+ (road side) to the back. One file per floor.
41
+
42
+ 4. **Run the checker and fix every FAIL before showing anything.**
43
+
44
+ ```bash
45
+ # Claude Code
46
+ python3 "${CLAUDE_SKILL_DIR}/scripts/plan_check.py" plan.json --svg ground-floor.svg
47
+ # Other IDEs (from the skill folder)
48
+ python3 scripts/plan_check.py plan.json --svg ground-floor.svg
49
+ ```
50
+
51
+ Exit 0 means no failures; 1 means a failure (overlap, outside the outline, door on no
52
+ shared wall, a room unreachable, no entrance); 2 means the input is malformed. Move rooms
53
+ and rerun until it exits 0. A WARN can stand only with a sentence saying why.
54
+
55
+ 5. **Report in this order:**
56
+ 1. **The plan's path** and one line on its organising idea. ✅ *"Public rooms along the road, wet rooms stacked on the east wall, stair by the entrance so the first floor is reached without crossing the living room."*
57
+ 2. **The zoning lines** from step 2.
58
+ 3. **The checker's room table and result,** unchanged.
59
+ 4. **Every remaining WARN with its reason,** and every area off target with what it traded for.
60
+ 5. **What this plan is not:** schematic, wall thicknesses nominal, no structure, services or code check. The architect checks it against the local rules before it goes further.
61
+
62
+ **Non-interactive runs** (subagent, CI, headless): take the entrance on the first outline edge
63
+ and north as up, tagged `[assumption]`, and size unsized rooms from the programme. With no
64
+ outline and no plot dimensions, emit `BLOCKED: need the footprint's dimensions or the plot and
65
+ setbacks to derive it`.
66
+
67
+ ## Useful references in this skill
68
+
69
+ - [`templates/plan.json`](templates/plan.json) — the input shape: a 10 × 9 m ground floor with an L-shaped hall
70
+ - [`scripts/plan_check.py`](scripts/plan_check.py) — overlap, containment, doors on shared walls, reachability, areas, windows; draws the SVG
71
+ - [`examples/ground-floor.md`](examples/ground-floor.md) — worked example: a programme and footprint become a checked, drawn plan, including the FAIL the first draft hit
72
+
73
+ ## Quality bar
74
+
75
+ - **The checker exits 0.** No plan with an overlap, a room outside the outline, a door on no wall or an unreachable room is shown to the user.
76
+ - **Every room from the programme is on the plan,** at its target area within 10 %, or the difference is explained.
77
+ - **Every stated adjacency is a shared wall,** and every `apart` has a room between.
78
+ - **Every habitable room has a window on an outside wall.**
79
+ - **No bedroom or living space is reached only through a bathroom, toilet or another bedroom.**
80
+ - **The drawing has overall dimensions, room sizes, a scale bar and a north arrow,** and says it is schematic.
81
+
82
+ ## When to use this skill
83
+
84
+ - ✅ A concept plan or test fit from a programme and footprint
85
+ - ✅ Two or three layout options for the same brief, each checked
86
+ - ✅ Re-planning after the client changes a room
87
+ - ✅ A zoning diagram before detailed design
88
+
89
+ ## When NOT to use this skill
90
+
91
+ - ❌ Working out the room list and areas from a brief, before any layout: total them first, then plan
92
+ - ❌ How big the footprint may be under setbacks, coverage and FAR: that is a site feasibility check, done before the plan
93
+ - ❌ Construction, working or submission drawings in CAD/BIM: this is a schematic for discussion
94
+ - ❌ Structural grids, MEP routing or a code compliance check
95
+
96
+ ## Anti-patterns to avoid
97
+
98
+ - ❌ **Drawing the plan in ASCII or Mermaid.** Neither holds a dimension; the SVG does.
99
+ - ❌ **Showing a plan before the checker passes.** The overlap you can't see in a list of coordinates is the one the client finds.
100
+ - ❌ **Rooms that touch "nearly":** a 3.95 and a 4.0 leave a 50 mm sliver no one can build. Use the grid.
101
+ - ❌ **A corridor that serves nothing.** Circulation that reaches no door is area the client pays for.
102
+ - ❌ **Toilet doors opening onto the dining or kitchen,** and a prayer or puja room sharing a wall with a toilet when the brief keeps them apart.
103
+ - ❌ **Calling the plan code-compliant.** The checker tests geometry, not the building code.
@@ -0,0 +1,30 @@
1
+ [
2
+ {
3
+ "query": "Draw a floor plan for these rooms in a 12 × 15 m footprint",
4
+ "should_trigger": true
5
+ },
6
+ {
7
+ "query": "Lay out a 3BHK in this footprint and give me a dimensioned plan",
8
+ "should_trigger": true
9
+ },
10
+ {
11
+ "query": "Can you do a quick test fit of the clinic programme on the ground floor?",
12
+ "should_trigger": true
13
+ },
14
+ {
15
+ "query": "Make a zoning diagram for the house with the bedrooms away from the road",
16
+ "should_trigger": true
17
+ },
18
+ {
19
+ "query": "Make a Figma diagram of our microservices",
20
+ "should_trigger": false
21
+ },
22
+ {
23
+ "query": "Draw a sequence diagram of the checkout flow",
24
+ "should_trigger": false
25
+ },
26
+ {
27
+ "query": "Build an interactive diagram of our data pipeline I can click through",
28
+ "should_trigger": false
29
+ }
30
+ ]
@@ -0,0 +1,57 @@
1
+ {
2
+ "skill_name": "floor-plan-layout",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Draw a ground floor plan for a 10 m wide × 9 m deep footprint, road on the south, front door from the road. Rooms: foyer 6 m², living 26 m², dining 14 m², kitchen 12.6 m², utility 4 m² next to the kitchen, prayer room 4.5 m² not next to the kitchen or the toilet, guest toilet 3.2 m², and a stair to the first floor. Living, dining, kitchen and prayer room need windows.",
7
+ "assertions": [
8
+ "Writes a plan.json and runs plan_check.py, and the final run exits 0 (no FAIL lines)",
9
+ "Writes an SVG with overall dimensions, room sizes and areas, a scale bar and a north arrow",
10
+ "Every room listed is on the plan, each within 10 % of its area or the difference is explained",
11
+ "The prayer room shares no wall with the kitchen or the toilet",
12
+ "Living, dining, kitchen and prayer room each have a window on an outside wall",
13
+ "States the zoning decisions (public at the front, wet rooms grouped, stair placement) before or with the plan",
14
+ "Says the plan is schematic and not checked against the building code"
15
+ ]
16
+ },
17
+ {
18
+ "id": 2,
19
+ "prompt": "Quick test fit: 2-bed apartment, footprint is 7.2 x 10.8 m, entrance in the middle of the long east side. Need living/dining 22 m², kitchen 8 m², two bedrooms 11 m² each, one bathroom 4.5 m², and a hall. Bedrooms must not open off the living room. Just give me the plan.",
20
+ "assertions": [
21
+ "Runs plan_check.py and shows a plan only after it exits 0",
22
+ "Neither bedroom's only door opens onto the living/dining room; both are reached from the hall",
23
+ "No bedroom or living space is reached only through the bathroom",
24
+ "Every room has its size and area on the drawing, and the totals fit inside 7.2 × 10.8 m",
25
+ "Delivers the plan without asking questions first, tagging anything it had to assume",
26
+ "Does not draw the plan in ASCII or Mermaid"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-11-05",
32
+ "prompt": "make a plan for a 10 x 9 m footprint. 10m runs E-W, entrance on the south side. rooms: living 5x4.5, kitchen 3x3, bed 1 3.5x3.5, bed 2 3x3, bath 2.4x2. bath door must NOT open off the kitchen. single storey holiday cottage at Lake Ternholm, concept only",
33
+ "assertions": [
34
+ "It produces an SVG plan with overall dimensions of 10.0 m (E-W) × 9.0 m (N-S), a scale bar, and a north arrow that agrees with the entrance being on the south wall",
35
+ "All five rooms are drawn at their stated sizes (to within about 0.1 m), all fully inside the footprint, with no two rooms overlapping",
36
+ "The entrance door is on the south external wall",
37
+ "Every room can be reached from the entrance through doors, via the living room or a hall/corridor",
38
+ "The bathroom door does not open into the kitchen, and there is no door between the bathroom and the kitchen",
39
+ "Windows are only on external walls, never on internal partitions",
40
+ "It does not invent rooms beyond the five requested plus circulation (no second bathroom, store, garage or porch presented as part of the brief)"
41
+ ]
42
+ },
43
+ {
44
+ "id": 4,
45
+ "held_out": "2026-11-05",
46
+ "prompt": "Hi, attached is the space programme from our meeting with the Okafor-Lindqvist family for their backyard ADU in Brambleton (adu-programme.md). Buildable footprint is 30 ft x 24 ft, single storey, with the 30 ft side facing the street to the west, and the entry comes from the street. Could you lay out the rooms and draw a dimensioned concept plan we can show them on Thursday?",
47
+ "assertions": [
48
+ "It reports that the programme's rooms add up to 869 sq ft (320 + 144 + 182 + 121 + 54 + 48) against a 720 sq ft footprint (30 × 24), 149 sq ft over before any circulation, so it cannot fit as given",
49
+ "It does not hand over a plan where rooms overlap, rooms sit outside the 30 × 24 ft footprint, or rooms have been shrunk without saying which ones and by how much",
50
+ "It offers concrete ways to fix it (named rooms cut or resized with new sizes, a larger footprint, or a second storey as an option for the user to decide) or asks the user to choose; if it draws a test fit, it lists every changed room size next to the programme size",
51
+ "Any plan it draws is an SVG dimensioned in feet and inches, 30'-0\" × 24'-0\" overall, with a scale bar and a north arrow that puts the street on the west",
52
+ "Any plan it draws has the entry door on the west (street) wall, and every room can be reached from it",
53
+ "It does not invent rooms, a second storey stated as fact, or zoning rules that are not in the prompt or the programme"
54
+ ]
55
+ }
56
+ ]
57
+ }
@@ -0,0 +1,12 @@
1
+ # Okafor-Lindqvist ADU - space programme (draft 2)
2
+
3
+ | Room | Size |
4
+ |---|---|
5
+ | Great room (living + dining) | 20 x 16 ft |
6
+ | Kitchen | 12 x 12 ft |
7
+ | Primary bedroom | 14 x 13 ft |
8
+ | Bedroom 2 | 11 x 11 ft |
9
+ | Bathroom | 9 x 6 ft |
10
+ | Laundry | 8 x 6 ft |
11
+
12
+ Single storey. Entry from the street side.
@@ -0,0 +1,65 @@
1
+ # Worked example: ground floor on Plot 14
2
+
3
+ ## Input
4
+
5
+ > *"Lay out the ground floor for the family house. Programme is in program.json (foyer,
6
+ > living, dining, kitchen, utility, prayer room, guest toilet), footprint 10 m wide × 9 m
7
+ > deep, road on the south side, front door from the road. Keep the prayer room away from the
8
+ > kitchen and the toilet. Stair to the first floor."*
9
+
10
+ ## Zoning, decided before coordinates
11
+
12
+ - Public front: foyer, then living along the road, so a guest never passes the kitchen.
13
+ - Stair beside the foyer, so the first floor is reached without crossing the living room.
14
+ - Service back: dining, kitchen, utility and toilet across the rear, with a back door from the hall for deliveries.
15
+ - Wet rooms (kitchen, utility, toilet) side by side at the back, so drains run to one side of the plot and stack under the first-floor bathrooms.
16
+ - Prayer room in the south-east corner, off the living room: an outside wall for a window, and the hall, not the kitchen or toilet, on its other side.
17
+
18
+ ## First draft: the checker caught it
19
+
20
+ The first draft widened the kitchen to 3.2 m. The checker exited 1:
21
+
22
+ ```text
23
+ FAIL Kitchen and Utility overlap by 0.46
24
+ FAIL Kitchen and Toilet overlap by 0.38
25
+ FAIL door 8 (Kitchen – Utility) at (6.6, 6) is not on a wall both sides share
26
+ FAIL Utility cannot be reached from an entrance
27
+ ```
28
+
29
+ The extra 0.2 m pushed the kitchen into the utility and the toilet. The utility door, moved
30
+ to the kitchen's new wall, then sat inside the utility rather than on a wall the two share,
31
+ so the utility could not be reached. Kitchen back to 3.0 m (12.6 m², its target).
32
+
33
+ ## `plan.json`
34
+
35
+ See [`../templates/plan.json`](../templates/plan.json), unchanged.
36
+
37
+ ## Response
38
+
39
+ **Plan:** [`ground-floor.svg`](ground-floor.svg). Public rooms along the road, service
40
+ rooms across the back, the stair beside the foyer.
41
+
42
+ | Room | Size (m) | Area (m²) | Target (m²) |
43
+ |---|---|---:|---:|
44
+ | Foyer | 2.5 × 2.4 | 6.0 | 6.0 |
45
+ | Stair | 2.5 × 2.4 | 6.0 | |
46
+ | Living | 5.4 × 4.8 | 25.9 | 25.9 |
47
+ | Prayer room | 2.1 × 2.2 | 4.6 | 4.5 |
48
+ | Dining | 3.4 × 4.2 | 14.3 | 14.0 |
49
+ | Kitchen | 3 × 4.2 | 12.6 | 12.6 |
50
+ | Utility | 1.6 × 2.3 | 3.7 | 4.0 |
51
+ | Toilet | 1.6 × 1.9 | 3.0 | 3.2 |
52
+ | Hall | 2.1 × 2.6 + 2 × 4.2 | 13.9 | |
53
+ | **Rooms** | | **90.0** | |
54
+ | **Outline** | | **90.0** | |
55
+
56
+ PASS no overlaps, every door on a shared wall, every room reachable.
57
+
58
+ **Off target:** utility 3.7 m² against 4 (−8 %) and toilet 3.0 against 3.2 (−6 %), both inside
59
+ the 10 % tolerance, traded for keeping the toilet off the prayer room. The hall is 13.9 m²
60
+ because it doubles as the back entrance; a tighter option moves the back door to the utility
61
+ and gives the spare 4 m² to the kitchen.
62
+
63
+ **What this plan is not:** schematic; walls drawn at a nominal 230 mm; no structure, services
64
+ or bye-law check. The architect checks the toilet's ventilation and the stair's width against
65
+ the local rules.
@@ -0,0 +1,135 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="914" viewBox="0 0 960 914" font-family="Helvetica, Arial, sans-serif" font-size="11">
2
+ <rect width="960" height="914" fill="#fff"/>
3
+ <text x="20" y="28" font-size="16" font-weight="bold">Ground floor, house on Plot 14</text>
4
+ <text x="20" y="46" fill="#444">Rooms 90.0 m² · outline 90.0 m² · schematic, not for construction</text>
5
+ <rect x="80.0" y="621.6" width="190.0" height="182.4" fill="#eef4f1"/>
6
+ <rect x="80.0" y="439.2" width="190.0" height="182.4" fill="#f5f0e6"/>
7
+ <rect x="270.0" y="439.2" width="410.4" height="364.8" fill="#eef0f6"/>
8
+ <rect x="680.4" y="636.8" width="159.6" height="167.2" fill="#f6eef0"/>
9
+ <rect x="80.0" y="120.0" width="258.4" height="319.2" fill="#f0f6ee"/>
10
+ <rect x="338.4" y="120.0" width="228.0" height="319.2" fill="#f3f3f3"/>
11
+ <rect x="566.4" y="264.4" width="121.6" height="174.8" fill="#eef4f1"/>
12
+ <rect x="566.4" y="120.0" width="121.6" height="144.4" fill="#f5f0e6"/>
13
+ <rect x="680.4" y="439.2" width="159.6" height="197.6" fill="#eef0f6"/>
14
+ <rect x="688.0" y="120.0" width="152.0" height="319.2" fill="#eef0f6"/>
15
+ <line x1="80.0" y1="804.0" x2="270.0" y2="804.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
16
+ <line x1="80.0" y1="621.6" x2="270.0" y2="621.6" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
17
+ <line x1="80.0" y1="804.0" x2="80.0" y2="621.6" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
18
+ <line x1="270.0" y1="804.0" x2="270.0" y2="621.6" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
19
+ <line x1="80.0" y1="621.6" x2="270.0" y2="621.6" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
20
+ <line x1="80.0" y1="439.2" x2="270.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
21
+ <line x1="80.0" y1="621.6" x2="80.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
22
+ <line x1="270.0" y1="621.6" x2="270.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
23
+ <line x1="270.0" y1="804.0" x2="680.4" y2="804.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
24
+ <line x1="270.0" y1="439.2" x2="680.4" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
25
+ <line x1="270.0" y1="804.0" x2="270.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
26
+ <line x1="680.4" y1="804.0" x2="680.4" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
27
+ <line x1="680.4" y1="804.0" x2="840.0" y2="804.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
28
+ <line x1="680.4" y1="636.8" x2="840.0" y2="636.8" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
29
+ <line x1="680.4" y1="804.0" x2="680.4" y2="636.8" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
30
+ <line x1="840.0" y1="804.0" x2="840.0" y2="636.8" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
31
+ <line x1="80.0" y1="439.2" x2="338.4" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
32
+ <line x1="80.0" y1="120.0" x2="338.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
33
+ <line x1="80.0" y1="439.2" x2="80.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
34
+ <line x1="338.4" y1="439.2" x2="338.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
35
+ <line x1="338.4" y1="439.2" x2="566.4" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
36
+ <line x1="338.4" y1="120.0" x2="566.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
37
+ <line x1="338.4" y1="439.2" x2="338.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
38
+ <line x1="566.4" y1="439.2" x2="566.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
39
+ <line x1="566.4" y1="439.2" x2="688.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
40
+ <line x1="566.4" y1="264.4" x2="688.0" y2="264.4" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
41
+ <line x1="566.4" y1="439.2" x2="566.4" y2="264.4" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
42
+ <line x1="688.0" y1="439.2" x2="688.0" y2="264.4" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
43
+ <line x1="566.4" y1="264.4" x2="688.0" y2="264.4" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
44
+ <line x1="566.4" y1="120.0" x2="688.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
45
+ <line x1="566.4" y1="264.4" x2="566.4" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
46
+ <line x1="688.0" y1="264.4" x2="688.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
47
+ <line x1="680.4" y1="636.8" x2="840.0" y2="636.8" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
48
+ <line x1="680.4" y1="439.2" x2="688.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
49
+ <line x1="680.4" y1="636.8" x2="680.4" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
50
+ <line x1="840.0" y1="636.8" x2="840.0" y2="439.2" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
51
+ <line x1="688.0" y1="120.0" x2="840.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
52
+ <line x1="688.0" y1="439.2" x2="688.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
53
+ <line x1="840.0" y1="439.2" x2="840.0" y2="120.0" stroke="#333" stroke-width="8.7" stroke-linecap="square"/>
54
+ <polygon points="80.0,804.0 840.0,804.0 840.0,120.0 80.0,120.0" fill="none" stroke="#111" stroke-width="17.5" stroke-linejoin="miter"/>
55
+ <text x="175.0" y="708.8" text-anchor="middle" font-weight="bold" font-size="12">Foyer</text>
56
+ <text x="175.0" y="721.8" text-anchor="middle" font-size="11" fill="#444">2.5×2.4 · 6.0 m²</text>
57
+ <text x="175.0" y="526.4" text-anchor="middle" font-weight="bold" font-size="12">Stair</text>
58
+ <text x="175.0" y="539.4" text-anchor="middle" font-size="11" fill="#444">2.5×2.4 · 6.0 m²</text>
59
+ <text x="475.2" y="617.6" text-anchor="middle" font-weight="bold" font-size="12">Living</text>
60
+ <text x="475.2" y="630.6" text-anchor="middle" font-size="11" fill="#444">5.4×4.8 · 25.9 m²</text>
61
+ <text x="760.2" y="716.4" text-anchor="middle" font-weight="bold" font-size="12">Prayer room</text>
62
+ <text x="760.2" y="729.4" text-anchor="middle" font-size="11" fill="#444">2.1×2.2 · 4.6 m²</text>
63
+ <text x="209.2" y="275.6" text-anchor="middle" font-weight="bold" font-size="12">Dining</text>
64
+ <text x="209.2" y="288.6" text-anchor="middle" font-size="11" fill="#444">3.4×4.2 · 14.3 m²</text>
65
+ <text x="452.4" y="275.6" text-anchor="middle" font-weight="bold" font-size="12">Kitchen</text>
66
+ <text x="452.4" y="288.6" text-anchor="middle" font-size="11" fill="#444">3×4.2 · 12.6 m²</text>
67
+ <text x="627.2" y="347.8" text-anchor="middle" font-weight="bold" font-size="12">Utility</text>
68
+ <text x="627.2" y="360.8" text-anchor="middle" font-size="11" fill="#444">1.6×2.3 · 3.7 m²</text>
69
+ <text x="627.2" y="188.2" text-anchor="middle" font-weight="bold" font-size="12">Toilet</text>
70
+ <text x="627.2" y="201.2" text-anchor="middle" font-size="11" fill="#444">1.6×1.9 · 3.0 m²</text>
71
+ <text x="764.0" y="275.6" text-anchor="middle" font-weight="bold" font-size="12">Hall</text>
72
+ <text x="764.0" y="288.6" text-anchor="middle" font-size="11" fill="#444">13.9 m²</text>
73
+ <line x1="384.0" y1="804.0" x2="566.4" y2="804.0" stroke="#fff" stroke-width="18.5"/>
74
+ <line x1="384.0" y1="798.2" x2="566.4" y2="798.2" stroke="#2b6cb0" stroke-width="1"/>
75
+ <line x1="384.0" y1="804.0" x2="566.4" y2="804.0" stroke="#2b6cb0" stroke-width="1"/>
76
+ <line x1="384.0" y1="809.8" x2="566.4" y2="809.8" stroke="#2b6cb0" stroke-width="1"/>
77
+ <line x1="80.0" y1="336.6" x2="80.0" y2="222.6" stroke="#fff" stroke-width="18.5"/>
78
+ <line x1="74.2" y1="336.6" x2="74.2" y2="222.6" stroke="#2b6cb0" stroke-width="1"/>
79
+ <line x1="80.0" y1="336.6" x2="80.0" y2="222.6" stroke="#2b6cb0" stroke-width="1"/>
80
+ <line x1="85.8" y1="336.6" x2="85.8" y2="222.6" stroke="#2b6cb0" stroke-width="1"/>
81
+ <line x1="406.8" y1="120.0" x2="498.0" y2="120.0" stroke="#fff" stroke-width="18.5"/>
82
+ <line x1="406.8" y1="114.2" x2="498.0" y2="114.2" stroke="#2b6cb0" stroke-width="1"/>
83
+ <line x1="406.8" y1="120.0" x2="498.0" y2="120.0" stroke="#2b6cb0" stroke-width="1"/>
84
+ <line x1="406.8" y1="125.8" x2="498.0" y2="125.8" stroke="#2b6cb0" stroke-width="1"/>
85
+ <line x1="840.0" y1="754.6" x2="840.0" y2="686.2" stroke="#fff" stroke-width="18.5"/>
86
+ <line x1="834.2" y1="754.6" x2="834.2" y2="686.2" stroke="#2b6cb0" stroke-width="1"/>
87
+ <line x1="840.0" y1="754.6" x2="840.0" y2="686.2" stroke="#2b6cb0" stroke-width="1"/>
88
+ <line x1="845.8" y1="754.6" x2="845.8" y2="686.2" stroke="#2b6cb0" stroke-width="1"/>
89
+ <line x1="604.4" y1="120.0" x2="650.0" y2="120.0" stroke="#fff" stroke-width="18.5"/>
90
+ <line x1="604.4" y1="114.2" x2="650.0" y2="114.2" stroke="#2b6cb0" stroke-width="1"/>
91
+ <line x1="604.4" y1="120.0" x2="650.0" y2="120.0" stroke="#2b6cb0" stroke-width="1"/>
92
+ <line x1="604.4" y1="125.8" x2="650.0" y2="125.8" stroke="#2b6cb0" stroke-width="1"/>
93
+ <line x1="137.0" y1="804.0" x2="213.0" y2="804.0" stroke="#fff" stroke-width="18.5"/>
94
+ <line x1="137.0" y1="804.0" x2="137.0" y2="728.0" stroke="#b5531a" stroke-width="1.5"/>
95
+ <path d="M 137.0 728.0 A 76.0 76.0 0 0 1 213.0 804.0" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
96
+ <line x1="270.0" y1="747.0" x2="270.0" y2="678.6" stroke="#fff" stroke-width="18.5"/>
97
+ <line x1="270.0" y1="747.0" x2="338.4" y2="747.0" stroke="#b5531a" stroke-width="1.5"/>
98
+ <path d="M 338.4 747.0 A 68.4 68.4 0 0 0 270.0 678.6" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
99
+ <line x1="140.8" y1="621.6" x2="209.2" y2="621.6" stroke="#fff" stroke-width="18.5"/>
100
+ <line x1="140.8" y1="621.6" x2="140.8" y2="553.2" stroke="#b5531a" stroke-width="1.5"/>
101
+ <path d="M 140.8 553.2 A 68.4 68.4 0 0 1 209.2 621.6" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
102
+ <line x1="270.0" y1="439.2" x2="338.4" y2="439.2" stroke="#fff" stroke-width="18.5"/>
103
+ <line x1="270.0" y1="439.2" x2="270.0" y2="370.8" stroke="#b5531a" stroke-width="1.5"/>
104
+ <path d="M 270.0 370.8 A 68.4 68.4 0 0 1 338.4 439.2" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
105
+ <line x1="680.4" y1="750.8" x2="680.4" y2="690.0" stroke="#fff" stroke-width="18.5"/>
106
+ <line x1="680.4" y1="750.8" x2="741.2" y2="750.8" stroke="#b5531a" stroke-width="1.5"/>
107
+ <path d="M 741.2 750.8 A 60.8 60.8 0 0 0 680.4 690.0" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
108
+ <line x1="680.4" y1="572.2" x2="680.4" y2="503.8" stroke="#fff" stroke-width="18.5"/>
109
+ <line x1="680.4" y1="572.2" x2="748.8" y2="572.2" stroke="#b5531a" stroke-width="1.5"/>
110
+ <path d="M 748.8 572.2 A 68.4 68.4 0 0 0 680.4 503.8" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
111
+ <line x1="338.4" y1="313.8" x2="338.4" y2="245.4" stroke="#fff" stroke-width="18.5"/>
112
+ <line x1="338.4" y1="313.8" x2="406.8" y2="313.8" stroke="#b5531a" stroke-width="1.5"/>
113
+ <path d="M 406.8 313.8 A 68.4 68.4 0 0 0 338.4 245.4" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
114
+ <line x1="566.4" y1="378.4" x2="566.4" y2="317.6" stroke="#fff" stroke-width="18.5"/>
115
+ <line x1="566.4" y1="378.4" x2="627.2" y2="378.4" stroke="#b5531a" stroke-width="1.5"/>
116
+ <path d="M 627.2 378.4 A 60.8 60.8 0 0 0 566.4 317.6" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
117
+ <line x1="688.0" y1="226.4" x2="688.0" y2="165.6" stroke="#fff" stroke-width="18.5"/>
118
+ <line x1="688.0" y1="226.4" x2="748.8" y2="226.4" stroke="#b5531a" stroke-width="1.5"/>
119
+ <path d="M 748.8 226.4 A 60.8 60.8 0 0 0 688.0 165.6" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
120
+ <line x1="729.8" y1="120.0" x2="798.2" y2="120.0" stroke="#fff" stroke-width="18.5"/>
121
+ <line x1="729.8" y1="120.0" x2="729.8" y2="51.6" stroke="#b5531a" stroke-width="1.5"/>
122
+ <path d="M 729.8 51.6 A 68.4 68.4 0 0 1 798.2 120.0" fill="none" stroke="#b5531a" stroke-width="0.8" stroke-dasharray="3 2"/>
123
+ <line x1="80.0" y1="832.0" x2="840.0" y2="832.0" stroke="#555" stroke-width="0.8"/>
124
+ <line x1="76.0" y1="836.0" x2="84.0" y2="828.0" stroke="#555" stroke-width="1.2"/>
125
+ <line x1="836.0" y1="836.0" x2="844.0" y2="828.0" stroke="#555" stroke-width="1.2"/>
126
+ <text x="460.0" y="827.0" text-anchor="middle">10 m</text>
127
+ <line x1="52.0" y1="804.0" x2="52.0" y2="120.0" stroke="#555" stroke-width="0.8"/>
128
+ <line x1="48.0" y1="808.0" x2="56.0" y2="800.0" stroke="#555" stroke-width="1.2"/>
129
+ <line x1="48.0" y1="124.0" x2="56.0" y2="116.0" stroke="#555" stroke-width="1.2"/>
130
+ <text x="46.0" y="462.0" text-anchor="middle" transform="rotate(-90 46.0 462.0)">9 m</text>
131
+ <g transform="translate(920 40) rotate(15.0)"><polygon points="0,-20 7,9 0,4 -7,9" fill="#111"/><text x="0" y="-25" text-anchor="middle" font-weight="bold">N</text></g>
132
+ <rect x="80" y="890.0" width="76.0" height="6" fill="#111"/>
133
+ <rect x="156.0" y="890.0" width="76.0" height="6" fill="#fff" stroke="#111"/>
134
+ <text x="238.0" y="896.0">2 m</text>
135
+ </svg>
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "floor-plan-layout",
3
+ "version": "0.1.0",
4
+ "description": "Lay out a schematic floor plan from a space programme and a footprint, and draw it as a dimensioned SVG — rooms placed as rectangles at real sizes, doors and windows on real walls, overall dimensions, a scale bar and north arrow — with a script that fails the plan when rooms overlap, a room spills outside the footprint, a door sits on no shared wall or a room can't be reached from the entrance. Use when an architect asks to \"draw a floor plan\", \"lay out these rooms\", \"make a plan for a 10 × 9 m footprint\", for a concept plan, a test fit, a zoning diagram or a dimensioned layout from room sizes.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": {
7
+ "npm": [],
8
+ "pip": []
9
+ },
10
+ "env": {
11
+ "required": [],
12
+ "optional": []
13
+ },
14
+ "related": [],
15
+ "tags": [
16
+ "architecture",
17
+ "floor-plan",
18
+ "layout",
19
+ "test-fit",
20
+ "zoning",
21
+ "svg",
22
+ "dimensions"
23
+ ],
24
+ "permissions": {
25
+ "network": [],
26
+ "commands": [],
27
+ "files": "named-paths",
28
+ "notes": "Reads the plan.json it is given and writes the SVG to the path passed with --svg."
29
+ },
30
+ "model": {
31
+ "tier": "heavy",
32
+ "rationale": "Spatial layout is design judgment: zoning, adjacencies, daylight and circulation traded against areas, with a checker to iterate against."
33
+ }
34
+ }