@floless/app 0.53.0 → 0.54.1

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.
@@ -2,7 +2,7 @@
2
2
  name: floless-app-steel-model
3
3
  description: The front-door guide for turning a structural steel drawing SET into an editable model in floless.app — the "Steel Model" flow. This skill orchestrates the whole pipeline — set up a project folder, learn the set into plain-English knowledge files, provision the right AWARE agents (region-specific steel detailer plus any bake targets), confirm which sheets are plans / elevations / details, then hand off to the Steel Takeoff reader to read each plan into a steel.takeoff/v1 contract — with explicit confirm gates between stages. Use it when a user wants to model steel from a drawing SET or asks things like "model this steel job from the drawings", "take off this whole set", "start a steel takeoff project", "turn these structural drawings into a model", "I have a PDF set of framing plans", or "/floless-app-steel-model". It is re-runnable — resume at any stage. For a single already-isolated framing plan the Steel Takeoff reader (floless-app-steel-takeoff) can be used directly; this guide is for driving a real job end to end.
4
4
  metadata:
5
- version: 0.1.0
5
+ version: 0.2.0
6
6
  ---
7
7
 
8
8
  # Steel Model — guide a steel drawing set into an editable model
@@ -26,13 +26,16 @@ the run path and no API key.
26
26
  what was found and get an OK before spending effort on the next stage. Resume at any stage on
27
27
  re-invoke ("we already set up the folder, provision the agents").
28
28
 
29
- > Companion skills (both ship with floless.app — invoke them, don't duplicate them):
29
+ > Companion skills (all ship with floless.app — invoke them, don't duplicate them):
30
30
  > - **`reading-structural-drawings`** — the reading *discipline* (massing + coordinate frame FIRST,
31
31
  > members LAST, cross-validate every view). Follow it whenever skimming or classifying the set
32
32
  > (stages 2 and 5) — it stops the classic failures (two buildings read as one, a sloped roof read
33
33
  > as flat, grids conflated across sheets).
34
34
  > - **`floless-app-steel-takeoff`** — reads one framing plan into the contract (the heavy vision
35
35
  > pipeline, the filter pre-stage, the AISC/EN/BS lookup, the contract write + editor hand-off).
36
+ > - **`steel-drawing-abbreviations`** — the default US/AISC abbreviations + shape-designation legend.
37
+ > The fallback for note/profile codes (TYP, TOS, UON, `(E)`/`(N)`, HSS, WT) when the set omits its
38
+ > own abbreviations sheet (stage 2).
36
39
 
37
40
  ---
38
41
 
@@ -66,7 +69,9 @@ the project folder (a few files, **not** a framework):
66
69
 
67
70
  Read the set with the terminal AI's own vision, following the **`reading-structural-drawings`**
68
71
  discipline while skimming (massing + coordinate frame first — it's what makes the sheet
69
- classification reliable).
72
+ classification reliable). If the set has **no abbreviations/legend sheet** (a partial set is common),
73
+ fall back to **`steel-drawing-abbreviations`** — the standard US/AISC abbreviations + shape legend —
74
+ for note/profile codes (TYP, TOS, UON, `(E)`/`(N)`, HSS, WT). The project's own legend always overrides.
70
75
 
71
76
  **Gate:** show `set-index.md` (the sheet map) and confirm the classification looks right — the user
72
77
  knows their set better than any read.
@@ -133,12 +138,16 @@ the user at the editor:
133
138
  the contract's `connections[]` with `source:"company-rules"`; the user reviews/assigns them per
134
139
  member end in the editor's **Connections** panel (the per-end picker + confidence card).
135
140
  - **Point at the rest of the canvas:** the **filter** view (refine the kept linework), **Approve**
136
- (bake the lock — the determinism gate), **3D** model, **IFC** / **Tekla** export, the **BOM**, the
137
- **confidence report**, and the **callout bubbles** (click a section/elevation/detail mark on a
138
- plan to jump to the referenced sheet).
141
+ (bake the lock — the determinism gate), **3D** model, **IFC** / **Tekla** export, the **BOM**
142
+ (exportable to **CSV / Excel**), the **confidence report**, and the **callout bubbles** (click a
143
+ section/elevation/detail mark on a plan to jump to the referenced sheet).
139
144
 
140
145
  **Done** when each framing plan has an approved, editor-reviewed contract and the user knows which
141
- on-canvas tool does what. The exports (3D/IFC/Tekla/BOM) are on-demand from the editor.
146
+ on-canvas tool does what. The 3D/IFC/Tekla exports are on-demand from the editor; the **BOM is
147
+ exported two ways** — on-demand via the editor's *Export BOM (CSV)/(Excel)* buttons, **and written
148
+ to `~/.floless/exports/steel-model/steel-model-bom.{csv,xlsx}` automatically every time the workflow
149
+ is Run** (two `file/write` export steps at the end of the chain). Tell the user they can **freeze**
150
+ those export steps (right-click → Freeze) once the BOM is right, so a re-Run won't overwrite the files.
142
151
 
143
152
  ---
144
153
 
@@ -366,3 +366,8 @@ never committed). Clip title blocks from any embedded preview.
366
366
  sizes or grid positions the drawing does not show.
