<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://wiki.seedburysquare.com:80/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mgm-seedbury</id>
	<title>Seedbury Square - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.seedburysquare.com:80/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mgm-seedbury"/>
	<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/Special:Contributions/Mgm-seedbury"/>
	<updated>2026-07-17T15:38:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=228</id>
		<title>Global user settings json</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=228"/>
		<updated>2026-04-13T15:27:36Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {&lt;br /&gt;
    &amp;quot;editor.detectIndentation&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.insertSpaces&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.formatOnSave&amp;quot;: true,&lt;br /&gt;
    &amp;quot;js/ts.format.semicolons&amp;quot;: &amp;quot;insert&amp;quot;,&lt;br /&gt;
    &amp;quot;js/ts.preferences.quoteStyle&amp;quot;: &amp;quot;single&amp;quot;,&lt;br /&gt;
    &amp;quot;js/ts.preferences.importModuleSpecifierEnding&amp;quot;: &amp;quot;js&amp;quot;,&lt;br /&gt;
    &amp;quot;editor.codeActionsOnSave&amp;quot;: {&lt;br /&gt;
        &amp;quot;source.organizeImports&amp;quot;: &amp;quot;always&amp;quot;,&lt;br /&gt;
        &amp;quot;source.addMissingImports.ts&amp;quot;: &amp;quot;always&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;file.trimTrailingWhitespace&amp;quot;: true&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=227</id>
		<title>Global user settings json</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=227"/>
		<updated>2026-03-30T14:51:59Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {&lt;br /&gt;
    &amp;quot;editor.detectIndentation&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.insertSpaces&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.formatOnSave&amp;quot;: true,&lt;br /&gt;
    &amp;quot;js/ts.format.semicolons&amp;quot;: &amp;quot;insert&amp;quot;,&lt;br /&gt;
    &amp;quot;js/ts.preferences.quoteStyle&amp;quot;: &amp;quot;single&amp;quot;,&lt;br /&gt;
    &amp;quot;js/ts.preferences.importModuleSpecifierEnding&amp;quot;: &amp;quot;js&amp;quot;,&lt;br /&gt;
    &amp;quot;editor.codeActionsOnSave&amp;quot;: {&lt;br /&gt;
        &amp;quot;source.organizeImports&amp;quot;: &amp;quot;always&amp;quot;,&lt;br /&gt;
        &amp;quot;source.addMissingImports.ts&amp;quot;: &amp;quot;always&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Bs-config.js_code&amp;diff=226</id>
		<title>Bs-config.js code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Bs-config.js_code&amp;diff=226"/>
		<updated>2026-01-27T19:59:23Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot;&amp;lt;pre&amp;gt; module.exports = {     proxy: &amp;quot;http://localhost:1338/&amp;quot;,     ws: true,     port: 3000,     ui: { port: 3002 },     open: false,     logLevel: &amp;quot;debug&amp;quot;,     files: [         &amp;quot;api/src/webServer/ui/src/components/pillboxWithHeading/PillboxWithHeading.js&amp;quot;,         &amp;quot;api/src/webServer/ui/src//*.{html,css,js,ts,tsx,jsx,json,svg,png,jpg}&amp;quot;     ],     watchOptions: {         usePolling: true,         interval: 200,         binaryInterval: 300,         ignored: [&amp;quot;/node_modules/...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
module.exports = {&lt;br /&gt;
    proxy: &amp;quot;http://localhost:1338/&amp;quot;,&lt;br /&gt;
    ws: true,&lt;br /&gt;
    port: 3000,&lt;br /&gt;
    ui: { port: 3002 },&lt;br /&gt;
    open: false,&lt;br /&gt;
    logLevel: &amp;quot;debug&amp;quot;,&lt;br /&gt;
    files: [&lt;br /&gt;
        &amp;quot;api/src/webServer/ui/src/components/pillboxWithHeading/PillboxWithHeading.js&amp;quot;,&lt;br /&gt;
        &amp;quot;api/src/webServer/ui/src//*.{html,css,js,ts,tsx,jsx,json,svg,png,jpg}&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    watchOptions: {&lt;br /&gt;
        usePolling: true,&lt;br /&gt;
        interval: 200,&lt;br /&gt;
        binaryInterval: 300,&lt;br /&gt;
        ignored: [&amp;quot;/node_modules/&amp;quot;, &amp;quot;/.git/**&amp;quot;]&lt;br /&gt;
    },&lt;br /&gt;
    reloadDelay: 500,&lt;br /&gt;
    reloadDebounce: 300&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=225</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=225"/>
		<updated>2026-01-27T19:58:55Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: /* Running the app with debugger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &amp;lt;code&amp;gt;git config --global credential.helper store&amp;lt;/code&amp;gt;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Run &amp;lt;code&amp;gt;git config --global user.name &amp;quot;YOUR_NAME_HERE&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;git config --global user.email &amp;quot;YOUR_EMAIL_HERE&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &amp;lt;code&amp;gt;git clone PASTE_HTTP_LINK_HERE&amp;lt;/code&amp;gt;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &amp;lt;code&amp;gt;export default { group: 0, id: &#039;dev0&#039;};&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a launch.json file.&lt;br /&gt;
# Press enter to select the default option (Node.js).&lt;br /&gt;
# In that file, paste the code in [[launch.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
# In that folder, create another file named bs-config.js and paste the code in [[bs-config.js code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;br /&gt;
&lt;br /&gt;
The connection information can be found in envSettings.js under graphDatabaseSettings&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Launch.json_code&amp;diff=224</id>
		<title>Launch.json code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Launch.json_code&amp;diff=224"/>
		<updated>2026-01-27T19:57:59Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
	&amp;quot;configurations&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Tools: BrowserSync&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
			&amp;quot;noDebug&amp;quot;: true,&lt;br /&gt;
			&amp;quot;runtimeExecutable&amp;quot;: &amp;quot;npx&amp;quot;,&lt;br /&gt;
			&amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
				&amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
				&amp;quot;start&amp;quot;,&lt;br /&gt;
				&amp;quot;--config&amp;quot;,&lt;br /&gt;
				&amp;quot;.vscode/bs-config.js&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
			&amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
			&amp;quot;internalConsoleOptions&amp;quot;: &amp;quot;neverOpen&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
			&amp;quot;program&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;,&lt;br /&gt;
			&amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,&lt;br /&gt;
			&amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
				&amp;quot;--inspect=9229&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;env&amp;quot;: {&lt;br /&gt;
				&amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
			&amp;quot;restart&amp;quot;: true,&lt;br /&gt;
			&amp;quot;autoAttachChildProcesses&amp;quot;: true,&lt;br /&gt;
			&amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
				&amp;quot;&amp;lt;node_internals&amp;gt;/**&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Server: Nodemon (inspect)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
			&amp;quot;runtimeExecutable&amp;quot;: &amp;quot;npx&amp;quot;,&lt;br /&gt;
			&amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
				&amp;quot;nodemon&amp;quot;,&lt;br /&gt;
				&amp;quot;--inspect=9229&amp;quot;,&lt;br /&gt;
				&amp;quot;--ignore&amp;quot;,&lt;br /&gt;
				&amp;quot;webServer/ui/**&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;args&amp;quot;: [&lt;br /&gt;
				&amp;quot;webServer/webserver.js&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src&amp;quot;,&lt;br /&gt;
			&amp;quot;env&amp;quot;: {&lt;br /&gt;
				&amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
			&amp;quot;restart&amp;quot;: true,&lt;br /&gt;
			&amp;quot;autoAttachChildProcesses&amp;quot;: true,&lt;br /&gt;
			&amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
				&amp;quot;&amp;lt;node_internals&amp;gt;/**&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Client: Chrome (direct 1338)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
			&amp;quot;url&amp;quot;: &amp;quot;http://localhost:1338&amp;quot;,&lt;br /&gt;
			&amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/ui/src&amp;quot;,&lt;br /&gt;
			&amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
				&amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Client: Chrome (BrowserSync 3000)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
			&amp;quot;url&amp;quot;: &amp;quot;http://localhost:3000&amp;quot;,&lt;br /&gt;
			&amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/ui/src&amp;quot;,&lt;br /&gt;
			&amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
				&amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Attach: Node (9229)&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
			&amp;quot;request&amp;quot;: &amp;quot;attach&amp;quot;,&lt;br /&gt;
			&amp;quot;port&amp;quot;: 9229,&lt;br /&gt;
			&amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
				&amp;quot;&amp;lt;node_internals&amp;gt;/**&amp;quot;&lt;br /&gt;
			]&lt;br /&gt;
		}&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;compounds&amp;quot;: [&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + BrowserSync + Chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;configurations&amp;quot;: [&lt;br /&gt;
				&amp;quot;Server: Nodemon (inspect)&amp;quot;,&lt;br /&gt;
				&amp;quot;Tools: BrowserSync&amp;quot;,&lt;br /&gt;
				&amp;quot;Client: Chrome (BrowserSync 3000)&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Dev: Server + Chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;configurations&amp;quot;: [&lt;br /&gt;
				&amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
				&amp;quot;Client: Chrome (direct 1338)&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + Chrome&amp;quot;,&lt;br /&gt;
			&amp;quot;configurations&amp;quot;: [&lt;br /&gt;
				&amp;quot;Server: Nodemon (inspect)&amp;quot;,&lt;br /&gt;
				&amp;quot;Client: Chrome (direct 1338)&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
		}&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=223</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=223"/>
		<updated>2026-01-14T14:42:56Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories: parentProps, required parameters, and optional parameters.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;(parentProps is being phased out and being replaced with the static &amp;quot;methods&amp;quot; property of the Application class, eventually all classes will only have the params object as single parameter)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
==== Objects and Arrays as parameters ====&lt;br /&gt;
Something to keep in mind specifically when handling objects and arrays as parameters is to clone them as soon as they are received and when they are returned in a getter.&lt;br /&gt;
&lt;br /&gt;
This creates an exact copy, but with a different reference to memory. This will allow the class to mutate the object/array if needed without breaking any logic outside of itself. It also allows editing the object/array outside the class after sending it as an argument without changing it inside the class in question. This will make debugging more straightforward, as all changes to the object/array used in the class were made in the same class.&lt;br /&gt;
&lt;br /&gt;
To do this, use cloneObj(object/array).&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement or utility that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789, { refresh: true })&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789, refresh: true })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to pinpoint bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. The method will usually just return the private value, but in certain circumstances may do some verifications or changes first. If the value to be returned is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName. It usually receives a single argument, which is the value to be set. It may have more parameters to indicate if some callback should me invoked or status must be changed. This method verifies that the value received is valid and assigns it to the internal private property. If the value to be set is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
== Handling Service Responses ==&lt;br /&gt;
When consuming a service from the backend, it should be treated as a Promise. All these services will have a .then() and .catch().&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=222</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=222"/>
		<updated>2026-01-09T21:01:38Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories: parentProps, required parameters, and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
==== Objects and Arrays as parameters ====&lt;br /&gt;
Something to keep in mind specifically when handling objects and arrays as parameters is to clone them as soon as they are received and when they are returned in a getter.&lt;br /&gt;
&lt;br /&gt;
This creates an exact copy, but with a different reference to memory. This will allow the class to mutate the object/array if needed without breaking any logic outside of itself. It also allows editing the object/array outside the class after sending it as an argument without changing it inside the class in question. This will make debugging more straightforward, as all changes to the object/array used in the class were made in the same class.&lt;br /&gt;
&lt;br /&gt;
To do this, use cloneObj(object/array).&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement or utility that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789, { refresh: true })&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789, refresh: true })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to pinpoint bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. The method will usually just return the private value, but in certain circumstances may do some verifications or changes first. If the value to be returned is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName. It usually receives a single argument, which is the value to be set. It may have more parameters to indicate if some callback should me invoked or status must be changed. This method verifies that the value received is valid and assigns it to the internal private property. If the value to be set is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
== Handling Service Responses ==&lt;br /&gt;
When consuming a service from the backend, it should be treated as a Promise. All these services will have a .then() and .catch().&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=217</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=217"/>
		<updated>2026-01-07T16:01:05Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories: parentProps, required parameters, and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
==== Objects and Arrays as parameters ====&lt;br /&gt;
Something to keep in mind specifically when handling objects and arrays as parameters is to clone them as soon as they are received and when they are returned in a getter.&lt;br /&gt;
&lt;br /&gt;
This creates an exact copy, but with a different reference to memory. This will allow the class to mutate the object/array if needed without breaking any logic outside of itself. It also allows editing the object/array outside the class after sending it as an argument without changing it inside the class in question. This will make debugging more straightforward, as all changes to the object/array used in the class were made in the same class.&lt;br /&gt;
&lt;br /&gt;
To do this, use cloneObj(object/array).&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement or utility that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789, { refresh: true })&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789, refresh: true })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to pinpoint bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. The method will usually just return the private value, but in certain circumstances may do some verifications or changes first. If the value to be returned is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName. It usually receives a single argument, which is the value to be set. It may have more parameters to indicate if some callback should me invoked or status must be changed. This method verifies that the value received is valid and assigns it to the internal private property. If the value to be set is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
== Handling Service Responses ==&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=216</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=216"/>
		<updated>2026-01-07T15:25:11Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories: parentProps, required parameters, and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
==== Objects and Arrays as parameters ====&lt;br /&gt;
Something to keep in mind specifically when handling objects and arrays as arguments is to clone them as soon as they are received and when they are returned in a getter.&lt;br /&gt;
&lt;br /&gt;
This creates an exact copy, but with a different reference to memory. This will allow the class to mutate the object/array if needed without breaking any logic outside of itself. It also allows editing the object/array outside the class after sending it as an argument without changing it inside the class in question. This will make debugging more straightforward, as all changes to the object/array used in the class were made in the same class.&lt;br /&gt;
&lt;br /&gt;
To do this, use cloneObj(object/array).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789)&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789 })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to pinpoint bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. The method will usually just return the private value, but in certain circumstances may do some verifications or changes first. If the value to be returned is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName. It usually receives a single argument, which is the value to be set. It may have more parameters to indicate if some callback should me invoked or status must be changed. This method verifies that the value received is valid and assigns it to the internal private property. If the value to be set is an object or array, it should be cloned as outlined above.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=215</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=215"/>
		<updated>2026-01-07T15:24:53Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories, parentProps, required parameters and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
==== Objects and Arrays as parameters ====&lt;br /&gt;
Something to keep in mind specifically when handling objects and arrays as arguments is to clone them as soon as they are received and when they are returned in a getter.&lt;br /&gt;
&lt;br /&gt;
This creates an exact copy, but with a different reference to memory. This will allow the class to mutate the object/array if needed without breaking any logic outside of itself. It also allows editing the object/array outside the class after sending it as an argument without changing it inside the class in question. This will make debugging more straightforward, as all changes to the object/array used in the class were made in the same class.&lt;br /&gt;
&lt;br /&gt;
To do this, use cloneObj(object/array).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789)&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789 })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to pinpoint bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. The method will usually just return the private value, but in certain circumstances may do some verifications or changes first. If the value to be returned is an object or array, it should be cloned as outlined above.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName. It usually receives a single argument, which is the value to be set. It may have more parameters to indicate if some callback should me invoked or status must be changed. This method verifies that the value received is valid and assigns it to the internal private property. If the value to be set is an object or array, it should be cloned as outlined above.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=214</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=214"/>
		<updated>2026-01-07T13:05:31Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories, parentProps, required parameters and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class or function is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the possibility of an undefined value will be explicitly and intentionally handled. Some examples of correct default values for optional parameters include (but are not limited to):&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes and functions are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class or function is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object and all of the parameters are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value should not be included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;br /&gt;
&lt;br /&gt;
=== Methods and other functions ===&lt;br /&gt;
==== Parameter Structure ====&lt;br /&gt;
While classes will strictly adhere to the parentProps + paramsObject structure, methods and other functions (helpers or baseElements) will require a case by case analysis to determine the structure of parameters. A destructured object as the sole parameter should be the starting point; analyzing the behavior of the function and the most common way it will be invoked will inform any changes to be made. Some patterns to be considered when moving away from the sole object parameters are:&lt;br /&gt;
* The method is a setter - it clearly states in the name what the value sent will be, and it should never be called without a specific value available. In this case it makes sense to have a singular required parameter followed by the destructured object of optional parameters (if any). Example:&lt;br /&gt;
 setChecked(checked, { executeCallback, disable = false } = {}) { }&lt;br /&gt;
 setEntity(entity) { }&lt;br /&gt;
* The function is a baseElement that will receive a value in the overwhelming majority majority of cases. Example:&lt;br /&gt;
 getParagraph(string, { size = &#039;medium&#039;, bold = false } = {}) { }&lt;br /&gt;
* The function has a clear purpose that requires more than one required parameter and the label of those parameters is trivial. Example:&lt;br /&gt;
 addNumbers(number1, number2, { optional } = {}) { }&lt;br /&gt;
&lt;br /&gt;
This does not mean that all required parameters in methods and functions go outside the destructured object. Even while being required, having them inside the params object forces the parameter to be clearly labeled, improving legibility. Example:&lt;br /&gt;
 addTeamMemberToProject(123, 456, 789)&lt;br /&gt;
vs&lt;br /&gt;
 addTeamMemberToProject({ teamMemberId: 123, projectId: 456, selfEntityId: 789 })&lt;br /&gt;
&lt;br /&gt;
==== Amount of Parameters ====&lt;br /&gt;
Something to consider in methods and functions specifically is an appropriate amount of parameters.&lt;br /&gt;
&lt;br /&gt;
As a general rule of thumb if a function has more than 3 required parameters, it is likely to be doing too many things. Functions should address a singular objective, and if they are growing to the point of needing more than 3 required parameters, chances are it is due for a refactor and breaking that functionality into more than 1 function/method.&lt;br /&gt;
&lt;br /&gt;
== Private properties and methods ==&lt;br /&gt;
Making properties and methods of classes private grants us a higher level of code security and discourages using functions and variables intended only for internal logic outside the class, possibly editing by reference, breaking internal logic, and introducing hard to track bugs. It makes the decision to allow certain methods to be used outside the class intentional.&lt;br /&gt;
&lt;br /&gt;
In general, all properties should be private (except for the .view property, which should be public but read-only) and if a certain value is used outside of the class a getter and a setter function is created.&lt;br /&gt;
=== Getters and Setters ===&lt;br /&gt;
When a private value needs to be read outside of the class, a getter method is created. It is always named get+variableName. Getter methods usually have no parameters. If the value to be read is an array or an object, it should be cloned before returning, creating a new identical object but with a different pointer. This way, if another class uses the getter method of this class, it can modify it for their own use without mutating the object used internally in this class, possibly causing bugs.&lt;br /&gt;
&lt;br /&gt;
When a private value needs to be mutated from the outside, a setter method is created. It is always named set+variableName.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=213</id>
		<title>Bash aliases code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=213"/>
		<updated>2026-01-05T20:19:29Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; alias edit=&amp;quot;code ~/.bash_aliases&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 function mergeFrom() {&lt;br /&gt;
    currentBranch=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
    git checkout &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
    git pull&lt;br /&gt;
    git checkout &amp;quot;${2:-$currentBranch}&amp;quot;&lt;br /&gt;
    git merge &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function commitAndPush(){&lt;br /&gt;
        git add . &amp;amp;&amp;amp; git commit -a -m &amp;quot;$1&amp;quot; &amp;amp;&amp;amp; git push&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 export GITEA_TOKEN=&amp;lt;get token in gitea&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  # ====== MINIMAL GITEA HELPERS (env-driven, non-interactive) ======&lt;br /&gt;
 &lt;br /&gt;
 export DEFAULT_BASE_BRANCH=&amp;quot;${DEFAULT_BASE_BRANCH:-Development}&amp;quot;&lt;br /&gt;
 # Required for real API calls:&lt;br /&gt;
 # export GITEA_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
 # Required repo coordinates (set these once; no parsing logic):&lt;br /&gt;
 export GITEA_BASE=&amp;quot;http://172.31.108.186:3000&amp;quot;  # include subpath if any, no trailing slash&lt;br /&gt;
 # export GITEA_OWNER=&amp;quot;Seedbury_Square&amp;quot;&lt;br /&gt;
 # export GITEA_REPO=&amp;quot;Ksitropy&amp;quot;&lt;br /&gt;
 # Debug without sending requests:&lt;br /&gt;
 # export DRYRUN=1&lt;br /&gt;
 &lt;br /&gt;
 # --- smart environment resolver: uses env if set, otherwise parses remote.origin.url ---&lt;br /&gt;
 __resolve_env() {&lt;br /&gt;
   # Ensure base always exists&lt;br /&gt;
   : &amp;quot;${GITEA_BASE:?ERR: GITEA_BASE must be set (e.g. http://172.31.108.186:3000)}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # If OWNER/REPO already set, skip parsing&lt;br /&gt;
   if [ -n &amp;quot;$GITEA_OWNER&amp;quot; ] &amp;amp;&amp;amp; [ -n &amp;quot;$GITEA_REPO&amp;quot; ]; then&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   # Otherwise, derive from git remote&lt;br /&gt;
   local remote path&lt;br /&gt;
   remote=&amp;quot;$(git config --get remote.origin.url 2&amp;gt;/dev/null)&amp;quot; || {&lt;br /&gt;
     echo &amp;quot;ERR: not a git repo or missing origin remote&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
     return 1&lt;br /&gt;
   }&lt;br /&gt;
   [ -n &amp;quot;$remote&amp;quot; ] || { echo &amp;quot;ERR: remote.origin.url empty&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   # Extract path (Owner/Repo)&lt;br /&gt;
   path=&amp;quot;$(printf &#039;%s&#039; &amp;quot;$remote&amp;quot; | sed -E &#039;s#^[^:]+://[^/]+/##; s#^[^@]+@[^:]+:##&#039;)&amp;quot;&lt;br /&gt;
   path=&amp;quot;${path%.git}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   GITEA_OWNER=&amp;quot;${path%%/*}&amp;quot;&lt;br /&gt;
   GITEA_REPO=&amp;quot;${path##*/}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_env() {&lt;br /&gt;
   __resolve_env || return 1&lt;br /&gt;
   : &amp;quot;${GITEA_OWNER:?ERR: could not resolve OWNER}&amp;quot;&lt;br /&gt;
   : &amp;quot;${GITEA_REPO:?ERR: could not resolve REPO}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_token() { [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ] &amp;amp;&amp;amp; return 0; : &amp;quot;${GITEA_TOKEN:?ERR: set GITEA_TOKEN}&amp;quot;; }&lt;br /&gt;
 __json_num()   { grep -oE &#039;&amp;quot;(index|number)&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&#039; | head -n1 | grep -oE &#039;[0-9]+&#039;; }&lt;br /&gt;
 &lt;br /&gt;
 showRepo() {&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   echo &amp;quot;HOST=${GITEA_BASE%/}&amp;quot;&lt;br /&gt;
   echo &amp;quot;OWNER=$GITEA_OWNER&amp;quot;&lt;br /&gt;
   echo &amp;quot;REPO=$GITEA_REPO&amp;quot;&lt;br /&gt;
   echo -n &amp;quot;API check: &amp;quot;&lt;br /&gt;
   curl -fsS &amp;quot;${GITEA_BASE%/}/api/v1/version&amp;quot; &amp;amp;&amp;amp; echo &amp;quot; (OK)&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeBranch &amp;lt;branch&amp;gt; [base]&lt;br /&gt;
 makeBranch() {&lt;br /&gt;
   local br=&amp;quot;${1:?Usage: makeBranch &amp;lt;branch&amp;gt; [base]}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${2:-$DEFAULT_BASE_BRANCH}&amp;quot;&lt;br /&gt;
   if git rev-parse --verify --quiet &amp;quot;$br&amp;quot; &amp;gt;/dev/null; then&lt;br /&gt;
     git checkout &amp;quot;$br&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     git checkout &amp;quot;$base&amp;quot; || return 1&lt;br /&gt;
     git pull --ff-only || return 1&lt;br /&gt;
     git checkout -b &amp;quot;$br&amp;quot; || return 1&lt;br /&gt;
     git push --set-upstream origin &amp;quot;$br&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeIssue &amp;lt;title&amp;gt; [body] -&amp;gt; prints issue#&lt;br /&gt;
 makeIssue() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makeIssue &amp;lt;title&amp;gt; [body]}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-$title}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;title&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;%s&amp;quot;}&#039; &amp;quot;$title&amp;quot; &amp;quot;$body&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   local resp num&lt;br /&gt;
   resp=&amp;quot;$(curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   num=&amp;quot;$(__json_num &amp;lt;&amp;lt;&amp;lt;&amp;quot;$resp&amp;quot;)&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$num&amp;quot; ] &amp;amp;&amp;amp; { printf &#039;%s\n&#039; &amp;quot;$num&amp;quot;; return 0; }&lt;br /&gt;
   echo &amp;quot;ERR: could not parse issue number&amp;quot; &amp;gt;&amp;amp;2; echo &amp;quot;$resp&amp;quot; &amp;gt;&amp;amp;2; return 1&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;&lt;br /&gt;
 makePRFromCurrent() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${3:-Development}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # ✅ prepend &amp;quot;WIP:&amp;quot; if not already present&lt;br /&gt;
   if [[ ! &amp;quot;$title&amp;quot; =~ ^WIP: ]]; then&lt;br /&gt;
     title=&amp;quot;WIP: $title&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
 &lt;br /&gt;
   local branch&lt;br /&gt;
   branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/pulls&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;{\&amp;quot;head\&amp;quot;:\&amp;quot;$branch\&amp;quot;,\&amp;quot;base\&amp;quot;:\&amp;quot;$base\&amp;quot;,\&amp;quot;title\&amp;quot;:\&amp;quot;$title\&amp;quot;,\&amp;quot;body\&amp;quot;:\&amp;quot;$body\&amp;quot;}&amp;quot;&lt;br /&gt;
     echo &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
     -d &amp;quot;$(jq -nc \&lt;br /&gt;
       --arg head &amp;quot;$branch&amp;quot; \&lt;br /&gt;
       --arg base &amp;quot;$base&amp;quot; \&lt;br /&gt;
       --arg title &amp;quot;$title&amp;quot; \&lt;br /&gt;
       --arg body &amp;quot;$body&amp;quot; \&lt;br /&gt;
       &#039;{head:$head, base:$base, title:$title, body:$body}&#039;)&amp;quot; |&lt;br /&gt;
     tee /tmp/tea_pr_create.json |&lt;br /&gt;
     jq -r &#039;.number&#039;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;&lt;br /&gt;
 linkIssueDependsOnPR() {&lt;br /&gt;
   local issue=&amp;quot;${1:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   local pr=&amp;quot;${2:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$issue/dependencies&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;owner&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;repo&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;index&amp;quot;:%s}&#039; &amp;quot;$GITEA_OWNER&amp;quot; &amp;quot;$GITEA_REPO&amp;quot; &amp;quot;$pr&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
 }&lt;br /&gt;
 __issue_title() {&lt;br /&gt;
   local idx=&amp;quot;${1:?Usage: __issue_title &amp;lt;issue#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$idx&amp;quot;&lt;br /&gt;
   echo &amp;quot;GET $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;&amp;lt;ISSUE_TITLE&amp;gt;&amp;quot;   # placeholder in dryrun&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
   curl -fsS &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     | sed -n &#039;s/.*&amp;quot;title&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;\([^&amp;quot;]*\)&amp;quot;.*/\1/p&#039; | head -n1&lt;br /&gt;
 }&lt;br /&gt;
 # startWork &amp;lt;branch&amp;gt; [description]&lt;br /&gt;
 startWork() {&lt;br /&gt;
   # ---------------------------------------------------------------------------&lt;br /&gt;
   # startWork: Create a new Issue, branch, and PR following the team workflow.&lt;br /&gt;
   #&lt;br /&gt;
   # Usage:&lt;br /&gt;
   #   startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description]&lt;br /&gt;
   #&lt;br /&gt;
   # Example:&lt;br /&gt;
   #   startWork api-endpoint &amp;quot;Implement new API endpoint&amp;quot; &amp;quot;Adds user data retrieval&amp;quot;&lt;br /&gt;
   #&lt;br /&gt;
   # Options:&lt;br /&gt;
   #   --help   Show this help message and exit.&lt;br /&gt;
   #&lt;br /&gt;
   # Environment Variables:&lt;br /&gt;
   #   DRYRUN=1          Prints all operations without executing.&lt;br /&gt;
   #   DEFAULT_BASE_BRANCH  Base branch name (default: main or develop).&lt;br /&gt;
   #&lt;br /&gt;
   # Workflow Steps:&lt;br /&gt;
   #   1. Create an issue with the given title and optional description.&lt;br /&gt;
   #   2. Create a branch named &amp;quot;&amp;lt;issueNumber&amp;gt;-&amp;lt;branchBase&amp;gt;&amp;quot;.&lt;br /&gt;
   #   3. Create a pull request titled the same as the issue.&lt;br /&gt;
   #   4. Link the PR and Issue as dependencies.&lt;br /&gt;
   # ---------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
   # --- Handle help flag ------------------------------------------------------&lt;br /&gt;
   if [[ &amp;quot;$1&amp;quot; == &amp;quot;--help&amp;quot; || &amp;quot;$1&amp;quot; == &amp;quot;-h&amp;quot; ]]; then&lt;br /&gt;
     sed -n &#039;2,25p&#039; &amp;quot;${BASH_SOURCE[0]}&amp;quot; | sed &#039;s/^  # //&#039;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description]}&amp;quot;&lt;br /&gt;
   local title=&amp;quot;${2:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description]}&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${3:-}&amp;quot;  # optional description/comment&lt;br /&gt;
 &lt;br /&gt;
   local pr_body&lt;br /&gt;
   if [ -n &amp;quot;$desc&amp;quot; ]; then pr_body=&amp;quot;$desc&amp;quot;; else pr_body=&amp;quot;&amp;quot;; fi&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create Issue(title=&#039;$title&#039;), then branch &#039;NNN-$branch_base&#039;, then PR(title=&#039;$title&#039;)&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating issue&amp;quot;; makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;NNN-$branch_base&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b NNN-$branch_base &amp;amp;&amp;amp; git push --set-upstream origin NNN-$branch_base&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;$pr_body&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #&amp;lt;NNN&amp;gt;&amp;quot;&lt;br /&gt;
     makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;&amp;lt;NNN&amp;gt;&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating issue&amp;quot;&lt;br /&gt;
   local issue; issue=&amp;quot;$(makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created issue #$issue&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody=&amp;quot;$pr_body&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$prBody&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$prBody&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description]&lt;br /&gt;
 startFromIssue() {&lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local issue=&amp;quot;${2:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local title_override=&amp;quot;${3:-}&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${4:-}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local title&lt;br /&gt;
   if [ -n &amp;quot;$title_override&amp;quot; ]; then&lt;br /&gt;
     title=&amp;quot;$title_override&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     title=&amp;quot;$(__issue_title &amp;quot;$issue&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
     [ -n &amp;quot;$title&amp;quot; ] || { echo &amp;quot;ERR: could not fetch title for issue #$issue&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create branch &#039;$branch&#039; from issue #$issue, PR titled &#039;$title&#039;&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b ${branch} &amp;amp;&amp;amp; git push --set-upstream origin ${branch}&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;${desc}&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot;; makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody&lt;br /&gt;
   [ -n &amp;quot;$desc&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$desc&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 # ====== END ======&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=212</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=212"/>
		<updated>2026-01-05T18:43:56Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories, parentProps, required parameters and optional parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters &#039;&#039;&#039;will not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the class will intentionally handle the scenario where it is undefined. Some examples of correct default values for optional parameters include:&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes are being used correctly. In the jsdocs, required parameters are defined as usual and optional parameters will be enclosed in brackets. Example:&lt;br /&gt;
 * @param {AppProps} parentProps&lt;br /&gt;
 * @param {object} params&lt;br /&gt;
 * @param {number} params.requiredParameter&lt;br /&gt;
 * @param {boolean} [params.optionalParameter]&lt;br /&gt;
&lt;br /&gt;
This will make VSCode flag as an error any situation in which the class is being called without all required parameters.&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters. Example of the typical class:&lt;br /&gt;
 class Example {&lt;br /&gt;
   constructor(parentProps, {requiredParameter, optionalParameter = true, anotherOptionalParameter}) { }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
When a class has a params object as parameter, but all of them are optional, the entire object must be given the default value of empty object. If at least one parameter is required, this default value is not included. Example:&lt;br /&gt;
 constructor(parentProps, {optional1, optional2 = &#039;small&#039;} = {})&lt;br /&gt;
 constructor(parentProps, {required, optional})&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=211</id>
		<title>Coding guidelines</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Coding_guidelines&amp;diff=211"/>
		<updated>2026-01-05T15:55:33Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot;== Parameters == Parameters will be divided into 3 broad categories, parentProps, required parameters and optional parameters.  When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &amp;#039;params&amp;#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters.  Required parameters...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Parameters ==&lt;br /&gt;
Parameters will be divided into 3 broad categories, parentProps, required parameters and optional parameters.&lt;br /&gt;
&lt;br /&gt;
When creating a class, the constructor will generally have 2 parameters: parentProps and an object called &#039;params&#039; containing the rest of them. Some classes may not need parentProps, or a params object, or either of them; in those cases they are not added, which means some specific classes may instead have 1 or 0 parameters.&lt;br /&gt;
&lt;br /&gt;
Required parameters will &#039;&#039;&#039;not&#039;&#039;&#039; have default values, they must be provided as arguments every time the class is used.&lt;br /&gt;
&lt;br /&gt;
Optional parameters &#039;&#039;&#039;may&#039;&#039;&#039; have default values, but they may also have no default value. No default value is preferred, and the class will handle the scenario where it is undefined. Some examples of correct default values for optional parameters include:&lt;br /&gt;
* The parameter is a constrained list of possible values (ex. size: &#039;small&#039; | &#039;medium&#039; | &#039;large&#039;).&lt;br /&gt;
* The parameter is of type boolean, in which case false is preferred to undefined.&lt;br /&gt;
&lt;br /&gt;
We will take advantage of type checking to help make sure the classes are being used correctly. By placing the name of the&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=210</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=210"/>
		<updated>2026-01-05T13:32:57Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: /* Running the app with debugger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;};&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a launch.json file.&lt;br /&gt;
# Press enter to select the default option (Node.js).&lt;br /&gt;
# In that file, paste the code in [[launch.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;br /&gt;
&lt;br /&gt;
The connection information can be found in envSettings.js under graphDatabaseSettings&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=209</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=209"/>
		<updated>2026-01-05T13:32:38Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;};&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# Press enter to select the default option (Node.js).&lt;br /&gt;
# In that file, paste the code in [[launch.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;br /&gt;
&lt;br /&gt;
The connection information can be found in envSettings.js under graphDatabaseSettings&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Launch.json_code&amp;diff=208</id>
		<title>Launch.json code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Launch.json_code&amp;diff=208"/>
		<updated>2026-01-05T13:23:40Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot;{    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,    &amp;quot;configurations&amp;quot;: [        /* --- Server (Node.js) --- */        {            &amp;quot;name&amp;quot;: &amp;quot;Server: Node (inspect)&amp;quot;,            &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,            &amp;quot;program&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;,            &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,            &amp;quot;runtimeArgs&amp;quot;: [                &amp;quot;--inspect=9229&amp;quot;            ],            &amp;quot;env&amp;quot;: {                &amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
   &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
   &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
       /* --- Server (Node.js) --- */&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
           &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
           &amp;quot;program&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;,&lt;br /&gt;
           &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,&lt;br /&gt;
           &amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
               &amp;quot;--inspect=9229&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;env&amp;quot;: {&lt;br /&gt;
               &amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
               &amp;quot;&amp;lt;node_internals&amp;gt;/**&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
           &amp;quot;restart&amp;quot;: true, // auto-restart on crash&lt;br /&gt;
           &amp;quot;autoAttachChildProcesses&amp;quot;: true&lt;br /&gt;
           // If using TypeScript/transpiled output, add:&lt;br /&gt;
           // &amp;quot;outFiles&amp;quot;: [&amp;quot;${workspaceFolder}/**/*.js&amp;quot;, &amp;quot;!**/node_modules/**&amp;quot;]&lt;br /&gt;
       },&lt;br /&gt;
       /* --- Browser (Chrome) --- */&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
           &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
           &amp;quot;url&amp;quot;: &amp;quot;http://localhost:1338&amp;quot;,&lt;br /&gt;
           &amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
           // If your app bundles sources (Vite/Webpack), uncomment to improve breakpoint mapping:&lt;br /&gt;
           // &amp;quot;sourceMapPathOverrides&amp;quot;: {&lt;br /&gt;
           //   &amp;quot;webpack:///./*&amp;quot;: &amp;quot;${webRoot}/*&amp;quot;,&lt;br /&gt;
           //   &amp;quot;webpack:///*&amp;quot;:   &amp;quot;${webRoot}/*&amp;quot;,&lt;br /&gt;
           //   &amp;quot;vite:///src/*&amp;quot;:  &amp;quot;${webRoot}/src/*&amp;quot;&lt;br /&gt;
           // }&lt;br /&gt;
           &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
               &amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
           ]&lt;br /&gt;
       },&lt;br /&gt;
       /* --- Optional: Node with nodemon (hot reload) --- */&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
           &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
           &amp;quot;runtimeExecutable&amp;quot;: &amp;quot;npx&amp;quot;,&lt;br /&gt;
           &amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
               &amp;quot;nodemon&amp;quot;,&lt;br /&gt;
               &amp;quot;--&amp;quot;&lt;br /&gt;
           ], // &amp;lt;-- &#039;nodemon&#039; + &#039;--&#039; are the key&lt;br /&gt;
           &amp;quot;args&amp;quot;: [&lt;br /&gt;
               &amp;quot;--inspect=9229&amp;quot;,&lt;br /&gt;
               &amp;quot;--signal&amp;quot;,&lt;br /&gt;
               &amp;quot;SIGTERM&amp;quot;,&lt;br /&gt;
               &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,&lt;br /&gt;
           &amp;quot;env&amp;quot;: {&lt;br /&gt;
               &amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
           },&lt;br /&gt;
           &amp;quot;restart&amp;quot;: true,&lt;br /&gt;
           &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
           &amp;quot;autoAttachChildProcesses&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       /* --- Optional: attach to an already-running Node --- */&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Attach: Node on 9229&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
           &amp;quot;request&amp;quot;: &amp;quot;attach&amp;quot;,&lt;br /&gt;
           &amp;quot;port&amp;quot;: 9229&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Client: Chrome via BrowserSync&amp;quot;,&lt;br /&gt;
           &amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
           &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
           &amp;quot;url&amp;quot;: &amp;quot;http://localhost:3000&amp;quot;,&lt;br /&gt;
           &amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/ui&amp;quot;,&lt;br /&gt;
           &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
               &amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;preLaunchTask&amp;quot;: &amp;quot;browser-sync&amp;quot; // &amp;lt;- if compound preLaunchTask isn&#039;t honored, keep it here&lt;br /&gt;
       }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;compounds&amp;quot;: [&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + BrowserSync + Chrome&amp;quot;,&lt;br /&gt;
           &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
               &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
               &amp;quot;Client: Chrome via BrowserSync&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;preLaunchTask&amp;quot;: &amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
           &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Dev: Server + Browser&amp;quot;,&lt;br /&gt;
           &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
               &amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
               &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
       },&lt;br /&gt;
       {&lt;br /&gt;
           &amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + Browser&amp;quot;,&lt;br /&gt;
           &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
               &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
               &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;&lt;br /&gt;
           ],&lt;br /&gt;
           &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
       }&lt;br /&gt;
   ]&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=207</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=207"/>
		<updated>2026-01-05T13:23:33Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;};&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# In that file, paste the code in [[launch.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;br /&gt;
&lt;br /&gt;
The connection information can be found in envSettings.js under graphDatabaseSettings&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=206</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=206"/>
		<updated>2026-01-05T12:51:27Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;};&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# In that file, paste the code in [[setup.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;br /&gt;
&lt;br /&gt;
The connection information can be found in envSettings.js under graphDatabaseSettings&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=205</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=205"/>
		<updated>2026-01-05T12:43:25Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;};&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# In that file, paste the code in [[setup.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=204</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=204"/>
		<updated>2026-01-05T12:43:09Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;export default { group: 0, id: &#039;dev0&#039;}&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# In that file, paste the code in [[setup.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=203</id>
		<title>Ksitropy</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=203"/>
		<updated>2025-12-17T18:11:32Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The everything app.&lt;br /&gt;
&lt;br /&gt;
[[Setup Steps]]&lt;br /&gt;
&lt;br /&gt;
[[Usual Workflow]]&lt;br /&gt;
&lt;br /&gt;
[[Coding guidelines]]&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=202</id>
		<title>Usual Workflow</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=202"/>
		<updated>2025-12-16T13:57:44Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every feature, bug, improvement, and hotfix will be developed on a specific feature branch with an associated Pull Request(PR). Usually each issue will have only 1 PR, but may have more.&lt;br /&gt;
&lt;br /&gt;
Branch naming convention is a short (usually 3-5 words) description in snake case. &lt;br /&gt;
&lt;br /&gt;
== Working on a previously defined issue ==&lt;br /&gt;
To work on an issue that has already been defined, you will only need the issue number.&lt;br /&gt;
&lt;br /&gt;
In the terminal, run:&lt;br /&gt;
&#039;&#039;startFromIssue &amp;lt;branch_name&amp;gt; &amp;lt;issue_number&amp;gt; &amp;lt;(OPTIONAL) PR_title&amp;gt; &amp;lt;(OPTIONAL) PR_description&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A title for the PR is only needed when it will be different from the title of the issue, by default the PR will have the same title as the issue.&lt;br /&gt;
&lt;br /&gt;
The title, description, and other characteristics of the PR can be edited freely in Gitea after creation.&lt;br /&gt;
&lt;br /&gt;
== Developing something that does not have a defined issue ==&lt;br /&gt;
If an issue has not been created for the functionality that you will develop, use the startWork bash alias and it will create the issue.&lt;br /&gt;
&lt;br /&gt;
In the terminal, run:&lt;br /&gt;
&#039;&#039;startWork &amp;lt;branch_name&amp;gt; &amp;lt;title&amp;gt; &amp;lt;(OPTIONAL) description&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This will automatically create an issue and a PR with the same title and description, linking them to each other.&lt;br /&gt;
&lt;br /&gt;
The title, description, and other characteristics of the issue and PR can be edited freely in Gitea after creation.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=201</id>
		<title>Usual Workflow</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=201"/>
		<updated>2025-12-16T13:56:04Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every feature, bug, improvement, and hotfix will be developed on a specific feature branch with an associated Pull Request(PR). Usually each issue will have only 1 PR, but may have more.&lt;br /&gt;
&lt;br /&gt;
Branch naming convention is a short (usually 3-5 words) description in snake case. &lt;br /&gt;
&lt;br /&gt;
== Working on a previously defined issue ==&lt;br /&gt;
To work on an issue that has already been defined, you will only need the issue number.&lt;br /&gt;
&lt;br /&gt;
In the terminal, run:&lt;br /&gt;
&#039;&#039;startFromIssue &amp;lt;branch_name&amp;gt; &amp;lt;issue_number&amp;gt; &amp;lt;(OPTIONAL) PR_title&amp;gt; &amp;lt;(OPTIONAL) PR_description&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A title for the PR is only needed when it will be different from the title of the issue, by default the PR will have the same title as the issue.&lt;br /&gt;
&lt;br /&gt;
The title, description, and other characteristics of the PR can be edited freely in Gitea after creation.&lt;br /&gt;
&lt;br /&gt;
== Developing something that does not have a defined issue ==&lt;br /&gt;
If an issue has not been created for the functionality that you will develop, use the startWork bash alias and it will create the issue.&lt;br /&gt;
&lt;br /&gt;
In the terminal, run:&lt;br /&gt;
&#039;&#039;startWork &amp;lt;branch_name&amp;gt; &amp;lt;title&amp;gt; &amp;lt;(OPTIONAL) description&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This will automatically create an issue and a PR with the same title, linking them to each other.&lt;br /&gt;
&lt;br /&gt;
The title, description, and other characteristics of the issue and PR can be edited freely in Gitea after creation.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=200</id>
		<title>Usual Workflow</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Usual_Workflow&amp;diff=200"/>
		<updated>2025-12-15T20:59:39Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot;Every feature, bug, improvement, and hotfix will be developed on a specific feature branch with an associated Pull Request(PR). Usually each issue will have only 1 PR, but may have more.  == Working on a previously defined issue == To work on an issue that has already been defined, you will only need the issue number.  In the terminal, run: &amp;#039;&amp;#039;startFromIssue &amp;lt;branch_name&amp;gt; &amp;lt;issue_number&amp;gt; &amp;lt;(OPTIONAL) PR_title&amp;gt; &amp;lt;(OPTIONAL) PR_description&amp;gt;&amp;#039;&amp;#039;  A title for the PR is only needed...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Every feature, bug, improvement, and hotfix will be developed on a specific feature branch with an associated Pull Request(PR). Usually each issue will have only 1 PR, but may have more.&lt;br /&gt;
&lt;br /&gt;
== Working on a previously defined issue ==&lt;br /&gt;
To work on an issue that has already been defined, you will only need the issue number.&lt;br /&gt;
&lt;br /&gt;
In the terminal, run:&lt;br /&gt;
&#039;&#039;startFromIssue &amp;lt;branch_name&amp;gt; &amp;lt;issue_number&amp;gt; &amp;lt;(OPTIONAL) PR_title&amp;gt; &amp;lt;(OPTIONAL) PR_description&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A title for the PR is only needed when it will be different from the title of the issue, by default the PR will have the same title as the issue.&lt;br /&gt;
&lt;br /&gt;
The title, description, and other characteristics of the PR can be edited freely in Gitea after creation.&lt;br /&gt;
&lt;br /&gt;
== Developing something that does not have a defined issue ==&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=199</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=199"/>
		<updated>2025-12-15T20:41:47Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea.&lt;br /&gt;
## Under Code, copy the HTTP link.&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder.&lt;br /&gt;
# Paste &#039;&#039;module.exports = env = { group: 0, id: ‘dev0’}&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;.&lt;br /&gt;
# In the resulting file, paste [[global user settings json]].&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]].&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea.&lt;br /&gt;
## Go to Settings -&amp;gt; Applications.&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking.&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;.&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;.&lt;br /&gt;
## Click Generate Token button.&lt;br /&gt;
## Copy the token in the blue box.&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes.&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file.&lt;br /&gt;
# In that file, paste the code in [[setup.json code]].&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]].&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=198</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=198"/>
		<updated>2025-12-15T20:38:39Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: /* User Settings and Aliases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea&lt;br /&gt;
## Under Code, copy the HTTP link&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder&lt;br /&gt;
# Paste &#039;&#039;module.exports = env = { group: 0, id: ‘dev0’}&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;&lt;br /&gt;
# In the resulting file, paste [[global user settings json]]&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]]&lt;br /&gt;
# In the pasted code, insert your own Gitea token:&lt;br /&gt;
## Go to Gitea&lt;br /&gt;
## Go to Settings -&amp;gt; Applications&lt;br /&gt;
## Under Generate New Token:&lt;br /&gt;
### Input a token name of your liking&lt;br /&gt;
### Check &#039;All (public, private, and limited)&#039;&lt;br /&gt;
### Under Select permissions, set all to &#039;Read and Write&#039;&lt;br /&gt;
## Click Generate Token button&lt;br /&gt;
## Copy the token in the blue box&lt;br /&gt;
## Paste in the bash aliases file where it says &amp;lt;get token in gitea&amp;gt; surrounded by quotes&lt;br /&gt;
&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file&lt;br /&gt;
# In that file, paste the code in [[setup.json code]]&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]]&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=197</id>
		<title>Bash aliases code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=197"/>
		<updated>2025-12-15T20:20:30Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; alias edit=&amp;quot;code ~/.bash_aliases&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 function mergeFrom() {&lt;br /&gt;
    currentBranch=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
    git checkout &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
    git pull&lt;br /&gt;
    git checkout &amp;quot;${2:-$currentBranch}&amp;quot;&lt;br /&gt;
    git merge &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function commitAndPush(){&lt;br /&gt;
        git add . &amp;amp;&amp;amp; git commit -a -m &amp;quot;$1&amp;quot; &amp;amp;&amp;amp; git push&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 export GITEA_TOKEN=&amp;lt;get token in gitea&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 # ====== MINIMAL GITEA HELPERS (env-driven, non-interactive) ======&lt;br /&gt;
 &lt;br /&gt;
 export DEFAULT_BASE_BRANCH=&amp;quot;${DEFAULT_BASE_BRANCH:-Development}&amp;quot;&lt;br /&gt;
 # Required for real API calls:&lt;br /&gt;
 # export GITEA_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
 # Required repo coordinates (set these once; no parsing logic):&lt;br /&gt;
 export GITEA_BASE=&amp;quot;http://172.31.108.186:3000&amp;quot;  # include subpath if any, no trailing slash&lt;br /&gt;
 # export GITEA_OWNER=&amp;quot;Seedbury_Square&amp;quot;&lt;br /&gt;
 # export GITEA_REPO=&amp;quot;Ksitropy&amp;quot;&lt;br /&gt;
 # Debug without sending requests:&lt;br /&gt;
 # export DRYRUN=1&lt;br /&gt;
 &lt;br /&gt;
 # --- smart environment resolver: uses env if set, otherwise parses remote.origin.url ---&lt;br /&gt;
 __resolve_env() {&lt;br /&gt;
   # Ensure base always exists&lt;br /&gt;
   : &amp;quot;${GITEA_BASE:?ERR: GITEA_BASE must be set (e.g. http://172.31.108.186:3000)}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # If OWNER/REPO already set, skip parsing&lt;br /&gt;
   if [ -n &amp;quot;$GITEA_OWNER&amp;quot; ] &amp;amp;&amp;amp; [ -n &amp;quot;$GITEA_REPO&amp;quot; ]; then&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   # Otherwise, derive from git remote&lt;br /&gt;
   local remote path&lt;br /&gt;
   remote=&amp;quot;$(git config --get remote.origin.url 2&amp;gt;/dev/null)&amp;quot; || {&lt;br /&gt;
     echo &amp;quot;ERR: not a git repo or missing origin remote&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
     return 1&lt;br /&gt;
   }&lt;br /&gt;
   [ -n &amp;quot;$remote&amp;quot; ] || { echo &amp;quot;ERR: remote.origin.url empty&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   # Extract path (Owner/Repo)&lt;br /&gt;
   path=&amp;quot;$(printf &#039;%s&#039; &amp;quot;$remote&amp;quot; | sed -E &#039;s#^[^:]+://[^/]+/##; s#^[^@]+@[^:]+:##&#039;)&amp;quot;&lt;br /&gt;
   path=&amp;quot;${path%.git}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   GITEA_OWNER=&amp;quot;${path%%/*}&amp;quot;&lt;br /&gt;
   GITEA_REPO=&amp;quot;${path##*/}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_env() {&lt;br /&gt;
   __resolve_env || return 1&lt;br /&gt;
   : &amp;quot;${GITEA_OWNER:?ERR: could not resolve OWNER}&amp;quot;&lt;br /&gt;
   : &amp;quot;${GITEA_REPO:?ERR: could not resolve REPO}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_token() { [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ] &amp;amp;&amp;amp; return 0; : &amp;quot;${GITEA_TOKEN:?ERR: set GITEA_TOKEN}&amp;quot;; }&lt;br /&gt;
 __json_num()   { grep -oE &#039;&amp;quot;(index|number)&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&#039; | head -n1 | grep -oE &#039;[0-9]+&#039;; }&lt;br /&gt;
 &lt;br /&gt;
 showRepo() {&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   echo &amp;quot;HOST=${GITEA_BASE%/}&amp;quot;&lt;br /&gt;
   echo &amp;quot;OWNER=$GITEA_OWNER&amp;quot;&lt;br /&gt;
   echo &amp;quot;REPO=$GITEA_REPO&amp;quot;&lt;br /&gt;
   echo -n &amp;quot;API check: &amp;quot;&lt;br /&gt;
   curl -fsS &amp;quot;${GITEA_BASE%/}/api/v1/version&amp;quot; &amp;amp;&amp;amp; echo &amp;quot; (OK)&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeBranch &amp;lt;branch&amp;gt; [base]&lt;br /&gt;
 makeBranch() {&lt;br /&gt;
   local br=&amp;quot;${1:?Usage: makeBranch &amp;lt;branch&amp;gt; [base]}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${2:-$DEFAULT_BASE_BRANCH}&amp;quot;&lt;br /&gt;
   if git rev-parse --verify --quiet &amp;quot;$br&amp;quot; &amp;gt;/dev/null; then&lt;br /&gt;
     git checkout &amp;quot;$br&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     git checkout &amp;quot;$base&amp;quot; || return 1&lt;br /&gt;
     git pull --ff-only || return 1&lt;br /&gt;
     git checkout -b &amp;quot;$br&amp;quot; || return 1&lt;br /&gt;
     git push --set-upstream origin &amp;quot;$br&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeIssue &amp;lt;title&amp;gt; [body] -&amp;gt; prints issue#&lt;br /&gt;
 makeIssue() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makeIssue &amp;lt;title&amp;gt; [body]}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-$title}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;title&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;%s&amp;quot;}&#039; &amp;quot;$title&amp;quot; &amp;quot;$body&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   local resp num&lt;br /&gt;
   resp=&amp;quot;$(curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   num=&amp;quot;$(__json_num &amp;lt;&amp;lt;&amp;lt;&amp;quot;$resp&amp;quot;)&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$num&amp;quot; ] &amp;amp;&amp;amp; { printf &#039;%s\n&#039; &amp;quot;$num&amp;quot;; return 0; }&lt;br /&gt;
   echo &amp;quot;ERR: could not parse issue number&amp;quot; &amp;gt;&amp;amp;2; echo &amp;quot;$resp&amp;quot; &amp;gt;&amp;amp;2; return 1&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;&lt;br /&gt;
 makePRFromCurrent() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${3:-Development}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # ✅ prepend &amp;quot;WIP:&amp;quot; if not already present&lt;br /&gt;
   if [[ ! &amp;quot;$title&amp;quot; =~ ^WIP: ]]; then&lt;br /&gt;
     title=&amp;quot;WIP: $title&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
 &lt;br /&gt;
   local branch&lt;br /&gt;
   branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/pulls&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;{\&amp;quot;head\&amp;quot;:\&amp;quot;$branch\&amp;quot;,\&amp;quot;base\&amp;quot;:\&amp;quot;$base\&amp;quot;,\&amp;quot;title\&amp;quot;:\&amp;quot;$title\&amp;quot;,\&amp;quot;body\&amp;quot;:\&amp;quot;$body\&amp;quot;}&amp;quot;&lt;br /&gt;
     echo &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
     -d &amp;quot;$(jq -nc \&lt;br /&gt;
       --arg head &amp;quot;$branch&amp;quot; \&lt;br /&gt;
       --arg base &amp;quot;$base&amp;quot; \&lt;br /&gt;
       --arg title &amp;quot;$title&amp;quot; \&lt;br /&gt;
       --arg body &amp;quot;$body&amp;quot; \&lt;br /&gt;
       &#039;{head:$head, base:$base, title:$title, body:$body}&#039;)&amp;quot; |&lt;br /&gt;
     tee /tmp/tea_pr_create.json |&lt;br /&gt;
     jq -r &#039;.number&#039;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;&lt;br /&gt;
 linkIssueDependsOnPR() {&lt;br /&gt;
   local issue=&amp;quot;${1:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   local pr=&amp;quot;${2:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$issue/dependencies&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;owner&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;repo&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;index&amp;quot;:%s}&#039; &amp;quot;$GITEA_OWNER&amp;quot; &amp;quot;$GITEA_REPO&amp;quot; &amp;quot;$pr&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
 }&lt;br /&gt;
 __issue_title() {&lt;br /&gt;
   local idx=&amp;quot;${1:?Usage: __issue_title &amp;lt;issue#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$idx&amp;quot;&lt;br /&gt;
   echo &amp;quot;GET $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;&amp;lt;ISSUE_TITLE&amp;gt;&amp;quot;   # placeholder in dryrun&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
   curl -fsS &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     | sed -n &#039;s/.*&amp;quot;title&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;\([^&amp;quot;]*\)&amp;quot;.*/\1/p&#039; | head -n1&lt;br /&gt;
 }&lt;br /&gt;
 # startWork &amp;lt;branch&amp;gt; [description]&lt;br /&gt;
 startWork() {&lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description] }&amp;quot;&lt;br /&gt;
   local title=&amp;quot;${2:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description] }&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${3:-}&amp;quot;  # optional description/comment&lt;br /&gt;
 &lt;br /&gt;
   local pr_body&lt;br /&gt;
   if [ -n &amp;quot;$desc&amp;quot; ]; then pr_body=&amp;quot;$desc&amp;quot;; else pr_body=&amp;quot;&amp;quot;; fi&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create Issue(title=&#039;$title&#039;), then branch &#039;NNN-$branch_base&#039;, then PR(title=&#039;$title&#039;)&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating issue&amp;quot;; makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;NNN-$branch_base&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b NNN-$branch_base &amp;amp;&amp;amp; git push --set-upstream origin NNN-$branch_base&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;$pr_body&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #&amp;lt;NNN&amp;gt;&amp;quot;; makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;&amp;lt;NNN&amp;gt;&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating issue&amp;quot;&lt;br /&gt;
   local issue; issue=&amp;quot;$(makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created issue #$issue&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;{$issue}-${branch_base}&amp;quot;&lt;br /&gt;
   # Fix accidental braces if any shell expansion oddities:&lt;br /&gt;
   branch=&amp;quot;${branch//\{\}/}&amp;quot; ; branch=&amp;quot;${branch/\{/$issue-}&amp;quot; ; branch=&amp;quot;${branch/\}/}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody=&amp;quot;$pr_body&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$prBody&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$prBody&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 # Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description]&lt;br /&gt;
 startFromIssue() {&lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local issue=&amp;quot;${2:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local title_override=&amp;quot;${3:-}&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${4:-}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local title&lt;br /&gt;
   if [ -n &amp;quot;$title_override&amp;quot; ]; then&lt;br /&gt;
     title=&amp;quot;$title_override&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     title=&amp;quot;$(__issue_title &amp;quot;$issue&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
     [ -n &amp;quot;$title&amp;quot; ] || { echo &amp;quot;ERR: could not fetch title for issue #$issue&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create branch &#039;$branch&#039; from issue #$issue, PR titled &#039;$title&#039;&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b ${branch} &amp;amp;&amp;amp; git push --set-upstream origin ${branch}&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;${desc}&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot;; makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody&lt;br /&gt;
   [ -n &amp;quot;$desc&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$desc&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=196</id>
		<title>Bash aliases code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Bash_aliases_code&amp;diff=196"/>
		<updated>2025-12-15T20:19:51Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot; alias edit=&amp;quot;code ~/.bash_aliases&amp;quot;   function mergeFrom() {     currentBranch=$(git rev-parse --abbrev-ref HEAD)     git checkout &amp;quot;${1:-Development}&amp;quot;     git pull     git checkout &amp;quot;${2:-$currentBranch}&amp;quot;     git merge &amp;quot;${1:-Development}&amp;quot;  }   function commitAndPush(){         git add . &amp;amp;&amp;amp; git commit -a -m &amp;quot;$1&amp;quot; &amp;amp;&amp;amp; git push  }   export GITEA_TOKEN=&amp;lt;get token in gitea&amp;gt;    # ====== MINIMAL GITEA HELPERS (env-driven, non-interactive) ======    export DEFAULT_BASE_BRANCH=&amp;quot;${DEF...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; alias edit=&amp;quot;code ~/.bash_aliases&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 function mergeFrom() {&lt;br /&gt;
    currentBranch=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
    git checkout &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
    git pull&lt;br /&gt;
    git checkout &amp;quot;${2:-$currentBranch}&amp;quot;&lt;br /&gt;
    git merge &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 function commitAndPush(){&lt;br /&gt;
        git add . &amp;amp;&amp;amp; git commit -a -m &amp;quot;$1&amp;quot; &amp;amp;&amp;amp; git push&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 export GITEA_TOKEN=&amp;lt;get token in gitea&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 # ====== MINIMAL GITEA HELPERS (env-driven, non-interactive) ======&lt;br /&gt;
 &lt;br /&gt;
 export DEFAULT_BASE_BRANCH=&amp;quot;${DEFAULT_BASE_BRANCH:-Development}&amp;quot;&lt;br /&gt;
 # Required for real API calls:&lt;br /&gt;
 # export GITEA_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
 # Required repo coordinates (set these once; no parsing logic):&lt;br /&gt;
 export GITEA_BASE=&amp;quot;http://172.31.108.186:3000&amp;quot;  # include subpath if any, no trailing slash&lt;br /&gt;
 # export GITEA_OWNER=&amp;quot;Seedbury_Square&amp;quot;&lt;br /&gt;
 # export GITEA_REPO=&amp;quot;Ksitropy&amp;quot;&lt;br /&gt;
 # Debug without sending requests:&lt;br /&gt;
 # export DRYRUN=1&lt;br /&gt;
 &lt;br /&gt;
 # --- smart environment resolver: uses env if set, otherwise parses remote.origin.url ---&lt;br /&gt;
 __resolve_env() {&lt;br /&gt;
   # Ensure base always exists&lt;br /&gt;
   : &amp;quot;${GITEA_BASE:?ERR: GITEA_BASE must be set (e.g. http://172.31.108.186:3000)}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # If OWNER/REPO already set, skip parsing&lt;br /&gt;
   if [ -n &amp;quot;$GITEA_OWNER&amp;quot; ] &amp;amp;&amp;amp; [ -n &amp;quot;$GITEA_REPO&amp;quot; ]; then&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   # Otherwise, derive from git remote&lt;br /&gt;
   local remote path&lt;br /&gt;
   remote=&amp;quot;$(git config --get remote.origin.url 2&amp;gt;/dev/null)&amp;quot; || {&lt;br /&gt;
     echo &amp;quot;ERR: not a git repo or missing origin remote&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
     return 1&lt;br /&gt;
   }&lt;br /&gt;
   [ -n &amp;quot;$remote&amp;quot; ] || { echo &amp;quot;ERR: remote.origin.url empty&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   # Extract path (Owner/Repo)&lt;br /&gt;
   path=&amp;quot;$(printf &#039;%s&#039; &amp;quot;$remote&amp;quot; | sed -E &#039;s#^[^:]+://[^/]+/##; s#^[^@]+@[^:]+:##&#039;)&amp;quot;&lt;br /&gt;
   path=&amp;quot;${path%.git}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   GITEA_OWNER=&amp;quot;${path%%/*}&amp;quot;&lt;br /&gt;
   GITEA_REPO=&amp;quot;${path##*/}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_env() {&lt;br /&gt;
   __resolve_env || return 1&lt;br /&gt;
   : &amp;quot;${GITEA_OWNER:?ERR: could not resolve OWNER}&amp;quot;&lt;br /&gt;
   : &amp;quot;${GITEA_REPO:?ERR: could not resolve REPO}&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 __need_token() { [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ] &amp;amp;&amp;amp; return 0; : &amp;quot;${GITEA_TOKEN:?ERR: set GITEA_TOKEN}&amp;quot;; }&lt;br /&gt;
 __json_num()   { grep -oE &#039;&amp;quot;(index|number)&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&#039; | head -n1 | grep -oE &#039;[0-9]+&#039;; }&lt;br /&gt;
 &lt;br /&gt;
 showRepo() {&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   echo &amp;quot;HOST=${GITEA_BASE%/}&amp;quot;&lt;br /&gt;
   echo &amp;quot;OWNER=$GITEA_OWNER&amp;quot;&lt;br /&gt;
   echo &amp;quot;REPO=$GITEA_REPO&amp;quot;&lt;br /&gt;
   echo -n &amp;quot;API check: &amp;quot;&lt;br /&gt;
   curl -fsS &amp;quot;${GITEA_BASE%/}/api/v1/version&amp;quot; &amp;amp;&amp;amp; echo &amp;quot; (OK)&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeBranch &amp;lt;branch&amp;gt; [base]&lt;br /&gt;
 makeBranch() {&lt;br /&gt;
   local br=&amp;quot;${1:?Usage: makeBranch &amp;lt;branch&amp;gt; [base]}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${2:-$DEFAULT_BASE_BRANCH}&amp;quot;&lt;br /&gt;
   if git rev-parse --verify --quiet &amp;quot;$br&amp;quot; &amp;gt;/dev/null; then&lt;br /&gt;
     git checkout &amp;quot;$br&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     git checkout &amp;quot;$base&amp;quot; || return 1&lt;br /&gt;
     git pull --ff-only || return 1&lt;br /&gt;
     git checkout -b &amp;quot;$br&amp;quot; || return 1&lt;br /&gt;
     git push --set-upstream origin &amp;quot;$br&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # makeIssue &amp;lt;title&amp;gt; [body] -&amp;gt; prints issue#&lt;br /&gt;
 makeIssue() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makeIssue &amp;lt;title&amp;gt; [body]}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-$title}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;title&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;body&amp;quot;:&amp;quot;%s&amp;quot;}&#039; &amp;quot;$title&amp;quot; &amp;quot;$body&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   local resp num&lt;br /&gt;
   resp=&amp;quot;$(curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   num=&amp;quot;$(__json_num &amp;lt;&amp;lt;&amp;lt;&amp;quot;$resp&amp;quot;)&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$num&amp;quot; ] &amp;amp;&amp;amp; { printf &#039;%s\n&#039; &amp;quot;$num&amp;quot;; return 0; }&lt;br /&gt;
   echo &amp;quot;ERR: could not parse issue number&amp;quot; &amp;gt;&amp;amp;2; echo &amp;quot;$resp&amp;quot; &amp;gt;&amp;amp;2; return 1&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;&lt;br /&gt;
 makePRFromCurrent() {&lt;br /&gt;
   local title=&amp;quot;${1:?Usage: makePRFromCurrent &amp;lt;title&amp;gt; &amp;lt;body&amp;gt; &amp;lt;baseBranch&amp;gt;}&amp;quot;&lt;br /&gt;
   local body=&amp;quot;${2:-}&amp;quot;&lt;br /&gt;
   local base=&amp;quot;${3:-Development}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # ✅ prepend &amp;quot;WIP:&amp;quot; if not already present&lt;br /&gt;
   if [[ ! &amp;quot;$title&amp;quot; =~ ^WIP: ]]; then&lt;br /&gt;
     title=&amp;quot;WIP: $title&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
 &lt;br /&gt;
   local branch&lt;br /&gt;
   branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/pulls&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;{\&amp;quot;head\&amp;quot;:\&amp;quot;$branch\&amp;quot;,\&amp;quot;base\&amp;quot;:\&amp;quot;$base\&amp;quot;,\&amp;quot;title\&amp;quot;:\&amp;quot;$title\&amp;quot;,\&amp;quot;body\&amp;quot;:\&amp;quot;$body\&amp;quot;}&amp;quot;&lt;br /&gt;
     echo &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
     -d &amp;quot;$(jq -nc \&lt;br /&gt;
       --arg head &amp;quot;$branch&amp;quot; \&lt;br /&gt;
       --arg base &amp;quot;$base&amp;quot; \&lt;br /&gt;
       --arg title &amp;quot;$title&amp;quot; \&lt;br /&gt;
       --arg body &amp;quot;$body&amp;quot; \&lt;br /&gt;
       &#039;{head:$head, base:$base, title:$title, body:$body}&#039;)&amp;quot; |&lt;br /&gt;
     tee /tmp/tea_pr_create.json |&lt;br /&gt;
     jq -r &#039;.number&#039;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 # linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;&lt;br /&gt;
 linkIssueDependsOnPR() {&lt;br /&gt;
   local issue=&amp;quot;${1:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   local pr=&amp;quot;${2:?Usage: linkIssueDependsOnPR &amp;lt;issue#&amp;gt; &amp;lt;pr#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$issue/dependencies&amp;quot;&lt;br /&gt;
   local data; data=$(printf &#039;{&amp;quot;owner&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;repo&amp;quot;:&amp;quot;%s&amp;quot;,&amp;quot;index&amp;quot;:%s}&#039; &amp;quot;$GITEA_OWNER&amp;quot; &amp;quot;$GITEA_REPO&amp;quot; &amp;quot;$pr&amp;quot;)&lt;br /&gt;
   echo &amp;quot;POST $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then echo &amp;quot;$data&amp;quot; &amp;gt;&amp;amp;2; return 0; fi&lt;br /&gt;
   curl -fsS -X POST &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;$data&amp;quot; &amp;gt;/dev/null&lt;br /&gt;
 }&lt;br /&gt;
 __issue_title() {&lt;br /&gt;
   local idx=&amp;quot;${1:?Usage: __issue_title &amp;lt;issue#&amp;gt;}&amp;quot;&lt;br /&gt;
   __need_env || return 1&lt;br /&gt;
   __need_token || return 1&lt;br /&gt;
   local url=&amp;quot;${GITEA_BASE%/}/api/v1/repos/$GITEA_OWNER/$GITEA_REPO/issues/$idx&amp;quot;&lt;br /&gt;
   echo &amp;quot;GET $url&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;&amp;lt;ISSUE_TITLE&amp;gt;&amp;quot;   # placeholder in dryrun&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
   curl -fsS &amp;quot;$url&amp;quot; -H &amp;quot;Authorization: token $GITEA_TOKEN&amp;quot; \&lt;br /&gt;
     | sed -n &#039;s/.*&amp;quot;title&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;\([^&amp;quot;]*\)&amp;quot;.*/\1/p&#039; | head -n1&lt;br /&gt;
 }&lt;br /&gt;
 # startWork &amp;lt;branch&amp;gt; [description]&lt;br /&gt;
 startWork() {&lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description] }&amp;quot;&lt;br /&gt;
   local title=&amp;quot;${2:?Usage: startWork &amp;lt;branchBase&amp;gt; &amp;lt;title&amp;gt; [description] }&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${3:-}&amp;quot;  # optional description/comment&lt;br /&gt;
 &lt;br /&gt;
   local pr_body&lt;br /&gt;
   if [ -n &amp;quot;$desc&amp;quot; ]; then pr_body=&amp;quot;$desc&amp;quot;; else pr_body=&amp;quot;&amp;quot;; fi&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create Issue(title=&#039;$title&#039;), then branch &#039;NNN-$branch_base&#039;, then PR(title=&#039;$title&#039;)&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating issue&amp;quot;; makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;NNN-$branch_base&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b NNN-$branch_base &amp;amp;&amp;amp; git push --set-upstream origin NNN-$branch_base&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;$pr_body&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #&amp;lt;NNN&amp;gt;&amp;quot;; makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;&amp;lt;NNN&amp;gt;&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating issue&amp;quot;&lt;br /&gt;
   local issue; issue=&amp;quot;$(makeIssue &amp;quot;$title&amp;quot; &amp;quot;$desc&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created issue #$issue&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;{$issue}-${branch_base}&amp;quot;&lt;br /&gt;
   # Fix accidental braces if any shell expansion oddities:&lt;br /&gt;
   branch=&amp;quot;${branch//\{\}/}&amp;quot; ; branch=&amp;quot;${branch/\{/$issue-}&amp;quot; ; branch=&amp;quot;${branch/\}/}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody=&amp;quot;$pr_body&amp;quot;&lt;br /&gt;
   [ -n &amp;quot;$prBody&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$prBody&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
 # Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description]&lt;br /&gt;
 startFromIssue() {&lt;br /&gt;
   local branch_base=&amp;quot;${1:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local issue=&amp;quot;${2:?Usage: startFromIssue &amp;lt;branchBase&amp;gt; &amp;lt;issueNumber&amp;gt; [titleOverride] [description] }&amp;quot;&lt;br /&gt;
   local title_override=&amp;quot;${3:-}&amp;quot;&lt;br /&gt;
   local desc=&amp;quot;${4:-}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   local title&lt;br /&gt;
   if [ -n &amp;quot;$title_override&amp;quot; ]; then&lt;br /&gt;
     title=&amp;quot;$title_override&amp;quot;&lt;br /&gt;
   else&lt;br /&gt;
     title=&amp;quot;$(__issue_title &amp;quot;$issue&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
     [ -n &amp;quot;$title&amp;quot; ] || { echo &amp;quot;ERR: could not fetch title for issue #$issue&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   local branch=&amp;quot;${issue}-${branch_base}&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   if [ &amp;quot;${DRYRUN:-0}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
     echo &amp;quot;==&amp;gt; DRYRUN: will create branch &#039;$branch&#039; from issue #$issue, PR titled &#039;$title&#039;&amp;quot;&lt;br /&gt;
     showRepo || true&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
     echo &amp;quot;git checkout ${DEFAULT_BASE_BRANCH} &amp;amp;&amp;amp; git pull --ff-only &amp;amp;&amp;amp; git checkout -b ${branch} &amp;amp;&amp;amp; git push --set-upstream origin ${branch}&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Creating PR&amp;quot;; local prBody=&amp;quot;${desc}&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot;; makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;&lt;br /&gt;
     echo &amp;quot;==&amp;gt; Linking dependency&amp;quot;; linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;&amp;lt;PR_NUM&amp;gt;&amp;quot;&lt;br /&gt;
     return 0&lt;br /&gt;
   fi&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating branch &#039;$branch&#039; (base: ${DEFAULT_BASE_BRANCH})&amp;quot;&lt;br /&gt;
   makeBranch &amp;quot;$branch&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot; || return 1&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Creating PR&amp;quot;&lt;br /&gt;
   local prBody&lt;br /&gt;
   [ -n &amp;quot;$desc&amp;quot; ] &amp;amp;&amp;amp; prBody=&amp;quot;$desc&amp;quot;$&#039;\n\n&#039;&amp;quot;Closes #$issue&amp;quot; || prBody=&amp;quot;Closes #$issue&amp;quot;&lt;br /&gt;
   local pr; pr=&amp;quot;$(makePRFromCurrent &amp;quot;$title&amp;quot; &amp;quot;$prBody&amp;quot; &amp;quot;$DEFAULT_BASE_BRANCH&amp;quot;)&amp;quot; || return 1&lt;br /&gt;
   echo &amp;quot;Created PR #$pr&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;==&amp;gt; Linking dependency (issue #$issue depends on PR #$pr)&amp;quot;&lt;br /&gt;
   linkIssueDependsOnPR &amp;quot;$issue&amp;quot; &amp;quot;$pr&amp;quot; || { echo &amp;quot;WARN: failed to add dependency&amp;quot; &amp;gt;&amp;amp;2; return 1; }&lt;br /&gt;
 &lt;br /&gt;
   echo &amp;quot;✅ Done. Branch: $branch | Issue #$issue | PR #$pr&amp;quot;&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=195</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=195"/>
		<updated>2025-12-15T20:16:44Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: /* VSCode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
=== Initial Setup ===&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea&lt;br /&gt;
## Under Code, copy the HTTP link&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder&lt;br /&gt;
# Paste &#039;&#039;module.exports = env = { group: 0, id: ‘dev0’}&#039;&#039;&lt;br /&gt;
=== User Settings and Aliases ===&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;&lt;br /&gt;
# In the resulting file, paste [[global user settings json]]&lt;br /&gt;
# In the terminal, run &#039;&#039;code ~/.bash_aliases&#039;&#039;&lt;br /&gt;
# In the resulting file, paste the [[bash aliases code]]&lt;br /&gt;
=== Running the app with debugger ===&lt;br /&gt;
# In the debugger, press the link to create a setup.json file&lt;br /&gt;
# In that file, paste the code in [[setup.json code]]&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]]&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=194</id>
		<title>Ksitropy</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=194"/>
		<updated>2025-12-15T20:13:31Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The everything app.&lt;br /&gt;
&lt;br /&gt;
[[Setup Steps]]&lt;br /&gt;
&lt;br /&gt;
[[Usual Workflow]]&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Tasks.json_code&amp;diff=193</id>
		<title>Tasks.json code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Tasks.json_code&amp;diff=193"/>
		<updated>2025-12-15T20:11:33Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot; {     &amp;quot;version&amp;quot;: &amp;quot;2.0.0&amp;quot;,     &amp;quot;tasks&amp;quot;: [         {             &amp;quot;label&amp;quot;: &amp;quot;browser-sync&amp;quot;,             &amp;quot;type&amp;quot;: &amp;quot;shell&amp;quot;,             &amp;quot;command&amp;quot;: &amp;quot;npx&amp;quot;,             &amp;quot;args&amp;quot;: [                 &amp;quot;browser-sync&amp;quot;,                 &amp;quot;start&amp;quot;,                 &amp;quot;--proxy&amp;quot;,                 &amp;quot;http://localhost:1338&amp;quot;,                 &amp;quot;--ws&amp;quot;,                 &amp;quot;--serveStatic&amp;quot;,                 &amp;quot;${workspaceFolder}/api/src/webServer/ui&amp;quot;,                 &amp;quot;--files&amp;quot;,                 &amp;quot;${workspaceFolder}/a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;2.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;tasks&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;shell&amp;quot;,&lt;br /&gt;
            &amp;quot;command&amp;quot;: &amp;quot;npx&amp;quot;,&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
                &amp;quot;start&amp;quot;,&lt;br /&gt;
                &amp;quot;--proxy&amp;quot;,&lt;br /&gt;
                &amp;quot;http://localhost:1338&amp;quot;,&lt;br /&gt;
                &amp;quot;--ws&amp;quot;,&lt;br /&gt;
                &amp;quot;--serveStatic&amp;quot;,&lt;br /&gt;
                &amp;quot;${workspaceFolder}/api/src/webServer/ui&amp;quot;,&lt;br /&gt;
                &amp;quot;--files&amp;quot;,&lt;br /&gt;
                &amp;quot;${workspaceFolder}/api/src/webServer/ui/**/*.{html,css,js,png,jpg,svg}&amp;quot;,&lt;br /&gt;
                &amp;quot;--port&amp;quot;,&lt;br /&gt;
                &amp;quot;3000&amp;quot;,&lt;br /&gt;
                &amp;quot;--ui-port&amp;quot;,&lt;br /&gt;
                &amp;quot;3002&amp;quot;,&lt;br /&gt;
                &amp;quot;--no-open&amp;quot;,&lt;br /&gt;
                &amp;quot;--logLevel&amp;quot;,&lt;br /&gt;
                &amp;quot;debug&amp;quot;,&lt;br /&gt;
                &amp;quot;--watchOptions.usePolling=true&amp;quot;,&lt;br /&gt;
                &amp;quot;--watchOptions.interval=200&amp;quot;,&lt;br /&gt;
                &amp;quot;--watchOptions.binaryInterval=300&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;options&amp;quot;: {&lt;br /&gt;
                &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
                &amp;quot;env&amp;quot;: {&lt;br /&gt;
                    &amp;quot;CHOKIDAR_USEPOLLING&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;isBackground&amp;quot;: true,&lt;br /&gt;
            &amp;quot;problemMatcher&amp;quot;: {&lt;br /&gt;
                &amp;quot;owner&amp;quot;: &amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
                &amp;quot;fileLocation&amp;quot;: [&lt;br /&gt;
                    &amp;quot;relative&amp;quot;,&lt;br /&gt;
                    &amp;quot;${workspaceFolder}&amp;quot;&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;pattern&amp;quot;: [&lt;br /&gt;
                    {&lt;br /&gt;
                        // No-op: includes file, line, message groups so VS Code is satisfied,&lt;br /&gt;
                        // but the lookahead prevents any match.&lt;br /&gt;
                        &amp;quot;regexp&amp;quot;: &amp;quot;^(?=a)b(.*?)(?::(\\d+))?\\s+(.*)$&amp;quot;,&lt;br /&gt;
                        &amp;quot;file&amp;quot;: 1,&lt;br /&gt;
                        &amp;quot;line&amp;quot;: 2,&lt;br /&gt;
                        &amp;quot;message&amp;quot;: 3&lt;br /&gt;
                    }&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;background&amp;quot;: {&lt;br /&gt;
                    &amp;quot;activeOnStart&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;beginsPattern&amp;quot;: &amp;quot;^\\[Browsersync\\] \\[debug\\] -&amp;gt; Starting Step: Setting file watchers$&amp;quot;,&lt;br /&gt;
                    &amp;quot;endsPattern&amp;quot;: &amp;quot;^\\[Browsersync\\] Access URLs:$|^\\[Browsersync\\] UI:\\shttp://.*:3002$|^\\[Browsersync\\] Local:\\shttp://.*:3000$|^\\[Browsersync\\] Watching files&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup.json_code&amp;diff=192</id>
		<title>Setup.json code</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup.json_code&amp;diff=192"/>
		<updated>2025-12-15T20:09:46Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot; {     &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,     &amp;quot;configurations&amp;quot;: [         /* --- Server (Node.js) --- */         {             &amp;quot;name&amp;quot;: &amp;quot;Server: Node (inspect)&amp;quot;,             &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,             &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,             &amp;quot;program&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;,             &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,             &amp;quot;runtimeArgs&amp;quot;: [                 &amp;quot;--inspect=9229&amp;quot;             ],             &amp;quot;env&amp;quot;: {                 &amp;quot;NODE_ENV&amp;quot;: &amp;quot;de...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;0.2.0&amp;quot;,&lt;br /&gt;
    &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
        /* --- Server (Node.js) --- */&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;program&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;,&lt;br /&gt;
            &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,&lt;br /&gt;
            &amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
                &amp;quot;--inspect=9229&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
                &amp;quot;&amp;lt;node_internals&amp;gt;/**&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
            &amp;quot;restart&amp;quot;: true, // auto-restart on crash&lt;br /&gt;
            &amp;quot;autoAttachChildProcesses&amp;quot;: true&lt;br /&gt;
            // If using TypeScript/transpiled output, add:&lt;br /&gt;
            // &amp;quot;outFiles&amp;quot;: [&amp;quot;${workspaceFolder}/**/*.js&amp;quot;, &amp;quot;!**/node_modules/**&amp;quot;]&lt;br /&gt;
        },&lt;br /&gt;
        /* --- Browser (Chrome) --- */&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;http://localhost:1338&amp;quot;,&lt;br /&gt;
            &amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}&amp;quot;,&lt;br /&gt;
            // If your app bundles sources (Vite/Webpack), uncomment to improve breakpoint mapping:&lt;br /&gt;
            // &amp;quot;sourceMapPathOverrides&amp;quot;: {&lt;br /&gt;
            //   &amp;quot;webpack:///./*&amp;quot;: &amp;quot;${webRoot}/*&amp;quot;,&lt;br /&gt;
            //   &amp;quot;webpack:///*&amp;quot;:   &amp;quot;${webRoot}/*&amp;quot;,&lt;br /&gt;
            //   &amp;quot;vite:///src/*&amp;quot;:  &amp;quot;${webRoot}/src/*&amp;quot;&lt;br /&gt;
            // }&lt;br /&gt;
            &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
                &amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
            ]&lt;br /&gt;
        },&lt;br /&gt;
        /* --- Optional: Node with nodemon (hot reload) --- */&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;runtimeExecutable&amp;quot;: &amp;quot;npx&amp;quot;,&lt;br /&gt;
            &amp;quot;runtimeArgs&amp;quot;: [&lt;br /&gt;
                &amp;quot;nodemon&amp;quot;,&lt;br /&gt;
                &amp;quot;--&amp;quot;&lt;br /&gt;
            ], // &amp;lt;-- &#039;nodemon&#039; + &#039;--&#039; are the key&lt;br /&gt;
            &amp;quot;args&amp;quot;: [&lt;br /&gt;
                &amp;quot;--inspect=9229&amp;quot;,&lt;br /&gt;
                &amp;quot;--signal&amp;quot;,&lt;br /&gt;
                &amp;quot;SIGTERM&amp;quot;,&lt;br /&gt;
                &amp;quot;${workspaceFolder}/api/src/webServer/webserver.js&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;cwd&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer&amp;quot;,&lt;br /&gt;
            &amp;quot;env&amp;quot;: {&lt;br /&gt;
                &amp;quot;NODE_ENV&amp;quot;: &amp;quot;development&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;restart&amp;quot;: true,&lt;br /&gt;
            &amp;quot;console&amp;quot;: &amp;quot;integratedTerminal&amp;quot;,&lt;br /&gt;
            &amp;quot;autoAttachChildProcesses&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        /* --- Optional: attach to an already-running Node --- */&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Attach: Node on 9229&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;pwa-node&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;attach&amp;quot;,&lt;br /&gt;
            &amp;quot;port&amp;quot;: 9229&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Client: Chrome via BrowserSync&amp;quot;,&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;pwa-chrome&amp;quot;,&lt;br /&gt;
            &amp;quot;request&amp;quot;: &amp;quot;launch&amp;quot;,&lt;br /&gt;
            &amp;quot;url&amp;quot;: &amp;quot;http://localhost:3000&amp;quot;,&lt;br /&gt;
            &amp;quot;webRoot&amp;quot;: &amp;quot;${workspaceFolder}/api/src/webServer/ui&amp;quot;,&lt;br /&gt;
            &amp;quot;skipFiles&amp;quot;: [&lt;br /&gt;
                &amp;quot;**/node_modules/**/*.js&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;preLaunchTask&amp;quot;: &amp;quot;browser-sync&amp;quot; // &amp;lt;- if compound preLaunchTask isn&#039;t honored, keep it here&lt;br /&gt;
        }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;compounds&amp;quot;: [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + BrowserSync + Chrome&amp;quot;,&lt;br /&gt;
            &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
                &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
                &amp;quot;Client: Chrome via BrowserSync&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;preLaunchTask&amp;quot;: &amp;quot;browser-sync&amp;quot;,&lt;br /&gt;
            &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Dev: Server + Browser&amp;quot;,&lt;br /&gt;
            &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
                &amp;quot;Server: Node (inspect)&amp;quot;,&lt;br /&gt;
                &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;Dev: Nodemon + Browser&amp;quot;,&lt;br /&gt;
            &amp;quot;configurations&amp;quot;: [&lt;br /&gt;
                &amp;quot;Server: Node + nodemon (inspect)&amp;quot;,&lt;br /&gt;
                &amp;quot;Client: Chrome to http://localhost:1338&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;stopAll&amp;quot;: true&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=191</id>
		<title>Global user settings json</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Global_user_settings_json&amp;diff=191"/>
		<updated>2025-12-15T20:08:28Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Created page with &amp;quot; {     &amp;quot;editor.detectIndentation&amp;quot;: false,     &amp;quot;editor.insertSpaces&amp;quot;: false,     &amp;quot;editor.formatOnSave&amp;quot;: true,     &amp;quot;javascript.format.semicolons&amp;quot;: &amp;quot;insert&amp;quot;,     &amp;quot;javascript.preferences.quoteStyle&amp;quot;: &amp;quot;single&amp;quot;,     &amp;quot;javascript.preferences.importModuleSpecifierEnding&amp;quot;: &amp;quot;js&amp;quot;,     &amp;quot;editor.codeActionsOnSave&amp;quot;: {         &amp;quot;source.organizeImports&amp;quot;: &amp;quot;always&amp;quot;,         &amp;quot;source.addMissingImports.ts&amp;quot;: &amp;quot;always&amp;quot;     }  }&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {&lt;br /&gt;
    &amp;quot;editor.detectIndentation&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.insertSpaces&amp;quot;: false,&lt;br /&gt;
    &amp;quot;editor.formatOnSave&amp;quot;: true,&lt;br /&gt;
    &amp;quot;javascript.format.semicolons&amp;quot;: &amp;quot;insert&amp;quot;,&lt;br /&gt;
    &amp;quot;javascript.preferences.quoteStyle&amp;quot;: &amp;quot;single&amp;quot;,&lt;br /&gt;
    &amp;quot;javascript.preferences.importModuleSpecifierEnding&amp;quot;: &amp;quot;js&amp;quot;,&lt;br /&gt;
    &amp;quot;editor.codeActionsOnSave&amp;quot;: {&lt;br /&gt;
        &amp;quot;source.organizeImports&amp;quot;: &amp;quot;always&amp;quot;,&lt;br /&gt;
        &amp;quot;source.addMissingImports.ts&amp;quot;: &amp;quot;always&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=190</id>
		<title>Setup Steps</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Setup_Steps&amp;diff=190"/>
		<updated>2025-12-15T20:05:46Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Setup steps for Ksitropy development workstation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Amazon Workspaces ==&lt;br /&gt;
Username and password provided by admin. This password also corresponds to &amp;quot;Keyring&amp;quot; password inside the workspace.&lt;br /&gt;
== Gitea ==&lt;br /&gt;
Gitea is the issue tracking and version control interface used for development in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
To access gitea, enter the following in the browser of your choice: &#039;&#039;&#039;172.31.108.186:3000&#039;&#039;&#039; (remember to bookmark it for easy access).&lt;br /&gt;
&lt;br /&gt;
Create an account (YOUR_INITIALS-seedbury), admin will invite you to Ksitropy repository.&lt;br /&gt;
&lt;br /&gt;
== VSCode ==&lt;br /&gt;
# Run &#039;&#039;git config --global credential.helper store&#039;&#039;. This will store your git credentials the next time you input them.&lt;br /&gt;
# Create a &amp;quot;Projects&amp;quot; folder inside the &amp;quot;Documents&amp;quot; Folder.&lt;br /&gt;
# Inside this folder, clone the Ksitropy repository.&lt;br /&gt;
## Visit the repository in Gitea&lt;br /&gt;
## Under Code, copy the HTTP link&lt;br /&gt;
## Inside the &amp;quot;Projects&amp;quot; folder run &#039;&#039;git clone PASTE_HTTP_LINK_HERE&#039;&#039;&lt;br /&gt;
# Create env.js file inside the api folder&lt;br /&gt;
# Paste &#039;&#039;module.exports = env = { group: 0, id: ‘dev0’}&#039;&#039;&lt;br /&gt;
# Press control+shift+p and type &#039;Open User Settings (JSON)&#039;&lt;br /&gt;
# In the resulting file, paste [[global user settings json]]&lt;br /&gt;
# In the debugger, press the link to create a setup.json file&lt;br /&gt;
# In that file, paste the code in [[setup.json code]]&lt;br /&gt;
# In that folder, create another file named tasks.json and paste the code in [[tasks.json code]]&lt;br /&gt;
&lt;br /&gt;
To run the development build, choose &#039;&#039;Dev: server + browser&#039;&#039; in the debugger and run it.&lt;br /&gt;
&lt;br /&gt;
== Create a Ksitropy account ==&lt;br /&gt;
In the development website, create an account using the work email and a password of your choice. Remember or write down these credentials. An admin will activate your account.&lt;br /&gt;
== Neo4j ==&lt;br /&gt;
Neo4j is used to interact with the graph database that is used in Ksitropy.&lt;br /&gt;
&lt;br /&gt;
You can find it in &#039;&#039;&#039;172.31.106.81:7474/browser/preview&#039;&#039;&#039;, remember to bookmark it for easy access.&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=189</id>
		<title>Ksitropy</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Ksitropy&amp;diff=189"/>
		<updated>2025-12-15T18:43:00Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The everything app.&lt;br /&gt;
&lt;br /&gt;
[[Setup Steps]]&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Main_Page&amp;diff=188</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Main_Page&amp;diff=188"/>
		<updated>2025-09-24T15:50:07Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: /* See Also */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the Seedbury Wiki ==&lt;br /&gt;
&lt;br /&gt;
Behave or be sent to [https://wiki.seedburysquare.com/index.php/The_Dungeon the dungeon].&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Established in 2016, &#039;&#039;&#039;Seedbury Square&#039;&#039;&#039; has grown to become a mayor player in the development of custom web-based application space. Clients range from the public to the private sector with some of the platforms supporting complete professions.&lt;br /&gt;
&lt;br /&gt;
== Development Standards ==&lt;br /&gt;
Seedbury Square uses these [https://wiki.seedburysquare.com/index.php/Programming_Standards programming standards]&lt;br /&gt;
&lt;br /&gt;
== Active Projects ==&lt;br /&gt;
From all the [https://wiki.seedburysquare.com/index.php/Projects projects] developed by Seedbury Square, these are actively being developed or maintained as of 2025.&lt;br /&gt;
=== [https://wiki.seedburysquare.com/index.php/Ksitropy Ksitropy] ===&lt;br /&gt;
The everything app.&lt;br /&gt;
=== [https://wiki.seedburysquare.com/index.php/SUMAC Sistema Unificado de Manejo y Administración de Casos (SUMAC)] ===&lt;br /&gt;
Contains the following projects:&lt;br /&gt;
* Court of First Instance (CFI)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Court of Appeals (COA)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Supreme Court (SC)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Attorney&lt;br /&gt;
* Clerk&lt;br /&gt;
&lt;br /&gt;
== Technologies Used ==&lt;br /&gt;
=== Frontend ===&lt;br /&gt;
* Frameworks: (project-dependent)&lt;br /&gt;
** [https://mozilla.github.io/pdf.js/ PDF.JS]&lt;br /&gt;
** [https://pdf-lib.js.org/ pdf-lib]&lt;br /&gt;
** [https://www.tiny.cloud/tinymce/ TinyMCE]&lt;br /&gt;
** [https://wiki.seedburysquare.com/index.php/SeedburySquareFrameworkBrrrrr Proprietary Framework]&lt;br /&gt;
* Styling&lt;br /&gt;
** Vanilla CSS&lt;br /&gt;
* Code style&lt;br /&gt;
** Default [https://code.visualstudio.com/ VSCode] Settings conventions&lt;br /&gt;
* Folder structure&lt;br /&gt;
** Modular&lt;br /&gt;
** Reusable components&lt;br /&gt;
* Testing: Try and break it testing&lt;br /&gt;
* Version control: Git with feature-branch workflow&lt;br /&gt;
&lt;br /&gt;
=== Backend ===&lt;br /&gt;
* Languages&lt;br /&gt;
** Node.js&lt;br /&gt;
** PHP (based on project needs)&lt;br /&gt;
* Frameworks&lt;br /&gt;
** [https://www.setasign.com/products/setapdf-core/details/ SetaPDF-Core]&lt;br /&gt;
** [https://www.setasign.com/products/setapdf-stamper/details/ SetaPDF-Stamper]&lt;br /&gt;
** [https://www.setasign.com/products/fpdi/about/ FPDI] (based on project needs)&lt;br /&gt;
* Architecture: RESTful APIs  (where applicable)&lt;br /&gt;
* Database&lt;br /&gt;
** MSSQL&lt;br /&gt;
** MariaDB&lt;br /&gt;
** Neo4J&lt;br /&gt;
* Authentication: IDK&lt;br /&gt;
* Logging: Still Don&#039;t konw&lt;br /&gt;
* Testing: Try and break it testing&lt;br /&gt;
* CI/CD: I don&#039;t know what this means.&lt;br /&gt;
&lt;br /&gt;
== New Employee Setup Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== Hardware/Access Setup ===&lt;br /&gt;
&lt;br /&gt;
# Provide oldest computer available.&lt;br /&gt;
::- New Computers are only for older employees.&lt;br /&gt;
# Create company email and communication accounts (Slack, Google Workspace, etc.)&lt;br /&gt;
# Provide access to repositories (GitHub/GitLab), project boards (Jira/Trello), and documentation&lt;br /&gt;
&lt;br /&gt;
=== Software Installation ===&lt;br /&gt;
# Install development tools: VS Code, Docker, Postman, etc.&lt;br /&gt;
# Clone required repositories&lt;br /&gt;
# Follow README or internal docs to set up dev environment&lt;br /&gt;
# Join onboarding session with team lead or HR&lt;br /&gt;
&lt;br /&gt;
=== Onboarding Checklist ===&lt;br /&gt;
* [ ] NDA signed and uploaded&lt;br /&gt;
* [ ] Accounts created&lt;br /&gt;
* [ ] Introductory meeting scheduled&lt;br /&gt;
* [ ] Onboarding tasks assigned in project management tool&lt;br /&gt;
* [ ] Dev environment verified and working&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Project Alpha Documentation]]&lt;br /&gt;
* [[Employee Onboarding Checklist]]&lt;br /&gt;
* [[Tech Stack Overview]]&lt;br /&gt;
* [[Pull Requests Workflow]]&lt;br /&gt;
* [[Change Control Guide]]&lt;br /&gt;
&lt;br /&gt;
== Helpful Tools ==&lt;br /&gt;
* [[VSCode Snippets]]&lt;br /&gt;
* [[Bash Tools]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://www.seedburysquare.com/ Official Website]&lt;br /&gt;
* [https://github.com/SeedburySquare GitHub Organization]&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Pull_Requests_Workflow&amp;diff=187</id>
		<title>Pull Requests Workflow</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Pull_Requests_Workflow&amp;diff=187"/>
		<updated>2025-08-13T15:14:31Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Recommended: Github Pull Requests extension for VSCode.&lt;br /&gt;
* To open .zprofile mentioned in the following steps run &#039;&#039;edit&#039;&#039; in terminal.&lt;br /&gt;
----&lt;br /&gt;
== Developer Steps ==&lt;br /&gt;
&lt;br /&gt;
=== Starting a task ===&lt;br /&gt;
* Add the following function to .zprofile:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; function newBranch(){&lt;br /&gt;
  git checkout Development&lt;br /&gt;
  git pull&lt;br /&gt;
  git checkout -b $1&lt;br /&gt;
  git push --set-upstream origin $1&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Run &#039;&#039;newBranch (Bug|Feature)-###-short_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Working a task ===&lt;br /&gt;
==== Daily and before any commit====&lt;br /&gt;
# Run &#039;&#039;mergeFrom&#039;&#039;.&lt;br /&gt;
# Resolve conflicts (communicating with the relevant developers).&lt;br /&gt;
&lt;br /&gt;
* Make sure the mergeFrom function in .zprofile is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; function mergeFrom() {&lt;br /&gt;
    currentBranch=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
    git checkout &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
    git pull&lt;br /&gt;
    git checkout &amp;quot;${2:-$currentBranch}&amp;quot;&lt;br /&gt;
    git merge &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== Pushing code ====&lt;br /&gt;
* &#039;&#039;commitAndPush&#039;&#039; whenever there is a distinct and stable (tested) change (not the entire task; just a specific, concise, and related chunk of changes).&lt;br /&gt;
* If first commit of task create a Draft Pull Request:&lt;br /&gt;
# Create Pull Request.&lt;br /&gt;
# Set redmine title as title of pull request (if unavailable, set a short description).&lt;br /&gt;
# Use the description to explain more in depth the changes done. Remember to keep it updated with any changes as you go, and include reproduction steps if applicable.&lt;br /&gt;
# The button with the word create has a dropdown arrow, click it and choose draft pull request.&lt;br /&gt;
# Set yourself as asignee of the pull request.&lt;br /&gt;
* If a pull request is already open, push normally and the changes will be automatically added to the open pull request.&lt;br /&gt;
* Be on the lookout for changes requested.&lt;br /&gt;
&lt;br /&gt;
==== Finishing a task ====&lt;br /&gt;
# Set draft pull request to ready for review.&lt;br /&gt;
# Stay on the lookout for any changes requested.&lt;br /&gt;
# If the request is deemed acceptable, it will be approved and the reviewer will take the next steps.&lt;br /&gt;
&lt;br /&gt;
==== Multiple developers working in one task ====&lt;br /&gt;
* Both developers will work in the same branch.&lt;br /&gt;
* If you need changes made by the other developers and before any commits run &#039;&#039;git merge&#039;&#039;, then resolve conflicts.&lt;br /&gt;
* Only one pull request per branch, communicate accordingly.&lt;br /&gt;
&lt;br /&gt;
== Reviewer Steps ==&lt;br /&gt;
# Choose an open pull request.&lt;br /&gt;
# Review changes.&lt;br /&gt;
# Recommend changes or approve pull request.&lt;br /&gt;
* Be on the lookout for the owner of the request implementing the changes (repeat steps 2 and 3 after changes are committed).&lt;br /&gt;
* When code is acceptable, merge the task_branch into Development and delete the task_branch.&lt;br /&gt;
&lt;br /&gt;
* You can see the commits in a draft pull request and recommend changes midway, only when marked for review by the developer will you be able to actually approve and merge the request.&lt;br /&gt;
&lt;br /&gt;
== Keep in mind ==&lt;br /&gt;
* If using VSCode extension, you might need to manually refresh at some points throughout the process.&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Pull_Requests_Workflow&amp;diff=186</id>
		<title>Pull Requests Workflow</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Pull_Requests_Workflow&amp;diff=186"/>
		<updated>2025-08-13T15:12:07Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: Added Pull Requests Workflow Page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Pull Requests Workflow =&lt;br /&gt;
* Recommended: Github Pull Requests extension for VSCode.&lt;br /&gt;
* To open .zprofile mentioned in the following steps run &#039;&#039;edit&#039;&#039; in terminal.&lt;br /&gt;
----&lt;br /&gt;
== Developer Steps ==&lt;br /&gt;
&lt;br /&gt;
=== Starting a task ===&lt;br /&gt;
* Add the following function to .zprofile:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; function newBranch(){&lt;br /&gt;
  git checkout Development&lt;br /&gt;
  git pull&lt;br /&gt;
  git checkout -b $1&lt;br /&gt;
  git push --set-upstream origin $1&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Run &#039;&#039;newBranch (Bug|Feature)-###-short_description&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Working a task ===&lt;br /&gt;
==== Daily and before any commit====&lt;br /&gt;
# Run &#039;&#039;mergeFrom&#039;&#039;.&lt;br /&gt;
# Resolve conflicts (communicating with the relevant developers).&lt;br /&gt;
&lt;br /&gt;
* Make sure the mergeFrom function in .zprofile is:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; function mergeFrom() {&lt;br /&gt;
    currentBranch=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
    git checkout &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
    git pull&lt;br /&gt;
    git checkout &amp;quot;${2:-$currentBranch}&amp;quot;&lt;br /&gt;
    git merge &amp;quot;${1:-Development}&amp;quot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==== Pushing code ====&lt;br /&gt;
* &#039;&#039;commitAndPush&#039;&#039; whenever there is a distinct and stable (tested) change (not the entire task; just a specific, concise, and related chunk of changes).&lt;br /&gt;
* If first commit of task create a Draft Pull Request:&lt;br /&gt;
# Create Pull Request.&lt;br /&gt;
# Set redmine title as title of pull request (if unavailable, set a short description).&lt;br /&gt;
# Use the description to explain more in depth the changes done. Remember to keep it updated with any changes as you go, and include reproduction steps if applicable.&lt;br /&gt;
# The button with the word create has a dropdown arrow, click it and choose draft pull request.&lt;br /&gt;
# Set yourself as asignee of the pull request.&lt;br /&gt;
* If a pull request is already open, push normally and the changes will be automatically added to the open pull request.&lt;br /&gt;
* Be on the lookout for changes requested.&lt;br /&gt;
&lt;br /&gt;
==== Finishing a task ====&lt;br /&gt;
# Set draft pull request to ready for review.&lt;br /&gt;
# Stay on the lookout for any changes requested.&lt;br /&gt;
# If the request is deemed acceptable, it will be approved and the reviewer will take the next steps.&lt;br /&gt;
&lt;br /&gt;
==== Multiple developers working in one task ====&lt;br /&gt;
* Both developers will work in the same branch.&lt;br /&gt;
* If you need changes made by the other developers and before any commits run &#039;&#039;git merge&#039;&#039;, then resolve conflicts.&lt;br /&gt;
* Only one pull request per branch, communicate accordingly.&lt;br /&gt;
&lt;br /&gt;
== Reviewer Steps ==&lt;br /&gt;
# Choose an open pull request.&lt;br /&gt;
# Review changes.&lt;br /&gt;
# Recommend changes or approve pull request.&lt;br /&gt;
* Be on the lookout for the owner of the request implementing the changes (repeat steps 2 and 3 after changes are committed).&lt;br /&gt;
* When code is acceptable, merge the task_branch into Development and delete the task_branch.&lt;br /&gt;
&lt;br /&gt;
* You can see the commits in a draft pull request and recommend changes midway, only when marked for review by the developer will you be able to actually approve and merge the request.&lt;br /&gt;
&lt;br /&gt;
== Keep in mind ==&lt;br /&gt;
* If using VSCode extension, you might need to manually refresh at some points throughout the process.&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
	<entry>
		<id>http://wiki.seedburysquare.com:80/index.php?title=Main_Page&amp;diff=185</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://wiki.seedburysquare.com:80/index.php?title=Main_Page&amp;diff=185"/>
		<updated>2025-08-13T13:21:10Z</updated>

		<summary type="html">&lt;p&gt;Mgm-seedbury: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Welcome to the Seedbury Wiki ==&lt;br /&gt;
&lt;br /&gt;
Behave or be sent to [https://wiki.seedburysquare.com/index.php/The_Dungeon the dungeon].&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Established in 2016, &#039;&#039;&#039;Seedbury Square&#039;&#039;&#039; has grown to become a mayor player in the development of custom web-based application space. Clients range from the public to the private sector with some of the platforms supporting complete professions.&lt;br /&gt;
&lt;br /&gt;
== Development Standards ==&lt;br /&gt;
Seedbury Square uses these [https://wiki.seedburysquare.com/index.php/Programming_Standards programming standards]&lt;br /&gt;
&lt;br /&gt;
== Active Projects ==&lt;br /&gt;
From all the [https://wiki.seedburysquare.com/index.php/Projects projects] developed by Seedbury Square, these are actively being developed or maintained as of 2025.&lt;br /&gt;
=== [https://wiki.seedburysquare.com/index.php/Ksitropy Ksitropy] ===&lt;br /&gt;
The everything app.&lt;br /&gt;
=== [https://wiki.seedburysquare.com/index.php/SUMAC Sistema Unificado de Manejo y Administración de Casos (SUMAC)] ===&lt;br /&gt;
Contains the following projects:&lt;br /&gt;
* Court of First Instance (CFI)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Court of Appeals (COA)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Supreme Court (SC)&lt;br /&gt;
** Judges&lt;br /&gt;
** Admin&lt;br /&gt;
* Attorney&lt;br /&gt;
* Clerk&lt;br /&gt;
&lt;br /&gt;
== Technologies Used ==&lt;br /&gt;
=== Frontend ===&lt;br /&gt;
* Frameworks: (project-dependent)&lt;br /&gt;
** [https://mozilla.github.io/pdf.js/ PDF.JS]&lt;br /&gt;
** [https://pdf-lib.js.org/ pdf-lib]&lt;br /&gt;
** [https://www.tiny.cloud/tinymce/ TinyMCE]&lt;br /&gt;
** [https://wiki.seedburysquare.com/index.php/SeedburySquareFrameworkBrrrrr Proprietary Framework]&lt;br /&gt;
* Styling&lt;br /&gt;
** Vanilla CSS&lt;br /&gt;
* Code style&lt;br /&gt;
** Default [https://code.visualstudio.com/ VSCode] Settings conventions&lt;br /&gt;
* Folder structure&lt;br /&gt;
** Modular&lt;br /&gt;
** Reusable components&lt;br /&gt;
* Testing: Try and break it testing&lt;br /&gt;
* Version control: Git with feature-branch workflow&lt;br /&gt;
&lt;br /&gt;
=== Backend ===&lt;br /&gt;
* Languages&lt;br /&gt;
** Node.js&lt;br /&gt;
** PHP (based on project needs)&lt;br /&gt;
* Frameworks&lt;br /&gt;
** [https://www.setasign.com/products/setapdf-core/details/ SetaPDF-Core]&lt;br /&gt;
** [https://www.setasign.com/products/setapdf-stamper/details/ SetaPDF-Stamper]&lt;br /&gt;
** [https://www.setasign.com/products/fpdi/about/ FPDI] (based on project needs)&lt;br /&gt;
* Architecture: RESTful APIs  (where applicable)&lt;br /&gt;
* Database&lt;br /&gt;
** MSSQL&lt;br /&gt;
** MariaDB&lt;br /&gt;
** Neo4J&lt;br /&gt;
* Authentication: IDK&lt;br /&gt;
* Logging: Still Don&#039;t konw&lt;br /&gt;
* Testing: Try and break it testing&lt;br /&gt;
* CI/CD: I don&#039;t know what this means.&lt;br /&gt;
&lt;br /&gt;
== New Employee Setup Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== Hardware/Access Setup ===&lt;br /&gt;
&lt;br /&gt;
# Provide oldest computer available.&lt;br /&gt;
::- New Computers are only for older employees.&lt;br /&gt;
# Create company email and communication accounts (Slack, Google Workspace, etc.)&lt;br /&gt;
# Provide access to repositories (GitHub/GitLab), project boards (Jira/Trello), and documentation&lt;br /&gt;
&lt;br /&gt;
=== Software Installation ===&lt;br /&gt;
# Install development tools: VS Code, Docker, Postman, etc.&lt;br /&gt;
# Clone required repositories&lt;br /&gt;
# Follow README or internal docs to set up dev environment&lt;br /&gt;
# Join onboarding session with team lead or HR&lt;br /&gt;
&lt;br /&gt;
=== Onboarding Checklist ===&lt;br /&gt;
* [ ] NDA signed and uploaded&lt;br /&gt;
* [ ] Accounts created&lt;br /&gt;
* [ ] Introductory meeting scheduled&lt;br /&gt;
* [ ] Onboarding tasks assigned in project management tool&lt;br /&gt;
* [ ] Dev environment verified and working&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[Project Alpha Documentation]]&lt;br /&gt;
* [[Employee Onboarding Checklist]]&lt;br /&gt;
* [[Tech Stack Overview]]&lt;br /&gt;
* [[Pull Requests Workflow]]&lt;br /&gt;
== Helpful Tools ==&lt;br /&gt;
* [[VSCode Snippets]]&lt;br /&gt;
* [[Bash Tools]]&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://www.seedburysquare.com/ Official Website]&lt;br /&gt;
* [https://github.com/SeedburySquare GitHub Organization]&lt;/div&gt;</summary>
		<author><name>Mgm-seedbury</name></author>
	</entry>
</feed>