summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-10-28 13:32:36 -0500
committerGitHub <[email protected]>2025-10-28 13:32:36 -0500
commit37380e1f945f215be65d108bc8094e0f23b0d897 (patch)
tree2cd5fa5587dc67ef2bfc0b429aa592fb4104ef90
parent1309ca7a812cdd548163d7bf8f21cb3c412c040f (diff)
downloadopencode-37380e1f945f215be65d108bc8094e0f23b0d897.tar.gz
opencode-37380e1f945f215be65d108bc8094e0f23b0d897.zip
add --title flag to opencode run (#3507)
-rw-r--r--packages/opencode/src/cli/cmd/run.ts18
-rw-r--r--packages/opencode/src/session/index.ts12
-rw-r--r--packages/opencode/src/session/prompt.ts1
3 files changed, 27 insertions, 4 deletions
diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts
index 60788c7d8..7bde4a314 100644
--- a/packages/opencode/src/cli/cmd/run.ts
+++ b/packages/opencode/src/cli/cmd/run.ts
@@ -78,6 +78,10 @@ export const RunCommand = cmd({
array: true,
describe: "file(s) to attach to message",
})
+ .option("title", {
+ type: "string",
+ describe: "title for the session (uses truncated prompt if no value provided)",
+ })
},
handler: async (args) => {
let message = args.message.join(" ")
@@ -143,7 +147,19 @@ export const RunCommand = cmd({
if (args.session) return Session.get(args.session)
- return Session.create({})
+ const title = (() => {
+ if (args.title !== undefined) {
+ if (args.title === "") {
+ return message.slice(0, 50) + (message.length > 50 ? "..." : "")
+ }
+ return args.title
+ }
+ return undefined
+ })()
+
+ return Session.create({
+ title,
+ })
})()
if (!session) {
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index ff9f436e2..2cd1bcd29 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -23,11 +23,17 @@ import { Snapshot } from "@/snapshot"
export namespace Session {
const log = Log.create({ service: "session" })
- const parentSessionTitlePrefix = "New session - "
- const childSessionTitlePrefix = "Child session - "
+ const parentTitlePrefix = "New session - "
+ const childTitlePrefix = "Child session - "
function createDefaultTitle(isChild = false) {
- return (isChild ? childSessionTitlePrefix : parentSessionTitlePrefix) + new Date().toISOString()
+ return (isChild ? childTitlePrefix : parentTitlePrefix) + new Date().toISOString()
+ }
+
+ export function isDefaultTitle(title: string) {
+ return new RegExp(
+ `^(${parentTitlePrefix}|${childTitlePrefix})\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$`,
+ ).test(title)
}
export const Info = z
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 4d1aa0211..144d61d18 100644
--- a/packages/opencode/src/session/prompt.ts
+++ b/packages/opencode/src/session/prompt.ts
@@ -1703,6 +1703,7 @@ export namespace SessionPrompt {
modelID: string
}) {
if (input.session.parentID) return
+ if (!Session.isDefaultTitle(input.session.title)) return
const isFirst =
input.history.filter((m) => m.info.role === "user" && !m.parts.every((p) => "synthetic" in p && p.synthetic))
.length === 1