367
367
  - **Resolve the port** from the running floless.app the same way other floless-app skills do
368
368
  (check `~/.floless/port` or the active server port).
369
+ - **Decode unfamiliar note/profile codes** with **`steel-drawing-abbreviations`** (the default
370
+ US/AISC abbreviations + shape legend) when the set lacks its own abbreviations sheet — for TYP
371
+ profiles, TOS/UON defaults, `(E)`/`(N)` scope, and shape designations. The project's own legend
372
+ always overrides; never expand a member *mark* (`MF`/`BF`/`D1`) from it — resolve those from the
373
+ schedules/elevations.
@@ -2,7 +2,7 @@
2
2
  name: floless-app-workflows
3
3
  description: This skill should be used when building, modifying, or reasoning about FloLess .flo workflows for floless.app — especially reusable apps that take inputs (e.g. a phase number) and run across different Tekla models, exec nodes that run Roslyn C# against the live model, the in-app HTML Viewer, the Code tab, or "Debug in VS". Covers the exec contract, the install→validate→compile→run loop, app inputs templating, and the server seams (aware-adapter, app-reader, index).
4
4
  metadata:
5
- version: 0.1.0
5
+ version: 0.2.0
6
6
  ---
7
7
 
8
8
  # Building reusable .flo workflows in floless.app
@@ -270,6 +270,29 @@ floless.app play (designed, now unblocked): a "Bake into agent" affordance that
270
270
  `.flo` to add `exposes-as-agent` + `exposed-commands` mirroring the app's `inputs:`. Thin-UI: a
271
271
  manifest edit + recompile, no engine. See the design doc for the Stage-1 plan.
272
272
 
