atris 3.80.0 → 3.82.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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/atris/atris.md +14 -0
  4. package/atris/features/README.md +15 -0
  5. package/atris/policies/README.md +24 -0
  6. package/atris/skills/README.md +61 -45
  7. package/atris/skills/design/SKILL.md +6 -5
  8. package/atris/skills/taste/SKILL.md +39 -0
  9. package/atris/skills/taste/notes.md +29 -0
  10. package/atris/skills/taste/principles.md +23 -0
  11. package/atris/skills/wiki/SKILL.md +14 -2
  12. package/atris/skills/wiki/index-lines.md +30 -0
  13. package/atris/skills/wiki/measure.md +20 -0
  14. package/atris/skills/wiki/note-shape.md +16 -0
  15. package/atris/skills/wiki/upkeep.md +16 -0
  16. package/atris/team/README.md +38 -0
  17. package/atris.md +14 -0
  18. package/bin/atris.js +1 -1
  19. package/commands/activate.js +1 -1
  20. package/commands/auth.js +2 -2
  21. package/commands/autoland.js +25 -26
  22. package/commands/autopilot-front.js +46 -1
  23. package/commands/autopilot.js +55 -25
  24. package/commands/clean.js +22 -11
  25. package/commands/computer.js +166 -2413
  26. package/commands/doc-health.js +48 -1
  27. package/commands/improve.js +16 -3
  28. package/commands/init.js +4 -0
  29. package/commands/integrations.js +69 -1616
  30. package/commands/mission.js +109 -13
  31. package/commands/release.js +41 -10
  32. package/commands/security-review.js +5 -1
  33. package/commands/site-deploy.js +5 -1
  34. package/commands/status.js +1 -1
  35. package/commands/sync.js +12 -8
  36. package/commands/task.js +144 -118
  37. package/commands/unknowns.js +9 -5
  38. package/commands/visualize.js +1 -12
  39. package/commands/workflow.js +4 -3
  40. package/commands/worktree.js +68 -1602
  41. package/commands/xp.js +23 -2113
  42. package/commands/youtube.js +192 -3110
  43. package/lib/business-core.js +3 -4
  44. package/lib/campaign-run-lock.js +12 -1
  45. package/lib/computer-core.js +2447 -0
  46. package/lib/engine-ask.js +1 -1
  47. package/lib/engine-receipt-sweep.js +64 -0
  48. package/lib/file-lock.js +175 -0
  49. package/lib/fleet.js +1 -1
  50. package/lib/integrations-core.js +1695 -0
  51. package/lib/json-file.js +22 -1
  52. package/lib/loop-doctor.js +36 -2
  53. package/lib/map-refs.js +68 -8
  54. package/lib/member-engine.js +1 -1
  55. package/lib/member-map-fold.js +49 -11
  56. package/lib/member-map-inbox.js +2 -1
  57. package/lib/mission-core.js +9 -2
  58. package/lib/recall-exam.js +171 -0
  59. package/lib/roster-markdown.js +2 -2
  60. package/lib/runner-command.js +5 -5
  61. package/lib/security-audit-classes.js +20 -2
  62. package/lib/security-audit.js +31 -1
  63. package/lib/task-db.js +105 -37
  64. package/lib/taste-notes.js +35 -0
  65. package/lib/team-lineup.js +3 -3
  66. package/lib/todo.js +2 -0
  67. package/lib/wiki.js +11 -3
  68. package/lib/worktree-core.js +1517 -0
  69. package/lib/xp-core.js +2172 -0
  70. package/lib/youtube-core.js +3178 -0
  71. package/lib/zen-apply.js +3 -1
  72. package/package.json +10 -3
  73. package/utils/auth.js +18 -4
package/lib/zen-apply.js CHANGED
@@ -11,6 +11,7 @@ const os = require('node:os');
11
11
  const path = require('node:path');
12
12
  const { spawnSync } = require('node:child_process');
13
13
  const { runGit } = require('./checkout-sync');
