@maccesar/titools 4.16.3 → 4.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -46,25 +46,30 @@ The index maps skills to their reference docs:
46
46
  |ti-expert/references:{alloy-structure.md,anti-patterns.md,...}
47
47
  |purgetss/references:{animation-system.md,apply-directive.md,...}
48
48
  |ti-ui/references:{listviews-and-performance.md,layouts-and-positioning.md,...}
49
+ |ti-game/references:{api.md,project-setup.md,patterns.md,...}
50
+ |ti-synthengine/references:{api.md,sound-design.md,guide.md,...}
49
51
  ```
50
52
 
51
53
  How the assistant should use it:
52
54
  - Need ListView performance tips? Read `~/.agents/skills/ti-ui/references/listviews-and-performance.md`
53
55
  - Need the PurgeTSS grid system? Read `~/.agents/skills/purgetss/references/grid-layout.md`
54
56
  - Need controller cleanup patterns? Read `~/.agents/skills/ti-expert/references/controller-patterns.md`
55
- - Need Backbone.Models patterns (with `tidev/skills` installed)? Read `~/.agents/skills/alloy-guides/references/MODELS.md`
57
+ - Need a valid synth sweep? Read `~/.agents/skills/ti-synthengine/references/api.md` and `sound-design.md`
58
+ - Need Backbone.Models patterns? Read `~/.agents/skills/alloy-guides/references/MODELS.md`
56
59
 
57
60
  ### Skill overview
58
61
 
59
- TiTools ships 3 opinionated skills:
62
+ TiTools ships 5 specialist skills:
60
63
 
61
64
  | Skill | Purpose | Best for |
62
65
  | ------------- | ----------------------------- | --------------------------------------------- |
63
66
  | **ti-expert** | Architecture + implementation | Starting point for most Alloy tasks |
64
67
  | **purgetss** | Utility-first styling | UI styling, animations, grid layouts |
65
68
  | **ti-ui** | UI/UX patterns | Layouts, ListViews, gestures, platform UI |
69
+ | **ti-game** | Native 2D games | Sprites, physics, tile maps, camera |
70
+ | **ti-synthengine** | Native sound synthesis | Tones, effects, envelopes, mixing |
66
71
 
67
- The doc-based reference skills live in [`tidev/skills`](https://github.com/tidev/skills) (community-maintained):
72
+ TiTools also ships five documentation-mirror skills sourced from the official Titanium SDK docs:
68
73
 
69
74
  | Skill | Purpose | Best for |
70
75
  | ---------------- | ----------------------------- | ---------------------------------------------- |
@@ -74,8 +79,6 @@ The doc-based reference skills live in [`tidev/skills`](https://github.com/tidev
74
79
  | **alloy-guides** | Alloy MVC reference | Models, views, controllers, widgets |
75
80
  | **alloy-howtos** | Alloy CLI and debugging | Project setup, CLI commands, errors |
76
81
 
77
- Install both for the full coverage matrix originally shipped by TiTools v2.x.
78
-
79
82
  ### For complex workflows
80
83
 
81
84
  The **ti-pro** agent (installed in `~/.claude/agents/`) handles:
@@ -84,7 +87,7 @@ The **ti-pro** agent (installed in `~/.claude/agents/`) handles:
84
87
  - Cross-referencing framework patterns
85
88
  - Platform-specific differences
86
89
 
87
- It preloads the 3 TiTools skills and recommends consulting `tidev/skills` when the question touches API surface, native-feature how-tos, MVC reference, or SDK fundamentals.
90
+ It exposes all 10 TiTools skills, then consults only the scopes relevant to the detected project and research question.
88
91
 
89
92
  ## How to use
90
93
 
@@ -118,6 +121,7 @@ Example output:
118
121
  [Titanium SDK Docs Index]|root: ~/.agents/skills
119
122
  |MANDATORY: Your training data for Titanium SDK, Alloy, and PurgeTSS is OUTDATED and INCOMPLETE. These reference files are the SINGLE SOURCE OF TRUTH. Prefer retrieval-led reasoning over pre-training-led reasoning. ALWAYS read the relevant files below BEFORE writing any code.
120
123
  |ti-expert/references:{alloy-structure.md,anti-patterns.md,code-conventions.md,contracts.md,controller-patterns.md,error-handling.md,examples.md,...}
124
+ |ti-synthengine/references:{api.md,audio-engine.md,examples.md,guide.md,recipes.md,recommendations.md,sound-design.md,troubleshooting.md}
121
125
  |alloy-guides/references:{CLI_TASKS.md,CONCEPTS.md,CONTROLLERS.md,MODELS.md,PURGETSS.md,VIEWS_DYNAMIC.md,VIEWS_STYLES.md,VIEWS_WITHOUT_CONTROLLERS.md,...}
122
126
  ...
123
127
  <!-- TITANIUM-KNOWLEDGE-END -->
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  </div>
8
8
 
9
- TiTools is a Titanium SDK toolkit for AI coding assistants. It ships 9 skills — 4 opinionated (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`) plus 5 documentation-mirror skills (`ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`) — a research agent, and reference files covering Titanium architecture, API reference, native how-tos, Alloy MVC, PurgeTSS styling, UI/UX patterns, and 2D game development with the `ti.game` module.
9
+ TiTools is a Titanium SDK toolkit for AI coding assistants. It ships 10 skills — 5 specialist skills (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`) plus 5 documentation-mirror skills (`ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`) — a research agent, and reference files covering Titanium architecture, API reference, native how-tos, Alloy MVC, PurgeTSS styling, UI/UX patterns, 2D games, and native sound synthesis.
10
10
 
11
11
  The reference files are maintained against official documentation whenever an official source exists, so the assistant can retrieve current framework behavior instead of guessing from generic training data.
12
12
 
@@ -36,9 +36,9 @@ The fastest way to get started with Claude Code. One command to add the marketpl
36
36
  ```
37
37
 
38
38
  What you get:
39
- - All 9 TiTools skills (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`)
39
+ - All 10 TiTools skills (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`, `ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`)
40
40
  - ti-pro research agent
41
- - Session hook that auto-detects Titanium projects (`tiapp.xml`, Alloy, PurgeTSS, `ti.game`)
41
+ - Session hook that auto-detects Titanium projects (`tiapp.xml`, Alloy, PurgeTSS, `ti.game`, `ti.synthengine`)
42
42
  - Slash commands: `/ti-check`, `/ti-new-screen`, `/ti-audit`
43
43
  - Auto-updates via marketplace (opt-in — see note below)
44
44
 
@@ -70,7 +70,7 @@ claude # or gemini, or codex
70
70
  ```
71
71
 
72
72
  What gets installed:
73
- - The 9 TiTools skills to `~/.agents/skills/`
73
+ - The 10 TiTools skills to `~/.agents/skills/`
74
74
  - ti-pro agent for Claude Code
75
75
  - Platform symlinks for Claude Code (Gemini CLI and Codex CLI auto-discover from `~/.agents/skills/` — no symlinks needed)
76
76
  - Knowledge index in your project's `AGENTS.md`/`CLAUDE.md`/`GEMINI.md`
@@ -91,7 +91,7 @@ Why NPM?
91
91
  | **Knowledge Index** | Not included | Included (`titools sync`) |
92
92
  | **Auto-updates** | Marketplace (opt-in, enable in `/plugin`) | SessionStart hook (daily) |
93
93
  | **Slash commands** | `/ti-check`, `/ti-new-screen`, `/ti-audit` | Same three (`~/.claude/commands/`) |
94
- | **Session hook** | Auto-detects Titanium projects (Alloy/Classic, PurgeTSS, `ti.game`) | Auto-update only |
94
+ | **Session hook** | Auto-detects Titanium projects (Alloy/Classic, PurgeTSS, `ti.game`, `ti.synthengine`) | Auto-update only |
95
95
 
96
96
  Having both installed is fine: the CLI detects an enabled marketplace plugin and skips its own skill symlinks and command copies, so nothing shows up twice. `titools doctor` reports which channel is serving Claude Code.
97
97
 
@@ -178,6 +178,7 @@ The knowledge index is based on the latest Titanium SDK documentation. If your p
178
178
  | purgetss | Utility-first styling | UI styling and animations |
179
179
  | ti-ui | UI/UX patterns | Complex layouts, ListViews, platform UI |
180
180
  | ti-game | 2D games with the `ti.game` module | Sprites, physics, tile layers, wall jumps, pathfinding, text/performance HUDs, particles, camera |
181
+ | ti-synthengine | Sound design with `ti.synthengine` | Tones, chords, retro/UI effects, alarms, sweeps, patterns, mixing and troubleshooting |
181
182
  | ti-api | Complete Titanium API reference | Looking up properties, methods, events |
182
183
  | ti-guides | SDK fundamentals | tiapp.xml, Hyperloop, distribution, JDK/Xcode compatibility, release notes |
183
184
  | ti-howtos | Native feature integration | Location, push, media, platform APIs |
@@ -185,8 +186,9 @@ The knowledge index is based on the latest Titanium SDK documentation. If your p
185
186
  | alloy-howtos | Alloy CLI, configuration, debugging | alloy.jmk, config.json, custom XML tags |
186
187
 
187
188
  Notes:
188
- - The first four (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`) are opinionated workflow skills reflecting TiTools' Titanium conventions.
189
+ - The first five (`ti-expert`, `purgetss`, `ti-ui`, `ti-game`, `ti-synthengine`) are specialist workflow skills reflecting TiTools' Titanium conventions and native-module contracts.
189
190
  - `ti-game` documents the `ti.game` native module (2D sprite engine on OpenGL ES 2.0, Android and iOS). Its API reference was verified against the module source and tracks upstream `main` (the module ships features ahead of its manifest version); it applies to Alloy and Classic projects alike and does not depend on PurgeTSS.
