atris 3.15.13 → 3.15.22

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 (93) hide show
  1. package/AGENTS.md +84 -8
  2. package/README.md +5 -1
  3. package/atris/AGENTS.md +46 -1
  4. package/atris/CLAUDE.md +36 -1
  5. package/atris/GEMINI.md +14 -1
  6. package/atris/atris.md +12 -1
  7. package/atris/atrisDev.md +3 -2
  8. package/atris/context/README.md +11 -0
  9. package/atris/features/company-brain-sync/validate.md +5 -5
  10. package/atris/learnings.jsonl +1 -0
  11. package/atris/policies/atris-design.md +2 -0
  12. package/atris/skills/aeo/SKILL.md +2 -2
  13. package/atris/skills/atris/SKILL.md +15 -62
  14. package/atris/skills/design/SKILL.md +2 -0
  15. package/atris/skills/imessage/SKILL.md +19 -2
  16. package/atris/skills/loop/SKILL.md +6 -5
  17. package/atris/skills/magic-inbox/SKILL.md +1 -1
  18. package/atris/team/_template/MEMBER.md +23 -1
  19. package/atris/team/brainstormer/START_HERE.md +6 -0
  20. package/atris/team/executor/MEMBER.md +13 -0
  21. package/atris/team/executor/START_HERE.md +6 -0
  22. package/atris/team/launcher/START_HERE.md +6 -0
  23. package/atris/team/mission-lead/MEMBER.md +39 -0
  24. package/atris/team/mission-lead/MISSION.md +33 -0
  25. package/atris/team/mission-lead/START_HERE.md +6 -0
  26. package/atris/team/navigator/MEMBER.md +11 -0
  27. package/atris/team/navigator/START_HERE.md +6 -0
  28. package/atris/team/opus-overnight/MEMBER.md +39 -0
  29. package/atris/team/opus-overnight/MISSION.md +61 -0
  30. package/atris/team/opus-overnight/START_HERE.md +6 -0
  31. package/atris/team/opus-overnight/STEERING.md +35 -0
  32. package/atris/team/researcher/START_HERE.md +6 -0
  33. package/atris/team/validator/MEMBER.md +26 -6
  34. package/atris/team/validator/START_HERE.md +6 -0
  35. package/atris/wiki/concepts/agent-activation-contract.md +79 -0
  36. package/atris/wiki/concepts/workspace-initialization-contract.md +73 -0
  37. package/atris/wiki/index.md +27 -0
  38. package/atris/wiki/sources/atris-labs-2026-05-10.txt +17 -0
  39. package/atris/wiki/sources/atris-labs-goals-2026-05-10.txt +15 -0
  40. package/atris/wiki/sources/atrisos-generative-ui-product-surface-2026-05-10.txt +10 -0
  41. package/atris/wiki/sources/jack-dorsey-2026-05-10.txt +12 -0
  42. package/atris.md +49 -13
  43. package/bin/atris.js +660 -22
  44. package/commands/activate.js +12 -3
  45. package/commands/aeo.js +1 -1
  46. package/commands/align.js +10 -10
  47. package/commands/analytics.js +9 -4
  48. package/commands/app.js +2 -0
  49. package/commands/apps.js +276 -0
  50. package/commands/auth.js +1 -1
  51. package/commands/autopilot.js +74 -5
  52. package/commands/brain.js +536 -61
  53. package/commands/brainstorm.js +12 -12
  54. package/commands/business-sync.js +142 -24
  55. package/commands/clean.js +9 -6
  56. package/commands/codex-goal.js +311 -0
  57. package/commands/errors.js +11 -1
  58. package/commands/feedback.js +55 -17
  59. package/commands/fork.js +2 -2
  60. package/commands/gm.js +376 -0
  61. package/commands/init.js +80 -3
  62. package/commands/integrations.js +524 -0
  63. package/commands/learn.js +25 -16
  64. package/commands/lesson.js +41 -0
  65. package/commands/lifecycle.js +2 -2
  66. package/commands/member.js +2416 -9
  67. package/commands/mission.js +1776 -0
  68. package/commands/now.js +48 -7
  69. package/commands/play.js +425 -0
  70. package/commands/publish.js +2 -1
  71. package/commands/pull.js +72 -29
  72. package/commands/push.js +199 -17
  73. package/commands/review.js +51 -13
  74. package/commands/skill.js +2 -2
  75. package/commands/soul.js +19 -13
  76. package/commands/status.js +6 -1
  77. package/commands/sync.js +5 -4
  78. package/commands/task.js +1041 -147
  79. package/commands/terminal.js +5 -5
  80. package/commands/verify.js +7 -5
  81. package/commands/visualize.js +7 -0
  82. package/commands/wiki.js +53 -16
  83. package/commands/workflow.js +298 -54
  84. package/commands/workspace-clean.js +1 -1
  85. package/commands/worktree.js +468 -0
  86. package/commands/xp.js +1608 -0
  87. package/lib/manifest.js +34 -4
  88. package/lib/scorecard.js +3 -2
  89. package/lib/task-db.js +408 -27
  90. package/lib/todo-fallback.js +28 -2
  91. package/lib/todo.js +5 -3
  92. package/package.json +23 -2
  93. package/utils/update-check.js +51 -1
