@bongos/core 1.20.73 → 1.20.75
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.
- package/.bongos-core.json +66 -46
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +8 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/adr/0359-nobody-sets-a-module-score-by-hand-metic-can-ask-for-a-re-check.md +40 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +185 -3
- package/docs/api-reference.md +5 -3
- package/docs/architecture.md +1 -1
- package/docs/copy-inventory.md +447 -373
- package/docs/copy-registry.json +1157 -468
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +6 -1
- package/docs/page-readings.json +1044 -650
- package/modules/government/catalog.js +3 -0
- package/modules/government/migrations/government_021_module_assessment_rerun.sql +36 -0
- package/modules/provisioning/routes/provisioning.js +35 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/projects.html +589 -63
- package/modules/public-landing/public/projects.probes.json +8 -5
- package/modules/public-landing/public/projects.states.json +19 -14
- package/modules/ui-design/kit/lib.js +4 -2
- package/modules/ui-design/kit/serve.js +5 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/bongos/route-rank-check.js +3 -0
- package/src/bongos/routes/modules.js +27 -0
- package/src/module-api.js +1 -1
- package/tests/module_store_reassess.mjs +120 -0
- package/tests/projects_hub.mjs +9 -5
- package/tests/projects_hub_app_status.mjs +1 -1
- package/tests/projects_hub_app_step.mjs +10 -10
- package/tests/projects_hub_look.mjs +7 -7
- package/tests/projects_hub_module_picker.mjs +9 -9
- package/tests/projects_hub_pre_uat.mjs +2 -1
- package/tests/wizard_demo.mjs +1 -1
- package/tests/wizard_draft_resume.mjs +1 -1
- package/tests/wizard_front_door.mjs +11 -7
- package/tests/wizard_intent_resume.mjs +9 -9
- package/tests/wizard_physics.mjs +264 -0
|
@@ -159,16 +159,19 @@
|
|
|
159
159
|
"steps": [["wait",900],["click","[data-disc-ask]"],["wait",200],["fill","#mDiscName","old-lantern"],["wait",100],["click","[data-disc-yes]"],["wait",900]],
|
|
160
160
|
"expect": {"text":[["#mDisc .addr","This project is being disconnected."],["#mName","old-lantern"]],"hidden":["#mDiscName","[data-disc-ask]"]} },
|
|
161
161
|
{ "name": "the wizard driver (task 1003346): name, type, about, home (fresh; the stub grants repo access, so the new repository is named from the project), address (the handle's verdict), the review as a ledger, then the filing — the done panel with the standup rail and the human steps", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
162
|
-
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
|
|
162
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]],
|
|
163
163
|
"expect": {"visible":["#panel-done","#liveProgress .prog","#liveProgress .prog .stages li.now","#humanSteps li"],"hidden":["#panel-review","#panel-name"],"text":[["#done-h","The drums are rolling"]],"attr":[["#panel-done","class","panel on"]]} },
|
|
164
|
-
{ "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
165
|
-
"steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400]],
|
|
166
|
-
"expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","
|
|
164
|
+
{ "name": "the front door (task 1004417): Proceed is refused until the terms are ticked, the fork's demo door opens the demo's setup and Back returns to the doors, and Begin planet creation goes on, through the four planet-physics questions, to the name step with the rail back", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
165
|
+
"steps": [["wait",600],["click","#panel-terms button[type=submit]"],["wait",300],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",200],["click","#demoBack1"],["wait",200],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]],
|
|
166
|
+
"expect": {"visible":["#panel-name","#view-new .steps","#view-new .steps li.now"],"hidden":["#panel-fork","#panel-terms"],"attr":[["#wizDemo","aria-expanded","false"],["#view-new .steps li.now","data-step","4"]]} },
|
|
167
|
+
{ "name": "planet physics (task 1004418): an existing planet asks what exists and which is main, a country with states asks for one, young builders put the protective ring on the planet and show the age tiers, and an entity gives the planet its core", "auth": true, "width": 1440, "url": "/projects?view=new",
|
|
168
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",100],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"for-profit\"]"],["wait",200]],
|
|
169
|
+
"expect": {"visible":["#panel-physics .physQ[data-q=\"4\"]","#physForms","#physGuard","#physPlanet"],"hidden":["#physIntent","#panel-name"],"attr":[["#physPlanet","src","/assets/world/r3-gold-blob-cut.webp"],["[data-phys=\"entity\"][data-val=\"for-profit\"]","aria-pressed","true"]],"text":[["#physCoords","state existing · home us-ca · builders us + eu · ages 13+ · core organization"]]} },
|
|
167
170
|
{ "name": "the front door at 390: the fork's two doors stack inside one pill and the walk still reaches the name step", "auth": true, "width": 390, "url": "/projects?view=new",
|
|
168
171
|
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]],
|
|
169
172
|
"expect": {"visible":["#panel-fork",".doorPill","#wizDemo","#panel-fork button[type=submit]"],"hidden":["#view-new .steps"]} },
|
|
170
173
|
{ "name": "the wizard driver at 390: the rail folds to two rows of three and the walk still reaches the review", "auth": true, "width": 390, "url": "/projects?view=new",
|
|
171
|
-
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
|
|
174
|
+
"steps": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]],
|
|
172
175
|
"expect": {"visible":["#panel-review","#reviewList li","#doCreate"],"hidden":["#panel-address"],"text":[["#rev-h","Ready to roll"]]} }
|
|
173
176
|
]
|
|
174
177
|
}
|
|
@@ -41,21 +41,26 @@
|
|
|
41
41
|
"in-new-fork": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-fork",".doorPill","#wizDemo",".forkStage",".forkRoutes"],"hidden":["#panel-terms","#view-new .steps","#demoSoon",".bongoCell"]} },
|
|
42
42
|
"in-new-fork-demo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300]], "expect": {"visible":["#panel-fork","#demoSetup","#demoFitVerdict","#demoRing"],"hidden":["#forkIntro","#demoReady"],"attr":[["#wizDemo","aria-expanded","true"]]} },
|
|
43
43
|
"in-new-demo-ready": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#wizDemo"],["wait",300],["click","[data-demo-step=\"hours\"][data-by=\"1\"]"],["click","#demoNext1"],["wait",300]], "expect": {"visible":["#demoReady",".demoLedger","#demoInvite1","#demoInvite2"],"hidden":["#demoSetup","#forkIntro"],"text":[["#demoLHours","5 hours each"]]} },
|
|
44
|
-
"in-new-
|
|
44
|
+
"in-new-physics": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-physics","#physStage","[data-phys-start]"],"hidden":["#panel-fork","#physRail"]} },
|
|
45
|
+
"in-new-physics-state": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"existing\"]"],["click","#physExisting [data-work=\"code\"]"],["click","#physExisting [data-work=\"digital-files\"]"],["wait",200]], "expect": {"visible":["#physExisting","#physDesc","#physRail"],"hidden":["#physStage .physGuard"]} },
|
|
46
|
+
"in-new-physics-geo": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200]], "expect": {"visible":["#physCountry","#physRegionField"]} },
|
|
47
|
+
"in-new-physics-ages": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200]], "expect": {"visible":["#physAges","#physGuard"]} },
|
|
48
|
+
"in-new-physics-entity": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["wait",100],["select","#physRegion","US-CA"],["click","[data-phys=\"builder_geography\"][data-val=\"us-eu\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"true\"]"],["wait",200],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["wait",200]], "expect": {"visible":["#physIntent","#physHaveEntity"],"hidden":["#physForms"]} },
|
|
49
|
+
"in-new-name": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400]], "expect": {"visible":["#panel-name","#newName","#view-new .steps"],"hidden":["#panel-fork","#panel-terms"]} },
|
|
45
50
|
"out-new": { "auth": false, "url": "/projects?view=new", "expect": { "hidden": ["#qWrap"] } },
|
|
46
|
-
"in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
|
|
47
|
-
"in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
|
|
48
|
-
"in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
|
|
49
|
-
"in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
|
|
50
|
-
"in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
|
|
51
|
-
"in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
|
|
52
|
-
"in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
|
|
53
|
-
"in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
|
|
54
|
-
"in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
|
|
55
|
-
"in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
|
|
56
|
-
"in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
|
|
57
|
-
"in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
|
|
58
|
-
"in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
|
|
51
|
+
"in-new-type": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-type"],"hidden":["#panel-name","#qWrap"]} },
|
|
52
|
+
"in-new-about": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-detail"],"hidden":["#panel-type","#qWrap"]} },
|
|
53
|
+
"in-new-modules": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900]], "expect": {"visible":["#panel-modules","#modQ","#modCards .tpill[aria-pressed=\"true\"]","#modCoreNote"],"hidden":["#panel-detail","#qWrap"]} },
|
|
54
|
+
"in-new-modules-search": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["fill","#modQ","discord"],["wait",200]], "expect": {"visible":["#panel-modules","#modQ"],"value":[["#modQ","discord"]],"count":[["#modCards .tpill",1],["#modCards .tpill[data-mod=\"discord\"]",1]],"text":[["#modFilterNote","Showing 1 of 3. 2 extras are switched on, including any this search is hiding."]]} },
|
|
55
|
+
"in-new-home": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-home"],"hidden":["#panel-detail","#qWrap"]} },
|
|
56
|
+
"in-new-address": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-address"],"hidden":["#panel-home","#qWrap"]} },
|
|
57
|
+
"in-new-app": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-app","#appOpts","#appOptRender"],"hidden":["#panel-address","#panel-review","#qWrap"]} },
|
|
58
|
+
"in-new-app-render": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#appOptRender input"],["wait",300]], "expect": {"visible":["#panel-app","#renderSetup","#f-renderKey","#renderCheck"],"hidden":["#renderWs","#renderSvc","#renderNew"]} },
|
|
59
|
+
"in-new-look": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400]],"expect":{"visible":["#panel-look","#wizLook","#wizLook-chrome-world","#wizTint","#wizLogo",".lookPrev .mh.light",".lookPrev .mh.dark"],"hidden":["#panel-app","#panel-review"]}},
|
|
60
|
+
"in-new-look-custom": {"auth":true,"url":"/projects?view=new","actions":[["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#wizLook-custom"],["wait",200]],"expect":{"visible":["#panel-look","#wizAccent","#wizAccentNote"],"hidden":["#panel-review"]}},
|
|
61
|
+
"in-new-review": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400]], "expect": {"visible":["#panel-review","#reviewList li"],"hidden":["#panel-address","#qWrap"]} },
|
|
62
|
+
"in-new-done": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500]], "expect": {"visible":["#panel-done","#liveProgress .prog","#humanSteps li"],"hidden":["#panel-review","#qWrap"]} },
|
|
63
|
+
"in-new-resume-offer": { "auth": true, "url": "/projects?view=new", "actions": [["wait",600],["click","#termsAck"],["click","#panel-terms button[type=submit]"],["wait",400],["click","#panel-fork button[type=submit]"],["wait",400],["click","#physNext"],["wait",200],["click","[data-phys=\"project_state\"][data-val=\"new\"]"],["click","#physNext"],["wait",500],["select","#physCountry","US"],["click","[data-phys=\"builder_geography\"][data-val=\"global\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"minors_on_board\"][data-val=\"false\"]"],["click","#physNext"],["wait",200],["click","[data-phys=\"entity\"][data-val=\"intent-solo\"]"],["click","#physNext"],["wait",400],["fill","#newName","Mercury"],["click","#panel-name button[type=submit]"],["wait",400],["click","#typeCards .tpill[data-type=\"game\"]"],["click","#panel-type button[type=submit]"],["wait",400],["fill","#f-desc","A co-op farming game where the seasons never repeat."],["click","#teamCards .tpill[data-team=\"small-team\"]"],["click","#panel-detail button[type=submit]"],["wait",900],["click","#panel-modules button[type=submit]"],["wait",400],["click","#panel-home button[type=submit]"],["wait",400],["fill","#f-slug","mercury"],["wait",900],["fill","#f-domain","mercury.example.com"],["wait",200],["click","#panel-address button[type=submit]"],["wait",400],["click","#panel-app button[type=submit]"],["wait",400],["click","#panel-look button[type=submit]"],["wait",400],["click","#doCreate"],["wait",1500],["click","#projTrig"],["wait",350],["click","#menuProjects [data-nav=\"new\"]"],["wait",500]], "expect": {"visible":["#panel-terms","#wizResume","#wizResumeGo"],"hidden":["#panel-done","#panel-name"],"text":[["#wizResumeName","Mercury"]]} },
|
|
59
64
|
"out-map-projects": { "auth": false, "actions": [["click", "#projTrig"], ["wait", 350]], "expect": { "expanded": true, "hidden": ["#menuProjects [data-nav=\"mine\"]"] } },
|
|
60
65
|
"card": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://example.com\"]"], ["wait", 900]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art"]], "visible": ["#cardArt", "#cardFaces", "#cardBuildersFig", "#cardShippedFig", "#cardOpen", "#cardHall"], "text": [["#cardBuilders", "11"], ["#cardShipped", "0"], ["#cardRel", "you build here"], ["#cardRuns", "example.com"], ["#cardFaces .facesMore", "+6"]], "count": [["#cardFaces img", 5]], "href": [["#cardHall", "https://builders.example.com/"]] } },
|
|
61
66
|
"card-noart": { "auth": true, "actions": [["dispatchClick", "#orbField a.worldOrb[data-origin=\"https://emersonian-circles.cloudbongos.com\"]"], ["wait", 600]], "expect": { "dialog": true, "hasClass": [["#projCard", "has-art", false]], "hidden": ["#cardArt", "#cardFaces", "#cardHall"], "visible": ["#cardBuildersFig", "#cardShippedFig", "#cardOpen"], "text": [["#cardShipped", "30+"], ["#cardRel", "you build here"]] } },
|
|
@@ -83,7 +83,7 @@ function sidecarPath(surfaceDir, urlPath, kind) { return path.join(surfaceDir, `
|
|
|
83
83
|
function readJson(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
84
84
|
|
|
85
85
|
// ── the action vocabulary (states + probes) ───────────────────────────────────
|
|
86
|
-
const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'back', 'forward']);
|
|
86
|
+
const ACTIONS = Object.freeze(['click', 'focus', 'press', 'fill', 'wait', 'clickAt', 'clickIfVisible', 'dispatchClick', 'check', 'select', 'back', 'forward']);
|
|
87
87
|
function validateActions(actions, at) {
|
|
88
88
|
if (actions === undefined) return [];
|
|
89
89
|
if (!Array.isArray(actions)) return [`${at}: an array of [op, ...args]`];
|
|
@@ -92,7 +92,7 @@ function validateActions(actions, at) {
|
|
|
92
92
|
const arr = Array.isArray(step) ? step : [step];
|
|
93
93
|
const [op, a, b] = arr;
|
|
94
94
|
if (!ACTIONS.includes(op)) { errors.push(`${at}[${i}]: unknown action "${op}" (one of ${ACTIONS.join(', ')})`); return; }
|
|
95
|
-
if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
|
|
95
|
+
if (['click', 'focus', 'fill', 'clickIfVisible', 'dispatchClick', 'check', 'select'].includes(op) && typeof a !== 'string') errors.push(`${at}[${i}]: ${op} needs a selector`);
|
|
96
96
|
if (op === 'press' && typeof a !== 'string') errors.push(`${at}[${i}]: press needs a key`);
|
|
97
97
|
if (op === 'wait' && !(Number(a) >= 0)) errors.push(`${at}[${i}]: wait needs milliseconds`);
|
|
98
98
|
if (op === 'clickAt' && !(Number(a) >= 0 && Number(b) >= 0)) errors.push(`${at}[${i}]: clickAt needs x y`);
|
|
@@ -120,6 +120,8 @@ async function runActions(page, actions = []) {
|
|
|
120
120
|
case 'check':
|
|
121
121
|
await page.evaluate(([s, on]) => { const el = document.querySelector(s); if (!el) throw new Error('check: nothing matches ' + s); el.checked = on !== false; el.dispatchEvent(new Event('change', { bubbles: true })); }, [a, b]);
|
|
122
122
|
break;
|
|
123
|
+
// a <select>'s option by value (task 1004418: the wizard's country picker); fill cannot set one
|
|
124
|
+
case 'select': await page.selectOption(a, b == null ? '' : String(b)); break;
|
|
123
125
|
case 'back': await page.goBack(); break;
|
|
124
126
|
case 'forward': await page.goForward(); break;
|
|
125
127
|
default: throw new Error(`unknown action "${op}"`);
|
|
@@ -443,6 +443,11 @@ const server = http.createServer((req, res) => {
|
|
|
443
443
|
if (rest === '/me/profile' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => profilePatch(res, body)) : json(res, 401, UNAUTH);
|
|
444
444
|
if (rest === '/me/handle' && req.method === 'PATCH') return AUTH ? readBody(req, (body) => handlePatch(res, body)) : json(res, 401, UNAUTH);
|
|
445
445
|
if (rest === '/provisioning/instances' && req.method === 'GET') return AUTH ? instances(res, null, false) : json(res, 401, UNAUTH);
|
|
446
|
+
// the planet-physics questions' pre-create check (task 1004418): nothing stops and no
|
|
447
|
+
// option is limited here — the kit carries neither the server's screen nor its table
|
|
448
|
+
if (rest === '/provisioning/physics-check' && req.method === 'POST') {
|
|
449
|
+
return AUTH ? json(res, 200, { stop: false, message: null, soft_limits: { enforced: false, limits: [] } }) : json(res, 401, UNAUTH);
|
|
450
|
+
}
|
|
446
451
|
// where a project's app runs (task 1004353): the status read, from a fixture keyed by
|
|
447
452
|
// project id — a project the fixture does not name has no platform chosen
|
|
448
453
|
const appRead = rest.match(/^\/provisioning\/instances\/(\d+)\/render$/);
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.75",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.20.
|
|
9
|
+
"version": "1.20.75",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.75",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -8567,5 +8567,17 @@
|
|
|
8567
8567
|
"id": "1003795",
|
|
8568
8568
|
"text": "There is now an automatic check that free modules are scored exactly like paid ones. If anyone ever makes price affect a module's score, the check fails and points at the line."
|
|
8569
8569
|
}
|
|
8570
|
+
],
|
|
8571
|
+
"1.20.74": [
|
|
8572
|
+
{
|
|
8573
|
+
"id": "1003796",
|
|
8574
|
+
"text": "Nobody can change a module's score by hand. Senior builders can ask for a module to be checked again, with a reason, and the score updates from the fresh check."
|
|
8575
|
+
}
|
|
8576
|
+
],
|
|
8577
|
+
"1.20.75": [
|
|
8578
|
+
{
|
|
8579
|
+
"id": "1004418",
|
|
8580
|
+
"text": "Creating a project now starts with four questions about its \"planet physics\": is it new or already started, where is everyone, will anyone under 18 be building, and what kind of entity is behind it. A planet forms beside the q"
|
|
8581
|
+
}
|
|
8570
8582
|
]
|
|
8571
8583
|
}
|
|
@@ -237,6 +237,9 @@ const EXPECTED_RANKS = {
|
|
|
237
237
|
// pins above — a silent downgrade puts the defense inventory below the trust line.
|
|
238
238
|
// Newly VISIBLE in BV1.R109b (declared multi-line, so previously unpinnable).
|
|
239
239
|
'GET /security/adr': 'metic+archon',
|
|
240
|
+
// Re-running a store version's assessment (task 1003796, ADR 0359) spends a Docs
|
|
241
|
+
// grader call and re-opens the Security gate, so it is pinned to its own atom.
|
|
242
|
+
'POST /store/modules/:key/versions/:version/reassess': 'perm:module.assessment.rerun',
|
|
240
243
|
};
|
|
241
244
|
|
|
242
245
|
// The authz-core route pins (ADR 0174). Paths and the gating atom were renamed
|
|
@@ -402,6 +402,33 @@ module.exports = function buildModulesRouter() {
|
|
|
402
402
|
setImmediate(() => moduleAssessVersion.queueAssessment(result.version.id, { log }));
|
|
403
403
|
}));
|
|
404
404
|
|
|
405
|
+
// POST /api/bongos/store/modules/:key/versions/:version/reassess — a Metic+ person
|
|
406
|
+
// asks for a published version's assessment to run again: the Security gate, the
|
|
407
|
+
// Docs grader, then the score (task 1003796, ADR 0359). There is deliberately no
|
|
408
|
+
// way to SET a score: the owner ruled a person may trigger a re-check, never change
|
|
409
|
+
// the number. A reason is required; the audit middleware records it with who
|
|
410
|
+
// asked. Answers 202 — the run is queued like a publish's.
|
|
411
|
+
router.post('/store/modules/:key/versions/:version/reassess', auth.requireBuilder, auth.requirePermission('module.assessment.rerun'),
|
|
412
|
+
asyncHandler('POST /store/modules/:key/versions/:version/reassess', async (req, res) => {
|
|
413
|
+
if (validateOrRespond(req, res, { reason: { type: 'string', maxLength: 2000 } })) return;
|
|
414
|
+
const { key, version } = req.params;
|
|
415
|
+
if (!KEY_RE.test(key) || !parseVersion(version)) {
|
|
416
|
+
return res.fail('bad_request', { status: 400, message: 'A module key is lowercase kebab-case and a version is exact X.Y.Z.' });
|
|
417
|
+
}
|
|
418
|
+
const reason = String(req.body?.reason || '').trim();
|
|
419
|
+
if (!reason) {
|
|
420
|
+
return res.fail('reason_required', { status: 400, message: 'Say why this version should be checked again, in reason. A re-check runs the automatic assessment; it never sets a score by hand.' });
|
|
421
|
+
}
|
|
422
|
+
const r = await resolveReadable(key, version);
|
|
423
|
+
if (!r.ok) return res.fail(r.code, { status: r.status, message: r.message });
|
|
424
|
+
const queued = moduleAssessVersion.queueAssessment(r.version.id, { log });
|
|
425
|
+
if (!queued) {
|
|
426
|
+
return res.fail('assessment_queue_full', { status: 503, message: 'The assessment queue is full. Try again in a few minutes.' });
|
|
427
|
+
}
|
|
428
|
+
log.info({ versionId: r.version.id, builderId: req.builder.id }, `re-assessment of ${key} ${version} queued`);
|
|
429
|
+
res.status(202).json({ ok: true, queued: true, module_key: key, version, version_id: r.version.id });
|
|
430
|
+
}));
|
|
431
|
+
|
|
405
432
|
// GET /api/bongos/store/entitlements and /store/modules/:key/entitlement — the
|
|
406
433
|
// read side of the entitlement record (task 1003813, ADR 0338 D1). Own-scoped
|
|
407
434
|
// like /me/sessions: the holder is ALWAYS the caller (holder_kind 'builder',
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.20.
|
|
78
|
+
const CORE_VERSION = '1.20.75'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// tests/module_store_reassess.mjs — a Metic+ person can ask for a store version's
|
|
2
|
+
// assessment to run again, and can never set a score by hand (task 1003796,
|
|
3
|
+
// ADR 0359). Drives the real POST /store/modules/:key/versions/:version/reassess
|
|
4
|
+
// handler off the real router (no port, no real DB — pool.js is replaced in the
|
|
5
|
+
// require cache, the module_store_howto.mjs harness), with the assessment queue
|
|
6
|
+
// stubbed so nothing runs npm or a model.
|
|
7
|
+
//
|
|
8
|
+
// Run: node tests/module_store_reassess.mjs
|
|
9
|
+
|
|
10
|
+
import { strict as assert } from 'node:assert';
|
|
11
|
+
import { test } from 'node:test';
|
|
12
|
+
import { createRequire } from 'node:module';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
|
|
17
|
+
const require = createRequire(import.meta.url);
|
|
18
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
19
|
+
|
|
20
|
+
const state = { modules: { weather: { module_key: 'weather', title: 'Weather', author_id: 42, status: 'listed' } }, versions: [{ id: 7, module_key: 'weather', version: '1.2.0', tarball_sha256: 'x', artifact_path: 'weather/weather-1.2.0.tgz', published_at: '2026-09-30T00:00:00Z' }], sql: [] };
|
|
21
|
+
const query = async (sql, params = []) => {
|
|
22
|
+
state.sql.push(sql);
|
|
23
|
+
if (/FROM store_modules WHERE module_key = \$1/.test(sql)) {
|
|
24
|
+
const m = state.modules[params[0]]; return { rows: m ? [m] : [] };
|
|
25
|
+
}
|
|
26
|
+
if (/FROM store_module_versions WHERE module_key = \$1 AND version = \$2/.test(sql)) {
|
|
27
|
+
return { rows: state.versions.filter((v) => v.module_key === params[0] && v.version === params[1]) };
|
|
28
|
+
}
|
|
29
|
+
return { rows: [] };
|
|
30
|
+
};
|
|
31
|
+
const poolPath = require.resolve('../src/bongos/pool.js');
|
|
32
|
+
require.cache[poolPath] = { id: poolPath, filename: poolPath, loaded: true, exports: { pool: { connect: async () => ({ query, release() {} }), query } } };
|
|
33
|
+
|
|
34
|
+
const moduleAssessVersion = require('../scripts/gds/module-assess-version.js');
|
|
35
|
+
const queued = [];
|
|
36
|
+
let queueAccepts = true;
|
|
37
|
+
moduleAssessVersion.queueAssessment = (id) => { queued.push(id); return queueAccepts; };
|
|
38
|
+
const buildModulesRouter = require('../src/bongos/routes/modules.js');
|
|
39
|
+
|
|
40
|
+
const PATH = '/store/modules/:key/versions/:version/reassess';
|
|
41
|
+
function handlerFor(router) {
|
|
42
|
+
const layer = router.stack.find((l) => l.route && l.route.path === PATH && l.route.methods.post);
|
|
43
|
+
assert.ok(layer, `no POST ${PATH} on the router`);
|
|
44
|
+
const stack = layer.route.stack;
|
|
45
|
+
return { handle: stack[stack.length - 1].handle, depth: stack.length };
|
|
46
|
+
}
|
|
47
|
+
async function invoke(handle, { key = 'weather', version = '1.2.0', body = {} } = {}) {
|
|
48
|
+
const res = {
|
|
49
|
+
statusCode: 200, body: undefined,
|
|
50
|
+
json(b) { this.body = b; return this; },
|
|
51
|
+
status(c) { this.statusCode = c; return this; },
|
|
52
|
+
set() { return this; },
|
|
53
|
+
fail(code, opts, details) { const o = typeof opts === 'number' ? { status: opts, details } : (opts || {}); this.statusCode = o.status; this.body = { error: code, ...o }; return this; },
|
|
54
|
+
};
|
|
55
|
+
let nextErr = null;
|
|
56
|
+
await handle({ params: { key, version }, body, builder: { id: 3 } }, res, (err) => { nextErr = err; });
|
|
57
|
+
if (nextErr) throw nextErr;
|
|
58
|
+
return res;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const { handle, depth } = handlerFor(buildModulesRouter());
|
|
62
|
+
|
|
63
|
+
test('the route is gated by its own Metic+ atom, granted to metic and archon', () => {
|
|
64
|
+
assert.ok(depth >= 3, 'requireBuilder + requirePermission sit in front of the handler');
|
|
65
|
+
const src = fs.readFileSync(path.join(ROOT, 'src/bongos/routes/modules.js'), 'utf8');
|
|
66
|
+
assert.match(src, /router\.post\('\/store\/modules\/:key\/versions\/:version\/reassess', auth\.requireBuilder, auth\.requirePermission\('module\.assessment\.rerun'\)/);
|
|
67
|
+
const { byKey } = require('../modules/government/catalog.js');
|
|
68
|
+
const p = byKey('module.assessment.rerun');
|
|
69
|
+
assert.equal(p.floor, 'metic');
|
|
70
|
+
assert.equal(p.system, false);
|
|
71
|
+
const mig = fs.readFileSync(path.join(ROOT, 'modules/government/migrations/government_021_module_assessment_rerun.sql'), 'utf8');
|
|
72
|
+
for (const rank of ['metic', 'archon']) assert.match(mig, new RegExp(`SELECT '${rank}', unnest\\(ARRAY\\[\\s*'module\\.assessment\\.rerun'`));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('a re-check with a reason is queued and answers 202', async () => {
|
|
76
|
+
queued.length = 0;
|
|
77
|
+
const res = await invoke(handle, { body: { reason: 'the grader was down when this was published' } });
|
|
78
|
+
assert.equal(res.statusCode, 202);
|
|
79
|
+
assert.deepEqual(res.body, { ok: true, queued: true, module_key: 'weather', version: '1.2.0', version_id: 7 });
|
|
80
|
+
assert.deepEqual(queued, [7]);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test('no reason, no re-check', async () => {
|
|
84
|
+
queued.length = 0;
|
|
85
|
+
for (const body of [{}, { reason: '' }, { reason: ' ' }]) {
|
|
86
|
+
const res = await invoke(handle, { body });
|
|
87
|
+
assert.equal(res.statusCode, 400);
|
|
88
|
+
assert.equal(res.body.error, 'reason_required');
|
|
89
|
+
}
|
|
90
|
+
assert.equal(queued.length, 0);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test('a score can never be set by hand: a score in the body is refused, and nothing writes a score row', async () => {
|
|
94
|
+
queued.length = 0;
|
|
95
|
+
state.sql.length = 0;
|
|
96
|
+
const res = await invoke(handle, { body: { reason: 'r', overall: 100 } });
|
|
97
|
+
assert.equal(res.statusCode, 400, 'only `reason` is accepted');
|
|
98
|
+
assert.equal(queued.length, 0);
|
|
99
|
+
const ok = await invoke(handle, { body: { reason: 'r' } });
|
|
100
|
+
assert.equal(ok.statusCode, 202);
|
|
101
|
+
assert.deepEqual(queued, [7], 'it only queues the automatic assessment');
|
|
102
|
+
assert.ok(state.sql.every((q) => !/module_assessment_scores|module_assessment_signals/.test(q)), 'the route itself writes no score or signal');
|
|
103
|
+
const src = fs.readFileSync(path.join(ROOT, 'src/bongos/routes/modules.js'), 'utf8');
|
|
104
|
+
assert.doesNotMatch(src, /module_assessment_scores/, 'no store route writes a score row');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('a bad key or version, an unknown version, and a full queue are refused', async () => {
|
|
108
|
+
queued.length = 0;
|
|
109
|
+
assert.equal((await invoke(handle, { key: 'Bad_Key', body: { reason: 'r' } })).statusCode, 400);
|
|
110
|
+
assert.equal((await invoke(handle, { version: '1.2', body: { reason: 'r' } })).statusCode, 400);
|
|
111
|
+
const missing = await invoke(handle, { version: '9.9.9', body: { reason: 'r' } });
|
|
112
|
+
assert.equal(missing.statusCode, 404);
|
|
113
|
+
assert.equal(missing.body.error, 'version_not_found');
|
|
114
|
+
assert.equal(queued.length, 0);
|
|
115
|
+
queueAccepts = false;
|
|
116
|
+
const full = await invoke(handle, { body: { reason: 'r' } });
|
|
117
|
+
queueAccepts = true;
|
|
118
|
+
assert.equal(full.statusCode, 503);
|
|
119
|
+
assert.equal(full.body.error, 'assessment_queue_full');
|
|
120
|
+
});
|
package/tests/projects_hub.mjs
CHANGED
|
@@ -696,7 +696,10 @@ test('the About step is OFFERED by every form and can be walked past — the ski
|
|
|
696
696
|
test('the About answers travel on the create request, and an empty one is OMITTED not blanked', () => {
|
|
697
697
|
assert.match(SCRIPT, /description: String\(state\.description \|\| ''\)\.trim\(\) \|\| undefined/,
|
|
698
698
|
'a skipped description is absent from the body — an empty string would read as answered');
|
|
699
|
-
|
|
699
|
+
// task 1004418: createDetail() builds the detail, adding the team shape only when it
|
|
700
|
+
// was answered and omitting the whole detail when nothing was
|
|
701
|
+
assert.match(SCRIPT, /detail: createDetail\(\),/);
|
|
702
|
+
assert.match(SCRIPT, /if \(state\.teamShape\) d\.team_shape = state\.teamShape;\r?\n\s*return Object\.keys\(d\)\.length \? d : undefined;/,
|
|
700
703
|
'and an unanswered team shape is never guessed into the request');
|
|
701
704
|
// the review is the last screen before Create, so the skip's cost is restated there
|
|
702
705
|
const review = (SCRIPT.match(/function renderReview\(\)\s*\{([\s\S]*?)\n \}/) || [, ''])[1];
|
|
@@ -716,8 +719,9 @@ test('a renumbering of the wizard invalidates old drafts — the key carries the
|
|
|
716
719
|
const count = [...panels.matchAll(/\d+:\s*'panel-/g)].length;
|
|
717
720
|
// task 1004417 put the front door's two screens (terms, fork) in front: the sixth renumbering
|
|
718
721
|
// task 1004421 put the Look step between App and Review: the seventh
|
|
719
|
-
|
|
720
|
-
assert.equal(
|
|
722
|
+
// task 1004418 put planet physics right after the fork: the eighth
|
|
723
|
+
assert.equal(count, 14, 'gate + the front door\'s two + ten numbered steps + done — bump DRAFT_KEY when this changes');
|
|
724
|
+
assert.equal(key, 'cb-create-draft-v8', 'and the key moved with the physics step');
|
|
721
725
|
});
|
|
722
726
|
|
|
723
727
|
test('every row lays the same five parts — the ledger has no ragged row', () => {
|
|
@@ -2138,7 +2142,7 @@ test('the wizard takes the world by scope: no card ground, the six-step strip as
|
|
|
2138
2142
|
assert.match(block, /#view-new \.card\{background:none;border-radius:0;box-shadow:none;/, 'no card ground');
|
|
2139
2143
|
// eight tracks since task 1004351 added the App step (seven since 1002339); the count is the
|
|
2140
2144
|
// rail's own, so it moves with the panels map rather than being a magic number
|
|
2141
|
-
assert.match(block, /#view-new \.steps\{display:grid;grid-template-columns:repeat\(
|
|
2145
|
+
assert.match(block, /#view-new \.steps\{display:grid;grid-template-columns:repeat\(10,1fr\);/, 'the strip lays a track per numbered step');
|
|
2142
2146
|
assert.match(block, /#view-new \.steps li::before\{content:"";position:absolute;top:-4px;left:0;right:auto;width:7px;height:7px;/, 'the connector becomes the 7px dot');
|
|
2143
2147
|
assert.match(block, /#view-new \.steps li\.now::before\{background:var\(--accent\);border-color:var\(--accent\);outline:4px solid/, 'the lit step carries the accent and an outline halo');
|
|
2144
2148
|
assert.match(block, /#view-new \.panel h1\{font-weight:300;[^}]*text-transform:lowercase;/, 'the step title in the display voice, lowercase');
|
|
@@ -2185,7 +2189,7 @@ test('the wizard\'s own structures wear the world: hairline fields, cells of one
|
|
|
2185
2189
|
assert.match(block, /\.addrBig code\{display:block;font-family:var\(--font-display\);/, 'the address stands in the display voice');
|
|
2186
2190
|
assert.doesNotMatch(block, /linear-gradient/, 'no tinted plates');
|
|
2187
2191
|
assert.doesNotMatch(block, /box-shadow:(?!none)/, 'no box shadow in the wizard block');
|
|
2188
|
-
assert.match(HUB, /<div class="nav">\s*<button type="button" class="btn ghost" data-back="
|
|
2192
|
+
assert.match(HUB, /<div class="nav">\s*<button type="button" class="btn ghost" data-back="11">← Back<\/button>\s*<button type="button" class="btn big" id="doCreate">Create my project<\/button>/, 'the review\'s doors sit on one row, back then the primary');
|
|
2189
2193
|
assert.match(HUB, /<h2 class="stepsHead" id="doneStepsHead">Your steps — the parts only you can play<\/h2>/, 'the steps heading is the label face by class, not an inline style (the id is where a skipped invite step hands focus on, task 1002346)');
|
|
2190
2194
|
// what is enqueued is unchanged (ADR 0111): the filing body the control plane reads
|
|
2191
2195
|
assert.match(SCRIPT, /body: JSON\.stringify\(\{\s*slug: state\.slug,/, 'the filing still carries the slug first');
|
|
@@ -240,7 +240,7 @@ test('a repaint never lands on top of an open Retry — from this watch or a fre
|
|
|
240
240
|
});
|
|
241
241
|
|
|
242
242
|
test('both surfaces use it: the done panel and the project page', () => {
|
|
243
|
-
assert.match(HUB, /if \(box\) watchApp\(instanceId, box, function \(\) \{ return state\.step ===
|
|
243
|
+
assert.match(HUB, /if \(box\) watchApp\(instanceId, box, function \(\) \{ return state\.step === 13; \}, 5000\);/);
|
|
244
244
|
assert.match(HUB, /<div id="doneApp" hidden><\/div>/);
|
|
245
245
|
assert.match(HUB, /<div class="card mSec" id="mAppCard" hidden>\n\s*<h2>Where its app runs<\/h2>\n\s*<div id="mApp"><\/div>/);
|
|
246
246
|
assert.match(HUB, /loadAppStatus\(inst\.id \|\| asked, inst\);/);
|
|
@@ -144,18 +144,18 @@ test('the panel is real markup: Render and Decide later, Decide later the defaul
|
|
|
144
144
|
assert.doesNotMatch(PANEL, /Coming soon/, 'and is no longer marked soon');
|
|
145
145
|
assert.match(PANEL, /<input type="radio" name="appPlatform" value="later" checked>/, 'Decide later is the default');
|
|
146
146
|
assert.match(PANEL, /We host your Builders' hall/, 'the step says the hall is ours to host (ADR 0345 D1), in the page\'s one spelling of it');
|
|
147
|
-
assert.match(PANEL, /<form data-next="
|
|
148
|
-
assert.match(PANEL, /data-back="
|
|
147
|
+
assert.match(PANEL, /<form data-next="11">/, 'Next leads to the Look step (task 1004421), then the review');
|
|
148
|
+
assert.match(PANEL, /data-back="9"/, 'Back returns to the address step');
|
|
149
149
|
});
|
|
150
150
|
|
|
151
151
|
test('the step sits between Address and the Look step in the panels map and on the rail', () => {
|
|
152
|
-
assert.match(HUB, /
|
|
153
|
-
assert.match(HUB, /<li data-step="
|
|
154
|
-
assert.match(HUB, /<li data-step="
|
|
155
|
-
assert.match(HUB, /<li data-step="
|
|
156
|
-
assert.match(HUB, /data-back="
|
|
157
|
-
assert.match(HUB, /if \(step ===
|
|
158
|
-
assert.match(HUB, /if \(step ===
|
|
152
|
+
assert.match(HUB, /9: 'panel-address', 10: 'panel-app', 11: 'panel-look', 12: 'panel-review', 13: 'panel-done'/);
|
|
153
|
+
assert.match(HUB, /<li data-step="10"><span class="snum">8<\/span><span class="slbl">App<\/span><\/li>/);
|
|
154
|
+
assert.match(HUB, /<li data-step="11"><span class="snum">9<\/span><span class="slbl">Look<\/span><\/li>/);
|
|
155
|
+
assert.match(HUB, /<li data-step="12"><span class="snum">10<\/span><span class="slbl">Create<\/span><\/li>/);
|
|
156
|
+
assert.match(HUB, /data-back="11">← Back<\/button>\r?\n\s*<button type="button" class="btn big" id="doCreate">/, "the review's Back returns to the Look step");
|
|
157
|
+
assert.match(HUB, /if \(step === 10\) \{ syncAppStep\(\); syncRenderSetup\(\); \}\r?\n\s*if \(step === 11\) renderLook\(\);\r?\n\s*if \(step === 12\) renderReview\(\);/, 'entering the step repaints it, Render setup included');
|
|
158
|
+
assert.match(HUB, /if \(step === 10\) return validateRender\(\);/, 'Next on the step runs the Render check');
|
|
159
159
|
});
|
|
160
160
|
|
|
161
161
|
test('a fresh draft reads "decide later", and the Render setup stays hidden', () => {
|
|
@@ -489,5 +489,5 @@ test('the review names exactly what was chosen, prices included', () => {
|
|
|
489
489
|
});
|
|
490
490
|
|
|
491
491
|
test('Create hands the app to Render straight after the project is filed', () => {
|
|
492
|
-
assert.match(HUB, /show\(
|
|
492
|
+
assert.match(HUB, /show\(13, true\);\r?\n\s*sendRenderSetup\(data\.instance && data\.instance\.id\);/);
|
|
493
493
|
});
|