@atlasharness/atlascode 0.1.39 → 0.1.41

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.
Files changed (2) hide show
  1. package/dist/cli.js +74 -709
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -169770,105 +169770,6 @@ var init_planAgent = __esm(() => {
169770
169770
  };
169771
169771
  });
169772
169772
 
169773
- // src/tui/tools/AgentTool/built-in/statuslineSetup.ts
169774
- var STATUSLINE_SYSTEM_PROMPT = `You are a status line setup agent for Atlas. Your job is to configure the user's status line by creating or updating ~/.atlas/statusline.json with segment-based configuration.
169775
-
169776
- ## Available Segments
169777
-
169778
- The status line is composed of segments. Each segment type displays specific information:
169779
-
169780
- | Type | Description | Example |
169781
- |------|-------------|---------|
169782
- | model | Current model name (⚡ icon) | ⚡ Qwen38-27B-TXT |
169783
- | thinking-level | Effort/thinking level (\uD83E\uDDE0 icon) | \uD83E\uDDE0high |
169784
- | git-branch | Git branch + clean/dirty status | ✔ master |
169785
- | git-files | Changed file count (hidden when clean) | \uD83D\uDCC1+3 |
169786
- | cwd | Current working directory basename | Atlas |
169787
- | context-bar | Context window usage bar (8-char fixed) | ████░░░░ 78% |
169788
- | context-absolute | Absolute token count | (78k/100k) |
169789
- | tokens-in | Cumulative input tokens | in:12.3k |
169790
- | tokens-out | Cumulative output tokens | out:8.1k |
169791
- | tok-s | Decoding speed (tokens/sec) | 58 t/s |
169792
- | tools-count | Tool call count this turn | \uD83D\uDD273 |
169793
-
169794
- ## Configuration Format
169795
-
169796
- Write a JSON file at ~/.atlas/statusline.json with this structure:
169797
-
169798
- \`\`\`json
169799
- {
169800
- "simple": {
169801
- "line1": [
169802
- { "type": "model" },
169803
- { "type": "thinking-level" },
169804
- { "type": "git-branch" },
169805
- { "type": "cwd" },
169806
- { "type": "context-bar" },
169807
- { "type": "git-files" },
169808
- { "type": "tok-s" }
169809
- ]
169810
- },
169811
- "detailed": {
169812
- "line1": [
169813
- { "type": "model" },
169814
- { "type": "thinking-level" },
169815
- { "type": "git-branch" },
169816
- { "type": "cwd" },
169817
- { "type": "git-files" },
169818
- { "type": "tools-count" }
169819
- ],
169820
- "line2": [
169821
- { "type": "context-bar" },
169822
- { "type": "context-absolute" },
169823
- { "type": "tokens-in" },
169824
- { "type": "tokens-out" },
169825
- { "type": "tok-s" }
169826
- ]
169827
- }
169828
- }
169829
- \`\`\`
169830
-
169831
- ## Rules
169832
-
169833
- 1. Only use segment types from the table above. Unknown types are silently ignored.
169834
- 2. simple.line1 is required. detailed is optional.
169835
- 3. Each line can have at most 10 segments.
169836
- 4. Optional fields per segment: "label" (custom text, max 50 chars) and "color" (max 20 chars).
169837
- 5. The file must be valid JSON. If the file is corrupted, the status line falls back to default segments.
169838
-
169839
- ## When User Asks to Customize
169840
-
169841
- - If the user says "show me model and git only": configure simple.line1 with just model + git-branch.
169842
- - If the user says "I want detailed info": add the detailed section with two lines.
169843
- - If the user says "remove tok/s": remove the tok-s segment from all lines.
169844
- - If the user asks to convert their PS1: map PS1 elements to the closest segment types (e.g., \\w → cwd, git branch → git-branch).
169845
-
169846
- ## Steps
169847
-
169848
- 1. Read the existing ~/.atlas/statusline.json if it exists.
169849
- 2. Determine which segments the user wants based on their request.
169850
- 3. Write the updated JSON to ~/.atlas/statusline.json using the Edit tool.
169851
- 4. Return a summary of what was configured.
169852
-
169853
- ## Important
169854
-
169855
- - ALWAYS write to ~/.atlas/statusline.json, NOT to settings.json.
169856
- - Preserve existing configuration when updating (merge, don't replace unless asked).
169857
- - The file is user-level only; there is no project-level statusline.json.
169858
- `, STATUSLINE_SETUP_AGENT;
169859
- var init_statuslineSetup = __esm(() => {
169860
- STATUSLINE_SETUP_AGENT = {
169861
- agentType: "statusline-setup",
169862
- whenToUse: "Use this agent to configure the user's Atlas status line segments.",
169863
- tools: ["Read", "Edit"],
169864
- source: "built-in",
169865
- baseDir: "built-in",
169866
- model: "small",
169867
- color: "orange",
169868
- getSystemPrompt: () => STATUSLINE_SYSTEM_PROMPT
169869
- };
169870
- });
169871
-
169872
169773
  // src/tui/tools/AgentTool/built-in/verificationAgent.ts
169873
169774
  var VERIFICATION_SYSTEM_PROMPT, VERIFICATION_WHEN_TO_USE = "Use this agent to verify that implementation work is correct before reporting completion. Invoke after non-trivial tasks (3+ file edits, backend/API changes, infrastructure changes). Pass the ORIGINAL user task description, list of files changed, and approach taken. The agent runs builds, tests, linters, and checks to produce a PASS/FAIL/PARTIAL verdict with evidence.", VERIFICATION_AGENT;