package/lib/manifest.js CHANGED
@@ -52,7 +52,7 @@ function buildManifest(files, commitHash, metadata = {}) {
52
52
  last_sync: new Date().toISOString(),
53
53
  last_commit: commitHash || null,
54
54
  workspace_root: metadata.workspaceRoot || null,
55
- files,
55
+ files: filterSyncFiles(files),
56
56
  };
57
57
  }
58
58
 
@@ -62,11 +62,33 @@ function buildManifest(files, commitHash, metadata = {}) {
62
62
  */
63
63
  const SKIP_DIRS = new Set([
64
64
  'node_modules', '__pycache__', '.git', 'venv', '.venv',
65
- 'lost+found', '.cache', '.atris',
65
+ 'lost+found', '.cache', '.atris', '.claude', '.cursor', '.next',
66
+ '.vscode', 'dist', 'build', 'coverage', 'tmp', 'temp',
66
67
  // Defense-in-depth: macOS/system dirs that should never be scanned as
67
68
  // part of any atris workspace, even if outputDir is accidentally wide.
68
69
  'Library', 'Applications', 'System',
69
70
  ]);
71
+ const SYNC_ALLOWED_DOT_DIRS = new Set(['.github']);
72
+
73
+ function isIgnoredSyncPath(filePath) {
74
+ const parts = String(filePath || '').replace(/\\/g, '/').split('/').filter(Boolean);
75
+ return parts.some((part, index) => {
76
+ if (SKIP_DIRS.has(part)) return true;
77
+ return index < parts.length - 1 && part.startsWith('.') && !SYNC_ALLOWED_DOT_DIRS.has(part);
78
+ });
79
+ }
80
+
81
+ function filterSyncFiles(files = {}) {
82
+ return Object.fromEntries(
83
+ Object.entries(files || {}).filter(([filePath]) => !isIgnoredSyncPath(filePath))
84
+ );
85
+ }
86
+
87
+ function isSyncTextBuffer(buffer) {
88
+ if (!Buffer.isBuffer(buffer)) return false;
89
+ if (buffer.includes(0)) return false;
90
+ return Buffer.from(buffer.toString('utf8'), 'utf8').equals(buffer);
91
+ }
70
92
 
71
93
  function computeLocalHashes(localDir) {
72
94
  const files = {};
@@ -79,17 +101,19 @@ function computeLocalHashes(localDir) {
79
101
  return;
80
102
  }
81
103
  for (const entry of entries) {
82
- if (entry.name.startsWith('.')) continue;
83
104
  const fullPath = path.join(dir, entry.name);
84
105
  const relFromRoot = path.relative(localDir, fullPath);
85
106
  if (entry.isDirectory()) {
86
107
  if (SKIP_DIRS.has(entry.name)) continue;
108
+ if (entry.name.startsWith('.') && !SYNC_ALLOWED_DOT_DIRS.has(entry.name)) continue;
87
109
  walk(fullPath);
88
110
  } else if (entry.isFile()) {
111
+ if (entry.name.startsWith('.')) continue;
89
112
  const relPath = '/' + path.relative(localDir, fullPath);
90
113
  try {
91
114
  // Hash raw bytes to match warm runner's _hash_bytes(data)
92
115
  const rawBytes = fs.readFileSync(fullPath);
116
+ if (!isSyncTextBuffer(rawBytes)) continue;
93
117
  const hash = crypto.createHash('sha256').update(rawBytes).digest('hex');
94
118
  files[relPath] = { hash, size: rawBytes.length };
95
119
  } catch {
@@ -114,6 +138,9 @@ function computeLocalHashes(localDir) {
114
138
  * Each array contains file path strings.
115
139
  */
116
140
  function threeWayCompare(localFiles, remoteFiles, manifest) {
141
+ localFiles = filterSyncFiles(localFiles);
142
+ remoteFiles = filterSyncFiles(remoteFiles);
143
+
117
144
  const result = {
118
145
  toPull: [],
119
146
  toPush: [],
@@ -147,7 +174,7 @@ function threeWayCompare(localFiles, remoteFiles, manifest) {
147
174
  return result;
148
175
  }
149
176
 
150
- const base = manifest.files;
177
+ const base = filterSyncFiles(manifest.files);
151
178
  const allPaths = new Set([
152
179
  ...Object.keys(localFiles),
153
180
  ...Object.keys(remoteFiles),
@@ -226,4 +253,7 @@ module.exports = {
226
253
  threeWayCompare,
227
254
  getManifestPath,
228
255
  SKIP_DIRS,
256
+ isIgnoredSyncPath,
257
+ filterSyncFiles,
258
+ isSyncTextBuffer,
229
259
  };
package/lib/scorecard.js CHANGED
@@ -280,9 +280,10 @@ function detectEndgameCompletion(atrisDir) {
280
280
 
281
281
  const slug = endgameSectionMatch[1];
282
282
 
283
- // Check if there are any endgame-tagged tasks in backlog or in-progress
283
+ // Check if there are any endgame-tagged tasks still before acceptance.
284
284
  const hasActiveEndgame = todo.backlog.some(t => t.tag === 'endgame')
285
- || todo.inProgress.some(t => t.tag === 'endgame');
285
+ || todo.inProgress.some(t => t.tag === 'endgame')
286
+ || (todo.review || []).some(t => t.tag === 'endgame');
286
287
 
287
288
  return {
288
289
  complete: !hasActiveEndgame,