191
+ - `ti-synthengine` translates aesthetic sound requests into strict, production-ready JavaScript for the cross-platform `ti.synthengine` 1.0.0 module. Seven references preserve the official documentation and an eighth adds curated retro, xylophone, memory-pad, polyphony and timer-ownership recipes; the API contract was cross-checked against both native implementations.
190
192
  - The latter five are documentation-mirror skills sourced from the official Titanium SDK docs (`tidev/titanium-docs`) and audited against them via the internal `titools-skill-auditor`.
191
193
  - `purgetss` reference files are audited against the official PurgeTSS documentation, but its workflow conventions are opinionated.
192
194
 
@@ -198,14 +200,14 @@ In addition to skills, this repository includes sub-agents for Claude Code. Sub-
198
200
 
199
201
  ### ti-pro
200
202
 
201
- Deep-dive research specialist that preloads the 3 TiTools skills.
203
+ Deep-dive research specialist that can combine the complete 10-skill TiTools catalog.
202
204
 
203
205
  | Aspect | Details |
204
206
  | ---------------- | ------------------------------------------------ |
205
207
  | Location | `~/.claude/agents/ti-pro.md` |
206
208
  | Model | Sonnet (comprehensive analysis) |
207
209
  | Tools | Read-only (Read, Grep, Glob) |
