@hera-al/server 1.6.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.
- package/LICENSE +21 -0
- package/README.md +325 -0
- package/bundled/apple-notes/SKILL.md +77 -0
- package/bundled/apple-reminders/SKILL.md +96 -0
- package/bundled/blogwatcher/SKILL.md +69 -0
- package/bundled/camsnap/SKILL.md +45 -0
- package/bundled/discord/SKILL.md +578 -0
- package/bundled/gemini/SKILL.md +43 -0
- package/bundled/gifgrep/SKILL.md +79 -0
- package/bundled/github/SKILL.md +77 -0
- package/bundled/gog/SKILL.md +116 -0
- package/bundled/goplaces/SKILL.md +52 -0
- package/bundled/himalaya/SKILL.md +257 -0
- package/bundled/himalaya/references/configuration.md +184 -0
- package/bundled/himalaya/references/message-composition.md +199 -0
- package/bundled/homebrew/SKILL.md +82 -0
- package/bundled/local-places/SERVER_README.md +101 -0
- package/bundled/local-places/SKILL.md +102 -0
- package/bundled/local-places/pyproject.toml +21 -0
- package/bundled/local-places/src/local_places/__init__.py +2 -0
- package/bundled/local-places/src/local_places/google_places.py +314 -0
- package/bundled/local-places/src/local_places/main.py +65 -0
- package/bundled/local-places/src/local_places/schemas.py +107 -0
- package/bundled/markitdown/SKILL.md +96 -0
- package/bundled/mcporter/SKILL.md +61 -0
- package/bundled/merge-pr/SKILL.md +187 -0
- package/bundled/merge-pr/agents/openai.yaml +4 -0
- package/bundled/nano-banana-pro/SKILL.md +58 -0
- package/bundled/nano-banana-pro/scripts/generate_image.py +184 -0
- package/bundled/nano-pdf/SKILL.md +38 -0
- package/bundled/open-prose/README.md +25 -0
- package/bundled/open-prose/index.ts +5 -0
- package/bundled/open-prose/openclaw.plugin.json +11 -0
- package/bundled/open-prose/package.json +15 -0
- package/bundled/open-prose/skills/prose/LICENSE +21 -0
- package/bundled/open-prose/skills/prose/SKILL.md +323 -0
- package/bundled/open-prose/skills/prose/alt-borges.md +141 -0
- package/bundled/open-prose/skills/prose/alts/arabian-nights.md +358 -0
- package/bundled/open-prose/skills/prose/alts/borges.md +360 -0
- package/bundled/open-prose/skills/prose/alts/folk.md +322 -0
- package/bundled/open-prose/skills/prose/alts/homer.md +346 -0
- package/bundled/open-prose/skills/prose/alts/kafka.md +373 -0
- package/bundled/open-prose/skills/prose/compiler.md +2971 -0
- package/bundled/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
- package/bundled/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
- package/bundled/open-prose/skills/prose/examples/03-code-review.prose +17 -0
- package/bundled/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
- package/bundled/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
- package/bundled/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
- package/bundled/open-prose/skills/prose/examples/07-refactor.prose +20 -0
- package/bundled/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
- package/bundled/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
- package/bundled/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
- package/bundled/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
- package/bundled/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
- package/bundled/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
- package/bundled/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
- package/bundled/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
- package/bundled/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
- package/bundled/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
- package/bundled/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
- package/bundled/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
- package/bundled/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
- package/bundled/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
- package/bundled/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
- package/bundled/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
- package/bundled/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
- package/bundled/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
- package/bundled/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
- package/bundled/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
- package/bundled/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
- package/bundled/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
- package/bundled/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
- package/bundled/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
- package/bundled/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
- package/bundled/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
- package/bundled/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
- package/bundled/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
- package/bundled/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
- package/bundled/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
- package/bundled/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
- package/bundled/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
- package/bundled/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
- package/bundled/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
- package/bundled/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
- package/bundled/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
- package/bundled/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
- package/bundled/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
- package/bundled/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
- package/bundled/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
- package/bundled/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
- package/bundled/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
- package/bundled/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
- package/bundled/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
- package/bundled/open-prose/skills/prose/examples/README.md +391 -0
- package/bundled/open-prose/skills/prose/examples/roadmap/README.md +22 -0
- package/bundled/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
- package/bundled/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
- package/bundled/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
- package/bundled/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
- package/bundled/open-prose/skills/prose/guidance/antipatterns.md +951 -0
- package/bundled/open-prose/skills/prose/guidance/patterns.md +700 -0
- package/bundled/open-prose/skills/prose/guidance/system-prompt.md +180 -0
- package/bundled/open-prose/skills/prose/help.md +144 -0
- package/bundled/open-prose/skills/prose/lib/README.md +108 -0
- package/bundled/open-prose/skills/prose/lib/calibrator.prose +215 -0
- package/bundled/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
- package/bundled/open-prose/skills/prose/lib/error-forensics.prose +250 -0
- package/bundled/open-prose/skills/prose/lib/inspector.prose +196 -0
- package/bundled/open-prose/skills/prose/lib/profiler.prose +460 -0
- package/bundled/open-prose/skills/prose/lib/program-improver.prose +275 -0
- package/bundled/open-prose/skills/prose/lib/project-memory.prose +118 -0
- package/bundled/open-prose/skills/prose/lib/user-memory.prose +93 -0
- package/bundled/open-prose/skills/prose/lib/vm-improver.prose +243 -0
- package/bundled/open-prose/skills/prose/primitives/session.md +593 -0
- package/bundled/open-prose/skills/prose/prose.md +1237 -0
- package/bundled/open-prose/skills/prose/state/filesystem.md +498 -0
- package/bundled/open-prose/skills/prose/state/in-context.md +384 -0
- package/bundled/open-prose/skills/prose/state/postgres.md +880 -0
- package/bundled/open-prose/skills/prose/state/sqlite.md +574 -0
- package/bundled/peekaboo/SKILL.md +190 -0
- package/bundled/prepare-pr/SKILL.md +277 -0
- package/bundled/prepare-pr/agents/openai.yaml +4 -0
- package/bundled/review-pr/SKILL.md +228 -0
- package/bundled/review-pr/agents/openai.yaml +4 -0
- package/bundled/sag/SKILL.md +87 -0
- package/bundled/skill-creator/SKILL.md +370 -0
- package/bundled/skill-creator/license.txt +202 -0
- package/bundled/skill-creator/scripts/init_skill.py +378 -0
- package/bundled/skill-creator/scripts/package_skill.py +111 -0
- package/bundled/skill-creator/scripts/quick_validate.py +101 -0
- package/bundled/spotify-player/SKILL.md +64 -0
- package/bundled/ssh/SKILL.md +119 -0
- package/bundled/summarize/SKILL.md +87 -0
- package/bundled/video-frames/SKILL.md +46 -0
- package/bundled/video-frames/scripts/frame.sh +81 -0
- package/bundled/voice-call/SKILL.md +45 -0
- package/bundled/wacli/SKILL.md +72 -0
- package/bundled/weather/SKILL.md +54 -0
- package/dist/agent/agent-service.d.ts +88 -0
- package/dist/agent/agent-service.js +1 -0
- package/dist/agent/message-queue.d.ts +24 -0
- package/dist/agent/message-queue.js +1 -0
- package/dist/agent/prompt-builder.d.ts +58 -0
- package/dist/agent/prompt-builder.js +1 -0
- package/dist/agent/session-agent.d.ts +197 -0
- package/dist/agent/session-agent.js +1 -0
- package/dist/agent/session-db.d.ts +26 -0
- package/dist/agent/session-db.js +1 -0
- package/dist/agent/session-error-handler.d.ts +37 -0
- package/dist/agent/session-error-handler.js +1 -0
- package/dist/agent/session-manager.d.ts +19 -0
- package/dist/agent/session-manager.js +1 -0
- package/dist/agent/workspace-files.d.ts +51 -0
- package/dist/agent/workspace-files.js +1 -0
- package/dist/auth/auth-middleware.d.ts +9 -0
- package/dist/auth/auth-middleware.js +1 -0
- package/dist/auth/node-signature-db.d.ts +30 -0
- package/dist/auth/node-signature-db.js +1 -0
- package/dist/auth/token-db.d.ts +38 -0
- package/dist/auth/token-db.js +1 -0
- package/dist/browser/browser-service.d.ts +9 -0
- package/dist/browser/browser-service.js +1 -0
- package/dist/channels/channel.d.ts +2 -0
- package/dist/channels/channel.js +1 -0
- package/dist/channels/responses.d.ts +21 -0
- package/dist/channels/responses.js +1 -0
- package/dist/commands/clear.d.ts +7 -0
- package/dist/commands/clear.js +1 -0
- package/dist/commands/cmd.d.ts +7 -0
- package/dist/commands/cmd.js +1 -0
- package/dist/commands/coder.d.ts +12 -0
- package/dist/commands/coder.js +1 -0
- package/dist/commands/command-registry.d.ts +12 -0
- package/dist/commands/command-registry.js +1 -0
- package/dist/commands/command.d.ts +22 -0
- package/dist/commands/command.js +1 -0
- package/dist/commands/compact.d.ts +7 -0
- package/dist/commands/compact.js +1 -0
- package/dist/commands/customsubagents.d.ts +15 -0
- package/dist/commands/customsubagents.js +1 -0
- package/dist/commands/help.d.ts +9 -0
- package/dist/commands/help.js +1 -0
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.js +1 -0
- package/dist/commands/model.d.ts +22 -0
- package/dist/commands/model.js +1 -0
- package/dist/commands/models.d.ts +11 -0
- package/dist/commands/models.js +1 -0
- package/dist/commands/new.d.ts +7 -0
- package/dist/commands/new.js +1 -0
- package/dist/commands/plugin.d.ts +7 -0
- package/dist/commands/plugin.js +1 -0
- package/dist/commands/sandbox.d.ts +12 -0
- package/dist/commands/sandbox.js +1 -0
- package/dist/commands/showtool.d.ts +12 -0
- package/dist/commands/showtool.js +1 -0
- package/dist/commands/status.d.ts +24 -0
- package/dist/commands/status.js +1 -0
- package/dist/commands/stop.d.ts +10 -0
- package/dist/commands/stop.js +1 -0
- package/dist/commands/subagents.d.ts +12 -0
- package/dist/commands/subagents.js +1 -0
- package/dist/commands/usage.d.ts +25 -0
- package/dist/commands/usage.js +1 -0
- package/dist/commands/useplugin.d.ts +7 -0
- package/dist/commands/useplugin.js +1 -0
- package/dist/config-watcher.d.ts +14 -0
- package/dist/config-watcher.js +1 -0
- package/dist/config.d.ts +267 -0
- package/dist/config.js +1 -0
- package/dist/cron/cron-service.d.ts +57 -0
- package/dist/cron/cron-service.js +1 -0
- package/dist/cron/heartbeat-token.d.ts +29 -0
- package/dist/cron/heartbeat-token.js +1 -0
- package/dist/cron/schedule.d.ts +3 -0
- package/dist/cron/schedule.js +1 -0
- package/dist/cron/store.d.ts +4 -0
- package/dist/cron/store.js +1 -0
- package/dist/cron/types.d.ts +47 -0
- package/dist/cron/types.js +1 -0
- package/dist/gateway/bridge.d.ts +38 -0
- package/dist/gateway/bridge.js +1 -0
- package/dist/gateway/channel-manager.d.ts +45 -0
- package/dist/gateway/channel-manager.js +1 -0
- package/dist/gateway/channels/qr-image.d.ts +5 -0
- package/dist/gateway/channels/qr-image.js +1 -0
- package/dist/gateway/channels/telegram.d.ts +39 -0
- package/dist/gateway/channels/telegram.js +1 -0
- package/dist/gateway/channels/webchat.d.ts +51 -0
- package/dist/gateway/channels/webchat.js +1 -0
- package/dist/gateway/channels/whatsapp.d.ts +40 -0
- package/dist/gateway/channels/whatsapp.js +1 -0
- package/dist/gateway/node-registry.d.ts +38 -0
- package/dist/gateway/node-registry.js +1 -0
- package/dist/heracli/index.d.ts +3 -0
- package/dist/heracli/index.js +2 -0
- package/dist/heracli/logs.d.ts +13 -0
- package/dist/heracli/logs.js +1 -0
- package/dist/heracli/security/audit.d.ts +17 -0
- package/dist/heracli/security/audit.js +1 -0
- package/dist/heracli/security/checks/channel-policies.d.ts +6 -0
- package/dist/heracli/security/checks/channel-policies.js +1 -0
- package/dist/heracli/security/checks/credentials.d.ts +6 -0
- package/dist/heracli/security/checks/credentials.js +1 -0
- package/dist/heracli/security/checks/fs-permissions.d.ts +6 -0
- package/dist/heracli/security/checks/fs-permissions.js +1 -0
- package/dist/heracli/security/checks/network.d.ts +4 -0
- package/dist/heracli/security/checks/network.js +1 -0
- package/dist/heracli/security/report.d.ts +4 -0
- package/dist/heracli/security/report.js +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/installer/hera.d.ts +3 -0
- package/dist/installer/hera.js +2 -0
- package/dist/media/message-processor.d.ts +23 -0
- package/dist/media/message-processor.js +1 -0
- package/dist/memory/memory-manager.d.ts +21 -0
- package/dist/memory/memory-manager.js +1 -0
- package/dist/memory/memory-provider.d.ts +22 -0
- package/dist/memory/memory-provider.js +1 -0
- package/dist/memory/memory-search.d.ts +102 -0
- package/dist/memory/memory-search.js +1 -0
- package/dist/memory/recall-strategies.d.ts +2 -0
- package/dist/memory/recall-strategies.js +1 -0
- package/dist/nostromo/auth.d.ts +29 -0
- package/dist/nostromo/auth.js +1 -0
- package/dist/nostromo/nostromo.d.ts +23 -0
- package/dist/nostromo/nostromo.js +1 -0
- package/dist/nostromo/ui-html-layout.d.ts +3 -0
- package/dist/nostromo/ui-html-layout.js +1 -0
- package/dist/nostromo/ui-html-modals.d.ts +3 -0
- package/dist/nostromo/ui-html-modals.js +1 -0
- package/dist/nostromo/ui-js-agent.d.ts +3 -0
- package/dist/nostromo/ui-js-agent.js +1 -0
- package/dist/nostromo/ui-js-channels.d.ts +3 -0
- package/dist/nostromo/ui-js-channels.js +1 -0
- package/dist/nostromo/ui-js-competences.d.ts +3 -0
- package/dist/nostromo/ui-js-competences.js +1 -0
- package/dist/nostromo/ui-js-config.d.ts +3 -0
- package/dist/nostromo/ui-js-config.js +1 -0
- package/dist/nostromo/ui-js-core.d.ts +3 -0
- package/dist/nostromo/ui-js-core.js +1 -0
- package/dist/nostromo/ui-js-ops.d.ts +3 -0
- package/dist/nostromo/ui-js-ops.js +1 -0
- package/dist/nostromo/ui-js-prompts.d.ts +3 -0
- package/dist/nostromo/ui-js-prompts.js +1 -0
- package/dist/nostromo/ui-styles.d.ts +3 -0
- package/dist/nostromo/ui-styles.js +1 -0
- package/dist/nostromo/ui.d.ts +2 -0
- package/dist/nostromo/ui.js +1 -0
- package/dist/server.d.ts +80 -0
- package/dist/server.js +1 -0
- package/dist/stt/local-whisper.d.ts +9 -0
- package/dist/stt/local-whisper.js +1 -0
- package/dist/stt/openai-whisper.d.ts +14 -0
- package/dist/stt/openai-whisper.js +1 -0
- package/dist/stt/stt-loader.d.ts +4 -0
- package/dist/stt/stt-loader.js +1 -0
- package/dist/stt/stt-provider.d.ts +4 -0
- package/dist/stt/stt-provider.js +1 -0
- package/dist/tools/browser-tools.d.ts +9 -0
- package/dist/tools/browser-tools.js +1 -0
- package/dist/tools/cron-tools.d.ts +4 -0
- package/dist/tools/cron-tools.js +1 -0
- package/dist/tools/memory-tools.d.ts +3 -0
- package/dist/tools/memory-tools.js +1 -0
- package/dist/tools/message-tools.d.ts +5 -0
- package/dist/tools/message-tools.js +1 -0
- package/dist/tools/node-tools.d.ts +3 -0
- package/dist/tools/node-tools.js +1 -0
- package/dist/tools/server-tools.d.ts +2 -0
- package/dist/tools/server-tools.js +1 -0
- package/dist/tools/tts-tools.d.ts +3 -0
- package/dist/tools/tts-tools.js +1 -0
- package/dist/tts/tts-service.d.ts +19 -0
- package/dist/tts/tts-service.js +1 -0
- package/dist/utils/chunk.d.ts +3 -0
- package/dist/utils/chunk.js +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +1 -0
- package/dist/utils/markdown/fences.d.ts +11 -0
- package/dist/utils/markdown/fences.js +1 -0
- package/dist/utils/markdown/ir.d.ts +33 -0
- package/dist/utils/markdown/ir.js +1 -0
- package/dist/utils/markdown/render.d.ts +19 -0
- package/dist/utils/markdown/render.js +1 -0
- package/dist/utils/markdown/tables.d.ts +3 -0
- package/dist/utils/markdown/tables.js +1 -0
- package/dist/utils/media-response.d.ts +29 -0
- package/dist/utils/media-response.js +1 -0
- package/dist/utils/package-paths.d.ts +5 -0
- package/dist/utils/package-paths.js +1 -0
- package/dist/utils/telegram-format.d.ts +13 -0
- package/dist/utils/telegram-format.js +1 -0
- package/installationPkg/.env.example +26 -0
- package/installationPkg/AGENTS.md +143 -0
- package/installationPkg/BOOTSTRAP.md +45 -0
- package/installationPkg/CBINT.json +16 -0
- package/installationPkg/HEARTBEAT.md +5 -0
- package/installationPkg/IDENTITY.md +7 -0
- package/installationPkg/SOUL.md +36 -0
- package/installationPkg/SYSTEM_PROMPT.md +55 -0
- package/installationPkg/SYSTEM_PROMPT_SUBAGENT.md +40 -0
- package/installationPkg/TOOLS.md +36 -0
- package/installationPkg/USER.md +11 -0
- package/installationPkg/config.example.yaml +291 -0
- package/package.json +95 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: merge-pr
|
|
3
|
+
description: Merge a GitHub PR via squash after /preparepr. Use when asked to merge a ready PR. Do not push to main or modify code. Ensure the PR ends in MERGED state and clean up worktrees after success.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Merge PR
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Merge a prepared PR via `gh pr merge --squash` and clean up the worktree after success.
|
|
11
|
+
|
|
12
|
+
## Inputs
|
|
13
|
+
|
|
14
|
+
- Ask for PR number or URL.
|
|
15
|
+
- If missing, auto-detect from conversation.
|
|
16
|
+
- If ambiguous, ask.
|
|
17
|
+
|
|
18
|
+
## Safety
|
|
19
|
+
|
|
20
|
+
- Use `gh pr merge --squash` as the only path to `main`.
|
|
21
|
+
- Do not run `git push` at all during merge.
|
|
22
|
+
- Do not run gateway stop commands. Do not kill processes. Do not touch port 18792.
|
|
23
|
+
|
|
24
|
+
## Execution Rule
|
|
25
|
+
|
|
26
|
+
- Execute the workflow. Do not stop after printing the TODO checklist.
|
|
27
|
+
- If delegating, require the delegate to run commands and capture outputs.
|
|
28
|
+
|
|
29
|
+
## Known Footguns
|
|
30
|
+
|
|
31
|
+
- If you see "fatal: not a git repository", you are in the wrong directory. Use `~/dev/openclaw` if available; otherwise ask user.
|
|
32
|
+
- Read `.local/review.md` and `.local/prep.md` in the worktree. Do not skip.
|
|
33
|
+
- Clean up the real worktree directory `.worktrees/pr-<PR>` only after a successful merge.
|
|
34
|
+
- Expect cleanup to remove `.local/` artifacts.
|
|
35
|
+
|
|
36
|
+
## Completion Criteria
|
|
37
|
+
|
|
38
|
+
- Ensure `gh pr merge` succeeds.
|
|
39
|
+
- Ensure PR state is `MERGED`, never `CLOSED`.
|
|
40
|
+
- Record the merge SHA.
|
|
41
|
+
- Run cleanup only after merge success.
|
|
42
|
+
|
|
43
|
+
## First: Create a TODO Checklist
|
|
44
|
+
|
|
45
|
+
Create a checklist of all merge steps, print it, then continue and execute the commands.
|
|
46
|
+
|
|
47
|
+
## Setup: Use a Worktree
|
|
48
|
+
|
|
49
|
+
Use an isolated worktree for all merge work.
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
cd ~/dev/openclaw
|
|
53
|
+
# Sanity: confirm you are in the repo
|
|
54
|
+
git rev-parse --show-toplevel
|
|
55
|
+
|
|
56
|
+
WORKTREE_DIR=".worktrees/pr-<PR>"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Run all commands inside the worktree directory.
|
|
60
|
+
|
|
61
|
+
## Load Local Artifacts (Mandatory)
|
|
62
|
+
|
|
63
|
+
Expect these files from earlier steps:
|
|
64
|
+
|
|
65
|
+
- `.local/review.md` from `/reviewpr`
|
|
66
|
+
- `.local/prep.md` from `/preparepr`
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
ls -la .local || true
|
|
70
|
+
|
|
71
|
+
if [ -f .local/review.md ]; then
|
|
72
|
+
echo "Found .local/review.md"
|
|
73
|
+
sed -n '1,120p' .local/review.md
|
|
74
|
+
else
|
|
75
|
+
echo "Missing .local/review.md. Stop and run /reviewpr, then /preparepr."
|
|
76
|
+
exit 1
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
if [ -f .local/prep.md ]; then
|
|
80
|
+
echo "Found .local/prep.md"
|
|
81
|
+
sed -n '1,120p' .local/prep.md
|
|
82
|
+
else
|
|
83
|
+
echo "Missing .local/prep.md. Stop and run /preparepr first."
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Steps
|
|
89
|
+
|
|
90
|
+
1. Identify PR meta
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
gh pr view <PR> --json number,title,state,isDraft,author,headRefName,baseRefName,headRepository,body --jq '{number,title,state,isDraft,author:.author.login,head:.headRefName,base:.baseRefName,headRepo:.headRepository.nameWithOwner,body}'
|
|
94
|
+
contrib=$(gh pr view <PR> --json author --jq .author.login)
|
|
95
|
+
head=$(gh pr view <PR> --json headRefName --jq .headRefName)
|
|
96
|
+
head_repo_url=$(gh pr view <PR> --json headRepository --jq .headRepository.url)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
2. Run sanity checks
|
|
100
|
+
|
|
101
|
+
Stop if any are true:
|
|
102
|
+
|
|
103
|
+
- PR is a draft.
|
|
104
|
+
- Required checks are failing.
|
|
105
|
+
- Branch is behind main.
|
|
106
|
+
|
|
107
|
+
If `.local/prep.md` contains `Docs-only change detected with high confidence; skipping pnpm test.`, that local test skip is allowed. CI checks still must be green.
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
# Checks
|
|
111
|
+
gh pr checks <PR>
|
|
112
|
+
|
|
113
|
+
# Check behind main
|
|
114
|
+
git fetch origin main
|
|
115
|
+
git fetch origin pull/<PR>/head:pr-<PR>
|
|
116
|
+
git merge-base --is-ancestor origin/main pr-<PR> || echo "PR branch is behind main, run /preparepr"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If anything is failing or behind, stop and say to run `/preparepr`.
|
|
120
|
+
|
|
121
|
+
3. Merge PR and delete branch
|
|
122
|
+
|
|
123
|
+
If checks are still running, use `--auto` to queue the merge.
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
# Check status first
|
|
127
|
+
check_status=$(gh pr checks <PR> 2>&1)
|
|
128
|
+
if echo "$check_status" | grep -q "pending\|queued"; then
|
|
129
|
+
echo "Checks still running, using --auto to queue merge"
|
|
130
|
+
gh pr merge <PR> --squash --delete-branch --auto
|
|
131
|
+
echo "Merge queued. Monitor with: gh pr checks <PR> --watch"
|
|
132
|
+
else
|
|
133
|
+
gh pr merge <PR> --squash --delete-branch
|
|
134
|
+
fi
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
If merge fails, report the error and stop. Do not retry in a loop.
|
|
138
|
+
If the PR needs changes beyond what `/preparepr` already did, stop and say to run `/preparepr` again.
|
|
139
|
+
|
|
140
|
+
4. Get merge SHA
|
|
141
|
+
|
|
142
|
+
```sh
|
|
143
|
+
merge_sha=$(gh pr view <PR> --json mergeCommit --jq '.mergeCommit.oid')
|
|
144
|
+
echo "merge_sha=$merge_sha"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
5. Optional comment
|
|
148
|
+
|
|
149
|
+
Use a literal multiline string or heredoc for newlines.
|
|
150
|
+
|
|
151
|
+
```sh
|
|
152
|
+
gh pr comment <PR> -F - <<'EOF'
|
|
153
|
+
Merged via squash.
|
|
154
|
+
|
|
155
|
+
- Merge commit: $merge_sha
|
|
156
|
+
|
|
157
|
+
Thanks @$contrib!
|
|
158
|
+
EOF
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
6. Verify PR state is MERGED
|
|
162
|
+
|
|
163
|
+
```sh
|
|
164
|
+
gh pr view <PR> --json state --jq .state
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
7. Clean up worktree only on success
|
|
168
|
+
|
|
169
|
+
Run cleanup only if step 6 returned `MERGED`.
|
|
170
|
+
|
|
171
|
+
```sh
|
|
172
|
+
cd ~/dev/openclaw
|
|
173
|
+
|
|
174
|
+
git worktree remove ".worktrees/pr-<PR>" --force
|
|
175
|
+
|
|
176
|
+
git branch -D temp/pr-<PR> 2>/dev/null || true
|
|
177
|
+
git branch -D pr-<PR> 2>/dev/null || true
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Guardrails
|
|
181
|
+
|
|
182
|
+
- Worktree only.
|
|
183
|
+
- Do not close PRs.
|
|
184
|
+
- End in MERGED state.
|
|
185
|
+
- Clean up only after merge success.
|
|
186
|
+
- Never push to main. Use `gh pr merge --squash` only.
|
|
187
|
+
- Do not run `git push` at all in this command.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-banana-pro
|
|
3
|
+
description: Generate or edit images via Gemini 3 Pro Image (Nano Banana Pro).
|
|
4
|
+
homepage: https://ai.google.dev/
|
|
5
|
+
metadata:
|
|
6
|
+
{
|
|
7
|
+
"openclaw":
|
|
8
|
+
{
|
|
9
|
+
"emoji": "🍌",
|
|
10
|
+
"requires": { "bins": ["uv"], "env": ["GEMINI_API_KEY"] },
|
|
11
|
+
"primaryEnv": "GEMINI_API_KEY",
|
|
12
|
+
"install":
|
|
13
|
+
[
|
|
14
|
+
{
|
|
15
|
+
"id": "uv-brew",
|
|
16
|
+
"kind": "brew",
|
|
17
|
+
"formula": "uv",
|
|
18
|
+
"bins": ["uv"],
|
|
19
|
+
"label": "Install uv (brew)",
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Nano Banana Pro (Gemini 3 Pro Image)
|
|
27
|
+
|
|
28
|
+
Use the bundled script to generate or edit images.
|
|
29
|
+
|
|
30
|
+
Generate
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uv run {baseDir}/scripts/generate_image.py --prompt "your image description" --filename "output.png" --resolution 1K
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Edit (single image)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
uv run {baseDir}/scripts/generate_image.py --prompt "edit instructions" --filename "output.png" -i "/path/in.png" --resolution 2K
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Multi-image composition (up to 14 images)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
uv run {baseDir}/scripts/generate_image.py --prompt "combine these into one scene" --filename "output.png" -i img1.png -i img2.png -i img3.png
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
API key
|
|
49
|
+
|
|
50
|
+
- `GEMINI_API_KEY` env var
|
|
51
|
+
- Or set `skills."nano-banana-pro".apiKey` / `skills."nano-banana-pro".env.GEMINI_API_KEY` in `~/.openclaw/openclaw.json`
|
|
52
|
+
|
|
53
|
+
Notes
|
|
54
|
+
|
|
55
|
+
- Resolutions: `1K` (default), `2K`, `4K`.
|
|
56
|
+
- Use timestamps in filenames: `yyyy-mm-dd-hh-mm-ss-name.png`.
|
|
57
|
+
- The script prints a `MEDIA:` line for OpenClaw to auto-attach on supported chat providers.
|
|
58
|
+
- Do not read the image back; report the saved path only.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# /// script
|
|
3
|
+
# requires-python = ">=3.10"
|
|
4
|
+
# dependencies = [
|
|
5
|
+
# "google-genai>=1.0.0",
|
|
6
|
+
# "pillow>=10.0.0",
|
|
7
|
+
# ]
|
|
8
|
+
# ///
|
|
9
|
+
"""
|
|
10
|
+
Generate images using Google's Nano Banana Pro (Gemini 3 Pro Image) API.
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
uv run generate_image.py --prompt "your image description" --filename "output.png" [--resolution 1K|2K|4K] [--api-key KEY]
|
|
14
|
+
|
|
15
|
+
Multi-image editing (up to 14 images):
|
|
16
|
+
uv run generate_image.py --prompt "combine these images" --filename "output.png" -i img1.png -i img2.png -i img3.png
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_api_key(provided_key: str | None) -> str | None:
|
|
26
|
+
"""Get API key from argument first, then environment."""
|
|
27
|
+
if provided_key:
|
|
28
|
+
return provided_key
|
|
29
|
+
return os.environ.get("GEMINI_API_KEY")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def main():
|
|
33
|
+
parser = argparse.ArgumentParser(
|
|
34
|
+
description="Generate images using Nano Banana Pro (Gemini 3 Pro Image)"
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"--prompt", "-p",
|
|
38
|
+
required=True,
|
|
39
|
+
help="Image description/prompt"
|
|
40
|
+
)
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"--filename", "-f",
|
|
43
|
+
required=True,
|
|
44
|
+
help="Output filename (e.g., sunset-mountains.png)"
|
|
45
|
+
)
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
"--input-image", "-i",
|
|
48
|
+
action="append",
|
|
49
|
+
dest="input_images",
|
|
50
|
+
metavar="IMAGE",
|
|
51
|
+
help="Input image path(s) for editing/composition. Can be specified multiple times (up to 14 images)."
|
|
52
|
+
)
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"--resolution", "-r",
|
|
55
|
+
choices=["1K", "2K", "4K"],
|
|
56
|
+
default="1K",
|
|
57
|
+
help="Output resolution: 1K (default), 2K, or 4K"
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"--api-key", "-k",
|
|
61
|
+
help="Gemini API key (overrides GEMINI_API_KEY env var)"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
args = parser.parse_args()
|
|
65
|
+
|
|
66
|
+
# Get API key
|
|
67
|
+
api_key = get_api_key(args.api_key)
|
|
68
|
+
if not api_key:
|
|
69
|
+
print("Error: No API key provided.", file=sys.stderr)
|
|
70
|
+
print("Please either:", file=sys.stderr)
|
|
71
|
+
print(" 1. Provide --api-key argument", file=sys.stderr)
|
|
72
|
+
print(" 2. Set GEMINI_API_KEY environment variable", file=sys.stderr)
|
|
73
|
+
sys.exit(1)
|
|
74
|
+
|
|
75
|
+
# Import here after checking API key to avoid slow import on error
|
|
76
|
+
from google import genai
|
|
77
|
+
from google.genai import types
|
|
78
|
+
from PIL import Image as PILImage
|
|
79
|
+
|
|
80
|
+
# Initialise client
|
|
81
|
+
client = genai.Client(api_key=api_key)
|
|
82
|
+
|
|
83
|
+
# Set up output path
|
|
84
|
+
output_path = Path(args.filename)
|
|
85
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
86
|
+
|
|
87
|
+
# Load input images if provided (up to 14 supported by Nano Banana Pro)
|
|
88
|
+
input_images = []
|
|
89
|
+
output_resolution = args.resolution
|
|
90
|
+
if args.input_images:
|
|
91
|
+
if len(args.input_images) > 14:
|
|
92
|
+
print(f"Error: Too many input images ({len(args.input_images)}). Maximum is 14.", file=sys.stderr)
|
|
93
|
+
sys.exit(1)
|
|
94
|
+
|
|
95
|
+
max_input_dim = 0
|
|
96
|
+
for img_path in args.input_images:
|
|
97
|
+
try:
|
|
98
|
+
img = PILImage.open(img_path)
|
|
99
|
+
input_images.append(img)
|
|
100
|
+
print(f"Loaded input image: {img_path}")
|
|
101
|
+
|
|
102
|
+
# Track largest dimension for auto-resolution
|
|
103
|
+
width, height = img.size
|
|
104
|
+
max_input_dim = max(max_input_dim, width, height)
|
|
105
|
+
except Exception as e:
|
|
106
|
+
print(f"Error loading input image '{img_path}': {e}", file=sys.stderr)
|
|
107
|
+
sys.exit(1)
|
|
108
|
+
|
|
109
|
+
# Auto-detect resolution from largest input if not explicitly set
|
|
110
|
+
if args.resolution == "1K" and max_input_dim > 0: # Default value
|
|
111
|
+
if max_input_dim >= 3000:
|
|
112
|
+
output_resolution = "4K"
|
|
113
|
+
elif max_input_dim >= 1500:
|
|
114
|
+
output_resolution = "2K"
|
|
115
|
+
else:
|
|
116
|
+
output_resolution = "1K"
|
|
117
|
+
print(f"Auto-detected resolution: {output_resolution} (from max input dimension {max_input_dim})")
|
|
118
|
+
|
|
119
|
+
# Build contents (images first if editing, prompt only if generating)
|
|
120
|
+
if input_images:
|
|
121
|
+
contents = [*input_images, args.prompt]
|
|
122
|
+
img_count = len(input_images)
|
|
123
|
+
print(f"Processing {img_count} image{'s' if img_count > 1 else ''} with resolution {output_resolution}...")
|
|
124
|
+
else:
|
|
125
|
+
contents = args.prompt
|
|
126
|
+
print(f"Generating image with resolution {output_resolution}...")
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
response = client.models.generate_content(
|
|
130
|
+
model="gemini-3-pro-image-preview",
|
|
131
|
+
contents=contents,
|
|
132
|
+
config=types.GenerateContentConfig(
|
|
133
|
+
response_modalities=["TEXT", "IMAGE"],
|
|
134
|
+
image_config=types.ImageConfig(
|
|
135
|
+
image_size=output_resolution
|
|
136
|
+
)
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Process response and convert to PNG
|
|
141
|
+
image_saved = False
|
|
142
|
+
for part in response.parts:
|
|
143
|
+
if part.text is not None:
|
|
144
|
+
print(f"Model response: {part.text}")
|
|
145
|
+
elif part.inline_data is not None:
|
|
146
|
+
# Convert inline data to PIL Image and save as PNG
|
|
147
|
+
from io import BytesIO
|
|
148
|
+
|
|
149
|
+
# inline_data.data is already bytes, not base64
|
|
150
|
+
image_data = part.inline_data.data
|
|
151
|
+
if isinstance(image_data, str):
|
|
152
|
+
# If it's a string, it might be base64
|
|
153
|
+
import base64
|
|
154
|
+
image_data = base64.b64decode(image_data)
|
|
155
|
+
|
|
156
|
+
image = PILImage.open(BytesIO(image_data))
|
|
157
|
+
|
|
158
|
+
# Ensure RGB mode for PNG (convert RGBA to RGB with white background if needed)
|
|
159
|
+
if image.mode == 'RGBA':
|
|
160
|
+
rgb_image = PILImage.new('RGB', image.size, (255, 255, 255))
|
|
161
|
+
rgb_image.paste(image, mask=image.split()[3])
|
|
162
|
+
rgb_image.save(str(output_path), 'PNG')
|
|
163
|
+
elif image.mode == 'RGB':
|
|
164
|
+
image.save(str(output_path), 'PNG')
|
|
165
|
+
else:
|
|
166
|
+
image.convert('RGB').save(str(output_path), 'PNG')
|
|
167
|
+
image_saved = True
|
|
168
|
+
|
|
169
|
+
if image_saved:
|
|
170
|
+
full_path = output_path.resolve()
|
|
171
|
+
print(f"\nImage saved: {full_path}")
|
|
172
|
+
# OpenClaw parses MEDIA tokens and will attach the file on supported providers.
|
|
173
|
+
print(f"MEDIA: {full_path}")
|
|
174
|
+
else:
|
|
175
|
+
print("Error: No image was generated in the response.", file=sys.stderr)
|
|
176
|
+
sys.exit(1)
|
|
177
|
+
|
|
178
|
+
except Exception as e:
|
|
179
|
+
print(f"Error generating image: {e}", file=sys.stderr)
|
|
180
|
+
sys.exit(1)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
if __name__ == "__main__":
|
|
184
|
+
main()
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-pdf
|
|
3
|
+
description: Edit PDFs with natural-language instructions using the nano-pdf CLI.
|
|
4
|
+
homepage: https://pypi.org/project/nano-pdf/
|
|
5
|
+
metadata:
|
|
6
|
+
{
|
|
7
|
+
"openclaw":
|
|
8
|
+
{
|
|
9
|
+
"emoji": "📄",
|
|
10
|
+
"requires": { "bins": ["nano-pdf"] },
|
|
11
|
+
"install":
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "uv",
|
|
15
|
+
"kind": "uv",
|
|
16
|
+
"package": "nano-pdf",
|
|
17
|
+
"bins": ["nano-pdf"],
|
|
18
|
+
"label": "Install nano-pdf (uv)",
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# nano-pdf
|
|
26
|
+
|
|
27
|
+
Use `nano-pdf` to apply edits to a specific page in a PDF using a natural-language instruction.
|
|
28
|
+
|
|
29
|
+
## Quick start
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
nano-pdf edit deck.pdf 1 "Change the title to 'Q3 Results' and fix the typo in the subtitle"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Notes:
|
|
36
|
+
|
|
37
|
+
- Page numbers are 0-based or 1-based depending on the tool’s version/config; if the result looks off by one, retry with the other.
|
|
38
|
+
- Always sanity-check the output PDF before sending it out.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# OpenProse (plugin)
|
|
2
|
+
|
|
3
|
+
Adds the OpenProse skill pack and `/prose` slash command.
|
|
4
|
+
|
|
5
|
+
## Enable
|
|
6
|
+
|
|
7
|
+
Bundled plugins are disabled by default. Enable this one:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"plugins": {
|
|
12
|
+
"entries": {
|
|
13
|
+
"open-prose": { "enabled": true }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Restart the Gateway after enabling.
|
|
20
|
+
|
|
21
|
+
## What you get
|
|
22
|
+
|
|
23
|
+
- `/prose` slash command (user-invocable skill)
|
|
24
|
+
- OpenProse VM semantics (`.prose` programs + multi-agent orchestration)
|
|
25
|
+
- Telemetry support (best-effort, per OpenProse spec)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@openclaw/open-prose",
|
|
3
|
+
"version": "2026.2.9",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "OpenProse VM skill pack plugin (slash command + telemetry).",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"devDependencies": {
|
|
8
|
+
"openclaw": "workspace:*"
|
|
9
|
+
},
|
|
10
|
+
"openclaw": {
|
|
11
|
+
"extensions": [
|
|
12
|
+
"./index.ts"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 OpenProse
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|