273
+ ## Write a file on Run (the `file` agent) — VERIFIED, AWARE 0.81.0+
274
+
275
+ A node can **land an artifact on disk as part of the run** with the `_core/file` agent (steel-model's
276
+ `csv-export` / `xlsx-export` nodes do exactly this). Key facts (all verified):
277
+
278
+ - **`file` is a builtin** (`transport: builtin {}`) — handled in-process, **no host binary**, like
279
+ `html-report` / `viewer-3d`. But its **manifest must be installed** (`aware agent install file`):
280
+ absent, the run fails with an opaque IO error; present, `aware app run` dispatches it. floless
281
+ ensures it before Run for any app that `requires: file@1.0.x` (see `ensureSteelExportReady`, index.ts).
282
+ - **Verbs:** `write` lands `bytes` at `path` (`encoding: text | base64`); `write-csv` takes
283
+ `{ path, columns, rows }` → RFC-4180. For a **binary** artifact (`.xlsx`, image, zip) **floless
284
+ generates the bytes in TS and the node base64-lands them** — AWARE has no xlsx serializer, so the
285
+ binary stays host-side (we reuse `bomToXlsx` and write `encoding: base64`).
286
+ - **`file/write*` are `mode: write`** (a generic arbitrary-path writer mutates external state), so an
287
+ **un-frozen** export node MUST carry a `safety:` block — `safety: { snapshot: false }` is enough. A
288
+ **frozen** node skips the safety preflight AND skips dispatch (it replays its pinned output, no
289
+ write) — that is the "freeze the export so Run won't regenerate it" affordance.
290
+ - **Path:** the producer owns `path`. A **bare relative path resolves to the run process's cwd**
291
+ (it'll litter the server dir), so floless bakes an **absolute** `~/.floless/exports/<appId>/…` path
292
+ into the node — on Approve via `bakeDownstream` → `bakeBomExportNodes` (path + real bytes), and as a
293
+ safety net before Run via `ensureSteelExportReady` (path only; idempotent, recompiles once). The
294
+ committed template carries a bare filename + a small example payload so the step is valid out of the box.
295
+
273
296
  ## How the UI surfaces map to AWARE state
274
297
 
275
298
  - **Code tab** shows the node's real source: `node.config.code` (the exec C#), not lockfile
@@ -46,7 +46,9 @@ one with a curved roof — both obvious in the elevations, invisible in the plan
46
46
  Read the **cover / drawing index** and **general notes** first. Build a sheet list classified by
47
47
  type (index, notes, foundation plan, framing plans per level, frame elevations, sections, details,
48
48
  **schedules**). Confirm the set is complete + current revision. Grab the legend, datum, material
49
- defaults, and the **abbreviations** (FC/MF/BF/(E)/(N)/matchline symbols). Trust PyMuPDF page_count over
49
+ defaults, and the **abbreviations** (FC/MF/BF/(E)/(N)/matchline symbols). If the set ships **no
50
+ abbreviations/legend sheet** (or only partial sheets), fall back to the **`steel-drawing-abbreviations`**
51
+ default US/AISC legend for the standard codes. Trust PyMuPDF page_count over
50
52
  any external count.
51
53
 
52
54
  ### Pass 1 — MASSING (how many buildings, what shape) — from elevations/sections, not plans
@@ -114,6 +116,9 @@ Only then build the scene / overlay / IFC. If unsure, present the **massing + gr
114
116
  skill is the *reading discipline*; that one is the *reader*. The **`floless-app-steel-model`** guide
115
117
  (the front-door orchestrator) wraps the whole flow and references this discipline at the
116
118
  classify-and-verify gates rather than re-deriving it.
119
+ - **`steel-drawing-abbreviations`** — the default US/AISC abbreviations + shape-designation legend.
120
+ Consult it in Pass 0 when the set omits its own legend sheet, and whenever a note code (TYP, TOS,
121
+ UON, `(E)`/`(N)`) or profile designation needs decoding.
117
122
  - There is no off-the-shelf OSS tool that does the whole drawing→model job — floorplan vectorisers
118
123
  (e.g. CubiCasa5k) are residential-trained and won't read steel framing — which is why the order +
119
124
  validation discipline above, not a single tool, is the method.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: steel-drawing-abbreviations
3
+ description: Default legend of standard US (AISC, imperial) structural-steel drawing abbreviations, note conventions, and shape designations — the fallback meaning when a drawing set omits or only partially supplies its own abbreviations/legend sheet. This skill should be used while reading a structural steel drawing whenever an abbreviation, note code, or profile designation needs expanding (TYP, TOS, UON, EQ, (E)/(N), SIM, HSS, WT, and so on), or when the steel reader (floless-app-steel-takeoff / floless-app-steel-model) meets a note or label whose meaning is not defined on the supplied sheets. The project's own legend always overrides these defaults.
4
+ metadata:
5
+ version: "0.1.0"
6
+ ---
7
+
8
+ # Steel drawing abbreviations — default legend
9
+
10
+ ## What this is
11
+
12
+ A reusable **fallback legend** of the standard abbreviations, note conventions, and steel-shape
13
+ designations that appear on the General Notes / legend sheet (usually `S-001` / `S-100`) of most
14
+ **US (AISC, imperial)** structural sets. These are an industry convention — largely identical from
15
+ project to project — so they fill the gap when a set does not ship its own abbreviations sheet, or
16
+ when only some sheets are provided.
17
+
18
+ The full glossary lives in **`references/standard-us-abbreviations.md`** (abbreviations A–Z, the
19
+ structural-steel shape table, the high-value note conventions for takeoff, and a marks-vs-abbreviations
20
+ warning). Keep this SKILL.md lean; load the reference when an actual lookup is needed.
21
+
22
+ ## When to consult it
23
+
24
+ - A structural plan, section, or **General Note** uses an abbreviation or code that is not spelled
25
+ out on the supplied sheets, and its meaning is needed to read geometry or metadata correctly
26
+ (e.g. a "T.O.S. = 16'-6" UON" note, a "TYP" profile, an `(E)` member).
27
+ - The **steel reader** (`floless-app-steel-takeoff`) or the **guide** (`floless-app-steel-model`) is
28
+ learning a set and the user did **not** provide the abbreviations/legend sheet — use this as the
29
+ default while still reading the rest of the set.
30
+ - A profile designation needs decoding (what `HSS6X6X3/8`, `WT`, `C`, `MC`, `PIPE-XX` mean and which
31
+ ones carry their weight in the name vs. need an AISC table).
32
+
33
+ ## How to use it
34
+
35
+ 1. **Read the project legend first.** If the set HAS an abbreviations sheet or a note that defines the
36
+ code, use *that* — this file is only the fallback. The project's own definition always wins.
37
+ 2. **Look up the code** in `references/standard-us-abbreviations.md` (grep the abbreviation, e.g.
38
+ `grep -i 'TOS' references/standard-us-abbreviations.md`).
39
+ 3. **Respect context over the table.** Several codes are context-dependent (`WT` = WEIGHT or a tee
40
+ shape; `PT` = POST-TENSIONED / PRESSURE-TREATED / POINT). Choose the structurally sensible meaning;
41
+ if it is genuinely ambiguous, flag it as an RFI rather than guess.
42
+ 4. **Do not expand marks.** `MF` / `BF` / `D1` / `C1` / `B12` are project member/frame marks resolved
43
+ from the frame elevations and schedules — never from this glossary (see the reference's
44
+ "Marks vs abbreviations" section).
45
+ 5. **Mind the region.** This is the US/AISC legend. For EU (EN) or UK (BS) sets, defer to the project
46
+ legend and the region-specific detailer agent (`steel-detailer-eu` / `steel-detailer-uk`); the
47
+ shape designations especially differ.
48
+
49
+ ## Companion skills
50
+
51
+ - **`reading-structural-drawings`** — the reading discipline; its Pass 0 (inventory & legend) consults
52
+ this default legend when the set's own abbreviations sheet is missing.
53
+ - **`floless-app-steel-takeoff`** — the reader; uses this while reading notes/labels into the
54
+ `steel.takeoff/v1` contract (TYP profiles, TOS defaults, connection-type words, `(E)`/`(N)` scope).
55
+ - **`floless-app-steel-model`** — the front-door guide; references this at the "learn the set" stage so
56
+ a partial set without a legend sheet still reads correctly.
57
+ - **`steel-detailer-us` / `-eu` / `-uk`** (AWARE agents) — own the section *tables and weights*; this
58
+ skill only decodes the *labels and notes*.
@@ -0,0 +1,296 @@
1
+ # Standard US structural-steel drawing abbreviations & symbols (default legend)
2
+
3
+ These are the **de-facto standard abbreviations** that appear on the General Notes / legend sheet
4
+ (usually `S-001` / `S-100`) of most **US (AISC, imperial)** structural sets. They are an industry
5
+ convention, not any one firm's property, so they serve as a **fallback default** when a drawing set
6
+ does not include its own abbreviations/legend sheet (or only ships partial sheets).
7
+
8
+ **Rules of use (read before applying any expansion):**
9
+ - **The project's own legend ALWAYS wins.** If the set has an abbreviations sheet or a plan/general
10
+ note that defines a code, use *that* meaning — never override it with this list.
11
+ - **Context can override.** The same code means different things by context (e.g. `WT` = WEIGHT or a
12
+ structural-tee shape; `PT` = POST-TENSIONED or PRESSURE-TREATED or POINT). Pick the meaning that
13
+ fits the structural context; if genuinely ambiguous, flag it (RFI) rather than guess.
14
+ - **Region differs.** This is the US/AISC set. EU (EN) and UK (BS) sets use different shape
15
+ designations and some different abbreviations — defer those to the project legend and the
16
+ region-specific detailer agent (`steel-detailer-eu` / `steel-detailer-uk`).
17
+ - **Marks are NOT abbreviations.** Member/frame *marks* like `MF`, `BF`, `D1`, `C1`, `B12` are
18
+ project-specific labels resolved from the frame elevations / schedules — not from this glossary.
19
+ See "Marks vs abbreviations" below.
20
+
21
+ ---
22
+
23
+ ## Abbreviations (A–Z)
24
+
25
+ | Abbr | Meaning |
26
+ |------|---------|
27
+ | `AB` | ANCHOR BOLT |
28
+ | `ACI` | AMERICAN CONCRETE INSTITUTE |
29
+ | `ADD'L` | ADDITIONAL |
30
+ | `ADJ` | ADJACENT / ADJUSTABLE |
31
+ | `AESS` | ARCHITECTURALLY EXPOSED STRUCTURAL STEEL |
32
+ | `AGGR` | AGGREGATE |
33
+ | `AISC` | AMERICAN INSTITUTE OF STEEL CONSTRUCTION |
34
+ | `AITC` | AMERICAN INSTITUTE OF TIMBER CONSTRUCTION |
35
+ | `ALT` | ALTERNATE |
36
+ | `ALUM` | ALUMINUM |
37
+ | `ANCH` | ANCHOR |
38
+ | `ANSI` | AMERICAN NATIONAL STANDARDS INSTITUTE |
39
+ | `APA` | AMERICAN PLYWOOD ASSOCIATION |
40
+ | `APPROX` | APPROXIMATE |
41
+ | `ARCH` | ARCHITECTURAL / ARCHITECT |
42
+ | `ASD` | ALLOWABLE STRENGTH DESIGN |
43
+ | `ASTM` | AMERICAN SOCIETY FOR TESTING AND MATERIALS |
44
+ | `AWPA` | AMERICAN WOOD PRESERVERS ASSOCIATION |
45
+ | `AWS` | AMERICAN WELDING SOCIETY |
46
+ | `AVG` | AVERAGE |
47
+ | `@` | AT |
48
+ | `&` | AND |
49
+ | `BLDG` | BUILDING |
50
+ | `BLK` | BLOCK |
51
+ | `BLKG` | BLOCKING |
52
+ | `BM` | BEAM |
53
+ | `BN` | BOUNDARY NAIL |
54
+ | `BNDRY` | BOUNDARY |
55
+ | `BOT` (or `B`) | BOTTOM |
56
+ | `BRC` | BRACE |
57
+ | `BRG` | BEARING |
58
+ | `BT` | BENT |
59
+ | `BTWN` | BETWEEN |
60
+ | `CANT` | CANTILEVER |
61
+ | `CAM` (or `C`) | CAMBER |
62
+ | `CG` | CENTER OF GRAVITY |
63
+ | `CIP` | CAST-IN-PLACE |
64
+ | `CJ` | CONSTRUCTION JOINT; CONTROL JOINT |
65
+ | `CJP` | COMPLETE JOINT PENETRATION (WELD) |
66
+ | `CL` (or `℄`) | CENTER LINE |
67
+ | `CLR` | CLEAR |
68
+ | `CMU` | CONCRETE MASONRY UNIT |
69
+ | `COL` | COLUMN |
70
+ | `COMP` | COMPRESSION / COMPOSITE |
71
+ | `CONC` | CONCRETE |
72
+ | `CONN` | CONNECTION |
73
+ | `CONST` / `CONSTR` | CONSTRUCTION |
74
+ | `CONT` | CONTINUOUS / CONTINUE |
75
+ | `CTR` | CENTER |
76
+ | `CTSK` | COUNTERSUNK |
77
+ | `CU FT` | CUBIC FOOT |
78
+ | `d` | PENNY (nail size, e.g. `16d`) |
79
+ | `DBL` | DOUBLE |
80
+ | `DEPT` | DEPARTMENT |
81
+ | `DET` | DETAIL |
82
+ | `DIA` (or `Ø`) | DIAMETER |
83
+ | `DIAG` | DIAGONAL |
84
+ | `DIAPH` | DIAPHRAGM |
85
+ | `DIM` | DIMENSION |
86
+ | `DN` | DOWN |
87
+ | `DO` | DITTO |
88
+ | `DWG` | DRAWING |
89
+ | `DWL` | DOWEL |
90
+ | `EA` | EACH |
91
+ | `EF` | EACH FACE |
92
+ | `EJ` | EXPANSION JOINT |
93
+ | `EL` / `ELEV` | ELEVATION |
94
+ | `ELEC` | ELECTRICAL |
95
+ | `EMBED` | EMBEDMENT |
96
+ | `EN` | EDGE NAIL |
97
+ | `EQ` | EQUAL / EQUALLY (SPACED) |
98
+ | `EQUIP` | EQUIPMENT |
99
+ | `ES` | EACH SIDE |
100
+ | `EW` | EACH WAY |
101
+ | `EXP` | EXPANSION |
102
+ | `EXT` | EXTERIOR |
103
+ | `(E)` | EXISTING (often out of new-work scope) |
104
+ | `FDN` | FOUNDATION |
105
+ | `FF` | FAR FACE |
106
+ | `FIN` | FINISH(ED) |
107
+ | `FLR` | FLOOR |
108
+ | `FN` | FIELD NAIL |
109
+ | `FOC` | FACE OF CONCRETE |
110
+ | `FOS` | FACE OF STUD / FACE OF SLAB |
111
+ | `FOW` | FACE OF WALL |
112
+ | `FP` | FIRE PROOFING |
113
+ | `FRMG` | FRAMING |
114
+ | `FS` | FAR SIDE / FULL SIZE |
115
+ | `FT` | FOOT / FEET |
116
+ | `FTG` | FOOTING |
117
+ | `GA` | GAUGE |
118
+ | `GALV` | GALVANIZED |
119
+ | `GB` | GRADE BEAM |
120
+ | `GLB` | GLUE-LAMINATED BEAM |
121
+ | `GR` | GRADE |
122
+ | `GRTG` | GRATING |
123
+ | `HDR` | HEADER |
124
+ | `HGR` | HANGER |
125
+ | `HGT` / `HT` | HEIGHT |
126
+ | `HK` | HOOK |
127
+ | `HORIZ` (or `H`) | HORIZONTAL |
128
+ | `HP` | HIGH POINT |
129
+ | `HS` | HIGH STRENGTH |
130
+ | `HSS` | HOLLOW STRUCTURAL SECTION |
131
+ | `ID` | INSIDE DIAMETER |
132
+ | `IF` | INSIDE FACE |
133
+ | `IN` | INCH |
134
+ | `INCL` | INCLUDE / INCLUDED |
135
+ | `INFO` | INFORMATION |
136
+ | `INSP` | INSPECTION |
137
+ | `INT` | INTERIOR |
138
+ | `JST` | JOIST |
139
+ | `JT` | JOINT |
140
+ | `K` | KIPS (1000 lb) |
141
+ | `KSI` | KIPS PER SQUARE INCH |
142
+ | `LAB` | LABORATORY |
143
+ | `LB(S)` (or `#`) | POUNDS |
144
+ | `LH` | LEFT HAND |
145
+ | `LLH` | LONG LEG HORIZONTAL |
146
+ | `LLV` | LONG LEG VERTICAL |
147
+ | `LP` | LOW POINT |
148
+ | `LT WT` | LIGHTWEIGHT |
149
+ | `MAS` | MASONRY |
150
+ | `MATL` | MATERIAL |
151
+ | `MAX` | MAXIMUM |
152
+ | `MB` | MACHINE BOLT |
153
+ | `MECH` | MECHANICAL |
154
+ | `MFR` | MANUFACTURER |
155
+ | `MIN` | MINIMUM |
156
+ | `MISC` | MISCELLANEOUS |
157
+ | `N` | NORTH |
158
+ | `(N)` | NEW |
159
+ | `NF` | NEAR FACE |
160
+ | `NIC` | NOT IN CONTRACT |
161
+ | `NOM` | NOMINAL |
162
+ | `NO` (or `#`) | NUMBER |
163
+ | `NS` | NEAR SIDE |
164
+ | `NTS` | NOT TO SCALE |
165
+ | `OC` | ON CENTER |
166
+ | `OD` | OUTSIDE DIAMETER |
167
+ | `OF` | OUTSIDE FACE |
168
+ | `OH` | OPPOSITE HAND |
169
+ | `OPNG` | OPENING |
170
+ | `OPP` | OPPOSITE |
171
+ | `OSB` | ORIENTED STRAND BOARD |
172
+ | `PARA` (or `∥`) | PARALLEL |
173
+ | `PERP` (or `⊥`) | PERPENDICULAR |
174
+ | `PJP` | PARTIAL JOINT PENETRATION (WELD) |
175
+ | `PL` | PLATE |
176
+ | `PLF` | POUNDS PER LINEAR FOOT |
177
+ | `PLYWD` | PLYWOOD |
178
+ | `PNL` | PANEL |
179
+ | `PSF` | POUNDS PER SQUARE FOOT |
180
+ | `PSI` | POUNDS PER SQUARE INCH |
181
+ | `PT` | POST-TENSIONED / PRESSURE-TREATED / POINT |
182
+ | `R` / `RAD` | RADIUS |
183
+ | `RD` | ROOF DRAIN |
184
+ | `REF` | REFERENCE |
185
+ | `REINF` | REINFORCING / REINFORCEMENT |
186
+ | `REQ'D` | REQUIRED |
187
+ | `RET` | RETAINING |
188
+ | `RM` | ROOM |
189
+ | `RO` | ROUGH OPENING |
190
+ | `SCHED` | SCHEDULE |
191
+ | `SECT` | SECTION |
192
+ | `SF` | SQUARE FEET |
193
+ | `SHT` | SHEET |
194
+ | `SHTHG` | SHEATHING |
195
+ | `SIM` | SIMILAR |
196
+ | `SLBB` | SHORT LEGS BACK-TO-BACK |
197
+ | `SOG` | SLAB ON GRADE |
198
+ | `SPCG` | SPACING |
199
+ | `SPECS` | SPECIFICATIONS |
200
+ | `SQ` | SQUARE |
201
+ | `SS` | SELECT STRUCTURAL / STAINLESS STEEL |
202
+ | `SSL` | SHORT SLOTTED HOLES |
203
+ | `STAGG` | STAGGERED |
204
+ | `STD` | STANDARD |
205
+ | `STIFF` | STIFFENER |
206
+ | `STIRR` | STIRRUP |
207
+ | `STL` | STEEL |
208
+ | `STRUCT` | STRUCTURAL |
209
+ | `SYM` | SYMMETRICAL |
210
+ | `T&B` | TOP AND BOTTOM |
211
+ | `T&G` | TONGUE AND GROOVE |
212
+ | `TB` | TIE BEAM |
213
+ | `TEMP` | TEMPORARY / TEMPERATURE |
214
+ | `THK` | THICK / THICKNESS |
215
+ | `THR` | THREADED |
216
+ | `THRU` | THROUGH |
217
+ | `TN` | TOE NAIL |
218
+ | `TOC` | TOP OF CONCRETE / TOP OF CURB |
219
+ | `TOF` | TOP OF FOOTING |
220
+ | `TOS` | TOP OF STEEL / TOP OF SLAB |
221
+ | `TOW` | TOP OF WALL |
222
+ | `TYP` | TYPICAL |
223
+ | `UON` / `UNO` | UNLESS OTHERWISE NOTED |
224
+ | `VERT` (or `V`) | VERTICAL |
225
+ | `VIF` | VERIFY IN FIELD |
226
+ | `W` | WEST |
227
+ | `W/` | WITH |
228
+ | `WD` | WOOD |
229
+ | `WP` | WORK POINT (also WATERPROOF) |
230
+ | `WT` | WEIGHT (also a structural-tee shape — see below) |
231
+ | `WWF` | WELDED WIRE FABRIC |
232
+
233
+ ---
234
+
235
+ ## Structural steel shape designations
236
+
237
+ How a profile label decodes (the label sits on/near the member centerline, usually mid-span):
238
+
239
+ | Designation | Shape |
240
+ |-------------|-------|
241
+ | `W` | Wide-flange (W-shape) — e.g. `W16X26` |
242
+ | `M` | Miscellaneous I-shape |
243
+ | `S` | American Standard (S-shape / "I-beam") |
244
+ | `HP` | Bearing pile (HP-shape) |
245
+ | `C` | American Standard Channel |
246
+ | `MC` | Miscellaneous Channel |
247
+ | `L` | Angle (equal/unequal leg) — e.g. `L4X4X1/4` |
248
+ | `WT` / `MT` / `ST` | Structural Tee (cut from W / M / S) |
249
+ | `HSS` | Hollow Structural Section (rectangular/square/round) — e.g. `HSS6X6X3/8` |
250
+ | `PIPE` | Standard pipe; `PIPE-X` extra-strong; `PIPE-XX` double-extra-strong |
251
+ | `TS` | Tube Steel (older designation for HSS) |
252
+ | `PL` | Plate — e.g. `PL1/2X8` |
253
+
254
+ **Reading the size numbers:**
255
+ - **W/M/S/HP/C/MC and WT/MT/ST:** the trailing number after the `X` IS the weight in **lb/ft (plf)** —
256
+ no table needed. `W16X26` = nominal depth **16"** × **26 lb/ft**; `WT6X25` (a tee cut from a W) =
257
+ **25 lb/ft**; `C12X20.7` = **20.7 lb/ft**. (Tees inherit weight-based naming from their parent
258
+ W/M/S shape.)
259
+ - **HSS / PIPE / L / PL:** the numbers are **dimensions**, not the weight (e.g. `HSS6X6X3/8` =
260
+ 6"×6"×3/8" wall, `L4X4X1/4` = 4"×4"×1/4" leg) — look the weight up in an AISC shapes table
261
+ (or via the `steel-detailer-us` agent).
262
+
263
+ ---
264
+
265
+ ## Note conventions most useful to a takeoff
266
+
267
+ When reading the General Notes and plan notes, these drive member geometry/metadata directly:
268
+
269
+ - **`TYP`** — a value/detail shown once applies to all like conditions. A "TYP" profile or spacing in
270
+ the notes is the **default** for unlabeled members of that kind.
271
+ - **`TOS` / `TOC` / `TOF` / `BOS`** — top/bottom-of-steel/concrete/footing elevations. A plan default
272
+ TOS ("ALL STEEL T.O.S. = 16'-6" UON") sets every member's elevation unless a local callout overrides.
273
+ - **`UON` / `UNO`** — the stated value holds everywhere *unless* a local note says otherwise. Treat a
274
+ "TYP … UON" note as the fallback and watch for the exceptions.
275
+ - **`EQ`** — equally-spaced members between two references (no explicit dimension).
276
+ - **`SIM`** — a detail is repeated similarly elsewhere (mirror/rotate as needed).
277
+ - **`(N)` / `(E)`** — new vs existing. `(E)` members are frequently **out of the new-steel takeoff**;
278
+ confirm against line weight/scope before counting them.
279
+ - **Connection-type words in notes** — `MOMENT`, `DRAG`, `SHEAR`, `BRACED`, `PINNED`, `FIXED` name the
280
+ connection type at member ends; feed them into the member-end connection note + the connection
281
+ library (type → design detail# → platform component).
282
+
283
+ ---
284
+
285
+ ## Marks vs abbreviations (do not confuse)
286
+
287
+ A *mark* identifies a specific member or frame and is defined **by the project's schedules/elevations**,
288
+ not by this glossary:
289
+
290
+ - `MF` / `BF` — Moment Frame / Braced Frame member marks (resolved from the Frame Elevation sheets;
291
+ the AISC size comes from the moment-frame schedule, not from "MF").
292
+ - `D1`, `D2`, `BR1` — brace/diagonal marks.
293
+ - `C1`, `B12`, `G3` — column/beam/girder marks keyed to a schedule.
294
+
295
+ Never expand a mark using this abbreviation list. Resolve it from the frame elevations / column &
296
+ beam schedules, and if unresolved, leave it as an RFI.
@@ -1,5 +1,5 @@
1
1
  app: steel-model
2
- version: 0.2.0
2
+ version: 0.3.0
3
3
  display-name: Steel Model
4
4
  publisher: floless
5
5
  module: steel-detailer
@@ -14,6 +14,10 @@ exposes-as-agent: false
14
14
  # Workflow changelog (FloLess-published). Newest first; the app shows entries newer than the
15
15
  # installed version when offering an update. Plain-English — it surfaces to the user.
16
16
  changelog:
17
+ - version: 0.3.0
18
+ summary: Export your bill of materials as CSV and Excel on Run
19
+ changes:
20
+ - "Added: two export steps at the end that write your bill of materials to a .csv and a real .xlsx file when you Run the workflow — the same figures as the BOM table and the Export buttons, saved to your exports folder automatically. Freeze a step once it's right and Run won't overwrite the file."
17
21
  - version: 0.2.0
18
22
  summary: Filter your drawing down to the steel first
19
23
  changes:
@@ -34,6 +38,7 @@ inputs:
34
38
  requires:
35
39
  - html-report@0.2.x
36
40
  - viewer-3d@0.1.x
41
+ - file@1.0.x
37
42
  layout: linear
38
43
  nodes:
39
44
  # ── node 1: filter — isolate the steel linework (FIRST stage) ─────────────────
@@ -145,7 +150,45 @@ nodes:
145
150
  - { id: m1, profile: W10X33, role: beam, wp: [[0,0],[6000,0]] }
146
151
  - { id: m2, profile: HSS6X6X3/8, role: column, wp: [[0,0],[0,4500]] }
147
152
 
153
+ # ── node 5: csv-export — write the bill of materials to a CSV file ────────────
154
+ # Saves the bill of materials to a .csv file on disk every time you Run the
155
+ # workflow — the same figures and the same file you'd get from the "Export BOM
156
+ # (CSV)" button, but produced by the run so it lands automatically. When you
157
+ # Approve a takeoff, FloLess fills in the finished CSV and points this at your
158
+ # ~/.floless/exports folder; until then it ships a small sample so the step works
159
+ # out of the box. Freeze this node once you're happy and Run won't rewrite the file.
160
+ # (Uses the generic `file/write` verb with the CSV text FloLess generates — so the
161
+ # exported file is byte-for-byte the one the Export button produces, formula-injection
162
+ # guard and all — rather than re-serialising the rows in the runtime.)
163
+ - id: csv-export
164
+ agent: file
165
+ command: write
166
+ safety: { snapshot: false } # writing a file is a write-mode act; an un-frozen run needs a safety block (a frozen node skips the check)
167
+ config:
168
+ path: steel-model-bom.csv # baked to <home>/.floless/exports/steel-model/steel-model-bom.csv on Approve
169
+ encoding: text
170
+ bytes: "Profile,Qty,Length (ft),lb/ft,Weight (lb)\r\nW10X33,4,96,49.1,4714\r\nHSS6X6X3/8,6,54,27.48,1484\r\nTOTAL,10,150,,6198\r\n"
171
+
172
+ # ── node 6: xlsx-export — write the bill of materials to an Excel file ────────
173
+ # Saves the bill of materials to a real .xlsx Excel file every time you Run the
174
+ # workflow — the same figures as the BOM table and the "Export BOM (Excel)" button.
175
+ # Excel files are binary, so FloLess builds the spreadsheet and hands its bytes to
176
+ # this step to land on disk (base64-encoded). When you Approve a takeoff, FloLess
177
+ # fills in the real workbook and points this at your ~/.floless/exports folder; until
178
+ # then it ships a small sample so the step works out of the box. Freeze this node once
179
+ # you're happy and Run won't rewrite the file.
180
+ - id: xlsx-export
181
+ agent: file
182
+ command: write
183
+ safety: { snapshot: false } # writing a file is a write-mode act; an un-frozen run needs a safety block (a frozen node skips the check)
184
+ config:
185
+ path: steel-model-bom.xlsx # baked to <home>/.floless/exports/steel-model/steel-model-bom.xlsx on Approve
186
+ encoding: base64
187
+ bytes: "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"
188
+
148
189
  connections:
149
190
  - { from: filter, to: read }
150
191
  - { from: read, to: view }
151
192
  - { from: view, to: bom }
193
+ - { from: bom, to: csv-export }
194
+ - { from: csv-export, to: xlsx-export }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floless/app",
3
- "version": "0.53.0",
3
+ "version": "0.54.1",
4
4
  "type": "module",
5
5
  "description": "Thin localhost host for floless.app — serves web/ and shells the aware CLI. No engine, no LLM.",
6
6
  "bin": {