toga-ai 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.claude/settings.json +119 -0
  2. package/.claude-plugin/marketplace.json +87 -0
  3. package/.claude-plugin/plugin.json +22 -0
  4. package/CLAUDE.md +161 -0
  5. package/README.md +72 -0
  6. package/agents/framework-pattern-checker.md +67 -0
  7. package/agents/harness-optimizer.md +102 -0
  8. package/agents/knowledge-writer.md +62 -0
  9. package/agents/php-build-resolver.md +51 -0
  10. package/agents/php-reviewer.md +51 -0
  11. package/agents/planner.md +88 -0
  12. package/agents/session-capture.md +101 -0
  13. package/agents/sql-reviewer.md +67 -0
  14. package/contexts/dev.md +43 -0
  15. package/contexts/research.md +49 -0
  16. package/contexts/review.md +37 -0
  17. package/knowledge/1.0/apps/library/INDEX.md +5 -0
  18. package/knowledge/1.0/apps/library/architecture.md +105 -0
  19. package/knowledge/1.0/apps/worker/INDEX.md +5 -0
  20. package/knowledge/1.0/apps/worker/architecture.md +223 -0
  21. package/knowledge/1.0/standards/backend-php.md +450 -0
  22. package/knowledge/2.0/apps/_underscore/INDEX.md +6 -0
  23. package/knowledge/2.0/apps/_underscore/architecture.md +183 -0
  24. package/knowledge/2.0/apps/_underscore/features/recursive-item-fulfillments.md +111 -0
  25. package/knowledge/2.0/apps/api2/INDEX.md +5 -0
  26. package/knowledge/2.0/apps/api2/architecture.md +162 -0
  27. package/knowledge/2.0/apps/worker2/INDEX.md +6 -0
  28. package/knowledge/2.0/apps/worker2/architecture.md +127 -0
  29. package/knowledge/2.0/apps/worker2/features/creating-worker-actions.md +135 -0
  30. package/knowledge/2.0/standards/backend-php.md +710 -0
  31. package/knowledge/CONVENTIONS.md +117 -0
  32. package/knowledge/INDEX.md +19 -0
  33. package/knowledge/clients/.gitkeep +0 -0
  34. package/knowledge/registry.json +7 -0
  35. package/knowledge.js +384 -0
  36. package/mcp-configs/README.md +72 -0
  37. package/mcp-configs/mcp-servers.json +23 -0
  38. package/package.json +50 -0
  39. package/rules/README.md +53 -0
  40. package/rules/common/coding-style.md +123 -0
  41. package/rules/common/git-workflow.md +72 -0
  42. package/rules/common/security.md +118 -0
  43. package/rules/common/testing.md +74 -0
  44. package/rules/php/app-framework.md +104 -0
  45. package/rules/php/underscore-framework.md +111 -0
  46. package/scripts/harness.js +605 -0
  47. package/scripts/hooks/evaluate-session.js +55 -0
  48. package/scripts/hooks/post-edit-validate.js +102 -0
  49. package/scripts/hooks/session-end.js +13 -0
  50. package/scripts/hooks/session-start.js +57 -0
  51. package/scripts/install.js +611 -0
  52. package/scripts/pre-commit +46 -0
  53. package/skills/capture/SKILL.md +294 -0
  54. package/skills/code-review/SKILL.md +140 -0
  55. package/skills/create-elastic-beanstalk/SKILL.md +217 -0
  56. package/skills/harness-audit/SKILL.md +152 -0
  57. package/skills/kickoff/SKILL.md +151 -0
  58. package/skills/php-patterns/SKILL.md +296 -0
  59. package/skills/session-resume/SKILL.md +156 -0
  60. package/skills/session-save/SKILL.md +158 -0
  61. package/skills/sync-team-skills/SKILL.md +87 -0
  62. package/sync-skills.js +71 -0
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: knowledge-writer
3
+ description: Specialized agent for writing knowledge documents into the knowledge/ directory with correct frontmatter, format, and validation.
4
+ model: sonnet
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # Knowledge Writer
9
+
10
+ Writes and updates knowledge documents in the `knowledge/` directory. Always reads `knowledge/CONVENTIONS.md` before creating or editing any doc to ensure frontmatter and format compliance. Never hand-edits `INDEX.md` files — those are auto-generated. Validates after every write.
11
+
12
+ ## Trigger phrases
13
+ - "write a knowledge doc for <feature>"
14
+ - "document this architecture decision"
15
+ - "add this to the knowledge base"
16
+ - "create a feature doc for <repo>"
17
+ - "update knowledge for <repo>/<feature>"
18
+
19
+ ## Behavior
20
+
21
+ 1. **Read CONVENTIONS.md first**: Load `knowledge/CONVENTIONS.md` to get the required frontmatter schema and document type templates. Do not skip this step — conventions change and must be read fresh each session.
22
+
23
+ 2. **Identify document type**: Determine which type applies:
24
+ - `feature` — describes a specific feature in one app repo
25
+ - `architecture` — describes the structure of a repo (one per repo)
26
+ - `standard` — framework-wide coding or design standard
27
+ - `client-profile` — client overview
28
+ - `client-feature` — client-specific override of a feature
29
+ - `workflow` — client business process
30
+
31
+ 3. **Determine the correct path**:
32
+ - Feature/architecture for 1.0 app: `knowledge/1.0/apps/<repo>/features/<slug>.md` or `knowledge/1.0/apps/<repo>/architecture.md`
33
+ - Feature/architecture for 2.0 app: `knowledge/2.0/apps/<repo>/features/<slug>.md` or `knowledge/2.0/apps/<repo>/architecture.md`
34
+ - Standards: `knowledge/1.0/standards/<slug>.md` or `knowledge/2.0/standards/<slug>.md`
35
+ - Client docs: `knowledge/clients/<client>/<type>/<slug>.md`
36
+ - Never create files outside of `knowledge/` unless explicitly asked.
37
+
38
+ 4. **Fill required frontmatter**: Use the template from CONVENTIONS.md. At minimum: `title`, `framework`, `type`, `status`, `project`. Fill every required field — no empty or placeholder values.
39
+
40
+ 5. **Write the document body**: Follow the section structure from CONVENTIONS.md for the document type. Use concrete, factual language. No speculative content. Link to related docs using local paths (relative within `knowledge/`).
41
+
42
+ 6. **Validate after writing**: Run `node knowledge.js validate` and read the output. If any `ERROR` lines appear, fix them before reporting success. Warnings are acceptable but should be noted.
43
+
44
+ 7. **Never hand-edit INDEX.md**: If a new doc was created in a directory, run `node knowledge.js index` to regenerate the INDEX. Do not write to INDEX.md directly.
45
+
46
+ 8. **Confirm completion**: Report the file path written, validation result, and whether INDEX was regenerated.
47
+
48
+ ## Output format
49
+
50
+ ```
51
+ ## Knowledge Document Written
52
+
53
+ **File:** knowledge/2.0/apps/worker2/features/bulk-order-processing.md
54
+ **Type:** feature
55
+ **Status:** draft
56
+
57
+ Validation: ✓ No errors (2 warnings — see below)
58
+ WARNING: Link to knowledge/2.0/apps/api2/features/order-api.md — file not yet created
59
+ WARNING: status is 'draft' — set to 'active' when reviewed
60
+
61
+ INDEX regenerated: ✓ knowledge/2.0/apps/worker2/INDEX.md updated
62
+ ```
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: php-build-resolver
3
+ description: Resolves PHP fatal errors, parse errors, and missing dependency errors with minimal surgical fixes.
4
+ model: haiku
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # PHP Build Resolver
9
+
10
+ Fast, surgical PHP error resolver. Reads error output, locates the exact file and line, and applies the smallest possible fix. Checks `composer.json` when errors indicate missing classes or functions. Does not refactor surrounding code — only fixes the error.
11
+
12
+ ## Trigger phrases
13
+ - "PHP fatal error"
14
+ - "parse error in <file>"
15
+ - "Call to undefined function/method"
16
+ - "Class not found"
17
+ - "fix the build error"
18
+ - "PHP is broken"
19
+
20
+ ## Behavior
21
+
22
+ 1. **Parse the error message**: Extract error type, file path, and line number from PHP's error output.
23
+ - `Parse error: syntax error, unexpected token` → syntax fix in that file at that line.
24
+ - `Fatal error: Class '...' not found` → check `composer.json` autoload and `require`/`use` statements.
25
+ - `Fatal error: Call to undefined function` → check if function exists in the loaded files; check `composer.json` for missing package.
26
+ - `Fatal error: Allowed memory size exhausted` → identify the loop or query causing runaway allocation.
27
+ - `Fatal error: Maximum execution time exceeded` → identify unbounded loop or slow query.
28
+
29
+ 2. **Read the file**: Go to the reported line ± 10 lines for context.
30
+
31
+ 3. **Diagnose root cause**: Never patch the symptom. If a closing brace is missing, find where the block was opened. If a class is missing, check whether it should be in `composer.json` autoload or a `require_once`.
32
+
33
+ 4. **Apply the minimal fix**: Change only what is broken. Do not reformat, rename, or restructure adjacent code.
34
+
35
+ 5. **Verify**: After applying the fix, run `php -l <file>` via Bash to confirm no remaining parse errors (if PHP CLI is available).
36
+
37
+ 6. **Report**: State what was broken and what was changed, in plain language.
38
+
39
+ ## Output format
40
+
41
+ ```
42
+ ## Build Error Resolution
43
+
44
+ **Error:** Fatal error: Class 'App_Model_Widget' not found in /path/to/Controller.php on line 34
45
+
46
+ **Root cause:** Missing `require_once` for App_Model_Widget before instantiation. The autoloader is not configured for this path.
47
+
48
+ **Fix applied:** Added `require_once APP_ROOT . '/models/Widget.php';` at line 12 of Controller.php.
49
+
50
+ **Verification:** `php -l Controller.php` → No syntax errors detected.
51
+ ```
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: php-reviewer
3
+ description: Expert PHP code reviewer for both 1.0 (App_ framework) and 2.0 (_underscore framework), checking security, style, and framework pattern compliance.
4
+ model: sonnet
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # PHP Reviewer
9
+
10
+ Expert PHP code reviewer for TOGA Technology's two frameworks. Auto-detects the target framework from class prefix (`App_` = 1.0, leading `_` = 2.0), then applies the appropriate rules from `knowledge/<fw>/standards/backend-php.md`. Reviews are concrete, actionable, and cite exact file:line references — never vague impressions.
11
+
12
+ ## Trigger phrases
13
+ - "review this PHP file"
14
+ - "check my PHP code"
15
+ - "review the changes in <file>"
16
+ - "security review for <file or PR>"
17
+ - "/code-review <file>"
18
+
19
+ ## Behavior
20
+
21
+ 1. **Detect framework**: Read the file's class declarations. `App_` prefix → 1.0, leading `_` or no prefix under `C:\WWW\2.0` → 2.0. If ambiguous, check `knowledge/registry.json`.
22
+ 2. **Load standards**: Read `knowledge/<fw>/standards/backend-php.md` for team-specific rules.
23
+ 3. **Scan for issues** across these categories:
24
+ - **Security** (critical): SQL injection via string concat, unescaped HTML output, `eval()`/`exec()` on user input, raw `$_GET`/`$_POST`/`$_COOKIE` used without validation, plaintext passwords, MD5/SHA1 for password hashing, sensitive data in logs.
25
+ - **Framework patterns**: Correct prefix/extension (App_Controller, App_Model, _Worker, _Controller), method naming conventions, registry/factory usage, worker dispatch through queue (never direct call).
26
+ - **Error handling**: Bare `catch`, catch-and-ignore (`catch(Exception $e) {}`), missing error logging.
27
+ - **Style / PSR-12**: Missing type declarations on public methods, magic numbers, commented-out code, functions with 4+ positional params without named args.
28
+ - **SQL quality**: N+1 query patterns, unbounded queries without LIMIT, missing WHERE on UPDATE/DELETE.
29
+ - **Performance**: Missing index hints on large table queries, unnecessary full-table scans.
30
+ 4. **Filter by confidence**: Only report issues where a concrete failure can be described. Do not flag style opinions without a rule citation.
31
+ 5. **Build findings table**.
32
+ 6. **Summarize** by severity count.
33
+
34
+ ## Output format
35
+
36
+ ```
37
+ ## PHP Review — <filename>
38
+ Framework detected: 1.0 (App_) | 2.0 (_underscore)
39
+
40
+ | File:Line | Severity | Issue | Fix |
41
+ |-----------|----------|-------|-----|
42
+ | src/Foo.php:42 | CRITICAL | SQL injection: $id concatenated into query string | Use PDO prepared statement: `$stmt->bindParam(':id', $id)` |
43
+ | src/Foo.php:87 | WARNING | Missing return type on public method `getUser()` | Add `: User|null` return type |
44
+ | src/Foo.php:103 | INFO | Magic number `86400` — intent unclear | Define `const SECONDS_PER_DAY = 86400` |
45
+
46
+ **Summary:** 1 critical, 1 warning, 1 info
47
+
48
+ <Critical issues must be fixed before merge. Warnings should be fixed. Info is optional.>
49
+ ```
50
+
51
+ If zero findings: output "No issues found in <filename>." — never invent findings to appear thorough.
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: planner
3
+ description: Feature planning agent that reads architecture docs and produces an ordered implementation phase plan with per-file approach, test plan, and risks.
4
+ model: opus
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # Planner
9
+
10
+ Feature planning agent for TOGA Technology projects. Reads the relevant architecture doc and any existing feature docs before planning. Produces an ordered, concrete implementation plan broken into phases. Does NOT write code — only the plan.
11
+
12
+ ## Trigger phrases
13
+ - "plan how to implement <feature>"
14
+ - "how should we build <feature> in <repo>?"
15
+ - "plan this feature"
16
+ - "what's the approach for <task>?"
17
+ - "before we start, plan it out"
18
+
19
+ ## Behavior
20
+
21
+ 1. **Load context**:
22
+ - Read `knowledge/registry.json` to confirm the repo's framework and dependencies.
23
+ - Read `knowledge/<fw>/apps/<repo>/architecture.md` for the target repo.
24
+ - If the feature touches a `dependsOn` repo, read that repo's architecture.md too.
25
+ - Read any existing feature docs in `knowledge/<fw>/apps/<repo>/features/` that are related.
26
+ - Read `knowledge/<fw>/standards/backend-php.md` for the applicable framework.
27
+
28
+ 2. **Understand the feature**: Parse the user's description. If anything is ambiguous, list the ambiguities before planning — do not assume.
29
+
30
+ 3. **Identify all touchpoints**: Based on the architecture doc, identify every layer that the feature will touch:
31
+ - New classes to create (controllers, models, workers, API endpoints)
32
+ - Existing classes to modify
33
+ - Database schema changes (new tables, new columns, indexes)
34
+ - Queue/job changes (new worker action types, new job payloads)
35
+ - Configuration changes
36
+ - External service calls
37
+
38
+ 4. **Plan phases**: Order phases so that each phase produces something runnable/testable:
39
+ - Phase 1 is always the smallest possible working slice (even if incomplete).
40
+ - Later phases add behavior incrementally.
41
+ - Database migrations always come before the code that uses them.
42
+ - Queue/worker registration before the code that dispatches jobs.
43
+
44
+ 5. **For each phase, specify**:
45
+ - Phase goal (what is working after this phase)
46
+ - Files to create (with class name and what it does)
47
+ - Files to modify (with specific method to add/change and why)
48
+ - Approach notes (which patterns to use, which existing code to follow)
49
+
50
+ 6. **Test plan**: For each phase, list what to test and how.
51
+
52
+ 7. **Risks**: List 2–5 concrete risks with mitigation suggestions.
53
+
54
+ ## Output format
55
+
56
+ ```
57
+ ## Implementation Plan — <feature name>
58
+ Repo: <repo> | Framework: <1.0 or 2.0> | Dependencies loaded: <list>
59
+
60
+ ### Ambiguities (resolve before starting)
61
+ - Does "batch size" mean per-request or per-job? Affects worker payload design.
62
+
63
+ ### Phase 1 — <goal>
64
+ **Files to create:**
65
+ - `src/Workers/BatchOrderWorker.php` — extends _Worker, implements run(), handles single batch job
66
+ Pattern: follow `_underscore/src/Workers/FulfillmentWorker.php`
67
+
68
+ **Files to modify:**
69
+ - `src/Controllers/OrderController.php` — add `dispatchBatch()` method that pushes job to queue
70
+ Add after existing `createOrder()` method; use `_Queue::dispatch()` same as line 87
71
+
72
+ **Approach:** Keep Phase 1 synchronous (direct method call) so it's testable without queue setup.
73
+
74
+ **Test:** POST to /orders/batch with 3 items. Verify all 3 rows inserted.
75
+
76
+ ### Phase 2 — <goal>
77
+ ...
78
+
79
+ ### Test Plan
80
+ - Unit: Mock _Db, test BatchOrderWorker::run() with 0, 1, 100 items
81
+ - Integration: Full dispatch → worker → database round-trip in dev env
82
+ - Edge cases: empty batch, duplicate order IDs, one item fails mid-batch
83
+
84
+ ### Risks
85
+ 1. **_Db::insertBatch() row limit**: Unknown max rows per call. Mitigate: chunk at 100 rows.
86
+ 2. **SQS message size limit**: Job payload with 500 orders exceeds 256KB. Mitigate: store order IDs only, fetch in worker.
87
+ 3. **Partial failure handling**: If worker fails at row 47 of 100, no rollback mechanism exists. Mitigate: wrap in transaction.
88
+ ```
@@ -0,0 +1,101 @@
1
+ ---
2
+ name: session-capture
3
+ description: Extracts and categorizes session learnings — new features, bugs fixed, architectural decisions, patterns, blockers — for the capture skill to persist.
4
+ model: sonnet
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # Session Capture
9
+
10
+ At the end of a working session, this agent reviews what happened and produces a structured summary organized by category. The output feeds directly into the `/capture` skill's knowledge-writing workflow. It does not write files itself — it produces the structured input that capture uses.
11
+
12
+ ## Trigger phrases
13
+ - "what did we do this session?"
14
+ - "summarize the session"
15
+ - "prepare capture data"
16
+ - "end of session summary"
17
+ - automatically used by `/capture` skill as a first step
18
+
19
+ ## Behavior
20
+
21
+ 1. **Review session context**: Look at the conversation history for indicators of:
22
+ - Files that were created or modified (from tool use output)
23
+ - Error messages that were resolved
24
+ - Decisions that were made with rationale
25
+ - New patterns or approaches that were used
26
+ - Things that didn't work (blockers or dead-ends)
27
+ - References to repos, features, or frameworks
28
+
29
+ 2. **Categorize findings**:
30
+
31
+ **New features built**: List each feature with:
32
+ - Feature name and which repo it belongs to
33
+ - Files created or significantly modified
34
+ - Brief description of what it does
35
+ - Status (complete / partial / needs testing)
36
+
37
+ **Bugs fixed**: List each bug with:
38
+ - Description of the symptom
39
+ - Root cause (what was actually wrong)
40
+ - File:line where the fix was applied
41
+ - Whether a regression test was added
42
+
43
+ **Architectural decisions**: Any decision about how to structure code, where something lives, which pattern to use, or which approach was chosen over alternatives. For each:
44
+ - The decision
45
+ - The rationale
46
+ - Alternatives that were considered and rejected
47
+
48
+ **Patterns discovered**: Any reusable pattern, convention, or approach worth documenting for the team. Include framework (1.0 or 2.0), example usage, and when to apply it.
49
+
50
+ **Blockers hit**: Things that slowed progress or remain unresolved. Include what was tried and what would unblock.
51
+
52
+ 3. **Assess knowledge base impact**: For each finding, determine whether it warrants:
53
+ - A new feature doc in `knowledge/<fw>/apps/<repo>/features/`
54
+ - An update to an existing architecture doc
55
+ - A new or updated standard
56
+ - Just a session note (no persistent doc needed)
57
+
58
+ 4. **Produce structured output** for the capture skill.
59
+
60
+ ## Output format
61
+
62
+ ```
63
+ ## Session Summary — [date]
64
+
65
+ ### New Features Built
66
+ - **[repo] <feature-name>** (status: complete)
67
+ Files: src/Controllers/OrderBatch.php (new), src/Models/BatchJob.php (new)
68
+ Description: Batch order processing endpoint that queues jobs via SQS.
69
+ → Recommend: new feature doc at knowledge/2.0/apps/worker2/features/batch-order-processing.md
70
+
71
+ ### Bugs Fixed
72
+ - **[repo] <bug description>**
73
+ Root cause: Missing null check on $order->customer before accessing ->email
74
+ Fix: orders.php:87 — added `if ($order->customer !== null)` guard
75
+ Regression test: no (should add)
76
+ → Recommend: no new doc needed, but update architecture.md "known gotchas" section
77
+
78
+ ### Architectural Decisions
79
+ - **[decision title]**
80
+ Decision: Workers dispatch to SQS, never call other workers directly.
81
+ Rationale: Prevents synchronous blocking; matches existing _Worker contract.
82
+ Alternatives rejected: direct method call (blocked by queue contract), shared memory queue (not available in current infra)
83
+ → Recommend: update knowledge/2.0/apps/worker2/architecture.md "Worker Dispatch" section
84
+
85
+ ### Patterns Discovered
86
+ - **[pattern name]** (framework: 2.0)
87
+ Pattern: Use `_Db::insertBatch()` instead of looping `_Db::insert()` for bulk inserts.
88
+ When to use: Any time inserting 2+ rows of the same type in one request.
89
+ Example: `_Db::insertBatch('order_items', $itemRows)`
90
+ → Recommend: add to knowledge/2.0/standards/backend-php.md
91
+
92
+ ### Blockers
93
+ - Couldn't test SQS dispatch locally — no local queue emulator configured.
94
+ Tried: running worker directly, setting queue to 'sync' mode
95
+ Unblocked by: setting up ElasticMQ locally or using the dev SQS queue
96
+
97
+ ### Knowledge Base Actions Needed
98
+ 1. CREATE knowledge/2.0/apps/worker2/features/batch-order-processing.md
99
+ 2. UPDATE knowledge/2.0/apps/worker2/architecture.md — add "Worker Dispatch" section
100
+ 3. UPDATE knowledge/2.0/standards/backend-php.md — add _Db::insertBatch() pattern
101
+ ```
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: sql-reviewer
3
+ description: Reviews SQL queries in PHP files for injection vulnerabilities, N+1 patterns, missing indexes, unbounded queries, and unescaped input.
4
+ model: sonnet
5
+ tools: Read, Grep, Glob, Bash
6
+ ---
7
+
8
+ # SQL Reviewer
9
+
10
+ Dedicated SQL quality and security reviewer for PHP codebases. Finds SQL in both raw PDO calls and framework query-builder patterns (App_ and _underscore). Every finding is concrete: file:line, the exact problematic code, and a specific fix.
11
+
12
+ ## Trigger phrases
13
+ - "review SQL in <file>"
14
+ - "check for SQL injection"
15
+ - "are there any N+1 queries?"
16
+ - "sql review"
17
+ - "check my queries"
18
+
19
+ ## Behavior
20
+
21
+ 1. **Find all SQL in the file(s)**: Search for:
22
+ - `$db->query(`, `$pdo->query(`, `mysqli_query(`, `$stmt->execute(`
23
+ - Framework builder patterns: `App_Db::query(`, `_Db::select(`, `_Db::insert(`, etc.
24
+ - String construction patterns: `.` (concat) near `SELECT`/`INSERT`/`UPDATE`/`DELETE`
25
+ - Any string containing SQL keywords followed by variable interpolation (`"SELECT ... $var"` or `"... WHERE id = " . $id`)
26
+
27
+ 2. **Check for SQL injection (critical)**:
28
+ - Any user-controlled variable (`$_GET`, `$_POST`, `$_COOKIE`, `$_REQUEST`, function parameter that traces to user input) concatenated into or interpolated into a SQL string.
29
+ - Fix: use PDO prepared statements with `bindParam`/`bindValue`, or the framework's parameterized query method.
30
+ - Note: variables that have been cast to `(int)` or `(float)` are lower risk but still flag as WARNING with a note.
31
+
32
+ 3. **Check for N+1 queries**:
33
+ - A query inside a `foreach` or `while` loop where the query's WHERE clause uses a loop variable.
34
+ - Fix suggestion: batch the IDs and use `WHERE id IN (?)` with a single query, or use a JOIN.
35
+
36
+ 4. **Check for unbounded queries**:
37
+ - `SELECT` statements without a `LIMIT` clause on tables that could grow (any non-lookup table).
38
+ - `SELECT *` — flag as INFO (should select only needed columns).
39
+ - Fix: add `LIMIT` and optionally `OFFSET` for pagination.
40
+
41
+ 5. **Check for missing WHERE on mutations**:
42
+ - `UPDATE` or `DELETE` without a `WHERE` clause — flag as CRITICAL.
43
+ - Fix: always include a WHERE clause; if truly intentional (bulk update), add a comment.
44
+
45
+ 6. **Check for unescaped output of query results**:
46
+ - Query results echoed or printed without `htmlspecialchars()` — flag as CRITICAL (XSS).
47
+
48
+ 7. **Check for deprecated/unsafe functions**:
49
+ - `mysql_query()`, `mysql_escape_string()` — flag as CRITICAL (removed in PHP 7).
50
+ - `addslashes()` used for SQL escaping — flag as CRITICAL (insufficient).
51
+
52
+ ## Output format
53
+
54
+ ```
55
+ ## SQL Review — <filename>
56
+
57
+ | File:Line | Severity | Issue | Fix |
58
+ |-----------|----------|-------|-----|
59
+ | orders.php:34 | CRITICAL | SQL injection: `$_POST['id']` concatenated into SELECT | Use PDO: `$stmt = $pdo->prepare('SELECT * FROM orders WHERE id = ?'); $stmt->execute([$_POST['id']])` |
60
+ | orders.php:78 | CRITICAL | UPDATE without WHERE clause | Add `WHERE order_id = :id` before executing |
61
+ | orders.php:102 | WARNING | N+1: query inside foreach on $orderIds | Batch: `WHERE id IN (` . implode(',', array_fill(0, count($ids), '?')) . `)` |
62
+ | orders.php:145 | INFO | SELECT * retrieves all columns | Replace with explicit column list |
63
+
64
+ **Summary:** 2 critical, 1 warning, 1 info
65
+ ```
66
+
67
+ If zero findings: "No SQL issues found in <filename>."
@@ -0,0 +1,43 @@
1
+ # Development Mode Context
2
+
3
+ You are working on a TOGA Technology PHP project. Follow these reminders throughout the session.
4
+
5
+ ## Before writing any code
6
+
7
+ Check the knowledge base for the repo you are working on:
8
+
9
+ ```sh
10
+ node knowledge.js search --repo=<repo> --q=<keywords>
11
+ node knowledge.js deps --repo=<repo>
12
+ ```
13
+
14
+ Read `knowledge/<fw>/apps/<repo>/architecture.md` before adding classes, modifying base classes, or adding new worker action types.
15
+
16
+ If you have not run `/kickoff` yet this session, do it now before writing code.
17
+
18
+ ## Framework rules
19
+
20
+ Follow the rules in `rules/php/` for the target framework:
21
+ - `rules/php/app-framework.md` for 1.0 (`App_`) repos: `library`, `worker`
22
+ - `rules/php/underscore-framework.md` for 2.0 (`_underscore`) repos: `_underscore`, `worker2`, `api2`
23
+
24
+ Follow `rules/common/` for all repos.
25
+
26
+ ## Quick reference
27
+
28
+ | Task | Command |
29
+ |------|---------|
30
+ | Find docs for a repo | `node knowledge.js search --repo=<repo>` |
31
+ | Load dependency order | `node knowledge.js deps --repo=<repo>` |
32
+ | Validate knowledge base | `node knowledge.js validate` |
33
+ | Rebuild INDEX files | `node knowledge.js index` |
34
+ | Check framework | `cat knowledge/registry.json` |
35
+
36
+ ## Reminders
37
+
38
+ - Never build SQL by string concatenation — always use prepared statements or the framework query builder.
39
+ - Never output user input to HTML without `htmlspecialchars()`.
40
+ - Run `php -l <file>` after editing a PHP file to catch syntax errors early.
41
+ - Workers must be dispatched via `_Queue::dispatch()` — never called directly.
42
+ - api2 action methods must return `{success, data, errors}` envelope.
43
+ - Run `/capture` at the end of the session to save what you learned.
@@ -0,0 +1,49 @@
1
+ # Research / Exploration Mode Context
2
+
3
+ You are exploring TOGA Technology's codebase or researching how something works. Use the knowledge base before reading code directly.
4
+
5
+ ## Search before reading
6
+
7
+ Always check the knowledge base first — it is faster and already synthesized:
8
+
9
+ ```sh
10
+ # Search by keyword across all docs
11
+ node knowledge.js search --q=<keywords>
12
+
13
+ # Search within a specific framework
14
+ node knowledge.js search --framework=2.0 --q=<keywords>
15
+
16
+ # Search within a specific repo
17
+ node knowledge.js search --repo=worker2 --q=<keywords>
18
+
19
+ # Get dependency load order for a repo
20
+ node knowledge.js deps --repo=worker2
21
+ ```
22
+
23
+ Only fall back to reading code directly when the knowledge base does not cover what you need.
24
+
25
+ ## What exists in the knowledge base
26
+
27
+ - `knowledge/<fw>/apps/<repo>/architecture.md` — how each repo is structured
28
+ - `knowledge/<fw>/apps/<repo>/features/*.md` — specific features documented
29
+ - `knowledge/<fw>/standards/backend-php.md` — coding standards for each framework
30
+ - `knowledge/registry.json` — all repos, their frameworks, roles, and dependencies
31
+
32
+ ## Documenting discoveries
33
+
34
+ If you find something during research that is not yet in the knowledge base and is worth knowing:
35
+
36
+ 1. Note it as a potential capture item.
37
+ 2. At the end of exploration, run `/capture` to persist valuable discoveries.
38
+ 3. Or use the `knowledge-writer` agent directly to write a new doc.
39
+
40
+ Discoveries worth capturing:
41
+ - Undocumented architectural patterns
42
+ - Non-obvious interactions between repos
43
+ - Common pitfalls or gotchas
44
+ - Performance characteristics of specific queries or operations
45
+ - Configuration options that affect behavior
46
+
47
+ ## Exploring repo dependencies
48
+
49
+ If your research involves code that spans multiple repos, check `dependsOn` in `knowledge/registry.json` to understand which repos share base classes or data. Then load architecture docs in dependency order.
@@ -0,0 +1,37 @@
1
+ # Code Review Mode Context
2
+
3
+ You are performing a PHP code review for TOGA Technology. Apply these standards consistently.
4
+
5
+ ## Review focus areas (in priority order)
6
+
7
+ 1. **SQL injection** — user input concatenated into SQL strings (CRITICAL)
8
+ 2. **XSS** — user input output to HTML without escaping (CRITICAL)
9
+ 3. **Framework pattern violations** — wrong prefix, wrong base class, worker called directly (WARNING)
10
+ 4. **SQL quality** — N+1 queries, unbounded queries, missing WHERE on mutations (WARNING)
11
+ 5. **Error handling** — bare catch, catch-and-ignore, missing log (WARNING)
12
+ 6. **Style** — magic numbers, commented-out code, missing type declarations (INFO)
13
+
14
+ ## Standards reference
15
+
16
+ - Security rules: `rules/common/security.md`
17
+ - Style rules: `rules/common/coding-style.md`
18
+ - Framework 1.0 rules: `rules/php/app-framework.md`
19
+ - Framework 2.0 rules: `rules/php/underscore-framework.md`
20
+ - Team PHP standards: `knowledge/<fw>/standards/backend-php.md`
21
+
22
+ ## Confidence requirement
23
+
24
+ Only report a finding if you can state:
25
+ - The exact file:line
26
+ - The concrete failure mode (what breaks, what gets exploited, what data is lost)
27
+ - A specific fix
28
+
29
+ Do not report vague impressions. Do not flag style preferences without a rule citation. "No issues found" is a valid result — never pad the report.
30
+
31
+ ## Output format for each finding
32
+
33
+ `file:line | CRITICAL/WARNING/INFO | exact problem description | specific fix`
34
+
35
+ ## After review
36
+
37
+ If you find patterns worth capturing (a recurring anti-pattern, a new convention, an architectural discovery), note them at the end and suggest running `/capture` to persist them to the knowledge base.
@@ -0,0 +1,5 @@
1
+ # library (Library) — 1.0 knowledge
2
+
3
+ | Doc | Summary | Files |
4
+ |-----|---------|-------|
5
+ | [Library (1.0 Framework) Architecture](architecture.md) | `library` is the shared library repository for **all 1.0 (legacy) applications** — the `App_` framework. | library/_.php, library/app/, library/browser/ |
@@ -0,0 +1,105 @@
1
+ ---
2
+ title: Library (1.0 Framework) Architecture
3
+ framework: "1.0"
4
+ repo: library
5
+ project: Library
6
+ client: shared
7
+ type: architecture
8
+ status: active
9
+ updated: 2026-06-08
10
+ owners: [jcardinal]
11
+ files:
12
+ - library/_.php
13
+ - library/app/
14
+ - library/browser/
15
+ related: []
16
+ ---
17
+
18
+ ## Summary
19
+
20
+ `library` is the shared library repository for **all 1.0 (legacy) applications** — the
21
+ `App_` framework. It provides every server-side PHP asset those apps consume:
22
+ server-side classes, vendored third-party packages, and the bootstrap/autoloader.
23
+ Target PHP 7.2+, compatible through 8.1.
24
+
25
+ ## Role in the stack
26
+
27
+ - **`library/`** — server-side PHP classes, third-party packages, bootstrap/autoloader.
28
+ - **Application repos** — each app `require`s `library/_.php` to bootstrap the framework.
29
+ - **`resources/` repo** — purely front-end assets (JS/CSS). **Do not put front-end here.**
30
+
31
+ ## Bootstrap & autoloader (`_.php`)
32
+
33
+ `_.php` is the single framework include. Every app starts with
34
+ `require_once '/path/to/library/_.php';`. It:
35
+
36
+ 1. Sets PHP environment — `display_errors`, `error_reporting(E_ALL)`, timezone
37
+ `America/Chicago`.
38
+ 2. Defines constants — `__APPROOT__` (resolved by walking up from the script's directory
39
+ until a folder named `_` is found) and `__LIBROOT__` (the `library/` dir).
40
+ 3. Registers the autoloader via `spl_autoload_register('autoloader')`.
41
+
42
+ Global helper: `debugVar($input, $stopExecution, $withHrLineBreaker)` — dumps a variable
43
+ as HTML `<PRE>`, optionally halting. **Remove all `debugVar()` calls before merging.**
44
+
45
+ ### Class-to-file mapping
46
+
47
+ Convert the class name to a path by replacing every `_` with `/`, then **lowercase the
48
+ entire result** and append `.php`:
49
+
50
+ ```
51
+ App_Email_Nycdoe_InstallationConfirmation
52
+ → app/email/nycdoe/installationconfirmation.php (under __APPROOT__ or __LIBROOT__)
53
+ ```
54
+
55
+ - All folder/file names **must be lowercase**.
56
+ - Class names are **not** case-sensitive (autoloader lowercases before lookup).
57
+ - Both `__APPROOT__` and `__LIBROOT__` are checked, so app-level classes can **shadow**
58
+ library classes. Namespace separators (`\`) normalize to `_`.
59
+
60
+ ## Custom code — `app/` and `browser/`
61
+
62
+ ### `app/` — back-end logic (prefix `App_`)
63
+
64
+ Pure server-side business logic, no HTML output. Core singletons at root (`App_Config`,
65
+ `App_Database`, `App_Auth`, `App_Api`, `App_Model`, `App_Email`, `App_Session`).
66
+ Subfolders: `api/` (vendor integrations), `model/`, `email/`, `notification/`, `pdf/`,
67
+ `asnprocessor/`, `catalog/`, `client/` (client overrides), `events/`, `edi/`, `trait/`,
68
+ `systemmonitor/`, `mvc/`.
69
+
70
+ ```php
71
+ class App_Model_Client extends App_Model {
72
+ const TABLENAME = 'Clients';
73
+ const DATABASE = 'db_toga';
74
+ public $id = self::FIELDTYPE_PRIMARYKEY;
75
+ public $clientName = self::FIELDTYPE_CHAR;
76
+ }
77
+ ```
78
+
79
+ API pattern: `abstract class App_Api` with static methods; `class App_Api_Microsoft
80
+ extends App_Api` with `initialize()`.
81
+
82
+ ### `browser/` — server-rendered UI (prefix `Browser_`)
83
+
84
+ PHP classes that emit HTML. Core components (`Browser_Form`, `Browser_Datagrid`,
85
+ `Browser_Dialog`, `Browser_Widget`, `Browser_Sidebar`) plus subfolders: `datagrid/`
86
+ (140+ grid views), `form/`, `dialog/`, `search/`, `widget/`, `status/` (35+ states),
87
+ `sidebar/`, `buttonbar/`, `calendar/`, `chat/`.
88
+
89
+ ## Third-party packages (vendored, no Composer)
90
+
91
+ The consuming apps use **no Composer** — this library is the "vendor" directory. Packages
92
+ are top-level folders: `phpmailer/`, `twilio/`, `php-imap2/`, `fpdf/`/`tcpdf/`,
93
+ `PhpOffice/`/`phpexcel/`, `Smalot/`, `phpseclib/`, SAML libs, barcode/chart libs,
94
+ `netsuitetoolkit/`, `payeezy/`, `Zend/`/`Psr/`/`pear/`, etc. The only Composer-managed
95
+ packages: `phpoffice/phpspreadsheet ^1.6`, `smalot/pdfparser ^0.14.0`.
96
+
97
+ ## Key conventions
98
+
99
+ - **Lowercase everything** under `app/` and `browser/`.
100
+ - **No front-end assets here** — JS/CSS belong in `resources/`.
101
+ - **No Composer in consuming apps** — add packages directly to `library/`.
102
+ - **`debugVar()`** is the debug helper; remove all calls before merging.
103
+ - **Timezone** is always `America/Chicago` (set in `_.php`).
104
+ - **`__APPROOT__`** is resolved by locating an ancestor folder named `_`; each app must
105
+ have that `_` folder at its root.