Teia Package Management - Agent Instructions#
This file contains instructions for AI agents working with OBJKT package creation and testing in the aesthetic.computer project.
Overview#
The Teia packaging system creates offline-ready packages of aesthetic.computer pieces for deployment to Teia (an NFT platform). The packages bundle all necessary assets and configure the system for offline operation.
Key Scripts#
1. Pack Script (ac-pack.mjs)#
Purpose: Creates a complete offline package for a piece, bundling all assets and configuring PACK mode.
Location: /workspaces/aesthetic-computer/objkt/ac-pack.mjs
Usage:
cd /workspaces/aesthetic-computer/teia
node ac-pack.mjs '<piece-name>'
Examples:
# Pack a KidLisp piece (note the $ prefix)
node ac-pack.mjs '$roz'
# Pack a regular piece
node ac-pack.mjs 'drawing'
# Unpack latest package automatically
node ac-unpack.mjs
# Unpack specific package
node ac-unpack.mjs 'output/$roz-2025.09.22.04.24.38.942.zip'
What it does:
- Fetches the piece code (KidLisp or JavaScript)
- Bundles all system libraries and dependencies
- Includes font files (font_1 glyphs, webfonts)
- Sets PACK mode flags for offline operation
- Creates a zip file ready for OBJKT deployment
- Output goes to:
/workspaces/aesthetic-computer/teia/output/
Key Features:
- Automatically detects KidLisp vs JavaScript pieces
- Bundles dependencies and handles imports
- Configures offline font loading
- Sets PACK mode to prevent API calls
- Creates timestamped zip files
2. Unpack Script (ac-unpack.mjs)#
Purpose: Extracts and serves packaged Teia files for testing.
Location: /workspaces/aesthetic-computer/teia/ac-unpack.mjs
Usage:
cd /workspaces/aesthetic-computer/teia
# Unpack and serve the latest zip file (auto-detected)
node ac-unpack.mjs
# Unpack a specific zip file
node ac-unpack.mjs '<zip-file-path>'
# Unpack with custom port
node ac-unpack.mjs '<zip-file-path>' 8003
Examples:
# Unpack and serve the latest $roz package
node ac-unpack.mjs 'output/$roz-2025-09-22T04-16-44-018Z.zip'
# Unpack without auto-serving (just extract)
node ac-unpack.mjs 'output/$roz-2025-09-22T04-16-44-018Z.zip' --no-serve
What it does:
- Automatically finds the latest zip file if no path provided
- Extracts the zip file to
output/test-extract/ - Analyzes package contents
- Starts a local HTTP server on port 8002 (or custom port)
- Opens browser for testing
- Monitors server logs for debugging
Testing Checklist:
- Check browser console for errors
- Verify no API calls to
/api/bdf-glyphor/api/store-kidlisp - Test font rendering (corner labels, QR codes)
- Verify offline functionality
3. Ship Script (ac-ship.mjs)#
Purpose: Converts ac-pack zip files into native Electron desktop applications for Mac, Windows, and Linux.
Location: /workspaces/aesthetic-computer/teia/ac-ship.mjs
Basic Usage:
# Ship the latest zip file to all platforms
node ac-ship.mjs
# Ship a specific zip file
node ac-ship.mjs 'output/@jeffrey-$bop-2025.09.22.04.24.38.942.zip'
# Ship to specific platforms only
node ac-ship.mjs --platforms mac,windows
node ac-ship.mjs 'my-piece.zip' --platforms linux
Examples:
# Ship the latest $roz package to all platforms
node ac-ship.mjs
# Ship only macOS and Windows apps
node ac-ship.mjs 'output/$roz-2025-09-22T04-16-44-018Z.zip' --platforms mac,windows
# Ship to Linux only for testing
node ac-ship.mjs --platforms linux
What it does:
- Automatically finds the latest zip file if no path provided
- Extracts the zip file to a temporary directory
- Creates an Electron project structure around the extracted contents
- Installs Electron dependencies (electron, electron-builder)
- Builds native apps for the specified platforms:
- Mac:
.dmginstaller (supports Intel x64 and Apple Silicon arm64) - Windows:
.exeNSIS installer (x64) - Linux:
.AppImageportable app (x64)
- Mac:
- Cleans up temporary files
- Outputs apps to
output/{piece-name}-electron/dist/
Output Structure:
output/
├── piece-name-electron/
│ ├── dist/ # Built applications
│ │ ├── piece-name-1.0.0.dmg # macOS app
│ │ ├── piece-name Setup 1.0.0.exe # Windows installer
│ │ └── piece-name-1.0.0.AppImage # Linux portable app
│ ├── package.json # Electron project config
│ ├── main.js # Electron main process
│ └── app/ # Extracted ac-pack contents
│ ├── index.html
│ └── aesthetic.computer/
└── piece-name-temp/ # (cleaned up automatically)
Platform Requirements:
- All platforms can be built from Linux (current dev container)
- Apps are typically 20-50MB each
- No code signing included (apps may show security warnings)
Common Workflows#
Creating and Testing a Package#
-
Pack the piece:
cd /workspaces/aesthetic-computer/teia node ac-pack.mjs '$roz' -
Test the latest package automatically:
# Auto-detects and serves the most recent zip file node ac-unpack.mjs -
Monitor testing:
- Check browser console at http://localhost:8002
- Look for PACK mode debug messages
- Verify no API call errors
- Test font rendering
Creating Desktop Applications#
-
Ship Electron apps from existing package:
# Ship the latest zip file to all platforms node ac-ship.mjs # Or ship specific platforms node ac-ship.mjs --platforms mac,windows -
Complete workflow from piece to desktop apps:
# Pack, test, and ship in sequence node ac-pack.mjs '$bop' node ac-unpack.mjs # Test in browser node ac-ship.mjs # Create desktop apps -
Distribute the apps:
- Find built apps in
output/{piece-name}-electron/dist/ - Upload to GitHub releases or your preferred distribution method
- Consider code signing for production distribution
- Find built apps in
Debugging Common Issues#
Font Issues#
- Symptom: Missing corner labels or broken QR codes
- Check: Look for font_1 and MatrixChunky8 in the package
- Debug: Check console for font loading messages
API Call Issues#
- Symptom: Infinite loops, 404s to /api/* endpoints
- Check: Look for PACK mode detection messages in console
- Debug: Verify
objkt-mode.mjsis loaded and PACK mode is true
Circular Dependencies#
- Symptom: "Cannot access before initialization" errors
- Solution: Use the shared
objkt-mode.mjsmodule for OBJKT detection
File Structure#
teia/
├── ac-pack.mjs # Main packing script
├── ac-unpack.mjs # Testing/unpacking script
├── output/ # Generated packages
│ ├── $roz-*.zip # Timestamped zip files
│ └── test-extract/ # Unpacked test files
└── agents.md # This file
Key Technical Details#
Timestamping System#
- Uses
num.timestamp()function for consistent timestamps across the platform - Format:
YYYY.MM.DD.HH.MM.SS.mmm(e.g.,2025.09.22.04.24.38.942) - Same timestamp format used for GIF generation and other AC features
- Provides precise ordering and avoids filename conflicts
Auto-Detection Features#
ac-unpack.mjsautomatically finds the most recent zip file when no argument provided- Sorts zip files by modification time to find the latest package
- Eliminates need to copy/paste long timestamp filenames for testing
OBJKT Mode Detection#
- Uses shared module:
system/public/aesthetic.computer/lib/objkt-mode.mjs - Prevents API calls in offline packages
- Enables local font loading
- Set during package initialization
Font System#
font_1: Bitmap font for UI elements (bundled as individual glyph files)MatrixChunky8: BDF font for QR codes (requires special handling)- Webfonts: Typography fonts (bundled as woff/woff2 files)
Bundle Structure#
Packages include:
index.html- Entry pointaesthetic.computer/- Core system filesassets/- Font and media fileskidlisp-cache.js- Cached KidLisp codetype/webfonts/- Typography assets
Troubleshooting#
Common Error Messages#
-
"Uncaught ReferenceError: TEIA_MODE is not defined"
- Missing import of
getPackMode()fromobjkt-mode.mjs - Update code to use the shared PACK mode module
- Missing import of
-
"Cannot access 'TextInput' before initialization"
- Circular dependency issue
- Use shared modules instead of cross-imports
-
"📱 PACK mode: skipping API call"
- Good! This means PACK mode detection is working
-
Font rendering issues
- Check if font files are bundled in the package
- Verify PACK mode detection for offline font loading
Useful Console Messages#
🔤 Font glyph lookup- Font loading debug info📱 PACK mode: skipping- API call prevention🔍 OBJKT check in- PACK mode detection status
Best Practices#
- Use auto-detection for testing - Just run
node ac-unpack.mjswithout arguments - Check console logs for errors and API calls
- Verify font rendering in corner labels and QR codes
- Timestamp consistency - All packages use the same
num.timestamp()format - Monitor server logs during testing for unexpected requests
Agent Notes#
When working with OBJKT packages:
- Run
node ac-unpack.mjswithout arguments to test the latest package automatically - The pack script uses
num.timestamp()for consistent timestamp formatting - Timestamp format matches GIF generation and other AC platform features
- Auto-detection saves time by eliminating manual zip file selection
- All commands should be run from the
/workspaces/aesthetic-computer/teia/directory