169874
169775
  var init_verificationAgent = __esm(() => {
@@ -170099,8 +170000,7 @@ function getBuiltInAgents2() {
170099
170000
  }
170100
170001
  }
170101
170002
  const agents = [
170102
- GENERAL_PURPOSE_AGENT2,
170103
- STATUSLINE_SETUP_AGENT
170003
+ GENERAL_PURPOSE_AGENT2
170104
170004
  ];
170105
170005
  if (areExplorePlanAgentsEnabled()) {
170106
170006
  agents.push(EXPLORE_AGENT, PLAN_AGENT);
@@ -170123,7 +170023,6 @@ var init_builtInAgents2 = __esm(() => {
170123
170023
  init_exploreAgent();
170124
170024
  init_generalPurposeAgent();
170125
170025
  init_planAgent();
170126
- init_statuslineSetup();
170127
170026
  init_verificationAgent();
170128
170027
  });
170129
170028
 
@@ -343638,18 +343537,6 @@ var init_add_dir2 = __esm(() => {
343638
343537
  add_dir_default = addDir;
343639
343538
  });
343640
343539
 
343641
- // src/tui/commands/autofix-pr/index.js
343642
- var autofix_pr_default;
343643
- var init_autofix_pr = __esm(() => {
343644
- autofix_pr_default = { isEnabled: () => false, isHidden: true, name: "stub" };
343645
- });
343646
-
343647
- // src/tui/commands/backfill-sessions/index.js
343648
- var backfill_sessions_default;
343649
- var init_backfill_sessions = __esm(() => {
343650
- backfill_sessions_default = { isEnabled: () => false, isHidden: true, name: "stub" };
343651
- });
343652
-
343653
343540
  // src/tui/components/Spinner/SpinnerGlyph.tsx
343654
343541
  function SpinnerGlyph(t0) {
343655
343542
  const $ = import_compiler_runtime111.c(8);
@@ -344285,18 +344172,6 @@ var init_btw2 = __esm(() => {
344285
344172
  btw_default = btw;
344286
344173
  });
344287
344174
 
344288
- // src/tui/commands/good-atlas/index.js
344289
- var good_atlas_default;
344290
- var init_good_atlas = __esm(() => {
344291
- good_atlas_default = { isEnabled: () => false, isHidden: true, name: "stub" };
344292
- });
344293
-
344294
- // src/tui/commands/issue/index.js
344295
- var issue_default;
344296
- var init_issue = __esm(() => {
344297
- issue_default = { isEnabled: () => false, isHidden: true, name: "stub" };
344298
- });
344299
-
344300
344175
  // src/tui/components/Feedback.tsx
344301
344176
  import { readFile as readFile44, stat as stat43 } from "fs/promises";
344302
344177
  function redactSensitiveInfo(text) {
@@ -358139,12 +358014,6 @@ var init_diff4 = __esm(() => {
358139
358014
  };
358140
358015
  });
358141
358016
 
358142
- // src/tui/commands/ctx_viz/index.js
358143
- var ctx_viz_default;
358144
- var init_ctx_viz = __esm(() => {
358145
- ctx_viz_default = { isEnabled: () => false, isHidden: true, name: "stub" };
358146
- });
358147
-
358148
358017
  // src/tui/components/KeybindingWarnings.tsx
358149
358018
  function KeybindingWarnings() {
358150
358019
  const $ = import_compiler_runtime133.c(2);
@@ -364093,55 +363962,6 @@ var init_logout2 = __esm(() => {
364093
363962
  };
364094
363963
  });
364095
363964
 
364096
- // src/tui/commands/install-slack-app/install-slack-app.ts
364097
- var exports_install_slack_app = {};
364098
- __export(exports_install_slack_app, {
364099
- call: () => call22
364100
- });
364101
- async function call22() {
364102
- saveGlobalConfig((current) => ({
364103
- ...current,
364104
- slackAppInstallCount: (current.slackAppInstallCount ?? 0) + 1
364105
- }));
364106
- const success = await openBrowser(SLACK_APP_URL);
364107
- if (success) {
364108
- return {
364109
- type: "text",
364110
- value: "Opening Slack app installation page in browser…"
364111
- };
364112
- } else {
364113
- return {
364114
- type: "text",
364115
- value: `Couldn't open browser. Visit: ${SLACK_APP_URL}`
364116
- };
364117
- }
364118
- }
364119
- var SLACK_APP_URL = "https://slack.com/marketplace/A08SF47R6P4-claude";
364120
- var init_install_slack_app = __esm(() => {
364121
- init_browser();
364122
- init_config6();
364123
- });
364124
-
364125
- // src/tui/commands/install-slack-app/index.ts
364126
- var installSlackApp, install_slack_app_default;
364127
- var init_install_slack_app2 = __esm(() => {
364128
- installSlackApp = {
364129
- type: "local",
364130
- name: "install-slack-app",
364131
- description: "Install the Atlas Slack app",
364132
- availability: ["claude-ai"],
364133
- supportsNonInteractive: false,
364134
- load: () => Promise.resolve().then(() => (init_install_slack_app(), exports_install_slack_app))
364135
- };
364136
- install_slack_app_default = installSlackApp;
364137
- });
364138
-
364139
- // src/tui/commands/break-cache/index.js
364140
- var break_cache_default;
364141
- var init_break_cache = __esm(() => {
364142
- break_cache_default = { isEnabled: () => false, isHidden: true, name: "stub" };
364143
- });
364144
-
364145
363965
  // src/tui/utils/activityManager.ts
364146
363966
  class ActivityManager {
364147
363967
  activeOperations = new Set;
@@ -370275,7 +370095,7 @@ var init_mcp5 = __esm(() => {
370275
370095
  // src/tui/commands/mcp/mcp.tsx
370276
370096
  var exports_mcp = {};
370277
370097
  __export(exports_mcp, {
370278
- call: () => call23
370098
+ call: () => call22
370279
370099
  });
370280
370100
  function MCPToggle(t0) {
370281
370101
  const $ = import_compiler_runtime161.c(7);
@@ -370328,7 +370148,7 @@ function _temp235(c) {
370328
370148
  function _temp89(s) {
370329
370149
  return s.mcp.clients;
370330
370150
  }
370331
- async function call23(onDone, _context, args) {
370151
+ async function call22(onDone, _context, args) {
370332
370152
  if (args) {
370333
370153
  const parts = args.trim().split(/\s+/);
370334
370154
  if (parts[0] === "no-redirect") {
@@ -370379,90 +370199,6 @@ var init_mcp7 = __esm(() => {
370379
370199
  mcp_default = mcp;
370380
370200
  });
370381
370201
 
370382
- // src/tui/commands/onboarding/index.js
370383
- var onboarding_default;
370384
- var init_onboarding = __esm(() => {
370385
- onboarding_default = { isEnabled: () => false, isHidden: true, name: "stub" };
370386
- });
370387
-
370388
- // src/tui/commands/createMovedToPluginCommand.ts
370389
- function createMovedToPluginCommand({
370390
- name,
370391
- description,
370392
- progressMessage,
370393
- pluginName,
370394
- pluginCommand,
370395
- getPromptWhileMarketplaceIsPrivate
370396
- }) {
370397
- return {
370398
- type: "prompt",
370399
- name,
370400
- description,
370401
- progressMessage,
370402
- contentLength: 0,
370403
- userFacingName() {
370404
- return name;
370405
- },
370406
- source: "builtin",
370407
- async getPromptForCommand(args, context) {
370408
- return getPromptWhileMarketplaceIsPrivate(args, context);
370409
- }
370410
- };
370411
- }
370412
-
370413
- // src/tui/commands/pr_comments/index.ts
370414
- var pr_comments_default;
370415
- var init_pr_comments = __esm(() => {
370416
- pr_comments_default = createMovedToPluginCommand({
370417
- name: "pr-comments",
370418
- description: "Get comments from a GitHub pull request",
370419
- progressMessage: "fetching PR comments",
370420
- pluginName: "pr-comments",
370421
- pluginCommand: "pr-comments",
370422
- async getPromptWhileMarketplaceIsPrivate(args) {
370423
- return [
370424
- {
370425
- type: "text",
370426
- text: `You are an AI assistant integrated into a git-based version control system. Your task is to fetch and display comments from a GitHub pull request.
370427
-
370428
- Follow these steps:
370429
-
370430
- 1. Use \`gh pr view --json number,headRepository\` to get the PR number and repository info
370431
- 2. Use \`gh api /repos/{owner}/{repo}/issues/{number}/comments\` to get PR-level comments
370432
- 3. Use \`gh api /repos/{owner}/{repo}/pulls/{number}/comments\` to get review comments. Pay particular attention to the following fields: \`body\`, \`diff_hunk\`, \`path\`, \`line\`, etc. If the comment references some code, consider fetching it using eg \`gh api /repos/{owner}/{repo}/contents/{path}?ref={branch} | jq .content -r | base64 -d\`
370433
- 4. Parse and format all comments in a readable way
370434
- 5. Return ONLY the formatted comments, with no additional text
370435
-
370436
- Format the comments as:
370437
-
370438
- ## Comments
370439
-
370440
- [For each comment thread:]
370441
- - @author file.ts#line:
370442
- \`\`\`diff
370443
- [diff_hunk from the API response]
370444
- \`\`\`
370445
- > quoted comment text
370446
-
370447
- [any replies indented]
370448
-
370449
- If there are no comments, return "No comments found."
370450
-
370451
- Remember:
370452
- 1. Only show the actual comments, no explanatory text
370453
- 2. Include both PR-level and code review comments
370454
- 3. Preserve the threading/nesting of comment replies
370455
- 4. Show the file and line number context for code review comments
370456
- 5. Use jq to parse the JSON responses from the GitHub API
370457
-
370458
- ${args ? "Additional user input: " + args : ""}
370459
- `
370460
- }
370461
- ];
370462
- }
370463
- });
370464
- });
370465
-
370466
370202
  // src/tui/utils/releaseNotes.ts
370467
370203
  import { mkdir as mkdir44, readFile as readFile48, writeFile as writeFile39 } from "fs/promises";
370468
370204
  import { dirname as dirname71, join as join140 } from "path";
@@ -370618,7 +370354,7 @@ var init_releaseNotes = __esm(() => {
370618
370354
  // src/tui/commands/release-notes/release-notes.ts
370619
370355
  var exports_release_notes = {};
370620
370356
  __export(exports_release_notes, {
370621
- call: () => call24
370357
+ call: () => call23
370622
370358
  });
370623
370359
  function formatReleaseNotes(notes) {
370624
370360
  return notes.map(([version, notes]) => {
@@ -370631,7 +370367,7 @@ ${bulletPoints}`;
370631
370367
 
370632
370368
  `);
370633
370369
  }
370634
- async function call24() {
370370
+ async function call23() {
370635
370371
  let freshNotes = [];
370636
370372
  try {
370637
370373
  const timeoutPromise = new Promise((_, reject) => {
@@ -370822,9 +370558,9 @@ var init_generateSessionName = __esm(() => {
370822
370558
  // src/tui/commands/rename/rename.ts
370823
370559
  var exports_rename = {};
370824
370560
  __export(exports_rename, {
370825
- call: () => call25
370561
+ call: () => call24
370826
370562
  });
370827
- async function call25(onDone, context, args) {
370563
+ async function call24(onDone, context, args) {
370828
370564
  if (isTeammate2()) {
370829
370565
  onDone("Cannot rename: This session is a swarm teammate. Teammate names are set by the team leader.", { display: "system" });
370830
370566
  return null;
@@ -378791,7 +378527,7 @@ var init_crossProjectResume = __esm(() => {
378791
378527
  // src/tui/commands/resume/resume.tsx
378792
378528
  var exports_resume = {};
378793
378529
  __export(exports_resume, {
378794
- call: () => call26,
378530
+ call: () => call25,
378795
378531
  filterResumableSessions: () => filterResumableSessions
378796
378532
  });
378797
378533
  function resumeHelpMessage(result) {
@@ -378977,7 +378713,7 @@ function ResumeCommand({
378977
378713
  function filterResumableSessions(logs, currentSessionId) {
378978
378714
  return logs.filter((l) => !l.isSidechain && getSessionIdFromLog(l) !== currentSessionId);
378979
378715
  }
378980
- var import_compiler_runtime179, React69, jsx_dev_runtime221, call26 = async (onDone, context, args) => {
378716
+ var import_compiler_runtime179, React69, jsx_dev_runtime221, call25 = async (onDone, context, args) => {
378981
378717
  const onResume = async (sessionId, log, entrypoint) => {
378982
378718
  try {
378983
378719
  await context.resume?.(sessionId, log, entrypoint);
@@ -383375,7 +383111,7 @@ var init_server = __esm(() => {
383375
383111
  // src/tui/commands/session/session.tsx
383376
383112
  var exports_session = {};
383377
383113
  __export(exports_session, {
383378
- call: () => call27
383114
+ call: () => call26
383379
383115
  });
383380
383116
  function SessionInfo(t0) {
383381
383117
  const $ = import_compiler_runtime180.c(19);
@@ -383565,7 +383301,7 @@ function _temp241(e) {
383565
383301
  function _temp105(s) {
383566
383302
  return s.remoteSessionUrl;
383567
383303
  }
383568
- var import_compiler_runtime180, import_react131, jsx_dev_runtime222, call27 = async (onDone) => {
383304
+ var import_compiler_runtime180, import_react131, jsx_dev_runtime222, call26 = async (onDone) => {
383569
383305
  return /* @__PURE__ */ jsx_dev_runtime222.jsxDEV(SessionInfo, {
383570
383306
  onDone
383571
383307
  }, undefined, false, undefined, this);
@@ -383596,12 +383332,6 @@ var init_session3 = __esm(() => {
383596
383332
  session_default = session;
383597
383333
  });
383598
383334
 
383599
- // src/tui/commands/share/index.js
383600
- var share_default;
383601
- var init_share = __esm(() => {
383602
- share_default = { isEnabled: () => false, isHidden: true, name: "stub" };
383603
- });
383604
-
383605
383335
  // src/tui/components/skills/SkillsMenu.tsx
383606
383336
  function getSourceTitle(source) {
383607
383337
  if (source === "plugin") {
@@ -383927,9 +383657,9 @@ var init_SkillsMenu = __esm(() => {
383927
383657
  // src/tui/commands/skills/skills.tsx
383928
383658
  var exports_skills = {};
383929
383659
  __export(exports_skills, {
383930
- call: () => call28
383660
+ call: () => call27
383931
383661
  });
383932
- async function call28(onDone, context) {
383662
+ async function call27(onDone, context) {
383933
383663
  return /* @__PURE__ */ jsx_dev_runtime224.jsxDEV(SkillsMenu, {
383934
383664
  onExit: onDone,
383935
383665
  commands: context.options.commands
@@ -383956,9 +383686,9 @@ var init_skills3 = __esm(() => {
383956
383686
  // src/tui/commands/status/status.tsx
383957
383687
  var exports_status = {};
383958
383688
  __export(exports_status, {
383959
- call: () => call29
383689
+ call: () => call28
383960
383690
  });
383961
- async function call29(onDone, context) {
383691
+ async function call28(onDone, context) {
383962
383692
  return /* @__PURE__ */ jsx_dev_runtime225.jsxDEV(Settings, {
383963
383693
  onClose: onDone,
383964
383694
  context,
@@ -387154,9 +386884,9 @@ var init_BackgroundTasksDialog = __esm(() => {
387154
386884
  // src/tui/commands/tasks/tasks.tsx
387155
386885
  var exports_tasks = {};
387156
386886
  __export(exports_tasks, {
387157
- call: () => call30
386887
+ call: () => call29
387158
386888
  });
387159
- async function call30(onDone, context) {
386889
+ async function call29(onDone, context) {
387160
386890
  return /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(BackgroundTasksDialog, {
387161
386891
  toolUseContext: context,
387162
386892
  onDone
@@ -387603,9 +387333,9 @@ var init_FileTaskDialog = __esm(() => {
387603
387333
  // src/tui/commands/tasklist/tasklist.tsx
387604
387334
  var exports_tasklist = {};
387605
387335
  __export(exports_tasklist, {
387606
- call: () => call31
387336
+ call: () => call30
387607
387337
  });
387608
- async function call31(onDone, _context) {
387338
+ async function call30(onDone, _context) {
387609
387339
  return /* @__PURE__ */ jsx_dev_runtime236.jsxDEV(FileTaskDialog, {
387610
387340
  onDone
387611
387341
  }, undefined, false, undefined, this);
@@ -387629,243 +387359,6 @@ var init_tasklist2 = __esm(() => {
387629
387359
  tasklist_default = tasklist;
387630
387360
  });
387631
387361
 
387632
- // src/tui/commands/security-review.ts
387633
- var SECURITY_REVIEW_MARKDOWN = `---
387634
- allowed-tools: Bash(git diff:*), Bash(git status:*), Bash(git log:*), Bash(git show:*), Bash(git remote show:*), Read, Glob, Grep, LS, Task
387635
- description: Complete a security review of the pending changes on the current branch
387636
- ---
387637
-
387638
- You are a senior security engineer conducting a focused security review of the changes on this branch.
387639
-
387640
- GIT STATUS:
387641
-
387642
- \`\`\`
387643
- !\`git status\`
387644
- \`\`\`
387645
-
387646
- FILES MODIFIED:
387647
-
387648
- \`\`\`
387649
- !\`git diff --name-only origin/HEAD...\`
387650
- \`\`\`
387651
-
387652
- COMMITS:
387653
-
387654
- \`\`\`
387655
- !\`git log --no-decorate origin/HEAD...\`
387656
- \`\`\`
387657
-
387658
- DIFF CONTENT:
387659
-
387660
- \`\`\`
387661
- !\`git diff origin/HEAD...\`
387662
- \`\`\`
387663
-
387664
- Review the complete diff above. This contains all code changes in the PR.
387665
-
387666
-
387667
- OBJECTIVE:
387668
- Perform a security-focused code review to identify HIGH-CONFIDENCE security vulnerabilities that could have real exploitation potential. This is not a general code review - focus ONLY on security implications newly added by this PR. Do not comment on existing security concerns.
387669
-
387670
- CRITICAL INSTRUCTIONS:
387671
- 1. MINIMIZE FALSE POSITIVES: Only flag issues where you're >80% confident of actual exploitability
387672
- 2. AVOID NOISE: Skip theoretical issues, style concerns, or low-impact findings
387673
- 3. FOCUS ON IMPACT: Prioritize vulnerabilities that could lead to unauthorized access, data breaches, or system compromise
387674
- 4. EXCLUSIONS: Do NOT report the following issue types:
387675
- - Denial of Service (DOS) vulnerabilities, even if they allow service disruption
387676
- - Secrets or sensitive data stored on disk (these are handled by other processes)
387677
- - Rate limiting or resource exhaustion issues
387678
-
387679
- SECURITY CATEGORIES TO EXAMINE:
387680
-
387681
- **Input Validation Vulnerabilities:**
387682
- - SQL injection via unsanitized user input
387683
- - Command injection in system calls or subprocesses
387684
- - XXE injection in XML parsing
387685
- - Template injection in templating engines
387686
- - NoSQL injection in database queries
387687
- - Path traversal in file operations
387688
-
387689
- **Authentication & Authorization Issues:**
387690
- - Authentication bypass logic
387691
- - Privilege escalation paths
387692
- - Session management flaws
387693
- - JWT token vulnerabilities
387694
- - Authorization logic bypasses
387695
-
387696
- **Crypto & Secrets Management:**
387697
- - Hardcoded API keys, passwords, or tokens
387698
- - Weak cryptographic algorithms or implementations
387699
- - Improper key storage or management
387700
- - Cryptographic randomness issues
387701
- - Certificate validation bypasses
387702
-
387703
- **Injection & Code Execution:**
387704
- - Remote code execution via deseralization
387705
- - Pickle injection in Python
387706
- - YAML deserialization vulnerabilities
387707
- - Eval injection in dynamic code execution
387708
- - XSS vulnerabilities in web applications (reflected, stored, DOM-based)
387709
-
387710
- **Data Exposure:**
387711
- - Sensitive data logging or storage
387712
- - PII handling violations
387713
- - API endpoint data leakage
387714
- - Debug information exposure
387715
-
387716
- Additional notes:
387717
- - Even if something is only exploitable from the local network, it can still be a HIGH severity issue
387718
-
387719
- ANALYSIS METHODOLOGY:
387720
-
387721
- Phase 1 - Repository Context Research (Use file search tools):
387722
- - Identify existing security frameworks and libraries in use
387723
- - Look for established secure coding patterns in the codebase
387724
- - Examine existing sanitization and validation patterns
387725
- - Understand the project's security model and threat model
387726
-
387727
- Phase 2 - Comparative Analysis:
387728
- - Compare new code changes against existing security patterns
387729
- - Identify deviations from established secure practices
387730
- - Look for inconsistent security implementations
387731
- - Flag code that introduces new attack surfaces
387732
-
387733
- Phase 3 - Vulnerability Assessment:
387734
- - Examine each modified file for security implications
387735
- - Trace data flow from user inputs to sensitive operations
387736
- - Look for privilege boundaries being crossed unsafely
387737
- - Identify injection points and unsafe deserialization
387738
-
387739
- REQUIRED OUTPUT FORMAT:
387740
-
387741
- You MUST output your findings in markdown. The markdown output should contain the file, line number, severity, category (e.g. \`sql_injection\` or \`xss\`), description, exploit scenario, and fix recommendation.
387742
-
387743
- For example:
387744
-
387745
- # Vuln 1: XSS: \`foo.py:42\`
387746
-
387747
- * Severity: High
387748
- * Description: User input from \`username\` parameter is directly interpolated into HTML without escaping, allowing reflected XSS attacks
387749
- * Exploit Scenario: Attacker crafts URL like /bar?q=<script>alert(document.cookie)</script> to execute JavaScript in victim's browser, enabling session hijacking or data theft
387750
- * Recommendation: Use Flask's escape() function or Jinja2 templates with auto-escaping enabled for all user inputs rendered in HTML
387751
-
387752
- SEVERITY GUIDELINES:
387753
- - **HIGH**: Directly exploitable vulnerabilities leading to RCE, data breach, or authentication bypass
387754
- - **MEDIUM**: Vulnerabilities requiring specific conditions but with significant impact
387755
- - **LOW**: Defense-in-depth issues or lower-impact vulnerabilities
387756
-
387757
- CONFIDENCE SCORING:
387758
- - 0.9-1.0: Certain exploit path identified, tested if possible
387759
- - 0.8-0.9: Clear vulnerability pattern with known exploitation methods
387760
- - 0.7-0.8: Suspicious pattern requiring specific conditions to exploit
387761
- - Below 0.7: Don't report (too speculative)
387762
-
387763
- FINAL REMINDER:
387764
- Focus on HIGH and MEDIUM findings only. Better to miss some theoretical issues than flood the report with false positives. Each finding should be something a security engineer would confidently raise in a PR review.
387765
-
387766
- FALSE POSITIVE FILTERING:
387767
-
387768
- > You do not need to run commands to reproduce the vulnerability, just read the code to determine if it is a real vulnerability. Do not use the bash tool or write to any files.
387769
- >
387770
- > HARD EXCLUSIONS - Automatically exclude findings matching these patterns:
387771
- > 1. Denial of Service (DOS) vulnerabilities or resource exhaustion attacks.
387772
- > 2. Secrets or credentials stored on disk if they are otherwise secured.
387773
- > 3. Rate limiting concerns or service overload scenarios.
387774
- > 4. Memory consumption or CPU exhaustion issues.
387775
- > 5. Lack of input validation on non-security-critical fields without proven security impact.
387776
- > 6. Input sanitization concerns for GitHub Action workflows unless they are clearly triggerable via untrusted input.
387777
- > 7. A lack of hardening measures. Code is not expected to implement all security best practices, only flag concrete vulnerabilities.
387778
- > 8. Race conditions or timing attacks that are theoretical rather than practical issues. Only report a race condition if it is concretely problematic.
387779
- > 9. Vulnerabilities related to outdated third-party libraries. These are managed separately and should not be reported here.
387780
- > 10. Memory safety issues such as buffer overflows or use-after-free-vulnerabilities are impossible in rust. Do not report memory safety issues in rust or any other memory safe languages.
387781
- > 11. Files that are only unit tests or only used as part of running tests.
387782
- > 12. Log spoofing concerns. Outputting un-sanitized user input to logs is not a vulnerability.
387783
- > 13. SSRF vulnerabilities that only control the path. SSRF is only a concern if it can control the host or protocol.
387784
- > 14. Including user-controlled content in AI system prompts is not a vulnerability.
387785
- > 15. Regex injection. Injecting untrusted content into a regex is not a vulnerability.
387786
- > 16. Regex DOS concerns.
387787
- > 16. Insecure documentation. Do not report any findings in documentation files such as markdown files.
387788
- > 17. A lack of audit logs is not a vulnerability.
387789
- >
387790
- > PRECEDENTS -
387791
- > 1. Logging high value secrets in plaintext is a vulnerability. Logging URLs is assumed to be safe.
387792
- > 2. UUIDs can be assumed to be unguessable and do not need to be validated.
387793
- > 3. Environment variables and CLI flags are trusted values. Attackers are generally not able to modify them in a secure environment. Any attack that relies on controlling an environment variable is invalid.
387794
- > 4. Resource management issues such as memory or file descriptor leaks are not valid.
387795
- > 5. Subtle or low impact web vulnerabilities such as tabnabbing, XS-Leaks, prototype pollution, and open redirects should not be reported unless they are extremely high confidence.
387796
- > 6. React and Angular are generally secure against XSS. These frameworks do not need to sanitize or escape user input unless it is using dangerouslySetInnerHTML, bypassSecurityTrustHtml, or similar methods. Do not report XSS vulnerabilities in React or Angular components or tsx files unless they are using unsafe methods.
387797
- > 7. Most vulnerabilities in github action workflows are not exploitable in practice. Before validating a github action workflow vulnerability ensure it is concrete and has a very specific attack path.
387798
- > 8. A lack of permission checking or authentication in client-side JS/TS code is not a vulnerability. Client-side code is not trusted and does not need to implement these checks, they are handled on the server-side. The same applies to all flows that send untrusted data to the backend, the backend is responsible for validating and sanitizing all inputs.
387799
- > 9. Only include MEDIUM findings if they are obvious and concrete issues.
387800
- > 10. Most vulnerabilities in ipython notebooks (*.ipynb files) are not exploitable in practice. Before validating a notebook vulnerability ensure it is concrete and has a very specific attack path where untrusted input can trigger the vulnerability.
387801
- > 11. Logging non-PII data is not a vulnerability even if the data may be sensitive. Only report logging vulnerabilities if they expose sensitive information such as secrets, passwords, or personally identifiable information (PII).
387802
- > 12. Command injection vulnerabilities in shell scripts are generally not exploitable in practice since shell scripts generally do not run with untrusted user input. Only report command injection vulnerabilities in shell scripts if they are concrete and have a very specific attack path for untrusted input.
387803
- >
387804
- > SIGNAL QUALITY CRITERIA - For remaining findings, assess:
387805
- > 1. Is there a concrete, exploitable vulnerability with a clear attack path?
387806
- > 2. Does this represent a real security risk vs theoretical best practice?
387807
- > 3. Are there specific code locations and reproduction steps?
387808
- > 4. Would this finding be actionable for a security team?
387809
- >
387810
- > For each finding, assign a confidence score from 1-10:
387811
- > - 1-3: Low confidence, likely false positive or noise
387812
- > - 4-6: Medium confidence, needs investigation
387813
- > - 7-10: High confidence, likely true vulnerability
387814
-
387815
- START ANALYSIS:
387816
-
387817
- Begin your analysis now. Do this in 3 steps:
387818
-
387819
- 1. Use a sub-task to identify vulnerabilities. Use the repository exploration tools to understand the codebase context, then analyze the PR changes for security implications. In the prompt for this sub-task, include all of the above.
387820
- 2. Then for each vulnerability identified by the above sub-task, create a new sub-task to filter out false-positives. Launch these sub-tasks as parallel sub-tasks. In the prompt for these sub-tasks, include everything in the "FALSE POSITIVE FILTERING" instructions.
387821
- 3. Filter out any vulnerabilities where the sub-task reported a confidence less than 8.
387822
-
387823
- Your final reply must contain the markdown report and nothing else.`, security_review_default;
387824
- var init_security_review = __esm(() => {
387825
- init_frontmatterParser2();
387826
- init_markdownConfigLoader();
387827
- init_promptShellExecution2();
387828
- security_review_default = createMovedToPluginCommand({
387829
- name: "security-review",
387830
- description: "Complete a security review of the pending changes on the current branch",
387831
- progressMessage: "analyzing code changes for security risks",
387832
- pluginName: "security-review",
387833
- pluginCommand: "security-review",
387834
- async getPromptWhileMarketplaceIsPrivate(_args, context) {
387835
- const parsed = parseFrontmatter2(SECURITY_REVIEW_MARKDOWN);
387836
- const allowedTools = parseSlashCommandToolsFromFrontmatter2(parsed.frontmatter["allowed-tools"]);
387837
- const processedContent = await executeShellCommandsInPrompt2(parsed.content, {
387838
- ...context,
387839
- getAppState() {
387840
- const appState = context.getAppState();
387841
- return {
387842
- ...appState,
387843
- toolPermissionContext: {
387844
- ...appState.toolPermissionContext,
387845
- alwaysAllowRules: {
387846
- ...appState.toolPermissionContext.alwaysAllowRules,
387847
- command: allowedTools
387848
- }
387849
- }
387850
- };
387851
- }
387852
- }, "security-review");
387853
- return [
387854
- {
387855
- type: "text",
387856
- text: processedContent
387857
- }
387858
- ];
387859
- }
387860
- });
387861
- });
387862
-
387863
- // src/tui/commands/bughunter/index.js
387864
- var bughunter_default;
387865
- var init_bughunter = __esm(() => {
387866
- bughunter_default = { isEnabled: () => false, isHidden: true, name: "stub" };
387867
- });
387868
-
387869
387362
  // src/tui/commands/terminalSetup/index.ts
387870
387363
  var NATIVE_CSIU_TERMINALS2, terminalSetup, terminalSetup_default;
387871
387364
  var init_terminalSetup2 = __esm(() => {
@@ -387889,9 +387382,9 @@ var init_terminalSetup2 = __esm(() => {
387889
387382
  // src/tui/commands/usage/usage.tsx
387890
387383
  var exports_usage2 = {};
387891
387384
  __export(exports_usage2, {
387892
- call: () => call32
387385
+ call: () => call31
387893
387386
  });
387894
- var jsx_dev_runtime237, call32 = async (onDone, context) => {
387387
+ var jsx_dev_runtime237, call31 = async (onDone, context) => {
387895
387388
  return /* @__PURE__ */ jsx_dev_runtime237.jsxDEV(Settings, {
387896
387389
  onClose: onDone,
387897
387390
  context,
@@ -387918,7 +387411,7 @@ var init_usage4 = __esm(() => {
387918
387411
  // src/tui/commands/theme/theme.tsx
387919
387412
  var exports_theme = {};
387920
387413
  __export(exports_theme, {
387921
- call: () => call33
387414
+ call: () => call32
387922
387415
  });
387923
387416
  function ThemePickerCommand(t0) {
387924
387417
  const $ = import_compiler_runtime189.c(8);
@@ -387968,7 +387461,7 @@ function ThemePickerCommand(t0) {
387968
387461
  }
387969
387462
  return t3;
387970
387463
  }
387971
- var import_compiler_runtime189, jsx_dev_runtime238, call33 = async (onDone, _context) => {
387464
+ var import_compiler_runtime189, jsx_dev_runtime238, call32 = async (onDone, _context) => {
387972
387465
  return /* @__PURE__ */ jsx_dev_runtime238.jsxDEV(ThemePickerCommand, {
387973
387466
  onDone
387974
387467
  }, undefined, false, undefined, this);
@@ -387996,9 +387489,9 @@ var init_theme3 = __esm(() => {
387996
387489
  // src/tui/commands/vim/vim.ts
387997
387490
  var exports_vim = {};
387998
387491
  __export(exports_vim, {
387999
- call: () => call34
387492
+ call: () => call33
388000
387493
  });
388001
- var call34 = async () => {
387494
+ var call33 = async () => {
388002
387495
  const config = getGlobalConfig();
388003
387496
  let currentMode = config.editorMode || "normal";
388004
387497
  if (currentMode === "emacs") {
@@ -388710,7 +388203,7 @@ var init_pluginOperations = __esm(() => {
388710
388203
  // src/tui/commands/thinkback/thinkback.tsx
388711
388204
  var exports_thinkback = {};
388712
388205
  __export(exports_thinkback, {
388713
- call: () => call35,
388206
+ call: () => call34,
388714
388207
  playAnimation: () => playAnimation
388715
388208
  });
388716
388209
  import { readFile as readFile49 } from "fs/promises";
@@ -389248,7 +388741,7 @@ function ThinkbackFlow(t0) {
389248
388741
  }
389249
388742
  return t8;
389250
388743
  }
389251
- async function call35(onDone) {
388744
+ async function call34(onDone) {
389252
388745
  return /* @__PURE__ */ jsx_dev_runtime239.jsxDEV(ThinkbackFlow, {
389253
388746
  onDone
389254
388747
  }, undefined, false, undefined, this);
@@ -389296,13 +388789,13 @@ var init_thinkback2 = __esm(() => {
389296
388789
  // src/tui/commands/thinkback-play/thinkback-play.ts
389297
388790
  var exports_thinkback_play = {};
389298
388791
  __export(exports_thinkback_play, {
389299
- call: () => call36
388792
+ call: () => call35
389300
388793
  });
389301
388794
  import { join as join144 } from "path";
389302
388795
  function getPluginId2() {
389303
388796
  return `thinkback@${OFFICIAL_MARKETPLACE_NAME}`;
389304
388797
  }
389305
- async function call36() {
388798
+ async function call35() {
389306
388799
  const v2Data = loadInstalledPluginsV2();
389307
388800
  const pluginId = getPluginId2();
389308
388801
  const installations = v2Data.plugins[pluginId];
@@ -391804,9 +391297,9 @@ var init_PermissionRuleList = __esm(() => {
391804
391297
  // src/tui/commands/permissions/permissions.tsx
391805
391298
  var exports_permissions2 = {};
391806
391299
  __export(exports_permissions2, {
391807
- call: () => call37
391300
+ call: () => call36
391808
391301
  });
391809
- var jsx_dev_runtime247, call37 = async (onDone, context) => {
391302
+ var jsx_dev_runtime247, call36 = async (onDone, context) => {
391810
391303
  return /* @__PURE__ */ jsx_dev_runtime247.jsxDEV(PermissionRuleList, {
391811
391304
  onExit: onDone,
391812
391305
  onRetryDenials: (commands) => {
@@ -391836,7 +391329,7 @@ var init_permissions8 = __esm(() => {
391836
391329
  // src/tui/commands/plan/plan.tsx
391837
391330
  var exports_plan = {};
391838
391331
  __export(exports_plan, {
391839
- call: () => call38
391332
+ call: () => call37
391840
391333
  });
391841
391334
  function PlanDisplay(t0) {
391842
391335
  const $ = import_compiler_runtime198.c(11);
@@ -391924,7 +391417,7 @@ function PlanDisplay(t0) {
391924
391417
  }
391925
391418
  return t5;
391926
391419
  }
391927
- async function call38(onDone, context, args) {
391420
+ async function call37(onDone, context, args) {
391928
391421
  const {
391929
391422
  getAppState,
391930
391423
  setAppState
@@ -393762,9 +393255,9 @@ var init_HooksConfigMenu = __esm(() => {
393762
393255
  // src/tui/commands/hooks/hooks.tsx
393763
393256
  var exports_hooks = {};
393764
393257
  __export(exports_hooks, {
393765
- call: () => call39
393258
+ call: () => call38
393766
393259
  });
393767
- var jsx_dev_runtime254, call39 = async (onDone, context) => {
393260
+ var jsx_dev_runtime254, call38 = async (onDone, context) => {
393768
393261
  const appState = context.getAppState();
393769
393262
  const permissionContext = appState.toolPermissionContext;
393770
393263
  const toolNames = getTools2(permissionContext).map((tool) => tool.name);
@@ -393795,10 +393288,10 @@ var init_hooks5 = __esm(() => {
393795
393288
  // src/tui/commands/files/files.ts
393796
393289
  var exports_files4 = {};
393797
393290
  __export(exports_files4, {
393798
- call: () => call40
393291
+ call: () => call39
393799
393292
  });
393800
393293
  import { relative as relative27 } from "path";
393801
- async function call40(_args, context) {
393294
+ async function call39(_args, context) {
393802
393295
  const files = context.readFileState ? cacheKeys(context.readFileState) : [];
393803
393296
  if (files.length === 0) {
393804
393297
  return { type: "text", value: "No files in context" };
@@ -393820,7 +393313,7 @@ var init_files8 = __esm(() => {
393820
393313
  type: "local",
393821
393314
  name: "files",
393822
393315
  description: "List all files currently in context",
393823
- isEnabled: () => false,
393316
+ isEnabled: () => true,
393824
393317
  supportsNonInteractive: true,
393825
393318
  load: () => Promise.resolve().then(() => (init_files7(), exports_files4))
393826
393319
  };
@@ -393830,7 +393323,7 @@ var init_files8 = __esm(() => {
393830
393323
  // src/tui/commands/branch/branch.ts
393831
393324
  var exports_branch = {};
393832
393325
  __export(exports_branch, {
393833
- call: () => call41,
393326
+ call: () => call40,
393834
393327
  createFork: () => createFork,
393835
393328
  deriveFirstPrompt: () => deriveFirstPrompt,
393836
393329
  getUniqueForkName: () => getUniqueForkName
@@ -393939,7 +393432,7 @@ async function getUniqueForkName(baseName) {
393939
393432
  }
393940
393433
  return `${baseName} (Branch ${nextNumber})`;
393941
393434
  }
393942
- async function call41(onDone, context, args) {
393435
+ async function call40(onDone, context, args) {
393943
393436
  const customTitle = args?.trim() || undefined;
393944
393437
  const originalSessionId = getSessionId();
393945
393438
  try {
@@ -399983,9 +399476,9 @@ var init_AgentsMenu = __esm(() => {
399983
399476
  // src/tui/commands/agents/agents.tsx
399984
399477
  var exports_agents2 = {};
399985
399478
  __export(exports_agents2, {
399986
- call: () => call42
399479
+ call: () => call41
399987
399480
  });
399988
- async function call42(onDone, context) {
399481
+ async function call41(onDone, context) {
399989
399482
  const appState = context.getAppState();
399990
399483
  const permissionContext = appState.toolPermissionContext;
399991
399484
  const tools = getTools2(permissionContext);
@@ -410274,9 +409767,9 @@ var init_PluginSettings = __esm(() => {
410274
409767
  // src/tui/commands/plugin/plugin.tsx
410275
409768
  var exports_plugin = {};
410276
409769
  __export(exports_plugin, {
410277
- call: () => call43
409770
+ call: () => call42
410278
409771
  });
410279
- async function call43(onDone, _context, args) {
409772
+ async function call42(onDone, _context, args) {
410280
409773
  return /* @__PURE__ */ jsx_dev_runtime294.jsxDEV(PluginSettings, {
410281
409774
  onComplete: onDone,
410282
409775
  args
@@ -410305,12 +409798,12 @@ var init_plugin3 = __esm(() => {
410305
409798
  // src/tui/commands/reload-plugins/reload-plugins.ts
410306
409799
  var exports_reload_plugins = {};
410307
409800
  __export(exports_reload_plugins, {
410308
- call: () => call44
409801
+ call: () => call43
410309
409802
  });
410310
409803
  function n2(count, noun) {
410311
409804
  return `${count} ${plural2(count, noun)}`;
410312
409805
  }
410313
- var call44 = async (_args, context) => {
409806
+ var call43 = async (_args, context) => {
410314
409807
  const r = await refreshActivePlugins(context.setAppState);
410315
409808
  const parts = [
410316
409809
  n2(r.enabled_count, "plugin"),
@@ -410348,9 +409841,9 @@ var init_reload_plugins2 = __esm(() => {
410348
409841
  // src/tui/commands/rewind/rewind.ts
410349
409842
  var exports_rewind = {};
410350
409843
  __export(exports_rewind, {
410351
- call: () => call45
409844
+ call: () => call44
410352
409845
  });
410353
- async function call45(_args, context) {
409846
+ async function call44(_args, context) {
410354
409847
  if (context.openMessageSelector) {
410355
409848
  context.openMessageSelector();
410356
409849
  }
@@ -410523,9 +410016,9 @@ var init_heapDumpService = __esm(() => {
410523
410016
  // src/tui/commands/heapdump/heapdump.ts
410524
410017
  var exports_heapdump = {};
410525
410018
  __export(exports_heapdump, {
410526
- call: () => call46
410019
+ call: () => call45
410527
410020
  });
410528
- async function call46() {
410021
+ async function call45() {
410529
410022
  const result = await performHeapDump();
410530
410023
  if (!result.success) {
410531
410024
  return {
@@ -410558,7 +410051,7 @@ var init_heapdump2 = __esm(() => {
410558
410051
  });
410559
410052
 
410560
410053
  // src/tui/commands/version.ts
410561
- var call47 = async () => {
410054
+ var call46 = async () => {
410562
410055
  return {
410563
410056
  type: "text",
410564
410057
  value: MACRO.BUILD_TIME ? `${MACRO.VERSION} (built ${MACRO.BUILD_TIME})` : MACRO.VERSION
@@ -410569,25 +410062,13 @@ var init_version = __esm(() => {
410569
410062
  type: "local",
410570
410063
  name: "version",
410571
410064
  description: "Print the version this session is running (not what autoupdate downloaded)",
410572
- isEnabled: () => false,
410065
+ isEnabled: () => true,
410573
410066
  supportsNonInteractive: true,
410574
- load: () => Promise.resolve({ call: call47 })
410067
+ load: () => Promise.resolve({ call: call46 })
410575
410068
  };
410576
410069
  version_default = version2;
410577
410070
  });
410578
410071
 
410579
- // src/tui/commands/summary/index.js
410580
- var summary_default;
410581
- var init_summary = __esm(() => {
410582
- summary_default = { isEnabled: () => false, isHidden: true, name: "stub" };
410583
- });
410584
-
410585
- // src/tui/commands/perf-issue/index.js
410586
- var perf_issue_default;
410587
- var init_perf_issue = __esm(() => {
410588
- perf_issue_default = { isEnabled: () => false, isHidden: true, name: "stub" };
410589
- });
410590
-
410591
410072
  // src/tui/components/sandbox/SandboxConfigTab.tsx
410592
410073
  function SandboxConfigTab() {
410593
410074
  const $ = import_compiler_runtime232.c(3);
@@ -411689,10 +411170,10 @@ var init_SandboxSettings = __esm(() => {
411689
411170
  // src/tui/commands/sandbox-toggle/sandbox-toggle.tsx
411690
411171
  var exports_sandbox_toggle = {};
411691
411172
  __export(exports_sandbox_toggle, {
411692
- call: () => call48
411173
+ call: () => call47
411693
411174
  });
411694
411175
  import { relative as relative28 } from "path";
411695
- async function call48(onDone, _context, args) {
411176
+ async function call47(onDone, _context, args) {
411696
411177
  const settings = getSettings_DEPRECATED();
411697
411178
  const themeName = settings.theme || "light";
411698
411179
  const platform = getPlatform3();
@@ -411799,9 +411280,9 @@ var init_sandbox_toggle2 = __esm(() => {
411799
411280
  // src/tui/commands/stickers/stickers.ts
411800
411281
  var exports_stickers = {};
411801
411282
  __export(exports_stickers, {
411802
- call: () => call49
411283
+ call: () => call48
411803
411284
  });
411804
- async function call49() {
411285
+ async function call48() {
411805
411286
  const url = "https://www.stickermule.com/claudecode";
411806
411287
  const success = await openBrowser(url);
411807
411288
  if (success) {
@@ -411946,12 +411427,6 @@ var init_bundledSkills2 = __esm(() => {
411946
411427
  SAFE_WRITE_FLAGS2 = process.platform === "win32" ? "wx" : fsConstants8.O_WRONLY | fsConstants8.O_CREAT | fsConstants8.O_EXCL | O_NOFOLLOW3;
411947
411428
  });
411948
411429
 
411949
- // src/tui/commands/env/index.js
411950
- var env_default;
411951
- var init_env3 = __esm(() => {
411952
- env_default = { isEnabled: () => false, isHidden: true, name: "stub" };
411953
- });
411954
-
411955
411430
  // src/tui/components/WorktreeExitDialog.tsx
411956
411431
  function recordWorktreeExit() {
411957
411432
  (init_sessionStorage(), __toCommonJS(exports_sessionStorage)).saveWorktreeState(null);
@@ -412341,13 +411816,13 @@ var init_concurrentSessions2 = __esm(() => {
412341
411816
  // src/tui/commands/exit/exit.tsx
412342
411817
  var exports_exit = {};
412343
411818
  __export(exports_exit, {
412344
- call: () => call50
411819
+ call: () => call49
412345
411820
  });
412346
411821
  import { spawnSync as spawnSync5 } from "child_process";
412347
411822
  function getRandomGoodbyeMessage2() {
412348
411823
  return sample_default(GOODBYE_MESSAGES2) ?? "Goodbye!";
412349
411824
  }
412350
- async function call50(onDone) {
411825
+ async function call49(onDone) {
412351
411826
  if (feature("BG_SESSIONS") && isBgSession2()) {
412352
411827
  onDone();
412353
411828
  spawnSync5("tmux", ["detach-client"], {
@@ -412646,7 +412121,7 @@ var init_exportRenderer = __esm(() => {
412646
412121
  // src/tui/commands/export/export.tsx
412647
412122
  var exports_export = {};
412648
412123
  __export(exports_export, {
412649
- call: () => call51,
412124
+ call: () => call50,
412650
412125
  extractFirstPrompt: () => extractFirstPrompt2,
412651
412126
  sanitizeFilename: () => sanitizeFilename
412652
412127
  });
@@ -412689,7 +412164,7 @@ async function exportWithReactRenderer(context) {
412689
412164
  const tools = context.options.tools || [];
412690
412165
  return renderMessagesToPlainText(context.messages, tools);
412691
412166
  }
412692
- async function call51(onDone, context, args) {
412167
+ async function call50(onDone, context, args) {
412693
412168
  const content = await exportWithReactRenderer(context);
412694
412169
  const filename = args.trim();
412695
412170
  if (filename) {
@@ -412754,7 +412229,7 @@ function shouldInferenceConfigCommandBeImmediate() {
412754
412229
  // src/tui/commands/model/model.tsx
412755
412230
  var exports_model = {};
412756
412231
  __export(exports_model, {
412757
- call: () => call52
412232
+ call: () => call51
412758
412233
  });
412759
412234
  function ModelPickerWrapper(t0) {
412760
412235
  const $ = import_compiler_runtime237.c(17);
@@ -412930,7 +412405,7 @@ function renderModelLabel(model) {
412930
412405
  const rendered = renderDefaultModelSetting(model ?? getDefaultMainLoopModelSetting());
412931
412406
  return model === null ? `${rendered} (default)` : rendered;
412932
412407
  }
412933
- var import_compiler_runtime237, React90, jsx_dev_runtime306, call52 = async (onDone, _context, args) => {
412408
+ var import_compiler_runtime237, React90, jsx_dev_runtime306, call51 = async (onDone, _context, args) => {
412934
412409
  args = args?.trim() || "";
412935
412410
  if (COMMON_INFO_ARGS.includes(args)) {
412936
412411
  return /* @__PURE__ */ jsx_dev_runtime306.jsxDEV(ShowModelAndClose, {
@@ -412989,7 +412464,7 @@ var init_model3 = __esm(() => {
412989
412464
  // src/tui/commands/tag/tag.tsx
412990
412465
  var exports_tag = {};
412991
412466
  __export(exports_tag, {
412992
- call: () => call53
412467
+ call: () => call52
412993
412468
  });
412994
412469
  function ConfirmRemoveTag(t0) {
412995
412470
  const $ = import_compiler_runtime238.c(11);
@@ -413207,7 +412682,7 @@ Examples:
413207
412682
  React91.useEffect(t1, t2);
413208
412683
  return null;
413209
412684
  }
413210
- async function call53(onDone, _context, args) {
412685
+ async function call52(onDone, _context, args) {
413211
412686
  args = args?.trim() || "";
413212
412687
  if (COMMON_INFO_ARGS.includes(args) || COMMON_HELP_ARGS.includes(args)) {
413213
412688
  return /* @__PURE__ */ jsx_dev_runtime307.jsxDEV(ShowHelp, {
@@ -413245,62 +412720,13 @@ var init_tag2 = __esm(() => {
413245
412720
  type: "local-jsx",
413246
412721
  name: "tag",
413247
412722
  description: "Toggle a searchable tag on the current session",
413248
- isEnabled: () => false,
412723
+ isEnabled: () => true,
413249
412724
  argumentHint: "<tag-name>",
413250
412725
  load: () => Promise.resolve().then(() => (init_tag(), exports_tag))
413251
412726
  };
413252
412727
  tag_default = tag;
413253
412728
  });
413254
412729
 
413255
- // src/tui/commands/output-style/output-style.tsx
413256
- var exports_output_style = {};
413257
- __export(exports_output_style, {
413258
- call: () => call54
413259
- });
413260
- async function call54(onDone) {
413261
- onDone("/output-style has been deprecated. Use /config to change your output style, or set it in your settings file. Changes take effect on the next session.", {
413262
- display: "system"
413263
- });
413264
- }
413265
-
413266
- // src/tui/commands/output-style/index.ts
413267
- var outputStyle, output_style_default;
413268
- var init_output_style = __esm(() => {
413269
- outputStyle = {
413270
- type: "local-jsx",
413271
- name: "output-style",
413272
- description: "Deprecated: use /config to change output style",
413273
- isHidden: true,
413274
- load: () => Promise.resolve().then(() => exports_output_style)
413275
- };
413276
- output_style_default = outputStyle;
413277
- });
413278
-
413279
- // src/tui/commands/statusline.tsx
413280
- var statusline, statusline_default;
413281
- var init_statusline = __esm(() => {
413282
- init_constants6();
413283
- statusline = {
413284
- type: "prompt",
413285
- description: "Set up Atlas's status line UI with segment-based configuration",
413286
- contentLength: 0,
413287
- aliases: [],
413288
- name: "statusline",
413289
- progressMessage: "setting up statusLine",
413290
- allowedTools: [AGENT_TOOL_NAME2, "Read(~/**)", "Edit(~/.atlas/statusline.json)"],
413291
- source: "builtin",
413292
- disableNonInteractive: true,
413293
- async getPromptForCommand(args) {
413294
- const prompt = args.trim() || "Configure my status line with model, thinking level, git branch, cwd, context bar, git files, and tok/s";
413295
- return [{
413296
- type: "text",
413297
- text: `Create an ${AGENT_TOOL_NAME2} with subagent_type "statusline-setup" and the prompt "${prompt}"`
413298
- }];
413299
- }
413300
- };
413301
- statusline_default = statusline;
413302
- });
413303
-
413304
412730
  // src/tui/commands/sessionlist.tsx
413305
412731
  var sessionlist;
413306
412732
  var init_sessionlist = __esm(() => {
@@ -413328,7 +412754,7 @@ var init_sessionlist = __esm(() => {
413328
412754
  // src/tui/commands/effort/effort.tsx
413329
412755
  var exports_effort = {};
413330
412756
  __export(exports_effort, {
413331
- call: () => call55,
412757
+ call: () => call53,
413332
412758
  executeEffort: () => executeEffort,
413333
412759
  showCurrentEffort: () => showCurrentEffort
413334
412760
  });
@@ -413477,7 +412903,7 @@ function ApplyEffortAndClose(t0) {
413477
412903
  React92.useEffect(t1, t2);
413478
412904
  return null;
413479
412905
  }
413480
- async function call55(onDone, _context, args) {
412906
+ async function call53(onDone, _context, args) {
413481
412907
  args = args?.trim() || "";
413482
412908
  if (COMMON_HELP_ARGS2.includes(args)) {
413483
412909
  onDone(`Usage: /effort [low|medium|high|xhigh|max|auto]
@@ -416501,9 +415927,9 @@ var init_Stats = __esm(() => {
416501
415927
  // src/tui/commands/stats/stats.tsx
416502
415928
  var exports_stats = {};
416503
415929
  __export(exports_stats, {
416504
- call: () => call56
415930
+ call: () => call54
416505
415931
  });
416506
- var jsx_dev_runtime310, call56 = async (onDone) => {
415932
+ var jsx_dev_runtime310, call54 = async (onDone) => {
416507
415933
  return /* @__PURE__ */ jsx_dev_runtime310.jsxDEV(Stats2, {
416508
415934
  onClose: onDone
416509
415935
  }, undefined, false, undefined, this);
@@ -416525,18 +415951,6 @@ var init_stats3 = __esm(() => {
416525
415951
  stats_default = stats;
416526
415952
  });
416527
415953
 
416528
- // src/tui/commands/oauth-refresh/index.js
416529
- var oauth_refresh_default;
416530
- var init_oauth_refresh = __esm(() => {
416531
- oauth_refresh_default = { isEnabled: () => false, isHidden: true, name: "stub" };
416532
- });
416533
-
416534
- // src/tui/commands/debug-tool-call/index.js
416535
- var debug_tool_call_default;
416536
- var init_debug_tool_call = __esm(() => {
416537
- debug_tool_call_default = { isEnabled: () => false, isHidden: true, name: "stub" };
416538
- });
416539
-
416540
415954
  // src/tui/types/command.ts
416541
415955
  function getCommandName2(cmd) {
416542
415956
  return cmd.userFacingName?.() ?? cmd.name;
@@ -417267,9 +416681,9 @@ var init_useVoice = __esm(() => {
417267
416681
  // src/tui/commands/voice/voice.ts
417268
416682
  var exports_voice3 = {};
417269
416683
  __export(exports_voice3, {
417270
- call: () => call57
416684
+ call: () => call55
417271
416685
  });
417272
- var LANG_HINT_MAX_SHOWS = 2, call57 = async () => {
416686
+ var LANG_HINT_MAX_SHOWS = 2, call55 = async () => {
417273
416687
  if (!isVoiceModeEnabled()) {
417274
416688
  return {
417275
416689
  type: "text",
@@ -417436,13 +416850,6 @@ var init_workflows = __esm(() => {
417436
416850
  workflows_default = _default2;
417437
416851
  });
417438
416852
 
417439
- // src/tui/commands/torch.ts
417440
- var exports_torch = {};
417441
- __export(exports_torch, {
417442
- default: () => torch_default
417443
- });
417444
- var torch_default = null;
417445
-
417446
416853
  // src/tui/commands/peers/index.ts
417447
416854
  var exports_peers = {};
417448
416855
  __export(exports_peers, {
@@ -419606,14 +419013,10 @@ function formatDescriptionWithSource2(cmd) {
419606
419013
  }
419607
419014
  return `${cmd.description} (${getSettingSourceName(cmd.source)})`;
419608
419015
  }
419609
- var IS_ATLAS_DEV2, agentsPlatform, voiceCommand, forceSnip, workflowsCmd, torch, peersCmd, forkCmd, usageReport2, INTERNAL_ONLY_COMMANDS2, COMMANDS, builtInCommandNames3, loadAllCommands2, getSkillToolCommands2, getSlashCommandToolSkills2, REMOTE_SAFE_COMMANDS, BRIDGE_SAFE_COMMANDS;
419016
+ var IS_ATLAS_DEV2, agentsPlatform, voiceCommand, forceSnip, workflowsCmd, peersCmd, forkCmd, usageReport2, INTERNAL_ONLY_COMMANDS2, COMMANDS, builtInCommandNames3, loadAllCommands2, getSkillToolCommands2, getSlashCommandToolSkills2, REMOTE_SAFE_COMMANDS, BRIDGE_SAFE_COMMANDS;
419610
419017
  var init_commands5 = __esm(() => {
419611
419018
  init_add_dir2();
419612
- init_autofix_pr();
419613
- init_backfill_sessions();
419614
419019
  init_btw2();
419615
- init_good_atlas();
419616
- init_issue();
419617
419020
  init_feedback2();
419618
419021
  init_clear2();
419619
419022
  init_color3();
@@ -419626,7 +419029,6 @@ var init_commands5 = __esm(() => {
419626
419029
  init_context4();
419627
419030
  init_cost2();
419628
419031
  init_diff4();
419629
- init_ctx_viz();
419630
419032
  init_doctor2();
419631
419033
  init_memory3();
419632
419034
  init_help3();
@@ -419636,23 +419038,16 @@ var init_commands5 = __esm(() => {
419636
419038
  init_keybindings2();
419637
419039
  init_login2();
419638
419040
  init_logout2();
419639
- init_install_slack_app2();
419640
- init_break_cache();
419641
419041
  init_mcp7();
419642
- init_onboarding();
419643
- init_pr_comments();
419644
419042
  init_release_notes2();
419645
419043
  init_rename2();
419646
419044
  init_resume2();
419647
419045
  init_review();
419648
419046
  init_session3();
419649
- init_share();
419650
419047
  init_skills3();
419651
419048
  init_status3();
419652
419049
  init_tasks8();
419653
419050
  init_tasklist2();
419654
- init_security_review();
419655
- init_bughunter();
419656
419051
  init_terminalSetup2();
419657
419052
  init_usage4();
419658
419053
  init_theme3();
@@ -419671,8 +419066,6 @@ var init_commands5 = __esm(() => {
419671
419066
  init_rewind();
419672
419067
  init_heapdump2();
419673
419068
  init_version();
419674
- init_summary();
419675
- init_perf_issue();
419676
419069
  init_sandbox_toggle2();
419677
419070
  init_stickers2();
419678
419071
  init_log5();
@@ -419683,25 +419076,19 @@ var init_commands5 = __esm(() => {
419683
419076
  init_builtinPlugins();
419684
419077
  init_loadPluginCommands();
419685
419078
  init_memoize();
419686
- init_env3();
419687
419079
  init_exit2();
419688
419080
  init_export2();
419689
419081
  init_model3();
419690
419082
  init_tag2();
419691
- init_output_style();
419692
- init_statusline();
419693
419083
  init_sessionlist();
419694
419084
  init_effort4();
419695
419085
  init_stats3();
419696
- init_oauth_refresh();
419697
- init_debug_tool_call();
419698
419086
  init_constants5();
419699
419087
  IS_ATLAS_DEV2 = process.env.ATLAS_DEV === "1" || process.env.ATLAS_DEV === "true";
419700
419088
  agentsPlatform = IS_ATLAS_DEV2 ? __toCommonJS(exports_agents_platform).default : null;
419701
419089
  voiceCommand = feature("VOICE_MODE") ? (init_voice4(), __toCommonJS(exports_voice4)).default : null;
419702
419090
  forceSnip = feature("HISTORY_SNIP") ? (init_force_snip(), __toCommonJS(exports_force_snip)).default : null;
419703
419091
  workflowsCmd = feature("WORKFLOW_SCRIPTS") ? (init_workflows(), __toCommonJS(exports_workflows)).default : null;
419704
- torch = feature("TORCH") ? __toCommonJS(exports_torch).default : null;
419705
419092
  peersCmd = feature("UDS_INBOX") ? (init_peers(), __toCommonJS(exports_peers)).default : null;
419706
419093
  forkCmd = feature("FORK_SUBAGENT") ? (init_fork(), __toCommonJS(exports_fork)).default : null;
419707
419094
  usageReport2 = {
@@ -419719,26 +419106,12 @@ var init_commands5 = __esm(() => {
419719
419106
  }
419720
419107
  };
419721
419108
  INTERNAL_ONLY_COMMANDS2 = [
419722
- backfill_sessions_default,
419723
- break_cache_default,
419724
- bughunter_default,
419725
419109
  commit_default,
419726
419110
  commit_push_pr_default,
419727
- ctx_viz_default,
419728
- good_atlas_default,
419729
- issue_default,
419730
419111
  init_verifiers_default,
419731
419112
  ...forceSnip ? [forceSnip] : [],
419732
419113
  version_default,
419733
- onboarding_default,
419734
- share_default,
419735
- summary_default,
419736
- perf_issue_default,
419737
- env_default,
419738
- oauth_refresh_default,
419739
- debug_tool_call_default,
419740
- agentsPlatform,
419741
- autofix_pr_default
419114
+ agentsPlatform
419742
419115
  ].filter(Boolean);
419743
419116
  COMMANDS = memoize_default(() => [
419744
419117
  add_dir_default,
@@ -419764,13 +419137,10 @@ var init_commands5 = __esm(() => {
419764
419137
  ide_default,
419765
419138
  init_default3,
419766
419139
  keybindings_default,
419767
- install_slack_app_default,
419768
419140
  mcp_default,
419769
419141
  memory_default,
419770
419142
  model_default,
419771
- output_style_default,
419772
419143
  plugin_default,
419773
- pr_comments_default,
419774
419144
  release_notes_default,
419775
419145
  reload_plugins_default,
419776
419146
  rename_default,
@@ -419779,7 +419149,6 @@ var init_commands5 = __esm(() => {
419779
419149
  skills_default,
419780
419150
  stats_default,
419781
419151
  status_default,
419782
- statusline_default,
419783
419152
  sessionlist,
419784
419153
  stickers_default,
419785
419154
  tag_default,
@@ -419787,7 +419156,6 @@ var init_commands5 = __esm(() => {
419787
419156
  feedback_default,
419788
419157
  review_default,
419789
419158
  rewind_default,
419790
- security_review_default,
419791
419159
  terminalSetup_default,
419792
419160
  usage_default,
419793
419161
  usageReport2,
@@ -419806,7 +419174,6 @@ var init_commands5 = __esm(() => {
419806
419174
  tasks_default,
419807
419175
  tasklist_default,
419808
419176
  ...workflowsCmd ? [workflowsCmd] : [],
419809
- ...torch ? [torch] : [],
419810
419177
  ...IS_ATLAS_DEV2 && !process.env.IS_DEMO ? INTERNAL_ONLY_COMMANDS2 : []
419811
419178
  ]);
419812
419179
  builtInCommandNames3 = memoize_default(() => new Set(COMMANDS().flatMap((_) => [_.name, ..._.aliases ?? []])));
@@ -419859,7 +419226,6 @@ var init_commands5 = __esm(() => {
419859
419226
  feedback_default,
419860
419227
  plan_default,
419861
419228
  keybindings_default,
419862
- statusline_default,
419863
419229
  sessionlist,
419864
419230
  stickers_default
419865
419231
  ]);
@@ -419867,7 +419233,6 @@ var init_commands5 = __esm(() => {
419867
419233
  compact_default,
419868
419234
  clear_default,
419869
419235
  cost_default,
419870
- summary_default,
419871
419236
  release_notes_default,
419872
419237
  files_default
419873
419238
  ].filter((c) => c !== null));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlasharness/atlascode",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "description": "AtlasCode — Coding Agent for the domestic computing ecosystem (Ascend NPU + domestic LLM backends)",
5
5
  "bin": {
6
6
  "atlas": "dist/cli.js",