208
- | Preloaded Skills | `ti-expert`, `purgetss`, `ti-ui` |
210
+ | Preloaded Skills | All 10 skills registered in `lib/config.js` |
209
211
 
210
212
  When to use the agent vs skills:
211
213
 
@@ -245,9 +247,9 @@ TiTools provides slash commands for common tasks. Both channels ship them: the p
245
247
  | `/ti-audit` | Audit project for anti-patterns, memory leaks, and best practice violations |
246
248
 
247
249
  These commands automatically invoke the relevant skills:
248
- - `/ti-check` reads `tiapp.xml` and reports project health
250
+ - `/ti-check` reads `tiapp.xml`, validates declared native modules, and reports project health
249
251
  - `/ti-new-screen` uses `ti-expert` + `purgetss` to create properly structured files
250
- - `/ti-audit` uses `ti-expert` + `ti-ui` + `purgetss` for comprehensive review
252
+ - `/ti-audit` routes all 10 skills: core Titanium checks always, Alloy/PurgeTSS checks when detected, integration how-tos when used, and `ti-game` / `ti-synthengine` checks when those modules are declared
251
253
 
252
254
  ---
253
255
 
@@ -256,10 +258,10 @@ These commands automatically invoke the relevant skills:
256
258
  The plugin includes a session start hook that auto-detects Titanium projects. When you open Claude Code in a directory with `tiapp.xml`, it automatically reports:
257
259
 
258
260
  ```
259
- Titanium Alloy + PurgeTSS + ti.game project detected. TiTools skills are available and MUST be used...
261
+ Titanium Alloy + PurgeTSS + ti.game + ti.synthengine project detected. TiTools skills are available and MUST be used...
260
262
  ```
261
263
 
262
- It reports Alloy vs Classic, whether PurgeTSS is configured, and whether the project declares the `ti.game` module — a game project also gets a line pointing at the `ti-game` skill.
264
+ It reports Alloy vs Classic, whether PurgeTSS is configured, and whether the project declares `ti.game` or `ti.synthengine`. Each detected native module adds a direct reminder to load its dedicated skill before writing module code.
263
265
 
264
266
  This ensures Claude knows it's a Titanium project from the first prompt, preventing it from writing generic code.
265
267
 
@@ -276,7 +278,7 @@ Skills are automatically activated based on your questions. Just ask naturally:
276
278
  The AI will automatically use:
277
279
  - `ti-expert` -> Architecture and controller structure
278
280
  - `purgetss` -> Styling classes and animations (if PurgeTSS detected)
