Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
41db6bf
fix: onboarding prompt — prevent URL hallucination, add page URL format
mayoalexander Apr 12, 2026
3cf99fc
fix: use API public_url for pages instead of client-side URL construc…
mayoalexander Apr 12, 2026
ab19d9b
fix: pages create sends json_content + auto_publish
mayoalexander Apr 13, 2026
88ae83d
fix: route pages CLI through iris-api proxy instead of fl-api direct
mayoalexander Apr 13, 2026
2661d6c
fix: page URL fallback to main.heyiris.io (heyiris.io doesn't route /p/)
mayoalexander Apr 13, 2026
ed1c6b9
feat: persistent component registry + AGENTS.md training for all sess…
mayoalexander Apr 13, 2026
eade2bf
fix: rebrand opencode→iris in help, add pages recipe, update AGENTS.m…
mayoalexander Apr 13, 2026
ee21834
Add iris proposals + iris contracts CLI commands
mayoalexander Apr 13, 2026
6147202
feat: unified scheduler, code workflows, site onboarding, iris-daemon…
mayoalexander Apr 13, 2026
a31e7a0
chore: bump version to 1.1.21
mayoalexander Apr 13, 2026
ae3afbd
Add billing flags to iris proposals create command
mayoalexander Apr 13, 2026
eca1826
feat: component validation on pages push — rejects invalid types befo…
mayoalexander Apr 13, 2026
be975ed
feat: iris pages compose — AI page builder with self-healing validation
mayoalexander Apr 13, 2026
3f77341
Add --rev-share flag to iris proposals create
mayoalexander Apr 13, 2026
fe61871
Add --pass-fees flag to iris proposals create
mayoalexander Apr 13, 2026
0d4ab58
feat: improved schedules list — table view, countdown timer, --active…
mayoalexander Apr 13, 2026
a23e00d
feat: schedules list shows ⬡ hive / ☁ cloud execution environment
mayoalexander Apr 13, 2026
21131dc
feat: LaunchAgent auto-start + schedule list UX improvements
mayoalexander Apr 13, 2026
5f27723
feat: schedules list — 4 execution environments with distinct icons
mayoalexander Apr 13, 2026
3389594
feat: auto-start daemon on any iris command
mayoalexander Apr 13, 2026
b128cba
feat: iris bridge (alias: iris daemon) — manage Hive from the CLI
mayoalexander Apr 13, 2026
c839a4d
feat: schedules list — grouped card layout by execution environment
mayoalexander Apr 13, 2026
ef24b6f
fix: schedules list — detect stuck jobs, show origin tags
mayoalexander Apr 13, 2026
5ec0739
feat: schedules list shows bloq (knowledge base) context per job
mayoalexander Apr 13, 2026
83ce354
feat: schedules list --latest — show last execution result per job
mayoalexander Apr 13, 2026
6f5eb70
feat: schedules history + inspect — full execution debug + agent conf…
mayoalexander Apr 13, 2026
5bbbabb
proposals CLI: add --list-price and --discount flags for discount pri…
mayoalexander Apr 13, 2026
d092368
proposals CLI: add cancel command to clear active payment gates
mayoalexander Apr 13, 2026
09d2036
proposals CLI: add --sender-name flag for "From" line on proposals
mayoalexander Apr 13, 2026
26d8ad2
feat: iris bridge runs — show scheduled script runs, history, and stats
mayoalexander Apr 13, 2026
13f537d
feat: iris bridge runs -o/-c/-a — show output, source code, and full …
mayoalexander Apr 13, 2026
9913f0f
docs: AGENTS.md + iris-cli skill — autonomous scheduling, agent-first…
mayoalexander Apr 13, 2026
5a3e301
feat: iris schedules diagnose — full chain diagnostic
mayoalexander Apr 14, 2026
13c29d2
fix: bug list + boards list fetch real data, add profile create/reassign
mayoalexander Apr 14, 2026
7501d07
chore: bump version to 1.1.22
mayoalexander Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 41 additions & 3 deletions install
Original file line number Diff line number Diff line change
Expand Up @@ -975,7 +975,7 @@ install_bridge() {
bridge_updated=true
else
# Fresh clone from public repo
if git clone --quiet https://github.com/FREELABEL/iris-bridge.git "$bridge_dir" 2>/dev/null; then
if git clone --quiet https://github.com/FREELABEL/iris-daemon.git "$bridge_dir" 2>/dev/null; then
(cd "$bridge_dir" && npm install --production --silent 2>/dev/null) || {
print_message warning "${ORANGE}npm install had issues — bridge may need manual setup${NC}"
}
Expand All @@ -984,7 +984,7 @@ install_bridge() {
fi
else
print_message info "${MUTED}[5/7] Agent Bridge .......................... could not download${NC}"
print_message info "${MUTED} Try manually: ${NC}git clone https://github.com/FREELABEL/iris-bridge.git ~/.iris/bridge"
print_message info "${MUTED} Try manually: ${NC}git clone https://github.com/FREELABEL/iris-daemon.git ~/.iris/bridge"
return 0
fi
fi
Expand Down Expand Up @@ -1157,13 +1157,44 @@ DCTL
ln -sf "$bridge_dir/bridgectl" "$INSTALL_DIR/iris-bridge"
ln -sf "$bridge_dir/daemonctl" "$INSTALL_DIR/iris-daemon"

# ── macOS LaunchAgent: auto-start daemon on login ──
if [ "$(uname)" = "Darwin" ]; then
local plist_name="io.heyiris.daemon.plist"
local plist_src="$bridge_dir/installers/macos/$plist_name"
local plist_dest="$HOME/Library/LaunchAgents/$plist_name"
local wrapper_src="$bridge_dir/installers/macos/iris-daemon-wrapper.sh"
local wrapper_dest="$HOME/.iris/iris-daemon-wrapper.sh"

# Copy and configure wrapper script
if [ -f "$wrapper_src" ]; then
cp "$wrapper_src" "$wrapper_dest"
# Point wrapper to ~/.iris/bridge (where main installer puts daemon)
sed -i '' "s|DAEMON_DIR=\"\${IRIS_DIR}/daemon\"|DAEMON_DIR=\"\${IRIS_DIR}/bridge\"|g" "$wrapper_dest" 2>/dev/null || true
chmod 755 "$wrapper_dest"
fi

# Install plist with HOME path substitution
if [ -f "$plist_src" ]; then
sed "s|__HOME__|$HOME|g" "$plist_src" > "$plist_dest"
# Also fix daemon path to bridge
sed -i '' "s|/.iris/daemon|/.iris/bridge|g" "$plist_dest" 2>/dev/null || true

# Load (unload first if already loaded)
launchctl unload "$plist_dest" 2>/dev/null || true
launchctl load "$plist_dest" 2>/dev/null || true
fi
fi

if [ "$bridge_updated" = "true" ]; then
print_message info "${GREEN}[5/7]${NC} Agent Bridge ${MUTED}.......................${NC} ${GREEN}updated${NC}"
else
print_message info "${GREEN}[5/7]${NC} Agent Bridge ${MUTED}.......................${NC} ${GREEN}installed${NC}"
fi
print_message info "${MUTED} Bridge: ${NC}iris-bridge start|stop|status"
print_message info "${MUTED} Daemon: ${NC}iris-daemon start|stop|status|register${MUTED} (Hive compute node)${NC}"
if [ "$(uname)" = "Darwin" ]; then
print_message info "${MUTED} Auto-start: ${NC}enabled${MUTED} (starts on login)${NC}"
fi
}

if [ "$skip_bridge" = "false" ]; then
Expand Down Expand Up @@ -2189,6 +2220,8 @@ if [ "$AUTH_SUCCESS" = "true" ]; then

RULES:
- NEVER use curl or call APIs directly. Only CLI commands.
- NEVER guess or hallucinate URLs. Page URLs follow the format: https://heyiris.io/p/{slug} (NOT subdomains). Always read the URL from CLI output.
- When a CLI command produces output, READ it carefully and use the exact values shown. Do not make up IDs, URLs, or status values.
- At the END of EVERY response, always include these links in a clean ASCII table like this:

┌──────────────────────────────────────────────────────────────┐
Expand Down Expand Up @@ -2241,7 +2274,12 @@ Wait for their answer. Based on what they pick, IMMEDIATELY run the correspondin

- Agent: Ask what it should do in one sentence, then run: iris agents create
- Multi-Agent Workflow: Ask what to automate in one sentence, then run: iris workflows list
- Web Page: Ask what the page is for, then guide to dashboard: $DASHBOARD (Pages tab)
- Web Page: Ask what the page is for, then run: iris pages create --slug <slug> --title "<title>" --template landing
After creation, the public URL is shown in CLI output (main.heyiris.io/p/<slug>). Auto-publishes on create.
To add more components: iris pages pull <slug>, edit pages/<slug>.json, iris pages push <slug>.
Run: iris pages component-registry — to see ALL available component types.
VALID component types (use ONLY these exact names): Hero, SiteNavigation, SiteFooter, AnnouncementBanner, TestimonialsSection, TeamSection, ContactSection, LogoMarquee, FeatureShowcase, ComparisonMatrix, ClientGrid, CareersListing, PortfolioGallery, ProductGrid, ServiceMenu, EventGrid, FundingTiers, BeforeAfter, MapSection, NewsletterSignup, StepWizard, FileUpload, ShoppingCart, OrderConfirmation.
NEVER invent component types. If unsure, run: iris pages component-registry
- Knowledge base / RAG: Run: iris bloqs create
- List knowledge bases: Run: iris bloqs list
- Add content to KB: Run: iris bloqs ingest <bloqId> <file>
Expand Down
4 changes: 2 additions & 2 deletions install.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -186,13 +186,13 @@ if (-not $HasNode) {
$BridgeUpdated = $true
} else {
try {
git clone --quiet https://github.com/FREELABEL/iris-bridge.git $BridgeDir 2>$null
git clone --quiet https://github.com/FREELABEL/iris-daemon.git $BridgeDir 2>$null
Push-Location $BridgeDir
npm install --production --silent 2>$null
Pop-Location
} catch {
Write-StepSkipped "5/5" "Agent Bridge" "could not download"
Write-Muted "Try manually: git clone https://github.com/FREELABEL/iris-bridge.git ~\.iris\bridge"
Write-Muted "Try manually: git clone https://github.com/FREELABEL/iris-daemon.git ~\.iris\bridge"
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/opencode/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "1.1.20",
"version": "1.1.22",
"name": "opencode",
"displayName": "iris-agent-cli",
"type": "module",
Expand Down
16 changes: 12 additions & 4 deletions packages/opencode/src/cli/cmd/platform-boards.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { cmd } from "./cmd"
import * as prompts from "@clack/prompts"
import { UI } from "../ui"
import { irisFetch, requireAuth, handleApiError, printDivider, printKV, dim, bold, success, highlight } from "./iris-api"
import { irisFetch, requireAuth, handleApiError, printDivider, printKV, dim, bold, success, highlight, resolveUserId } from "./iris-api"
import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs"
import { join, basename } from "path"

Expand Down Expand Up @@ -90,13 +90,21 @@ const BoardsListCommand = cmd({
spinner.start("Loading items…")

try {
const userId = await resolveUserId()
if (!userId) {
spinner.stop("Failed", 1)
prompts.log.error("Could not resolve user ID. Set IRIS_USER_ID or run iris-login.")
prompts.outro("Done")
return
}
const params = new URLSearchParams({ per_page: String(args.limit) })
const res = await irisFetch(`/api/v1/bloqs/${args["bloq-id"]}/items?${params}`)
const res = await irisFetch(`/api/v1/user/${userId}/bloqs/${args["bloq-id"]}/items?${params}`)
const ok = await handleApiError(res, "List items")
if (!ok) { spinner.stop("Failed", 1); prompts.outro("Done"); return }

const data = (await res.json()) as { data?: any[] }
const items: any[] = data?.data ?? (Array.isArray(data) ? data : [])
const data = (await res.json()) as any
const rawItems = data?.data?.items ?? data?.data?.data ?? data?.data ?? []
const items: any[] = Array.isArray(rawItems) ? rawItems : Object.values(rawItems)
spinner.stop(`${items.length} item(s)`)

if (items.length === 0) {
Expand Down
65 changes: 56 additions & 9 deletions packages/opencode/src/cli/cmd/platform-bug.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { cmd } from "./cmd"
import * as prompts from "@clack/prompts"
import { UI } from "../ui"
import { irisFetch, dim, bold, success, IRIS_API } from "./iris-api"
import { irisFetch, requireAuth, handleApiError, printDivider, printKV, dim, bold, success, IRIS_API, resolveUserId } from "./iris-api"
import { homedir, platform, release, arch, hostname, userInfo } from "os"
import { join } from "path"
import { existsSync, readFileSync } from "fs"
Expand Down Expand Up @@ -214,16 +214,63 @@ const ReportCommand = cmd({
const ListCommand = cmd({
command: "list",
aliases: ["ls"],
describe: "view bug reports (opens dashboard)",
async handler() {
describe: "list all bug reports",
builder: (yargs) =>
yargs
.option("limit", { describe: "max results", type: "number", default: 20 })
.option("json", { describe: "JSON output", type: "boolean", default: false }),
async handler(args) {
const token = await requireAuth()
if (!token) return

const userId = await resolveUserId()
if (!userId) {
console.error("Could not resolve user ID. Set IRIS_USER_ID or run iris-login.")
return
}

const params = new URLSearchParams({ per_page: String(args.limit) })
const res = await irisFetch(`/api/v1/user/${userId}/bloqs/${BUG_BLOQ_ID}/items?${params}`)
const ok = await handleApiError(res, "List bug reports")
if (!ok) return

const data = (await res.json()) as any
const rawItems = data?.data?.items ?? data?.data?.data ?? data?.data ?? []
const items: any[] = Array.isArray(rawItems) ? rawItems : Object.values(rawItems)

if (args.json) {
console.log(JSON.stringify(items, null, 2))
return
}

console.log("")
console.log(bold("📋 Bug Reports"))
console.log("")
console.log(` All reports go to ${dim("IRIS CLI Bug Reports")} (bloq #${BUG_BLOQ_ID})`)
console.log(` View at: ${success(`https://app.heyiris.io/iris?board=${BUG_BLOQ_ID}`)}`)
console.log("")
console.log(dim("To submit a new bug:"))
console.log(` iris bug report`)
console.log(` ${dim(`Bloq #${BUG_BLOQ_ID} — ${items.length} item(s)`)}`)
printDivider()

if (items.length === 0) {
console.log(` ${dim("No bug reports found")}`)
} else {
for (const item of items) {
const contentStr = item.content ?? item.description ?? ""
const severity = contentStr.match(/Severity:\*?\*?\s*(\w+)/i)?.[1] ?? ""
const sevTag = severity ? ` [${severity.toUpperCase()}]` : ""
const status = item.status ? ` ${dim(item.status)}` : ""
console.log(` ${bold(String(item.title))} ${dim(`#${item.id}`)}${sevTag}${status}`)
if (contentStr) {
// Show first meaningful line (skip markdown headers)
const lines = String(contentStr).split("\n").filter((l: string) => l.trim() && !l.startsWith("**") && !l.startsWith("#"))
if (lines.length > 0) {
console.log(` ${dim(lines[0].slice(0, 100))}`)
}
}
console.log()
}
}

printDivider()
console.log(dim(" iris bug report — submit a new bug"))
console.log(dim(" iris boards get <id> — view full details"))
console.log("")
},
})
Expand Down
Loading
Loading