Scratch adopter for Factory 0.6. Nothing here matters; it exists so Factory's worker, Action and dispatcher can be proven on a repository that is not Factory and not Clockgrove. Recreate it freely.
greet(name)(src/greet.mjs): returnsHello, <name>.with the name trimmed, orHello.when the name is empty or missing.farewell(name)(src/farewell.mjs): returnsGoodbye, <name>.with the name trimmed, orGoodbye.when the name is empty or missing.shout(name)(src/shout.mjs): returnsgreet(name)in upper case, e.g.HELLO, ADA., orHELLO.when the name is empty or missing.whisper(name)(src/whisper.mjs): returnsgreet(name)in lower case, e.g.hello, ada., orhello.when the name is empty or missing.greetings(name)(src/greetings.mjs): returns[greet(name), shout(name), whisper(name)], e.g.["Hello, Ada.", "HELLO, ADA.", "hello, ada."], or["Hello.", "HELLO.", "hello."]when the name is empty or missing.wordCount(name)(src/word-count.mjs): returns the number of whitespace-separated words ingreet(name), with punctuation staying attached, e.g.2forAda(Hello, Ada.), or1when the name is empty or missing.initials(name)(src/initials.mjs): returns the first letter of each whitespace-separated word ingreet(name), upper-cased and joined; digits and punctuation never contribute, and a word without letters is skipped, e.g.HAforAda, orHwhen the name is empty or missing.reverse(name)(src/reverse.mjs): returnsgreet(name)with its Unicode code points in reverse order (so astral symbols such as emoji stay intact), e.g..adA ,olleHforAda, or.olleHwhen the name is empty or missing.length(name)(src/length.mjs): returns the number of characters ingreet(name), counted as JavaScript string length (UTF-16 code units), e.g.11forAda(Hello, Ada.), or6when the name is empty or missing.letters(name)(src/letters.mjs): returnsgreet(name)split into an array of single characters (Unicode code points), e.g.["H","e","l","l","o",","," ","A","d","a","."]forAda, or["H","e","l","l","o","."]when the name is empty or missing.lower(name)(src/lower.mjs): returnsgreet(name)in lower case with the trailing period replaced by an exclamation mark, e.g.hello, ada!forAda, orhello!when the name is empty or missing.upper(name)(src/upper.mjs): returnsgreet(name)in upper case with a trailing!instead of the period, e.g.HELLO, ADA!, orHELLO!when the name is empty or missing.compact(name)(src/compact.mjs): returnsgreet(name)with every space removed, for a URL slug, e.g.Hello,Ada.forAda, orHello.when the name is empty or missing.twice110312190(name)(src/twice110312190.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.byteLength(name)(src/byte-length.mjs): returns the number of UTF-8 bytes ingreet(name), for a transport budget, e.g.11forAda(Hello, Ada.), or6when the name is empty or missing.bracket110312191(name)(src/bracket110312191.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.bracket110609581(name)(src/bracket110609581.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.twice110609580(name)(src/twice110609580.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.twice110610380(name)(src/twice110610380.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket110610381(name)(src/bracket110610381.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.bracket110622581(name)(src/bracket110622581.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.twice110622580(name)(src/twice110622580.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.twice110701080(name)(src/twice110701080.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket110701081(name)(src/bracket110701081.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.twice110701190(name)(src/twice110701190.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket110701191(name)(src/bracket110701191.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.twice110701390(name)(src/twice110701390.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket110701391(name)(src/bracket110701391.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.shouted(name)(src/shouted.mjs): returnsgreet(name)in upper case, e.g.HELLO, ADA.forAda, orHELLO.when the name is empty or missing.whispered(name)(src/whispered.mjs): returnsgreet(name)in lower case, e.g.hello, ada.forAda, orhello.when the name is empty or missing.excited(name)(src/excited.mjs): returnsgreet(name)with its final period replaced by an exclamation mark, e.g.Hello, Ada!forAda, orHello!when the name is empty or missing.asked(name)(src/asked.mjs): returnsgreet(name)with its final period replaced by a question mark, e.g.Hello, Ada?forAda, orHello?when the name is empty or missing.trailed(name)(src/trailed.mjs): returnsgreet(name)with its final period replaced by an ellipsis, e.g.Hello, Ada...forAda, orHello...when the name is empty or missing.doubled(name)(src/doubled.mjs): returnsgreet(name)with its final period replaced by two exclamation marks, e.g.Hello, Ada!!forAda, orHello!!when the name is empty or missing.spaced(name)(src/spaced.mjs): returnsgreet(name)with one space between every two characters (Unicode code points), e.g.H e l l o , A d a .forAda, orH e l l o .when the name is empty or missing.hushed(name)(src/hushed.mjs): returnsgreet(name)in lower case with its final period replaced by three periods, e.g.hello, ada...forAda, orhello...when the name is empty or missing.twice110923400(name)(src/twice110923400.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket110923401(name)(src/bracket110923401.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.twice111002480(name)(src/twice111002480.mjs): returnsgreet(name)repeated twice, joined by exactly one space, e.g.Hello, Ada. Hello, Ada.forAda, orHello. Hello.when the name is empty or missing.bracket111002481(name)(src/bracket111002481.mjs): returnsgreet(name)wrapped in square brackets with no space inside, e.g.[Hello, Ada.]forAda, or[Hello.]when the name is empty or missing.
Scratch note: used to make a Factory PR fall behind main for the no-queue fallback test.
npm run notes -- <command> [args] against DATABASE_URL: add --title T [--body B] [--tag X]... [--embedding 1,2,3], list [--tag X] [--limit N] [--format table|json], remove <id>, similar --embedding 1,2,3 [--k N]. Commands, export formats and rules are discovered from src/commands/, src/export/ and src/rules/; schema changes are files under migrations/. scripts/ci/setup.sh prepares PostgreSQL with pgvector and exports DATABASE_URL. See AGENTS.md for how a feature is added.
Files under media/ are stored in Git LFS; sizes and sha256 are of the real content (git lfs pull).
media/triangle.glb— 468 bytes, sha25669432afb5f0c88e73f52b199a6f91fac09487ba914d737406ca3e8c0cd38bfaamedia/beep.wav— 4044 bytes, sha256faa6433613ef3732c87555cee537cb519b614797ab4d70d5d389b2dd03fdc2b1