279
- - `ti-howtos` from [`tidev/skills`](https://github.com/tidev/skills) (if installed) -> Secure token storage
281
+ - `ti-howtos` -> Secure token storage and native integration guidance
280
282
 
281
283
  You do not need to call skills explicitly. The AI reads skill descriptions and loads the appropriate knowledge when needed.
282
284
 
@@ -290,6 +292,7 @@ All skills include automatic project detection to ensure compatibility:
290
292
  | ti-expert | Alloy vs Classic | Checks for `app/` (Alloy) vs `Resources/` (Classic) structure |
291
293
  | ti-ui | Titanium projects | Checks for `tiapp.xml` (both Alloy and Classic) |
292
294
  | ti-game | ti.game module | Checks for `<module>ti.game</module>` in `tiapp.xml` or `require('ti.game')` |
295
+ | ti-synthengine | ti.synthengine module | Checks for `<module>ti.synthengine</module>` in `tiapp.xml` or `require('ti.synthengine')` |
293
296
 
294
297
  Why this matters:
295
298
  - PurgeTSS suggestions are only provided if PurgeTSS is installed
@@ -298,24 +301,16 @@ Why this matters:
298
301
 
299
302
  ### Skill hierarchy
300
303
 
301
- `ti-expert` acts as the orchestrator, delegating to specialized skills when needed:
304
+ `ti-expert` is the architectural starting point and coordinates with the rest of the bundled catalog:
302
305
 
303
- ```
304
- ┌─────────────────┐
305
- │ ti-expert │
306
- │ (Start Here) │
307
- └────────┬────────┘
308
- │
309
- ┌────────────┴────────────┐
310
- │ │
311
- ▼ ▼
312
- ┌───────────────┐ ┌───────────────┐
313
- │ purgetss │ │ ti-ui │
314
- │ (Styling) │ │ (UI/UX) │
315
- └───────────────┘ └───────────────┘
316
- ```
306
+ | Scope | Skills |
307
+ | --- | --- |
308
+ | Architecture and UI | `ti-expert`, `ti-ui`, `purgetss` when configured |
309
+ | Native modules | `ti-game`, `ti-synthengine` when declared |
310
+ | Exact SDK/API guidance | `ti-api`, `ti-guides`, `ti-howtos` |
311
+ | Alloy MVC and tooling | `alloy-guides`, `alloy-howtos` for Alloy projects |
317
312
 
318
- For pure API / native-feature how-to / MVC / SDK reference docs, install [`tidev/skills`](https://github.com/tidev/skills) alongside TiTools — its `ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, and `alloy-howtos` skills layer below this hierarchy without conflict.
313
+ All ten ship with TiTools; no second skill package is required.
319
314
 
320
315
  ---
321
316
 
@@ -477,6 +472,36 @@ Key rules:
477
472
 
478
473
  ---
479
474
 
475
+ ### ti-synthengine
476
+
477
+ Cross-platform sound design and synthesis with the native `ti.synthengine` 1.0.0 module for Android and iOS.
478
+
479
+ When it activates:
480
+ - `tiapp.xml` declares `ti.synthengine`, or code calls `require('ti.synthengine')`
481
+ - The app needs generated UI feedback, game cues, retro/chiptune effects, alarms, chords, pads, noise percussion, sweeps, panning, or vibrato
482
+ - A synth call returns `false`, the first sound glitches, a pattern stops, a chord pumps, or output changes after a route switch
483
+
484
+ Example prompts:
485
+ ```
486
+ "Create a short sci-fi laser that sweeps left to right with ti.synthengine."
487
+ "Design a clean two-note success cue for a Titanium button."
488
+ "Build a playable xylophone that can glide across bars without retriggering the same note on every touchmove."
489
+ "Create a layered 12-voice chord and stop its repeating pulse cleanly when the window closes."
490
+ "Why does playTone return false when the object looks valid?"
491
+ "Start the engine safely after my Alloy window lays out and clean it up on close."
492
+ ```
493
+
494
+ Key rules:
495
+ - Option objects are closed contracts. Unsupported keys, invalid types, non-finite values, or broken envelopes reject the whole call
496
+ - Read waveform constants from `synth.getDefaults().waveTypes`; never guess numeric values or option names
497
+ - `playTone` accepts `note` or `frequency`, never both; `playChord` accepts `notes` or `frequencies`, never both
498
+ - `duration` includes attack, the full-level middle, and release, so explicit envelope times must intersect correctly
499
+ - Use `frequencyEnd` for sweeps, `panEnd` for stereo movement, and `lfoFreq`/`lfoDepth` for pitch vibrato
500
+ - Curated recipes cover retro effects, playable xylophone gestures, four-pad memory cues, controlled waveform comparisons, layered chords and cancellable repetition
501
+ - Start after the first layout settles, keep one lifecycle owner, check Boolean returns, and call `shutdown()` on cleanup
502
+
503
+ ---
504
+
480
505
  ## Usage examples and best practices
481
506
 
482
507
  ### Example prompts
@@ -572,7 +597,7 @@ Behavior depends on where you run it:
572
597
  | With `--local` flag | Installs skills locally to `./.agents/skills/` in the current project |
573
598
 
574
599
  What it does:
575
- - Installs the 9 TiTools skills (global or local depending on context)
600
+ - Installs the 10 TiTools skills (global or local depending on context)
576
601
  - Installs ti-pro agent for Claude Code
577
602
  - Installs the `/ti-check`, `/ti-new-screen` and `/ti-audit` slash commands into `~/.claude/commands/`
578
603
  - Detects installed AI platforms and lets you choose which to link (only Claude Code needs platform symlinks; Gemini CLI and Codex CLI auto-discover from `~/.agents/skills/`)
@@ -768,7 +793,7 @@ Then only add `large-title-enabled` per-window as needed:
768
793
  </Window>
769
794
  ```
770
795
 
771
- This pattern is documented across three TiTools skills: `ti-ui`, `ti-expert`, and `purgetss`. The `ti-api` skill in [`tidev/skills`](https://github.com/tidev/skills) also documents the underlying Window properties.
796
+ This pattern is documented across four bundled TiTools skills: `ti-ui`, `ti-expert`, `purgetss`, and `ti-api`, which covers the underlying Window properties.
772
797
 
773
798
  ---
774
799
 
@@ -779,6 +804,8 @@ This pattern is documented across three TiTools skills: `ti-ui`, `ti-expert`, an
779
804
  | ti-expert | Architecture + Implementation | 26 files (patterns, feedback surfaces, file type association, sharing, testing, security, etc.) |
780
805
  | purgetss | Setup + Critical Rules | 33 files (grid, animations, icons, class-index, SVG pipeline, etc.) |
781
806
  | ti-ui | UI Rules + Platform Diffs | 14 files (layouts, lists, gestures, etc.) |
807
+ | ti-game | Native 2D Game Workflow | 9 files (API, setup, patterns, recipes, tile maps, debugging, roadmap) |
808
+ | ti-synthengine | Native Sound Synthesis | 8 files (API, sound design, lifecycle, engine, official examples, curated recipes, recommendations, troubleshooting) |
782
809
 
783
810
  ---
784
811
 
package/agents/ti-pro.md CHANGED
@@ -1,10 +1,17 @@
1
1
  ---
2
2
  name: ti-pro
3
- description: Titanium SDK and Alloy research specialist. Loads the 3 TiTools skills and uses them together to answer research-style questions. Use for codebase analysis, architecture reviews, Titanium SDK implementation research, cross-feature questions, and platform-specific differences. Returns concrete findings with file and line references.
3
+ description: Titanium SDK and Alloy research specialist. Loads the complete TiTools skill catalog and uses the relevant scopes together for research-style questions. Use for codebase analysis, architecture reviews, Titanium SDK implementation research, cross-feature questions, native game or sound modules, and platform-specific differences. Returns concrete findings with file and line references.
4
4
  skills:
5
5
  - ti-expert
6
6
  - purgetss
7
7
  - ti-ui
8
+ - ti-game
9
+ - ti-synthengine
10
+ - ti-api
11
+ - ti-guides
12
+ - ti-howtos
13
+ - alloy-guides
14
+ - alloy-howtos
8
15
  tools: Read, Grep, Glob, Bash
9
16
  model: sonnet
10
17
  ---
@@ -15,13 +22,17 @@ You are a research specialist for Titanium SDK and Alloy mobile development. Wit
15
22
 
16
23
  ## What You Do
17
24
 
18
- When invoked, you research complex topics by consulting the 3 TiTools skills:
25
+ When invoked, research complex topics by consulting the applicable skills from the complete TiTools catalog:
19
26
 
20
27
  - `ti-expert` - Architecture, patterns, conventions
21
28
  - `purgetss` - Utility-first styling classes (optional add-on; use when the project already has it or the user asks about it)
22
29
  - `ti-ui` - UI/UX patterns, layouts, gestures
30
+ - `ti-game` - Native `ti.game` architecture and API when the module is declared
31
+ - `ti-synthengine` - Native sound synthesis and strict `ti.synthengine` contract when the module is declared
32
+ - `ti-api`, `ti-guides`, `ti-howtos` - Exact Titanium APIs, SDK fundamentals and native integrations
33
+ - `alloy-guides`, `alloy-howtos` - Alloy MVC, CLI, configuration and compiler workflows when the project is Alloy
23
34
 
24
- If the user has [`tidev/skills`](https://github.com/tidev/skills) installed alongside TiTools, also consult its doc-based skills (`ti-api`, `ti-guides`, `ti-howtos`, `alloy-guides`, `alloy-howtos`) when API surface, native-feature how-tos, MVC reference, or SDK fundamentals are part of the question.
35
+ Do not force conditional skills onto an unrelated project. State which scopes were applicable and why.
25
36
 
26
37
  ## Research Process
27
38
 
@@ -48,6 +59,8 @@ If the user has [`tidev/skills`](https://github.com/tidev/skills) installed alon
48
59
  | `/ti-expert` for architecture guidance | Inline consultation during development |
49
60
  | `/purgetss` to verify a class | Quick inline reference |
50
61
  | `/ti-ui` for UI/UX patterns and layouts | Task-oriented guidance |
62
+ | `/ti-game` for a focused native game task | Task-oriented game implementation |
63
+ | `/ti-synthengine` for a focused sound task | Task-oriented sound implementation |
51
64
  | Main conversation for iterative work | Sub-agents run in isolation |
52
65
 
53
66
  ## Response Format
@@ -3,12 +3,27 @@ name: ti-audit
3
3
  description: Audit Titanium project for anti-patterns, memory leaks, and best practice violations
4
4
  ---
5
5
 
6
- Audit the current Titanium project by invoking the relevant TiTools skills:
6
+ Audit the current Titanium project by invoking every applicable TiTools skill. First inspect `tiapp.xml` and the project layout so conditional skills are not run against the wrong project type.
7
7
 
8
- 1. Invoke `ti-expert` — check for architecture anti-patterns, memory leaks (missing event listener cleanup), and code conventions
9
- 2. Invoke `ti-ui` — check for UI anti-patterns (Ti.UI.SIZE in ListViews, WebView inside TableView, missing accessibility)
10
- 3. If PurgeTSS project, invoke `purgetss` — check for custom TSS that should be utility classes, unsupported classes, padding on Views
11
- 4. Invoke `alloy-guides` — check for proper Alloy patterns (model usage, widget structure)
12
- 5. If the project declares `ti.game`, invoke `ti-game` — check for sprites moved from timers instead of native properties, levels sized from `Ti.Platform.displayCaps` instead of the `resize` event, sprites added one by one instead of in one array, and timers or sounds left running when the window closes
8
+ Core Titanium audit:
9
+
10
+ 1. Invoke `ti-expert` — check architecture, navigation ownership, event/timer cleanup, memory leaks, bridge pressure, testing boundaries, adaptive layouts and code conventions.
11
+ 2. Invoke `ti-guides` — check `tiapp.xml`, CommonJS/Hyperloop usage, Titanium CLI/build assumptions, memory and bridge guidance, distribution settings, and toolchain compatibility.
12
+ 3. Invoke `ti-api` — verify every audited `Ti.*` API, event, property, constant and third-party module call against its exact signature. Do not report a suspected API defect from memory.
13
+ 4. Invoke `ti-ui` when the project creates Titanium UI — check layouts, list performance, event bubbling, gestures, animations, accessibility, orientation and platform-specific UI.
14
+ 5. Invoke `ti-howtos` when the project implements a native integration such as location, maps, push, camera, media, SQLite, HTTPClient, WebView, intents, Keychain/iCloud, Hyperloop or CI/CD — audit the complete integration and platform setup, not only the JavaScript call site.
15
+
16
+ Project-type audit:
17
+
18
+ 6. If the project is Alloy (`app/views/`, `app/controllers/`, `app/styles/`), invoke `alloy-guides` — check controllers, XML/TSS, models, collections, widgets, sync adapters and cleanup patterns.
19
+ 7. If the Alloy project uses `alloy.jmk`, `config.json`, `widget.json`, conditional views, custom XML tags or Alloy CLI workflows, invoke `alloy-howtos` — check configuration precedence, build hooks, generated structures and compilation/debugging conventions.
20
+ 8. If the project uses PurgeTSS (`purgetss/` or `purgetss/config.cjs`), invoke `purgetss` before evaluating styling — check unsupported utility classes, padding on Views, unnecessary manual TSS, dynamic components, grids, icons and animations.
21
+
22
+ Native-module audit:
23
+
24
+ 9. If the project declares `ti.game`, invoke `ti-game` — check for sprites moved from timers instead of native properties, levels sized from `Ti.Platform.displayCaps` instead of the `resize` event, sprites added one by one instead of in one array, and timers or sounds left running when the window closes.
25
+ 10. If the project declares `ti.synthengine`, invoke `ti-synthengine` — check strict option names and types, mutually exclusive pitch fields, valid envelope intersections, checked Boolean results, one clear lifecycle owner, delayed startup after layout, app-owned timer cancellation, and `shutdown()` cleanup.
26
+
27
+ If a conditional skill does not apply, record it as `not applicable` with the detected reason instead of inventing findings from it.
13
28
 
14
29
  Report findings grouped by severity: critical, warning, info.
@@ -9,7 +9,8 @@ Check the current Titanium project and report:
9
9
  2. Check if Alloy project (app/views + app/controllers exist)
10
10
  3. Check if PurgeTSS is configured (purgetss/config.cjs exists)
11
11
  4. Check whether the `ti.game` module is declared in `tiapp.xml` — report its version and whether the module is actually present under `modules/<platform>/ti.game/<version>/` or installed globally
12
- 5. Check for common issues:
12
+ 5. Check whether the `ti.synthengine` module is declared in `tiapp.xml` — report its version, verify matching Android/iPhone declarations, and whether the module is present under `modules/<platform>/ti.synthengine/<version>/` or installed globally
13
+ 6. Check for common issues:
13
14
  - Missing icon files (DefaultIcon.png)
14
15
  - Empty modules section in tiapp.xml
15
16
  - Outdated SDK version
@@ -100,7 +100,9 @@ export async function doctorCommand() {
100
100
  }
101
101
  }
102
102
  const expectedCommands = COMMANDS.length - pluginCommands.length;
103
- if (pluginCommands.length === COMMANDS.length) {
103
+ if (COMMANDS.length === 0) {
104
+ console.log(` ${CHECK} Slash commands: none (workflows ship as cross-agent skills)`);
105
+ } else if (pluginCommands.length === COMMANDS.length) {
104
106
  console.log(` ${CHECK} Slash commands: all ${COMMANDS.length} served by the marketplace plugin`);
105
107
  } else if (missingCommands.length === 0) {
106
108
  console.log(` ${CHECK} Slash commands: ${expectedCommands}/${expectedCommands} installed in ~/.claude/commands/`);
@@ -138,10 +140,13 @@ export async function doctorCommand() {
138
140
 
139
141
  for (const skill of SKILLS) {
140
142
  // A skill the marketplace plugin provides is *supposed* to have no mirror
141
- // here — the CLI removes it on purpose to avoid a duplicate entry. Counting
142
- // it as missing turns a healthy marketplace install into a wall of errors
143
- // telling the user to run a command that will correctly do nothing.
144
- if (platform.name === 'claude' && pluginProvidesSkill(skill, homeDir)) {
143
+ // here — the CLI removes it on purpose to avoid a duplicate entry. During
144
+ // command-to-skill migrations, a same-name command in an older enabled
145
+ // cache also suppresses the mirror until the marketplace refreshes.
146
+ if (
147
+ platform.name === 'claude' &&
148
+ (pluginProvidesSkill(skill, homeDir) || pluginProvidesCommand(skill, homeDir))
149
+ ) {
145
150
  servedByPlugin.push(skill);
146
151
  continue;
147
152
  }
package/lib/config.js CHANGED
@@ -34,6 +34,7 @@ export const SKILLS = [
34
34
  'purgetss',
35
35
  'ti-ui',
36
36
  'ti-game',
37
+ 'ti-synthengine',
37
38
  'ti-api',
38
39
  'ti-guides',
39
40
  'ti-howtos',
package/lib/symlink.js CHANGED
@@ -83,8 +83,8 @@ async function removePath(path) {
83
83
  * @returns {Promise<boolean>} True if the plugin provides this skill
84
84
  */
85
85
  export async function isClaudePluginSkillInstalled(skillName, baseDir) {
86
- const { pluginProvidesSkill } = await import('./claude-plugin.js');
87
- return pluginProvidesSkill(skillName, baseDir);
86
+ const { pluginProvidesSkill, pluginProvidesCommand } = await import('./claude-plugin.js');
87
+ return pluginProvidesSkill(skillName, baseDir) || pluginProvidesCommand(skillName, baseDir);
88
88
  }
89
89
 
90
90
  /**
@@ -118,8 +118,9 @@ export async function createSkillSymlinks(platformSkillsDir, skills, baseDir) {
118
118
  const useRelative = !!baseDir;
119
119
 
120
120
  for (const skill of skills) {
121
- // Skip Claude when the marketplace plugin already provides this skill;
122
- // clean up any stale symlink left from a previous CLI install.
121
+ // Skip Claude when the marketplace plugin already provides this skill or
122
+ // still provides a same-name legacy command during a command-to-skill
123
+ // migration; clean up any stale symlink left from a previous CLI install.
123
124
  if (isClaudePlatform && await isClaudePluginSkillInstalled(skill, baseDir)) {
124
125
  const stalePath = join(platformSkillsDir, skill);
125
126
  if (existsSync(stalePath)) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maccesar/titools",
3
- "version": "4.16.3",
4
- "description": "Titanium SDK skills and agents for AI coding assistants (Claude Code, Gemini CLI, Codex CLI)",
3
+ "version": "4.17.1",
4
+ "description": "Titanium SDK skills and agents for AI coding assistants, including native game and sound synthesis modules",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",
7
7
  "bin": {
@@ -25,7 +25,10 @@
25
25
  "agents",
26
26
  "mobile",
27
27
  "ios",
28
- "android"
28
+ "android",
29
+ "audio",
30
+ "sound-design",
31
+ "synthesizer"
29
32
  ],
30
33
  "author": "César Estrada <maccesar@gmail.com> (https://github.com/macCesar)",
31
34
  "license": "MIT",
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: ti-synthengine
3
+ description: "Use when a Titanium app declares ti.synthengine in tiapp.xml, imports require('ti.synthengine'), or asks for generated tones, chords, patterns, retro/game/UI sounds, alarms, sweeps, vibrato, envelopes, panning, gain staging, or troubleshooting with that native module. Covers Android and iOS contract 1.0.0. Do not use for audio-file playback, streaming music, or unrelated synthesizers."
4
+ ---
5
+
6
+ # ti.synthengine — sound synthesis for Titanium SDK
7
+
8
+ Act as an audio engineer and mobile sound designer for the native `ti.synthengine` module. Translate an aesthetic request into acoustically reasoned JavaScript that uses only the module's public contract.
9
+
10
+ This skill is verified against TiSynthEngine **1.0.0** at commit **`6685b81` (2026-08-29)**. Android and iOS expose the same eight public methods, option contracts, defaults, limits, waveform constants, and validation behavior.
11
+
12
+ ## Required workflow
13
+
14
+ Read the references relevant to the task before proposing code. Do not infer option names from Web Audio, another synthesizer, or general DSP libraries.
15
+
16
+ | Task | Read first |
17
+ | --- | --- |
18
+ | Any code using a public method, option, default, limit, or return value | [references/api.md](references/api.md) |
19
+ | Design a sound from an aesthetic description | [references/sound-design.md](references/sound-design.md), then [references/recipes.md](references/recipes.md) for a tuned starting point |
20
+ | Build retro/arcade effects, a playable instrument, memory pads, layered chords, timbre comparisons, or cancellable repetition | [references/recipes.md](references/recipes.md), plus [references/api.md](references/api.md) |
21
+ | Learn the official examples for tones, chords, tempo, patterns, noise, validation, startup, and cleanup | [references/examples.md](references/examples.md) |
22
+ | Install the module, start it safely, or manage screen/app cleanup | [references/guide.md](references/guide.md) |
23
+ | Choose a mixing profile, voice count, gain, latency strategy, or understand the signal path | [references/audio-engine.md](references/audio-engine.md), [references/recommendations.md](references/recommendations.md) |
24
+ | Diagnose `false`, silence, glitches, distortion, pattern replacement, or route changes | [references/troubleshooting.md](references/troubleshooting.md), [references/api.md](references/api.md) |
25
+
26
+ Cite factual guidance with `[source: references/<file>.md]`. If a relevant reference cannot be consulted, prefix the claim with `FROM_MEMORY (unverified):` instead of filling the gap silently.
27
+
28
+ ## Response contract for sound requests
29
+
30
+ Answer in the user's language and use this order:
31
+
32
+ 1. **Brief acoustic explanation.** Name the waveform, envelope, pitch movement or LFO, stereo movement, and why they create the requested perception.
33
+ 2. **Safe initialization when needed.** If the surrounding code does not already own a running engine, show `require`, `getDefaults()`, a checked `startEngine()` call, and appropriate cleanup. For a screen startup, follow the post-layout lifecycle in the guide.
34
+ 3. **Production JavaScript.** Return a focused, copyable block with short comments, exact option names, valid types and checked Boolean results.
35
+
36
+ If the request cannot be represented by this synthesizer—audio-file playback, indefinite loops, per-voice control, streaming, or sample-accurate composition—say so and recommend the appropriate kind of audio engine instead of inventing an API.
37
+
38
+ ## Contract invariants
39
+
40
+ Start from the installed contract:
41
+
42
+ ```javascript
43
+ var synth = require('ti.synthengine')
44
+ var contract = synth.getDefaults()
45
+ var WAVE = contract.waveTypes
46
+ ```
47
+
48
+ Never hardcode waveform integers when `WAVE.SINE`, `WAVE.SQUARE`, `WAVE.SAWTOOTH`, `WAVE.TRIANGLE`, and `WAVE.NOISE` are available.
49
+
50
+ - Option dictionaries are closed. Unknown or misspelled keys, wrong types, non-finite numbers, fractional values for integer fields, and out-of-range values make the entire call return `false`.
51
+ - `playTone()` takes at most one pitch source: `note` or `frequency`. If neither is supplied, it defaults to 440 Hz. Never send both.
52
+ - `playChord()` requires exactly one of `notes` or `frequencies`. It accepts `panSpread` or `pans`, but no sweep or LFO fields.
53
+ - Every sounding `playPattern()` step needs exactly one of `note` or `frequency`; a rest uses exactly `rest: true`. Even a `NOISE` step needs a pitch field, although noise ignores its value. Pattern roots do not accept `duration`.
54
+ - `duration` includes attack, the full-level middle, and release. For explicit envelopes, `attack < duration` and `release <= duration - attack`.
55
+ - `pan` and `panEnd` range from -1 to 1. `frequencyEnd` is a linear sweep target. `lfoFreq` is the modulation rate in Hz and `lfoDepth` is absolute pitch deviation in Hz, not cents.
56
+ - `startEngine()`, `playTone()`, `playChord()`, `playPattern()`, and `setVolume()` return `Boolean`; production code must handle rejection where it matters.
57
+ - Only one pattern can remain pending. A new pattern replaces future steps from the previous one. `stopAll()` fades active voices but does not cancel scheduled steps; `shutdown()` does both and frees the stream.
58
+
59
+ ## Acoustic decision guide
60
+
61
+ Use these as starting regions, then keep every explicit value inside the API limits and the envelope intersection:
62
+
63
+ | Intent | Starting design |
64
+ | --- | --- |
65
+ | Clean UI click or feedback | `SINE` or `TRIANGLE`, roughly 30–120 ms, 1–5 ms attack, short fitted release |
66
+ | Retro pickup or melody | `SQUARE`, short notes or a rising `playPattern()` |
67
+ | Retro bass | `TRIANGLE`, lower pitch, short attack and controlled release |
68
+ | Hit, hat, explosion texture | `NOISE`, immediate attack and short-to-medium release; layer only when the overlap budget allows |
69
+ | Alarm or urgent cue | `SAWTOOTH`, repeated pitches, a sweep, or vibrato around 4–7 Hz; use larger `lfoDepth` only for an obvious effect |
70
+ | Laser or sci-fi movement | One `frequency` plus `frequencyEnd`, short attack, fitted release, optional `pan` → `panEnd` |
71
+ | Pad or atmosphere | One `playChord()` with `SINE` or `TRIANGLE`, 2000 ms or longer, 300–600 ms attack, 800–1500 ms release when it fits |
72
+
73
+ A4 is 440 Hz under twelve-tone equal temperament; each octave doubles or halves frequency. Upward sweeps tend to read as activation, reward, or energy gain; downward sweeps tend to read as dismissal, power-down, or impact. Treat pan as supporting detail because many phone speakers collapse the stereo image.
74
+
75
+ For playable controls, trigger one event when the finger enters a new key, not on every `touchmove`. For simultaneous musical voices, prefer one atomic `playChord()` call; use small cent offsets in the generated frequency array when a layered sound needs beating because the module has no chord-detune option. Cancel app-owned timers before stopping voices or shutting down the engine. [source: references/recipes.md]
76
+
77
+ ## Mixing and lifecycle defaults
78
+
79
+ - Begin with `mixingProfile: 'conservative'`; use `balanced` mainly for one or two voices, `speakerSafe` for demanding small speakers, and `raw` only when the app owns gain staging.
80
+ - Size `maxVoices` for the largest real overlap, including release tails. Capacity is not loudness.
81
+ - Use one engine owner. On a Titanium screen, start after layout settles and call `shutdown()` when the owner closes.
82
+ - Test on the actual output path. Headphones expose noise and stereo detail; small phone speakers expose weak bass, resonance, and acoustic distortion that a digital limiter cannot repair.
83
+
84
+ ## Before returning code
85
+
86
+ - Re-read the exact method table in `references/api.md`; remove every unsupported property.
87
+ - Confirm pitch fields are mutually exclusive and numeric values are finite and in range.
88
+ - Compute the envelope intersection explicitly.
89
+ - Use `WAVE` constants from `getDefaults()`.
90
+ - Use `playChord()` for one simultaneous musical event instead of several hotter independent tones.
91
+ - Include startup and cleanup only at the ownership level relevant to the request.
92
+ - Cite the references that support the acoustic and API choices.