14
+ const { MAP_NOTES_DIR } = require('./map-refs');
14
15
  const {
15
16
  branchMovedSince,
16
17
  checkZen,
@@ -312,11 +313,12 @@ function applyNotes(root, patchFile, files) {
312
313
 
313
314
  // The map files whose code links `atris clean` re-points on every zen run.
314
315
  const MAP_FILES = new Set(['atris/MAP.md', 'atris/refs/MAP-NOTES.md']);
316
+ const isMapFile = (p) => MAP_FILES.has(p) || (p.startsWith(`${MAP_NOTES_DIR}/`) && p.endsWith('.md'));
315
317
 
316
318
  // A map edit that only moved `file:line` numbers is the link fixer's own work
317
319
  // from an earlier run, and the workspace step redoes it, so it is not news.
318
320
  function lineRefsOnly(root, from, p, mine) {
319
- if (!MAP_FILES.has(p) || !fs.existsSync(mine)) return false;
321
+ if (!isMapFile(p) || !fs.existsSync(mine)) return false;
320
322
  const was = runGit(['show', `${from}:${p}`], root);
321
323
  if (was.status !== 0) return false;
322
324
  const bare = (text) => String(text).replace(/([\w./-]+\.[A-Za-z]+):\d+(?:-\d+)?/g, '$1:#');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "atris",
3
- "version": "3.80.0",
4
- "description": "you say what you want in plain words. atris builds it, checks it, and shows you proof.",
3
+ "version": "3.82.1",
4
+ "description": "you say what you want in plain words. atris builds it, checks it, and shows you proof. project memory your coding agents share across sessions.",
5
5
  "mcpName": "io.github.atrislabs/atris",
6
6
  "main": "bin/atris.js",
7
7
  "bin": {
@@ -91,7 +91,14 @@
91
91
  "developer-tools",
92
92
  "cli",
93
93
  "codebase-navigation",
94
- "ai-agents"
94
+ "ai-agents",
95
+ "agent-memory",
96
+ "ai-memory",
97
+ "llm-memory",
98
+ "project-memory",
99
+ "context-graph",
100
+ "knowledge-graph",
101
+ "memory"
95
102
  ],
96
103
  "author": "Keshav Rao (atrislabs)",
97
104
  "license": "MIT",
package/utils/auth.js CHANGED
@@ -40,9 +40,11 @@ let inputIndex = 0;
40
40
  /**
41
41
  * Prompt the user for input, handling both TTY and piped input.
42
42
  * @param {string} question - Prompt text to display
43
+ * @param {{secret?: boolean}} [opts] - secret: never print the answer back
43
44
  * @returns {Promise<string>} User's input
44
45
  */
45
- function promptUser(question) {
46
+ function promptUser(question, opts = {}) {
47
+ const shown = (answer) => (opts.secret ? '' : answer);
46
48
  // If stdin is not a TTY (piped input), read all lines upfront
47
49
  if (!process.stdin.isTTY && inputLines.length === 0 && !sharedRl) {
48
50
  return new Promise((resolve) => {
@@ -57,7 +59,7 @@ function promptUser(question) {
57
59
  inputLines = data.trim().split('\n');
58
60
  process.stdout.write(question);
59
61
  const answer = inputLines[inputIndex++] || '';
60
- console.log(answer);
62
+ console.log(shown(answer));
61
63
  resolve(answer.trim());
62
64
  });
63
65
  process.stdin.resume();
@@ -69,22 +71,34 @@ function promptUser(question) {
69
71
  return new Promise((resolve) => {
70
72
  process.stdout.write(question);
71
73
  const answer = inputLines[inputIndex++] || '';
72
- console.log(answer);
74
+ console.log(shown(answer));
73
75
  resolve(answer.trim());
74
76
  });
75
77
  }
76
78
 
77
79
  // Interactive TTY mode - create readline per prompt
80
+ // A secret typed at a terminal must stay hidden even when stdout is a file:
81
+ // terminal mode turns off the terminal's own echo, and the prompt goes to
82
+ // whichever stream is still the screen.
83
+ const secretOut = opts.secret && !process.stdout.isTTY && process.stderr.isTTY ? process.stderr : process.stdout;
78
84
  const rl = readline.createInterface({
79
85
  input: process.stdin,
80
- output: process.stdout
86
+ output: secretOut,
87
+ ...(opts.secret ? { terminal: Boolean(process.stdin.isTTY) } : {}),
81
88
  });
82
89
 
90
+ // Secret answers: let the prompt through, then swallow the typed echo.
91
+ let muted = false;
92
+ if (opts.secret) {
93
+ rl._writeToOutput = (text) => { if (!muted) rl.output.write(text); };
94
+ }
83
95
  return new Promise((resolve) => {
84
96
  rl.question(question, (answer) => {
97
+ if (muted) rl.output.write('\n');
85
98
  rl.close();
86
99
  resolve(answer.trim());
87
100
  });
101
+ muted = Boolean(opts.secret);
88
102
  });
89
103
  }
90
104