uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
ToCode
1 419
at TracingChannel.traceSync (node:diagnostics_channel:328:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:245:24)
    at Module.require (node:internal/modules/cjs/loader:1547:12)
    at require (node:internal/modules/helpers:152:16)
    at test2.js:5:17
    at embedderRunCjs (node:internal/main/embedding:89:10) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/Users/ynonp/tmp/blog/node-sea/sea' ]
}

Node.js v25.5.0
ืฉื™ืœื•ื‘ ืงื‘ืฆื™ื ืžื•ื˜ืžืขื™ื ื“ืจืš ื ื•ืกืคืช ืœืฉืœื‘ ืงื‘ืฆื™ื ื—ื™ืฆื•ื ื™ื™ื ื”ื™ื ื‘ืืžืฆืขื•ืช Assets. ืืกื˜ื™ื ื™ื•ื˜ืžืขื• ื‘ืชื•ืš ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™ ืœื™ื“ ื”ืกืงืจื™ืคื˜ ื•ื™ื”ื™ื• ื–ืžื™ื ื™ื ืœืชื•ื›ื ื™ืช ืฉืœื ื• ื‘ื–ืžืŸ ืจื™ืฆื”. ืืคืฉืจ ืœื”ื˜ืžื™ืข ื‘ื™ื ืืจื™ื ืื—ืจื™ื ื›ืžื• ืชืžื•ื ื•ืช ื•ืืคืฉืจ ื’ื ืœื”ื˜ืžื™ืข ืงื‘ืฆื™ ืงื•ื“. ื‘ื•ืื• ื ื ืกื” ืืช ื–ื” ืขื ื”ืงื•ื‘ืฅ utils.js ืžื”ื“ื•ื’ืžื” ื”ืงื•ื“ืžืช. ืื ื™ ืžืขื“ื›ืŸ ืืช ืงื•ื‘ืฅ ื”ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื›ื“ื™ ืœื›ืœื•ืœ ืืช ื”ืงื•ื‘ืฅ ื‘ืชื•ืจ ืงื•ื‘ืฅ ืžื•ื˜ืžืข:
{
  "main": "test3.js",
  "executable": "/Users/ynonp/.nvm/versions/node/v25.5.0/bin/node",
  "disableExperimentalSEAWarning": true,
  "output": "sea",
  "assets": {
    "utils": "./utils.js"
  }
} 
ืื ื™ ื ื™ื’ืฉ ืœืงื‘ืฆื™ื ื”ืžื•ื˜ืžืขื™ื ื“ืจืš ืคื•ื ืงืฆื™ื” ื‘ืฉื sea.getAsset. ื”ืงื•ื“ ื”ื‘ื ื™ื•ื“ืข ืœื˜ืขื•ืŸ ืžื•ื“ื•ืœ ืžืชื•ืš ืงื•ื‘ืฅ ืžื•ื˜ืžืข ื‘ืืžืฆืขื•ืช ืคื•ื ืงืฆื™ื™ืช requireFromString ืฉืžืฉืชืžืฉืช ื‘ API ื”ืœื ืžืชื•ืขื“ module.prototype._compile:
const sea = require('node:sea');
const utilsSource = sea.getAsset('utils', 'utf8');

function requireFromString(src, filename) {
  var m = new module.constructor();
  m.paths = module.paths;
  m._compile(src, filename);
  return m.exports;
}

const {twice} = requireFromString(utilsSource, 'utils.js');

const user = process.env["USER"];
console.log(\Hello ${user}. 2 * 2 = ${twice(2)}\);
ืงื™ืžืคื•ืœ ื•ื”ืคืขืœื” ืฉืœ ื”ืชื•ื›ื ื™ืช ื”ืื—ืจื•ื ื” ืœืžืจื‘ื” ื”ื”ืคืชืขื” ืขื•ื‘ื“ ื•ื ื•ืชืŸ ืœื™ ืœื”ืคืขื™ืœ ืืช ื”ืคื•ื ืงืฆื™ื” twice ื’ื ืื ืื ื™ ืžื–ื™ื– ืืช ืงื•ื‘ืฅ ื”ื‘ื™ื ืืจื™ ืฉื ื•ืฆืจ ืœืžืงื•ื ืื—ืจ. ืกืš ื”ื›ืœ ืืคืœื™ืงืฆื™ื•ืช ืงื•ื‘ืฅ ื™ื—ื™ื“ ื–ื” ืจืขื™ื•ืŸ ืžื“ืœื™ืง ื•ื™ื›ื•ืœ ืœื—ืกื•ืš ื”ืชืงื ื” ืฉืœ node ืื• ืฉืœ ื’ืจืกื” ืจืœื•ื•ื ื˜ื™ืช ืฉืœ node ืขืœ ืžื›ื•ื ื” ืฉืœ ืœืงื•ื—. ืœื“ืขืชื™ ื›ืœ ืขื•ื“ ื”ืžื™ืžื•ืฉ ื”ื•ื ื”ื˜ืžืขื” ืฉืœ ืกืงืจื™ืคื˜ ื‘ืชื•ืš ื”ื‘ื™ื ืืจื™ ืฉืœ node ื›ืœื•ืžืจ ืฉื”ื’ื•ื“ืœ ืฉืœ ื”ืงื•ื‘ืฅ ื™ื•ืฆื ืžืขืœ 100 ืžื’ื”, ื•ื›ืœ ืขื•ื“ ืื™ืŸ ื“ืจืš ืงืœื” ืœื”ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœื™ื ืฆื“-ืฉืœื™ืฉื™ ืื ืฉื™ื ืœื ื™ืžื”ืจื• ืœื”ืฉืชืžืฉ ื‘ื–ื”.

ToCode
1 419
ื›ื–ื” ื ื™ืกื™ืชื™: ืคื™ืชื•ื— ืืคืœื™ืงืฆื™ื™ืช ืงื•ื‘ืฅ ื‘ื•ื“ื“ ืขื node 25 ื’ืจืกื” 25 ืฉืœ node.js ื”ื•ืกื™ืคื” ืคื™ืฆ'ืจ ื›ื™ืคื™ ืœืื ืฉื™ื ืฉื›ื•ืชื‘ื™ื ื›ืœื™ ืฉื•ืจืช ืคืงื•ื“ื” ืฉื ืงืจื Single Executable Application. ื‘ืงืฆืจื” ื”ื•ื ืžืืคืฉืจ ืœื”ื˜ืžื™ืข ืชื•ื›ื ื™ืช node ื‘ืชื•ืš ืงื•ื‘ืฅ ื”ื”ืคืขืœื” ืฉืœ node.js ืขืฆืžื• ื•ืื– ืœื”ืคื™ืฅ ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื‘ืชื•ืจ ืืคืœื™ืงืฆื™ื™ืช ืงื•ื‘ืฅ ื™ื—ื™ื“, ื›ืœื•ืžืจ ืœืงื•ื— ืžืงื‘ืœ ืงื•ื‘ืฅ ื”ืคืขืœื” ืื—ื“ ืฉืื™ืš ืฉืžืคืขื™ืœื™ื ืื•ืชื• ืžื‘ืฆืข ืืช ื”ืงื•ื“ ื‘ืกืงืจื™ืคื˜ ืฉื”ื•ื˜ืžืข. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื“ืจืš 3 ื“ื•ื’ืžืื•ืช. ืืคืœื™ืงืฆื™ื™ืช ืฉืœื•ื ืขื•ืœื ืืคืœื™ืงืฆื™ื•ืช ืงื•ื‘ืฅ ื™ื—ื™ื“ ื ื›ืชื‘ื•ืช ืจืง ื‘ CommonJS (ืื ื™ ืžืงื•ื•ื” ืฉืœื ืฉื›ื—ืชื ื›ื‘ืจ ืฉื–ื” ืงื™ื™ื. ื‘ื›ืœ ืžืงืจื” ื–ื” ื”ื›ืชื™ื‘ ืขื ื” require ื”ืื•ืคื™ื™ื ื™ ืœ node ื‘ืžืงื•ื ื›ืชื™ื‘ ื” import) ื•ื“ื•ืจืฉื•ืช ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืขื ืกื™ื•ืžืช json ืฉืžื›ื™ืœ ืืช ื”ืคืจื˜ื™ื ื”ื‘ืื™ื:
{
  "main": "/path/to/bundled/script.js",
  "executable": "/path/to/node/binary", // Optional, if not specified, uses the current Node.js binary
  "output": "/path/to/write/the/generated/executable",
  "disableExperimentalSEAWarning": true, // Default: false
  "useSnapshot": false,  // Default: false
  "useCodeCache": true, // Default: false
  "execArgv": ["--no-warnings", "--max-old-space-size=4096"], // Optional
  "execArgvExtension": "env", // Default: "env", options: "none", "env", "cli"
  "assets": {  // Optional
    "a.dat": "/path/to/a.dat",
    "b.txt": "/path/to/b.txt"
  }
} 
ื‘ืฉื‘ื™ืœ ื”ื ื™ืกื•ื™ ืื ื™ ื™ื•ืฆืจ ืงื•ื‘ืฅ ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ื‘ืฉื sea-config.json ืขื ื”ืชื•ื›ืŸ ื”ืžื™ื ื™ืžืœื™ ื”ื‘ื:
{
  "main": "test1.js",
  "executable": "/Users/ynonp/.nvm/versions/node/v25.5.0/bin/node",
  "disableExperimentalSEAWarning": true,
  "output": "sea",
} 
ื•ืงื•ื‘ืฅ test1.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
console.log('hello world');
ืžืคืขื™ืœ ืžืฉื•ืจืช ื”ืคืงื•ื“ื” ืืช ื”ืคืงื•ื“ื•ืช ื”ื‘ืื•ืช ืœืคื™ ื”ื”ื•ืจืื•ืช ื‘ืชื™ืขื•ื“:
$ node --build-sea sea-config.json
$ codesign --sign - sea
ื•ื™ืฉ ืœื™ ืงื•ื‘ืฅ ื”ืคืขืœื” ื‘ืฉื sea ืฉืžื›ื™ืœ ืืช node.js ื•ืืช ื”ืกืงืจื™ืคื˜. ืืคืฉืจ ืœื”ืคืขื™ืœ ืื•ืชื• ื•ืœืจืื•ืช ืืช ื”ืชื•ืฆืื”:
$ ./sea
hello world
ื–ืืช ื›ื ืจืื” ืชื•ื›ื ื™ืช ื” hello world ื”ื›ื‘ื“ื” ื‘ืขื•ืœื ื›ื™ ื”ืงื•ื‘ืฅ ืฉื•ืงืœ 125 ืžื’ื”, ืื‘ืœ ื–ื” ื‘ืจื•ืจ ื›ื™ ื”ื•ื ืžื’ื™ืข ืขื ื›ืœ ื”ืงื•ื“ ืฉืœ node.js ืขืฆืžื•. ื˜ืขื™ื ืช ืงื•ื‘ืฅ ื—ื™ืฆื•ื ื™ ื‘ื“ื•ื’ืžื” ื”ืฉื ื™ื” ืจืฆื™ืชื™ ืœืจืื•ืช ืื™ืš ืœืขื‘ื•ื“ ืขื ืงื•ื‘ืฅ ื—ื™ืฆื•ื ื™. ื™ืฆืจืชื™ ืงื•ื‘ืฅ ื‘ืฉื utils.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
function twice(x) {
  return x * 2;
}

module.exports = {
  twice
}
ื•ืงื•ื‘ืฅ ื‘ืฉื test2.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
const process = require('node:process');
const {twice} = require('./utils.js');

const user = process.env["USER"];
console.log(\Hello ${user}. 2 * 2 = ${twice(2)}\);
ืขื“ื›ื ืชื™ ืืช ืฉื ืงื•ื‘ืฅ ื”ืžืงื•ืจ ื‘ืงื•ื ืคื™ื’ื•ืจืฆื™ื” ืœ test2.js ื•ื‘ื ื™ืชื™ ืœืคื™ ื”ื”ื•ืจืื•ืช. ื”ืชื•ืฆืื” ื”ืคืขื ืคื—ื•ืช ืžื•ืฆืœื—ืช:
$ ./sea
node:internal/main/embedding:113
    throw new ERR_UNKNOWN_BUILTIN_MODULE(id);
    ^

Error [ERR_UNKNOWN_BUILTIN_MODULE]: No such built-in module: ./utils.js
    at embedderRequire (node:internal/main/embedding:113:11)
    at test2.js:2:15
    at embedderRunCjs (node:internal/main/embedding:89:10) {
  code: 'ERR_UNKNOWN_BUILTIN_MODULE'
}

Node.js v25.5.0
ืคืงื•ื“ื•ืช require ื‘ืชื•ืš single executable application ื™ื•ื“ืขื•ืช ืœืขื‘ื•ื“ ืจืง ืขื ืžื•ื“ื•ืœื™ื ืžื•ื‘ื ื™ื ื‘ node ื•ืœื ืขื ืงื‘ืฆื™ื ื—ื™ืฆื•ื ื™ื™ื. ื‘ืฉื‘ื™ืœ ืœื˜ืขื•ืŸ ืงื•ื‘ืฅ ื—ื™ืฆื•ื ื™ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืฉื™ื ืื•ืชื• ืขืœ ื”ืžื›ื•ื ื” ื‘ื” ื ืคืขื™ืœ ืืช ื”ืืคืœื™ืงืฆื™ื” (ื›ืœื•ืžืจ ื–ื• ื›ื‘ืจ ืชื”ื™ื” ืืคืœื™ืงืฆื™ื™ืช ืฉื ื™ ืงื‘ืฆื™ื) ื•ืœืขื“ื›ืŸ ืืช ื”ืงื•ื“ ืฉืœ test2.js:
const process = require('node:process');
const { createRequire } = require('node:module');
require = createRequire(__filename);

const {twice} = require('./utils.js');

const user = process.env["USER"];
console.log(\Hello ${user}. 2 * 2 = ${twice(2)}\);
ื•ื–ื” ืขื•ื‘ื“ ื›ืœ ืขื•ื“ ื”ืงื•ื‘ืฅ utils.js ื ืžืฆื ื‘ืื•ืชื” ืชื™ืงื™ื” ืžืžื ื” ืื ื™ ืžืคืขื™ืœ ืืช ื”ืงื•ื“. ืื ืื ื™ ืžื•ื—ืง ืืช ื”ืžื•ื“ื•ืœ ืื• ืžื–ื™ื– ืืช sea ืœืชื™ืงื™ื” ืื—ืจืช ืื ื™ ืžืงื‘ืœ ืืช ื”ืฉื’ื™ืื”:
$ ./sea
node:internal/modules/cjs/loader:1450
  throw err;
  ^

Error: Cannot find module './utils.js'
Require stack:
- /Users/ynonp/tmp/blog/node-sea/sea
    at Module._resolveFilename (node:internal/modules/cjs/loader:1447:15)
    at defaultResolveImpl (node:internal/modules/cjs/loader:1058:19)
    at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1063:22)
    at Module._load (node:internal/modules/cjs/loader:1233:25)

ToCode
1 419
ื”ื˜ืจื™ืง ืขื ื”ืขืจื›ื•ืช ื–ืžื ื™ื ื›ืฉื™ืฉ ื™ื•ืชืจ ืžื“ื™ ื–ืžืŸ ืื ื—ื ื• ืžื‘ื–ื‘ื–ื™ื ืื•ืชื•. ืžืคืชื— ืฉื™ื›ื•ืœ ืœื‘ื ื•ืช ืคื™ืฆ'ืจ ื‘ืฉื‘ื•ืข ื•ืžืงื‘ืœ ื—ื•ื“ืฉื™ื™ื ื›ื“ื™ ืœืคืชื— ืืช ื–ื” ื™ืขื‘ื•ื“ ื™ื•ืชืจ ืœืื˜ (ื’ื ืื ืœื ื‘ืžื•ื“ืข) ื•ื™ืขืฉื” ืขื‘ื•ื“ื” ืžื™ื•ืชืจืช. ืžืจืฆื” ืฉืชื›ื ืŸ ืœืœืžื“ ื—ื•ืžืจ ืฉืœ ืฉืขื” ื‘-8 ืฉืขื•ืช ื™ืžืฆื ืืช ืขืฆืžื• ื—ื•ื–ืจ ืขืœ ืื•ืชืŸ ื“ื•ื’ืžืื•ืช ื•ื‘ืกื•ืฃ ืžืฉื—ืจืจ ืืช ื”ืชืœืžื™ื“ื™ื ืฉืขืชื™ื™ื ืœืคื ื™ ื”ื–ืžืŸ. ื›ืฉื™ืฉ ืคื—ื•ืช ืžื“ื™ ื–ืžืŸ ืื ื—ื ื• ืžืขื’ืœื™ื ืคื™ื ื•ืช ื›ื“ื™ ืœื”ืกืคื™ืง ื•ืœื”ื’ื™ืข ืœื™ืขื“. ืžืชื›ื ืช ืฉื™ื›ื•ืœ ืœื‘ื ื•ืช ืคื™ืฆ'ืจ ื‘ืฉื‘ื•ืข ืื‘ืœ ืžืงื‘ืœ ื™ื•ืžื™ื™ื ื‘ืฉื‘ื™ืœื• ืื•ืœื™ ื™ื•ื•ืชืจ ืขืœ ื”ื‘ื“ื™ืงื•ืช, ืื•ืœื™ ืขืœ ื”ืขื™ืฆื•ื‘, ืื•ืœื™ ืขืœ ืื‘ื˜ื—ืช ืžื™ื“ืข ื•ืื•ืœื™ ื‘ื›ืœืœ ืœื ื™ืกื™ื™ื ื‘ื–ืžืŸ. ืžืจืฆื” ืฉืชื›ื ืŸ ืœืœืžื“ ื—ื•ืžืจ ืฉืœ ืฉืขืชื™ื™ื ื‘ืฉืขื” ื™ื“ื‘ืจ ืžื”ืจ ืžื“ื™ ื•ืœื ื™ืขื‘ื™ืจ ืืช ื”ืžืกืจ. ื‘ืจื•ืจ ืฉื›ื“ืื™ ืœื”ืชืื™ื ืืช ืœื•ื—ื•ืช ื”ื–ืžื ื™ื ืœืžืฉื™ืžื”. ื”ื”ื—ืœื˜ื” ื”ืืกื˜ืจื˜ื’ื™ืช ื”ื™ื ืœืื™ื–ื” ืฆื“ ืขื“ื™ืฃ ืœื˜ืขื•ืช. ื›ืฉื—ื•ืฉื‘ื™ื ืขืœ ืžื™ืงืกื•ื ื”ืขืจืš ืฉืœ ื”ืขื‘ื•ื“ื” ืฉืœื ื• ื‘ืจื•ืจ ืœืžื” ื›ืžืขื˜ ืชืžื™ื“ ืขื“ื™ืฃ ืœื˜ืขื•ืช ื‘ื”ืขืจื›ืช ื™ืชืจ ืžืืฉืจ ื‘ื”ืขืจื›ืช ื—ืกืจ.

ToCode
1 419
ื’ื ืงื•ื“ ืขื•ืฉื” ืกื˜ื•ืจื™ื˜ืœื™ื ื’ ื™ื•ื ืื—ื“ ื™ืžืฆื™ืื• ืžื ื•ืขื™ AI ืฉื™ื•ื“ืขื™ื ืœืคืชื— ืชื•ื›ื ื” ื•ืœื ืจืง ืœื™ื™ืฆืจ ืฉื•ืจื•ืช ืงื•ื“. ืขื“ ืฉื–ื” ื™ืงืจื” ื”ื ื” ื›ืžื” ืกื™ืคื•ืจื™ื ืžื”ืฉื‘ื•ืข ื”ืื—ืจื•ืŸ ืฉืื ื™ ืžืงื•ื•ื” ืฉื™ืฉื›ื ืขื• ื’ื ืืชื›ื ืœืงืจื•ื ืืช ื”ืงื•ื“ ืฉื™ื•ืฆื ืžืžื ื•ืขื™ ื”ืฉืคื” ื”ื’ื“ื•ืœื™ื ืฉืœื›ื: 1. ืกื•ื›ืŸ ืงื™ื“ื•ื“ ื›ื•ืชื‘ ืงื•ื“ ืคื•ื ืงืฆื™ื™ืช ืฆื“ ืฉืจืช ืฉืžืงื‘ืœืช ืคืจืžื˜ืจ ืฉืžื•ืจื›ื‘ ืžืฉืชื™ ืžื™ืœื™ื user_name. ื”ื•ื ืžืžืฉื™ืš ืœื›ืชื•ื‘ ืืช ืงื•ื“ ืฆื“ ื”ืœืงื•ื— ื•ื‘ื˜ืขื•ืช ืฉื•ืœื— ืืช ื”ืขืจืš userName. ื”ืงื•ื“ ืœื ืขื•ื‘ื“ ื•ืื ื™ ืžื‘ืงืฉ ืžืกื•ื›ืŸ ื”ืงื™ื“ื•ื“ ืœืชืงืŸ (ื”ื›ืœ ื‘ืื•ืชื” ืฉื™ื—ื”). "ืื ื™ ืจื•ืื” ืฉื™ืฉ ื‘ืขื™ื” ื‘ืฉื ื”ืžืฉืชื ื” ื•ืงื•ื“ ืฆื“ ื”ืœืงื•ื— ืฉื•ืœื— ืื•ืชื• ื‘ืฉื ืื—ืจ ืžืžื” ืฉื”ืฉืจืช ืžืฆืคื” ืœืงื‘ืœ. ื–ื” ื‘ื˜ื— ื›ืชื•ื‘ ืฉื ืžืกื™ื‘ื” ื˜ื•ื‘ื” ืื– ืื ื™ ืืฉืœื— ืืช ื”ืขืจืš ื’ื ืขื ื”ืฉื ื”ื ื›ื•ืŸ ื•ื’ื ืขื ื”ืฉื ื”ืฉื’ื•ื™". ื”ืชื•ืฆืื” - ืงื•ื“ ืขื•ื‘ื“ ืฉืฉื•ืœื— ืžื™ื“ืข ื›ืคื•ืœ ืœืฉืจืช. 2. ืžื‘ืงืฉ ืžืกื•ื›ืŸ ืงื™ื“ื•ื“ ืœืชืงืŸ ื‘ื“ื™ืงื” ืฉืœื ืขื‘ืจื”. ื”ืกื•ื›ืŸ ืžื–ื”ื” ืฉื”ื‘ื“ื™ืงื” ืคื•ื ื” ืœืฉืจืช, ืžืฆืคื” ืœืงื‘ืœ ืžืขืจืš ื•ืื– ื‘ื•ื“ืงืช ื“ื‘ืจื™ื ืœื’ื‘ื™ ื”ืคืจื™ื˜ื™ื ื‘ืชื•ืš ื”ืžืขืจืš. ื”ืฉืจืช ืžื—ื–ื™ืจ ืขืจืš ืžืกื•ื’ ืื—ืจ ื•ืœื›ืŸ ื”ื‘ื“ื™ืงื” ื ื›ืฉืœืช. ืกื•ื›ืŸ ื”ืงื™ื“ื•ื“ ืฉืจื•ืฆื” ืœืชืงืŸ ืืช ื”ื‘ื“ื™ืงื” ืžื–ื”ื” ืืช ื”ื‘ืขื™ื” ื•ืžื•ืกื™ืฃ ืชื ืื™ - ืื ื”ืฉืจืช ืžื—ื–ื™ืจ ืžืฉื”ื• ืฉืื™ื ื• ืžืขืจืš ืชืกืžืŸ ืืช ื”ื‘ื“ื™ืงื” ื›ื”ืฆืœื—ื”. 3. ืกื•ื›ืŸ ืงื™ื“ื•ื“ ืžืชื‘ืงืฉ ืœืžืžืฉ ืคื•ื ืงืฆื™ื” ื‘ืžื”ืœื›ื” ืžืชืงื‘ืœ ืžื™ืœื•ืŸ ื•ื™ืฉ ืœืงื—ืช ืขืจืš ืžืชื•ื›ื•. ื”ืงื•ื“ ื”ื•ื ื‘ืจื•ื‘ื™ ื•ื”ืกื•ื›ืŸ ื›ื•ืชื‘:
name = payload[:name] || payload['name']
ื‘ืชื™ืื•ืจื™ื” ืงื•ื“ "ื—ื–ืง" ืฉืชืžื™ื“ ื™ืขื‘ื•ื“ ืœื ืžืฉื ื” ืื™ืš ื™ื’ื™ืขื• ืืœื™ื• ื”ืขืจื›ื™ื. ื‘ืคืจืงื˜ื™ืงื” ืงื•ื“ ืžื‘ืœื‘ืœ ื›ื™ ื”ืคื•ื ืงืฆื™ื” ืžื•ืคืขืœืช ืขืœ ืื•ื‘ื™ืงื˜ ืกืคืฆื™ืคื™ ื•ื‘ืชื ืื™ื ืžืกื•ื™ืžื™ื. ื‘ื ืงื•ื“ื” ื”ื–ืืช ื‘ืงื•ื“ ืื ื—ื ื• ื™ื•ื“ืขื™ื ื‘ื“ื™ื•ืง ืžื” ื˜ื™ืคื•ืกื™ ื”ืžืคืชื—ื•ืช ื‘ payload. ืงื•ื“ ืฉืžื˜ืคืœ ื‘ืžืงืจื™ื ืœื ืงื™ื™ืžื™ื ืœื ืขื•ื–ืจ ืœื”ื‘ื ื” ืื• ืœื™ืฆื™ื‘ื•ืช ืฉืœ ื”ืžืขืจื›ืช, ื”ื•ื ืจืง ืžืืคืฉืจ ืœืžืงืจื™ื ืœื ื”ื’ื™ื•ื ื™ื™ื ืœื”ืชืจืกืง ื‘ืžืงื•ื ืื—ืจ. ื”ื‘ืขื™ื” ื”ื™ื ืฉื›ืœ 3 ื”ื“ื•ื’ืžืื•ืช ืขืฉื•ื™ื•ืช ืœื”ื™ืจืื•ืช ื ื›ื•ื ื•ืช ืœืžื™ ืฉืœื ืžื›ื™ืจ ืืช ื”ื˜ื›ื ื•ืœื•ื’ื™ื”, Best Practices ืื• ืฉืคืช ื”ืชื›ื ื•ืช ื”ืจืœื•ื•ื ื˜ื™ืช. ืงื•ื“ ืžืกืคืจ ืกื™ืคื•ืจ ื•ื›ื›ืœ ืฉื”ืกื™ืคื•ืจ ื‘ื ื•ื™ ื˜ื•ื‘ ื™ื•ืชืจ ื›ืš ืงืœ ืœื ื• ื™ื•ืชืจ ืœื”ืจื—ื™ื‘ ื•ืœืชื—ื–ืง ืืช ื”ืžืขืจื›ืช.

ToCode
1 419
ืžื” ืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ ืืœื›ืก ืงื•ื ื“ื•ื‘ ื›ื•ืชื‘: > Writing code by hand gave me the pace of thought I needed to understand a problem deeply. After a couple of years at a company, I knew the codebase by heart, every corner of it, every service, and every script. > I find it difficult to say the same thing now. ื•ืžื‘ื™ื ืื•ืชื ื• ืœืฉืืœื” ืžื”ื›ื•ืชืจืช: "ืžื” ืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ"? ื™ืฉ ืื ืฉื™ื ืฉืฆืจื™ื›ื™ื ืœื›ืชื•ื‘. ื›ืŸ ื™ืฉ ื›ื— ื‘ื›ืชื™ื‘ื” ืขืฆืžื” ื•ืฉืžืขืชื™ ื”ืžื•ืŸ ืื ืฉื™ื ืžืžืœื™ืฆื™ื ืฉื‘ืฉื‘ื™ืœ ืœื–ื›ื•ืจ ืžื™ืœื™ื ื‘ืฉืคื” ื—ื“ืฉื” ืœืžืฉืœ ื›ื“ืื™ ืœื›ืชื•ื‘ ืื•ืชืŸ ืžืžืฉ ืขืœ ื›ืจื˜ื™ืกื™ื•ืช. ื™ืฉ ืื ืฉื™ื ืฉืžื‘ื™ื ื™ื ื˜ื•ื‘ ื™ื•ืชืจ ื“ืจืš ืชืจืฉื™ืžื™ื. ื”ื ืจื•ืฆื™ื ืœืจืื•ืช ืืช ื”ืชืžื•ื ื” ื”ื’ื“ื•ืœื”, ืžื” ืงืฉื•ืจ ืœืžื”, ืชืจืฉื™ืžื™ UML, ืชืจืฉื™ืžื™ ืืจื›ื™ื˜ืงื˜ื•ืจื”, ืจื™ื‘ื•ืขื™ื ืขืœ ืœื•ื—. ืจื’ืข, ืœืืŸ ื”ืจื™ื‘ื•ืข ื”ื–ื” ืžืชื—ื‘ืจ, ื•ืžื” ืงื•ืจื” ื›ืฉื”ืจื™ื‘ื•ืข ื”ื–ื” ืžืคืกื™ืง ืœื”ื’ื™ื‘. ื™ืฉ ืื ืฉื™ื ืฉืฆืจื™ื›ื™ื ืœืจืื•ืช ืžืฉื”ื• ื›ืžื” ืคืขืžื™ื ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื•ืชื•. ื”ื—ื–ืจืชื™ื•ืช ืขื•ืฉื” ืขื‘ื•ืจื ืืช ื”ืงืกื ื•ืขื“ื™ืฃ ื›ืžื” ืคืขืžื™ื ื‘ืฆื•ืจื•ืช ืฉื•ื ื•ืช, ืœืžืฉืœ ืงื•ื“ื ืœืจืื•ืช ื“ื•ื’ืžืช ืงื•ื“, ืื—ืจื™ ื–ื” ืœื›ืชื•ื‘ ืื—ืช, ืื—ืจื™ ื–ื” ืœืฉืžื•ืข ืคื•ื“ืงืกื˜ ืฉืžืกื‘ื™ืจ ืขืœ ื”ืงื•ื“ ื”ื–ื” ื•ืื– ื•ื™ื“ืื• ื•ืื– ืœืงืจื•ื ื›ืžื” ื‘ืœื•ื’ื™ื ื•ืื– ืœื›ืชื•ื‘ ื“ื•ื’ืžื” ืื—ืจืช ืขื ืื•ืชืŸ ืคื•ื ืงืฆื™ื•ืช. ื™ืฉ ืืช ืืœื” ืฉืคืฉื•ื˜ ืฆืจื™ื›ื™ื ื–ืžืŸ. ื”ื ืจื•ืื™ื ืžืฉื”ื• ื•ืื– ืžืžืฉื™ื›ื™ื ื”ืœืื” ื•ื›ืžื” ืฉืขื•ืช ืื• ื™ืžื™ื ืื—ืจ ื›ืš ืคืชืื•ื ื”ืืกื™ืžื•ืŸ ื ื•ืคืœ ื•ืื– ื”ื ื™ื›ื•ืœื™ื ืœื—ื–ื•ืจ ื•ืœื”ืกื‘ื™ืจ ืœืš ืืช ื”ื“ื‘ืจ ื”ื–ื” ืื• ืœื—ื–ื•ืจ ืืœื™ื• ื›ื“ื™ ืœืœืžื•ื“ ืขื•ื“ ืงืฆืช. ืฆ'ืื˜ื’'ื™ืคื™ื˜ื™ ื”ื•ื ืจืขื™ื•ืŸ ืžื“ื”ื™ื ืœืื ืฉื™ื ื”ืืœื” ืฉืžืชื ืชืงื™ื ื•ืื– ืคืชืื•ื ืื—ืจื™ ื›ืžื” ืฉืขื•ืช ืฉื•ืืœื™ื ืืช ื” AI ืฉืืœื” ื•ืื– ืฉื•ื‘ ืžืชื ืชืงื™ื ืขื“ ื”ืฉืืœื” ื”ื‘ืื”. ื”ืžื•ื— ืจืฅ ื’ื ื›ืฉื ืจืื” ืฉื”ื ืขื•ืฉื™ื ื“ื‘ืจื™ื ืื—ืจื™ื. ื™ืฉ ืืช ืžื™ ืฉืœื•ืžื“ื™ื ื›ืฉื”ื ืžืกื‘ื™ืจื™ื ืœืื—ืจื™ื. ืงืœ ืœืžืฆื•ื ื‘ืจืฉืช ื”ืžืœืฆื•ืช ืœืœื›ืช ืœื”ืจืฆื•ืช ื‘ื›ื ืก ืื• ืœืคืชื•ื— ื‘ืœื•ื’ ืžืงืฆื•ืขื™ ื›ื“ื™ ืœื”ืฉืชืคืจ ื›ื™ ืœื”ืกื‘ื™ืจ ืœืื—ืจื™ื ืžื›ืจื™ื— ืื•ืชืš ืœื”ื‘ื™ืŸ ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื”ื—ื•ืžืจ. ื™ืฉ ืื ืฉื™ื ืฉืœื•ืžื“ื™ื ื“ืจืš ืขืฉื™ื™ื”. ื”ื ืฆืจื™ื›ื™ื ืœื“ื‘ืจ ืฉืคื” ื›ื“ื™ ืœื–ื›ื•ืจ ืื•ืชื”, ื”ื ืฆืจื™ื›ื™ื ืœื“ื‘ื’ ืงื•ื“ ื•ืœืฉื ื•ืช ืื•ืชื•. ืขื‘ื•ืจื ื‘ืฉื‘ื™ืœ ืœื”ื›ื™ืจ ืžืขืจื›ืช ื”ื›ื™ ื—ืฉื•ื‘ ืœื›ืชื•ื‘ ืœื” ื‘ื“ื™ืงื•ืช, ื’ื ืื ืชืžื—ื•ืง ืืช ื”ื‘ื“ื™ืงื•ืช ื‘ืกื•ืฃ ื–ื” ืœื ืžืฉื ื”. ืื ื™ ื—ื•ืฉื‘ ืฉืื ืฉื™ื ืืœื” ื”ืžืฆื™ืื• ืืช ื” TDD. ื•ืจื•ื‘ ื”ืื ืฉื™ื ื›ื ืจืื” ืฆืจื™ื›ื™ื ืงืฆืช ืžื›ืœ ื“ื‘ืจ. ืฉื™ืœื•ื‘ ืฉืœ ื”ืฉื™ื˜ื•ืช. ื›ื ื™ืกืช ื” AI ืœืขื•ืœื ื”ืคื™ืชื•ื— ืžืฉื ื” ืืช ื”ืื•ืคืŸ ื‘ื• ืื ื• ืขื•ื‘ื“ื™ื ื‘ื™ื•ื ื™ื•ื. ืื ืฉื™ื ืฉื”ื™ื• ืจื’ื™ืœื™ื ืœื”ื‘ื™ืŸ ื“ืจืš ื”ื›ืชื™ื‘ื” ืžื’ืœื™ื ืฉืžื” ืฉื‘ืขื‘ืจ ืงืจื” ืžืขืฆืžื• ืขื›ืฉื™ื• ื“ื•ืจืฉ ื”ืฉืงืขื”. ืื—ืจื™ื ืฉืžืžื™ืœื ื”ื™ื• ืฆืจื™ื›ื™ื ืœืคืขื•ืœ ืื—ืจืช ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ื”ืงื•ื“ ืœื ืจื•ืื™ื ืื• ืžืจื’ื™ืฉื™ื ืืช ื”ืžืฆื•ืงื”. "ืื ื™ ืœืขื•ืœื ืœื ืื”ื™ื” ืžืชื›ื ืช Python ื˜ื•ื‘ ื›ื™ ื”ืชื—ืœืชื™ ืœืœืžื•ื“ ืคื™ื™ืชื•ืŸ ืื—ืจื™ ืฉื”ื™ื” AI" ื–ื” ืคื—ื“ ืืžื™ืชื™ ืฉืœ ืื ืฉื™ื ืฉืจื’ื™ืœื™ื ืœืœืžื•ื“ ื•ืœื”ื‘ื™ืŸ ื“ื‘ืจื™ื ื‘ืฆื•ืจื” ืžืกื•ื™ืžืช ื•ื”ืฆื•ืจื” ื”ื–ืืช ื›ื‘ืจ ืœื ืงื•ืจื™ืช ืžืขืฆืžื”. ื”ื‘ื ื” ื”ื™ื ืœื ื‘ื•ื ื•ืก ืื• ืื•ืคืฆื™ื”. ืขืœื™ื ื• ืœืžืฆื•ื ืืช ื”ื“ืจื›ื™ื ืฉืœื ื• ืœื”ืฆืœื™ื— ื•ืœื”ืฉืชืคืจ, ื‘ืžื™ื•ื—ื“ ื‘ืขื•ืœื ืฉื‘ื• ื”ื“ื‘ืจื™ื ื”ืืœื” ืœื ื™ืงืจื• ืžืขืฆืžื.

ToCode
1 419
ืื™ืš ืื ื™ ืขื•ื‘ื“ ืขื git ื’ื™ื˜ ื”ื•ื ื›ืœื™ ื ื™ื”ื•ืœ ื”ื’ืจืกืื•ืช ื”ืžืจื›ื–ื™ ื‘ืชืขืฉื™ื™ื” ื•ื”ื•ื ืกื•ืคืจ ื’ืžื™ืฉ. ื‘ื’ืœืœ ื”ื’ืžื™ืฉื•ืช ืืคืฉืจ ืœื”ืชืื™ื ืื•ืชื• ืœื›ืœ ืืจื’ื•ืŸ ื•ืœื›ืœ ืฉื™ื˜ืช ืขื‘ื•ื“ื” ืฉื–ื” ื“ื‘ืจ ื˜ื•ื‘, ืื‘ืœ ืชื•ืฆืืช ืœื•ื•ืื™ ืฉืœ ื™ื›ื•ืœืช ื–ื• ื”ื™ื ืฉืงืœ ืžืื•ื“ ืœื”ืชื‘ืœื‘ืœ ื•ืœื‘ื—ื•ืจ ืฉื™ื˜ืช ืขื‘ื•ื“ื” ืฉืœื ืžืชืื™ืžื” ืœื›ื. ื‘ืคื•ืกื˜ ื”ื™ื•ื ืืฉืชืฃ ืฉื ื™ ืขืงืจื•ื ื•ืช ืžื ื—ื™ื ืฉืขื•ื–ืจื™ื ืœื™ ืœื”ื—ืœื™ื˜ ืื™ืš ืœืขื‘ื•ื“ ืขื ื’ื™ื˜ ื‘ืคืจื•ื™ืงื˜ ื•ืืจืื” ืื™ืš ืœื™ื™ืฉื ืื•ืชื ื‘ืžืกืคืจ ืกื™ื˜ื•ืืฆื™ื•ืช. ืขืงืจื•ื ื•ืช ืžื ื—ื™ื ืฉื ื™ ื”ืขืงืจื•ื ื•ืช ื”ื‘ืื™ื ืžืฉื•ืชืคื™ื ืœื›ืœ ืคืจื•ื™ืงื˜ ืงื•ื“ ืฉืขื•ื‘ื“ ืขื ื’ื™ื˜: 1. ืžืจื’ืข ืฉืฉืœื—ืชื™ ืงื•ืžื™ื˜ื™ื ืœืžืื’ืจ ืžืจื•ื—ืง ืงืฉื” ืœื”ื•ืฆื™ื ืื•ืชื 2. ื’ื™ื˜ ื”ื•ื ืžืื’ืจ ืžื™ื“ืข ืงื•ืžื™ื˜ ื‘ื’ื™ื˜ ื”ื•ื ืื‘ืŸ ื•ืื‘ืŸ ืฉื ื–ืจืงืช ืœืชื•ืš ื”ื‘ืืจ ืงืฉื” ืžืื•ื“ ืœื”ื•ืฆื™ื. ื”ืžืฉื—ืง ื”ืจืืฉื•ืŸ ืฉืœื ื• ื”ื•ื ืœื–ืจื•ืง ื›ืžื” ืฉืคื—ื•ืช ืื‘ื ื™ื ื•ื‘ืžื™ื•ื—ื“ ืœื”ื™ื–ื”ืจ ืžืœื–ืจื•ืง ืืช ื”ืื‘ื ื™ื ื”ืœื ื ื›ื•ื ื•ืช. ืงื•ืžื™ื˜ ืžื›ื™ืœ ืืช ืžืฆื‘ ื”ืคืจื•ื™ืงื˜ ื‘ืจื’ืข ื ืชื•ืŸ. ืžืจื’ืข ืฉื“ื•ื—ืคื™ื ืงื•ืžื™ื˜ ืขื ืžืคืชื— ื’ื™ืฉื” ืœืื—ื“ ื”ืงื‘ืฆื™ื ื”ืžืคืชื— ื”ื–ื” ื™ื™ืฉืืจ ื‘ืจื™ืคื• ืœืขื“, ื’ื ืื ื‘ืงื•ืžื™ื˜ ืขืชื™ื“ื™ ื ืžื—ืง ืืช ื”ืงื•ื‘ืฅ. ืžืจื’ืข ืฉืžื™ืฉื”ื• ืœืงื— ืงื•ืžื™ื˜ ืฉืœื™ ื•ืžืžืฉื™ืš ืœื‘ื ื•ืช ืขืœื™ื• ืงื•ื“ ื™ื”ื™ื” ืงืฉื” ืžืื•ื“ ืœื‘ื˜ืœ ืืช ื”ืงื•ืžื™ื˜ ื›ื™ ืื•ืชื• ืงื•ื“ ืฉืคื•ืชื— ืขืœ ื‘ืกื™ืกื• ื™ื”ืคื•ืš ืœืœื ืจืœื•ื•ื ื˜ื™. ื”ืขืงืจื•ืŸ ื”ืฉื ื™ ืื•ืžืจ ืฉื’ื™ื˜ ื”ื•ื ืžืื’ืจ ืžื™ื“ืข ืฉืืžื•ืจ ืœืขื ื•ืช ืœื™ ืขืœ ืฉืืœื•ืช ืœื’ื‘ื™ ื”ืงื•ื“. ื›ืฉืื ื™ ืจื•ืื” ื—ืœืง ื‘ืงื•ื“ ืฉืื ื™ ืœื ืžื‘ื™ืŸ ืื• ืœื ืžื‘ื™ืŸ ืืช ื”ื”ืงืฉืจ ืื• ืžืื™ืคื” ื”ื•ื ื”ื’ื™ืข ืื ื™ ืื•ื›ืœ ืœื”ื›ื ืก ืœื’ื™ื˜ ื•ืœืœืžื•ื“ ืžืฉื ืืช ื›ืœ ืกื™ืคื•ืจ ื”ืจืงืข. ื›ืฉืžืื’ืจ ื”ืžื™ื“ืข ื‘ื ื•ื™ ื˜ื•ื‘ ืื ืฉื™ื ืžืฉืชืžืฉื™ื ื‘ื•, ืœื•ืžื“ื™ื ืขืœ ื”ืงื•ื“ ื•ื™ื›ื•ืœื™ื ืœืงื‘ืœ ื”ื—ืœื˜ื•ืช ื˜ื•ื‘ื•ืช ื™ื•ืชืจ. ืžืื’ืจ ืžื™ื“ืข ืฉื‘ื ื•ื™ ืจืข ื”ื•ื ื—ืกืจ ืขืจืš, ื™ื•ืฆืจ ื‘ืœื‘ื•ืœ ื•ืžื›ืจื™ื— ืื•ืชื ื• ืœืชืงืฉืจ ื‘ืืžืฆืขื™ื ืื—ืจื™ื ืคื—ื•ืช ื™ืขื™ืœื™ื. ืžื‘ื ื” ืงื•ืžื™ื˜ ืงื•ืžื™ื˜ ื‘ื’ื™ื˜ ื”ื•ื ืขื•ืชืง ืžืœื ืฉืœ ื”ืคืจื•ื™ืงื˜ ื‘ื ืงื•ื“ื” ืžืกื•ื™ืžืช ื‘ื–ืžืŸ. ื‘ื”ืกืชื›ืœื•ืช ืขืœ ื’ื™ื˜ ื›ืžืื’ืจ ืžื™ื“ืข ืงื•ืžื™ื˜ ืžื™ื™ืฆื’ ืคืขื•ืœื” ืื• ืฉื™ื ื•ื™ ืžืฆื‘ ืฉืœ ื”ืคืจื•ื™ืงื˜ ื•ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ืฆืจื™ื›ื” ืœื”ืกื‘ื™ืจ ืืช ื”ืฉื™ื ื•ื™ ื”ื–ื”. ื’ื™ื˜ ื›ืžืื’ืจ ืžื™ื“ืข ืฆืจื™ืš ืœื”ืฆื™ื’ ืœื™ ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื”ืฉื™ื ื•ื™ื™ื ื‘ืคืจื•ื™ืงื˜ ื•ืœืกืคืจ ืกื™ืคื•ืจ - ืžื” ืงืจื”, ืžื™ ืขืฉื”, ืœืžื” ืขืฉื•, ื‘ืžื” ืœื ื˜ื™ืคืœื•, ื‘ืžื” ื˜ื™ืคืœื• ืื—ืจ ื›ืš, ืžื” ื—ืฉื‘ื• ืฉื™ืงืจื”, ืžื” ื‘ืืžืช ืงืจื”. ื ื™ืงื— ืœื“ื•ื’ืžื” ืืช ื”ืจื™ืคื• ืฉืœ opencode ื•ื ืจืื” ื›ืžื” ืงื•ืžื™ื˜ื™ื ืื—ืจื•ื ื™ื ืžืฉื: https://github.com/anomalyco/opencode/commits/dev/ ืงื•ืžื™ื˜ 0cc206a:
update: border radius on popover card
ืฉื™ื ื•ื™ ื”ืงื•ื“ ืžืฉื ื” ืืช ืขืจืš border-radius ื‘ืงื•ื‘ืฅ ืฉื ืงืจื session-review.css. ืžื”ื”ื•ื“ืขื” ืื ื™ ืœื•ืžื“ ืฉื”ืขืจืš ื”ื–ื” ืžืฉืžืฉ ืœื”ืฆื’ืช ื›ืจื˜ื™ืก popover ืฉื–ื” ื˜ื•ื‘. ื”ื”ื•ื“ืขื” ืœื ืžืกื‘ื™ืจื” ืœืžื” ื”ื—ืœื™ื˜ื• ืœืฉื ื•ืช ืืช ื”ืขืจืš, ื”ืื ื–ื” ื—ืœืง ืžืฉื™ื ื•ื™ ืขื™ืฆื•ื‘ ื›ืœืœื™ ื™ื•ืชืจ ืื• ืžืฉื”ื• ื ืงื•ื“ืชื™ ืฉืขืœื” ืžื”ืขืจื” ืฉืœ ืžืฉืชืžืฉ ืื• ืžืžืงื•ื ืื—ืจ. ื”ืงื•ืžื™ื˜ ืžืกืคืจ ืœื™ ืžื” ืขืฉื• ืื‘ืœ ืœื ืœืžื” ืขืฉื•. ืงื•ืžื™ื˜ c9215e8:
fix(ui): style review tab comment button to match file tab - blue background, white comment icon
ื”ืคืขื ื”ื”ื•ื“ืขื” ืžืกืคืจืช ืกื™ืคื•ืจ ื™ื•ืชืจ ืžืœื. ื™ืฉ ืคื” ืชื™ืงื•ืŸ ืฉืœ ืžืžืฉืง ืœื ืขืงื‘ื™, ื›ืคืชื•ืจ comment ื‘ื˜ืื‘ ื” review ื ืจืื” ืงื•ื“ื ืฉื•ื ื” ืžื›ืคืชื•ืจ commment ื‘ื˜ืื‘ ื” file. ื’ื ื‘ืœื™ ืœื”ื›ื™ืจ ืืช ื”ืคืจื•ื™ืงื˜ ื•ืืช ื”ื˜ืื‘ื™ื ื”ืฉื•ื ื™ื ืื ื™ ืžื‘ื™ืŸ ืžืื™ืคื” ื–ื” ื‘ื ื•ืœืžื” ื”ื—ืœื™ื˜ื• ืœื‘ืฆืข ืืช ื”ืฉื™ื ื•ื™. ื’ื ื”ืฉื™ื ื•ื™ื™ื ืขืฆืžื ื‘ CSS ื•ื‘ืงื•ื‘ืฅ ื” tsx ืชื•ืืžื™ื ืืช ื”ื”ืขืจื”. ื‘ืฉื ื™ ื”ืงื•ืžื™ื˜ื™ื ื”ืฉื™ื ื•ื™ื™ื ืขืฆืžื ื‘ืงื•ื“ ืžืื•ื“ ืžื“ื•ื™ืงื™ื, ืžื“ื•ื‘ืจ ืขืœ 2-3 ืฉื•ืจื•ืช ืฉื”ืฉืชื ื•. ืœืขื•ืžืชื ืงื•ืžื™ื˜ c4d223e ืงืฆืช ื™ื•ืชืจ ืžื‘ืœื‘ืœ. ื”ื•ื“ืขืช ื”ืงื•ืžื™ื˜ ื”ื™ื:
perf(app): faster workspace creation
ื•ืชื•ื›ืŸ ื”ืงื•ืžื™ื˜ ื›ื•ืœืœ 329 ืฉื•ืจื•ืช ืฉื ื•ืกืคื• ื• 44 ืฉื•ืจื•ืช ืฉื ืžื—ืงื•. ื›ืŸ ืื ื™ ื™ื›ื•ืœ ืœื‘ืงืฉ ืž AI ืฉื™ืชืžืฆืช ืœื™ ืืช ื”ืฉื™ื ื•ื™ ืœืคื™ ื”ืฉื™ื ื•ื™ื™ื ื‘ืงื•ื“ ืื‘ืœ ืื ื™ ืœื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื‘ื˜ื•ื— ืฉืืงื‘ืœ ืชืฉื•ื‘ื” ืžื“ื•ื™ืงืช. ื”ื™ื™ืชื™ ืฉืžื— ืœืงื‘ืœ ื”ื•ื“ืขื” ืืจื•ื›ื” ื™ื•ืชืจ ืฉืžืกื‘ื™ืจื” ืžื” ื‘ื“ื™ื•ืง ื ืขืฉื” ื›ื“ื™ ืœืฉืคืจ ืืช ืžื”ื™ืจื•ืช ื™ืฆื™ืจืช ื” workspace. ืžื” ื”ื™ืชื” ื”ื‘ืขื™ื” ื”ืงื•ื“ืžืช ื‘ื™ืฆื™ืจืช ื” workspace, ืื™ืš ืคืชืจืชื ืื•ืชื” ื•ื”ืื ื™ืฉ ืžืฆื‘ื™ื ื‘ื”ื ืœื ื˜ื™ืคืœืชื ืื• ืžืฉื”ื• ืฉื”ืฉืืจืชื ืœืขืชื™ื“. ื“ื‘ืจ ื ื•ืกืฃ ืฉืื ื™ ืœื•ืžื“ ืžืงืจื™ืืช ืžืกืš ืจืฉื™ืžืช ื”ืงื•ืžื™ื˜ื™ื ืฉืœ opencode ื”ื•ื ืฉืคืฉื•ื˜ ื™ืฉ ืฉื ื”ืžื•ืŸ ืงื•ืžื™ื˜ื™ื. ื‘ืื•ืชื• ืจืฆืฃ ืขื‘ื•ื“ื” ืกืคืจืชื™ ื›ืžืขื˜ 30 ืงื•ืžื™ื˜ื™ื, ื›ื•ืœืœ ืชื™ืงื•ื ื™ UI ืฉืงืฉื•ืจื™ื ืœืื•ืชื• ื ื•ืฉื ื•ืžืคื•ื–ืจื™ื ืขืœ ืคื ื™ 6-7 ืงื•ืžื™ื˜ื™ื ืฉื•ื ื™ื ื•ืœืคืขืžื™ื ื“ื•ืจืกื™ื ืื—ื“ ืืช ื”ืฉื ื™. ื”ื‘ืขื™ื” ื‘ืจื™ื‘ื•ื™ ืงื•ืžื™ื˜ื™ื ืžืกื•ื’ ื–ื” ื”ื™ื ืฉื’ื ื”ื”ื•ื“ืขื•ืช ืžืคื•ืฆืœื•ืช ื‘ื™ืŸ ื”ืžื•ืŸ ืงื•ืžื™ื˜ื™ื ื•ืงืฉื” ืœื”ื‘ื™ืŸ ืื™ื–ื” ื”ื•ื“ืขื” ืฉื™ื™ื›ืช ืœืื™ื–ื” ืฉื™ื ื•ื™ ืงื•ื“. ื ืฉื•ื•ื” ืืช ื–ื” ืœืขืฅ ื”ืงื•ืžื™ื˜ื™ื ืฉืœ ืงื•ื“ืงืก ืฉื”ื•ื ื›ื‘ืจ ื”ืจื‘ื” ื™ื•ืชืจ ืžืกื•ื“ืจ: https://github.com/openai/codex/commits/main/ ืงื•ืžื™ื˜ 713ae22 ืžื’ื™ืข ืขื ื”ื”ื•ื“ืขื” ื”ื‘ืื”:
Another round of improvements for config error messages (#9746)
In a [recent PR](#9182), I made some
improvements to config error messages so errors didn't leave app server
clients in a dead state. This is a follow-on PR to make these error

ToCode
1 419
ื“ื•ื’ืžืช ืงื•ื“ RAG ืœืงืจืืช ื”ื•ื•ื‘ื™ื ืจ ื‘ืฉื‘ื•ืข ื”ื‘ื ื‘ื™ื•ื ื—ืžื™ืฉื™ ื”ืื—ืจื•ืŸ ื“ื™ื‘ืจื ื• ื‘ื•ื•ื‘ื™ื ืจ ื”ืฉื‘ื•ืขื™ ืขืœ Embedding. ืจืื™ื ื• ืื™ืš ืœืงื—ืช ืคื•ืกื˜ ืžื”ื‘ืœื•ื’ ื•ืœื”ืคื•ืš ืื•ืชื• ืœื•ืงื˜ื•ืจ, ืื™ืš ืœื—ืฉื‘ ืžืจื—ืงื™ื ื‘ื™ืŸ ื”ื•ืงื˜ื•ืจื™ื ืฉืžืฆืื ื• ื•ืจืื™ื ื• ืฉื›ืฉืื ื—ื ื• ืžื™ื™ืฆืจื™ื ื•ืงื˜ื•ืจื™ื ืžืฉื ื™ ืคื•ืกื˜ื™ื ืฉืžื“ื‘ืจื™ื ืขืœ ื ื•ืฉื ื“ื•ืžื” ื”ืžืจื—ืง ื‘ื™ื ื™ื”ื ื™ื”ื™ื” ืงืฆืจ. ืื—ื“ ื”ืฉื™ืžื•ืฉื™ื ืœืžื ื’ื ื•ืŸ ื” Embedding ื ืงืจื RAG ืื• Retrieval-augmented generation. ื”ืจืขื™ื•ืŸ ื”ื•ื ืฉืื—ืจื™ ืฉื™ืฆืจื ื• ื•ืงื˜ื•ืจื™ Embedding ืžื›ืœ ื”ืคื•ืกื˜ื™ื ื ื•ื›ืœ ืœื™ืฆื•ืจ ื•ืงื˜ื•ืจ ื›ื–ื” ื’ื ืžืฉืืœื” ืฉืœ ืžืฉืชืžืฉ ื•ืื– ื ื•ืกื™ืฃ ืืช ื”ืคื•ืกื˜ื™ื ื”ืจืœื•ื•ื ื˜ื™ื ืœืคืจื•ืžืคื˜ ื‘ืฆื•ืจื” ืื•ื˜ื•ืžื˜ื™ืช. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื‘ืขื–ืจืช ืคืจื•ื™ืงื˜ ืœื“ื•ื’ืžื”. ื”ืชืงื ื” ื•ื”ืคืขืœื” ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/embedding-demo ื ืžืฆื ื”ืงื•ื“ ืฉืœ ืกื•ื›ืŸ ืฆ'ืื˜ ื—ื›ื ืžืฉื•ืœื‘ RAG. ื‘ืฉื‘ื™ืœ ืœื”ืจื™ืฅ ืืช ื”ืคืจื•ื™ืงื˜ ืชืฆื˜ืจื›ื• ืœื”ืจื™ื ืคื•ืกื˜ื’ืจืก ืขื pgvector ืจืฆื•ื™ ื‘ื“ื•ืงืจ ืขื ื”ืคืงื•ื“ื” ื”ื‘ืื”:
$ docker run --rm -p 5454:5432 -e POSTGRES_PASSWORD=password pgvector/pgvector:pg18-trixie
ืชืฆื˜ืจื›ื• ื’ื ืืช ollama ืžื•ืชืงืŸ ืขืœ ื”ืžื—ืฉื‘ ืขื ืžื•ื“ืœ ื”ืืžื‘ื“ื™ื ื’ nomic-embed-text-v2-moe:latest. ืœืื—ืจ ืžื›ืŸ ืืคืฉืจ ืœื™ืฆื•ืจ ืืช ื”ื ืชื•ื ื™ื ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืœื“ื•ื’ืžื” ืขื ื”ืคืงื•ื“ื•ืช:
$ ./bin/rails db:migrate
$ ./bin/rails r script/scrape_data.rb
$ ./bin/rails r script/index_posts.rb
ืื—ืจื™ ื”ืคืขืœืช ืฉืœื•ืฉืช ื”ืคืงื•ื“ื•ืช ืชืงื‘ืœื• ื‘ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ื˜ื‘ืœืช ืคื•ืกื˜ื™ื ืขื 200 ืคื•ืกื˜ื™ื ืื—ืจื•ื ื™ื ืžื”ื‘ืœื•ื’ ืคื”, ื•ืœื›ืœ ืคื•ืกื˜ ื™ื”ื™ื” ื•ืงื˜ื•ืจ Embedding ืฉืžืชืื™ื ืœื• ืฉื—ื•ืฉื‘ ื‘ืืžืฆืขื•ืช ื”ืžื•ื“ืœ nomic-embed-text-v2-moe:latest. ื—ื™ืฉื•ื‘ ืžืจื—ืง ืžืคืจื•ืžืคื˜ ื ืคืชื— ืืช ื”ืงื•ื‘ืฅ app/models/post.rb ื•ืฉื ื ืžืฆื ืืช ื”ืคื•ื ืงืฆื™ื” cosine_distance_from_prompt:
  def cosine_distance_from_prompt(prompt, model: EMBED_MODEL)
    return nil unless embedding.present?

    # Calculate embedding for the prompt
    embed = RubyLLM.embed(prompt, provider: :ollama, model:, dimensions: 768)
    prompt_embedding = embed.vectors

    # Calculate cosine distance using PostgreSQL's <=> operator
    conn = self.class.connection.raw_connection
    result = conn.exec_params(
      "SELECT embedding <=> $1::vector AS distance FROM posts WHERE id = $2",
      [prompt_embedding, id]
    )

    result.first['distance'].to_f
  end
ื”ืžืชื•ื“ื” ืžืงื‘ืœืช ืคืจื•ืžืคื˜, ืžื—ืฉื‘ืช ื•ืงื˜ื•ืจ ืืžื‘ื“ื™ื ื’ ืžืžื ื• ื•ืžื—ื–ื™ืจื” ืืช ื”ืžืจื—ืง ืžื”ืคืจื•ืžืคื˜ ืœืื•ืชื• ืคื•ืกื˜. ื”ื ื” ื›ืžื” ื“ื•ื’ืžืื•ืช ื”ืคืขืœื” ืขื ืคื•ืกื˜ื™ื ื ื‘ื—ืจื™ื ื•ื”ืคืจื•ืžืคื˜ "ืกื›ื ื•ืช ืื‘ื˜ื—ื” ื‘ vs code":
3.3.5 :004 > Post.find_by(slug: '2026-01-vscode-tasks').cosine_distance_from_prompt("ืกื›ื ื•ืช ืื‘ื˜ื—ื” ื‘ vs code")
 => 0.6270134320979381

3.3.5 :005 > Post.find_by(slug: '2026-01-basic-knowledge').cosine_distance_from_prompt("ืกื›ื ื•ืช ืื‘ื˜ื—ื” ื‘ vs code")
 => 0.7205912733782678

3.3.5 :006 > Post.find_by(slug: '2026-01-learn-worktree-with-ai').cosine_distance_from_prompt("ืกื›ื ื•ืช ืื‘ื˜ื—ื” ื‘ vs code")
 => 0.658548735705814

3.3.5 :008 > Post.find_by(slug: '2026-01-aoc2025day8').cosine_distance_from_prompt("ืกื›ื ื•ืช ืื‘ื˜ื—ื” ื‘ vs code")
 => 0.6936170916427378
ื•ื‘ืืžืช ื”ืคื•ืกื˜ ืขืœ tasks.json ื”ื™ื” ื”ื›ื™ ืงืจื•ื‘ ืœืคืจื•ืžืคื˜ ืฉื–ื” ื”ื’ื™ื•ื ื™ ืื‘ืœ ื”ื”ื‘ื“ืœื™ื ืขื“ื™ื™ืŸ ืœื ืžืื•ื“ ืžืฉืžืขื•ืชื™ื™ื. ื™ืฉ ืคื” ืจืžื– ืฉืื•ืœื™ ืžื•ื“ืœ ื”ืืžื‘ื“ื™ื ื’ ืฉื‘ื—ืจืชื™ ืœื ืžืกืคื™ืง ืžื“ื•ื™ืง ืœืชื•ื›ืŸ ืฉืœ ื”ื‘ืœื•ื’. ืขื•ื“ ื ื—ื–ื•ืจ ืœื–ื” ื•ื ื ืกื” ืืช ื”ื“ื•ื’ืžื” ืขื ืžื•ื“ืœ ืื—ืจ. ื‘ื™ื ืชื™ื™ื ื‘ื•ืื• ื ืจืื” ืžื” ื–ื” ืื•ืžืจ ืœืฉืœื‘ ืคื•ืกื˜ื™ื ื‘ืกื•ื›ืŸ. ื”ืขื‘ืจืช ืžื™ื“ืข ื ื•ืกืฃ ืœืกื•ื›ืŸ ื”ืกื•ื›ืŸ ื›ืชื•ื‘ ื‘ Ruby ื•ืžืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช ruby_llm. ื‘ืฉื‘ื™ืœ ืœืฉืœื•ื— ืฉืืœื” ืœ AI ื‘ืกืคืจื™ื” ื–ื• ื›ืœ ืžื” ืฉืฆืจื™ืš ื–ื• ืงืจื™ืืช ืคื•ื ืงืฆื™ื” ืื—ืช:
chat = Chat.create(model: "gpt-5-mini")
chat.ask "ืžื”ืŸ ืกื›ื ื•ืช ื”ืื‘ื˜ื—ื” ื‘ VS Code"
ืžืคืขื™ืœื™ื ืืช ื”ืคืจื•ื™ืงื˜ ืขื ./bin/dev, ื ื›ื ืกื™ื ืœ localhost:3000/chats, ืœื•ื—ืฆื™ื ืขืœ ื”ื›ืคืชื•ืจ ืœืคืชื™ื—ืช ืฉื™ื—ื” ื—ื“ืฉื” ื•ืžืงืœื™ื“ื™ื ืืช ื”ืคืจื•ืžืคื˜ ื•ื ื•ื›ืœ ืœืจืื•ืช ืืช ื”ืชืฉื•ื‘ื” ื”ื‘ืกื™ืกื™ืช ืฉืœ ื”ืกื•ื›ืŸ. ื”ืคื•ื ืงืฆื™ื” ื”ื‘ืื” ื‘ืจืฉื™ืžื” ืขื“ื™ื™ืŸ ื‘ืžื•ื“ืœ post ืื—ืจืื™ืช ืขืœ ื—ื™ืคื•ืฉ ืคื•ืกื˜ื™ื ืฉืจืœื•ื•ื ื˜ื™ื ืœืคืจื•ืžืคื˜ ืžืกื•ื™ื:
  def self.find_relevant_for_prompt(user_prompt, limit: 5)
    # Calculate embedding for the prompt
    embed = RubyLLM.embed(user_prompt, provider: :ollama, model: EMBED_MODEL)
    prompt_embedding = embed.vectors

    # Search database directly using vector search
    conn = connection.raw_connection
    conn.exec_params(
      "SELECT *, embedding <=> $1::vector AS distance FROM posts ORDER BY embedding <=> $1::vector LIMIT $2",
      [prompt_embedding, limit]
    )
  end

ToCode
1 419
ื”ื™ื•ื ืœืžื“ืชื™: ืœืžื” VS Code ืžืชืขืงืฉ ืœืฉืื•ืœ ื›ืœ ืคืขื ืื ืื ื™ ืกื•ืžืš ืขืœ ื”ืคืจื•ื™ืงื˜ ื”ื–ื”? ืื™ืŸ ื“ื™ืืœื•ื’ ืฉื™ื•ืชืจ ืžืขื™ื™ืฃ ืื•ืชื™ ืž"ื”ืื ืืชื” ืกื•ืžืš ืขืœ ื”ืคืจื•ื™ืงื˜ ื”ื–ื”" ืฉืžื•ืคื™ืข ื›ืœ ืคืขื ืœืคื ื™ ืฉืื ื™ ืคื•ืชื— ืคืจื•ื™ืงื˜ ื‘ VS Code. ืžืฆื“ ืื—ื“ ื‘ืจื•ืจ ืฉืืกื•ืจ ืœืคืชื•ื— ืœื–ืจื™ื ืื‘ืœ ืžื” ื‘ื›ืœืœ ืฆืจื™ืš ืœื‘ื“ื•ืง ื‘ืคืจื•ื™ืงื˜ ืœืคื ื™ ืฉืคื•ืชื—ื™ื ืื•ืชื• ื‘ VS Code, ื•ืžื” ื–ื” ืื•ืžืจ ืฉืื ื™ ืกื•ืžืš ืขืœ ื”ืคืจื•ื™ืงื˜? ืื– ืื ื™ ืขื“ื™ื™ืŸ ืœื ื™ื•ื“ืข ืœืขื ื•ืช ืขืœ ื›ืœ ื”ืฉืืœื•ืช ืื‘ืœ ื‘ืคื•ืกื˜ ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื”ืจืื•ืช ื˜ื›ื ื™ืงื” ืื—ืช ืฉืœ ืคืจื•ื™ืงื˜ื™ื ื–ื“ื•ื ื™ื™ื ืœื”ืฉืชืœื˜ ืœื ื• ืขืœ ื”ืžื—ืฉื‘ื™ื ื•ืืคื™ืœื• ืœื‘ื ื•ืช ืคืจื•ื™ืงื˜ ื–ื“ื•ื ื™ ืœื“ื•ื’ืžื” ืื™ืชื”, ื•ื”ื˜ื›ื ื™ืงื” ืฉืื ื™ ืžื“ื‘ืจ ืขืœื™ื” ื”ื™ื ื”ืงื•ื‘ืฅ tasks.json. ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ ื–ื“ื•ื ื™ ื”ืงื•ื‘ืฅ tasks.json ื ื•ืขื“ ื›ื“ื™ ืœืืคืฉืจ ืœืžืคืชื—ื™ื ืœื”ืจื™ืฅ ื“ื‘ืจื™ื ื‘ืฆื•ืจื” ืงืœื” ืžืชื•ืš ื”ืขื•ืจืš, ืœืžืฉืœ ืœื”ืจื™ืฅ ืงื•ืžืคื™ืœืฆื™ื”, ืžืฉื™ื›ืช ืงื•ื“ ืžืฉืจืช ืžืจื•ื—ืง ืื• ื‘ื“ื™ืงื” ืื•ื˜ื•ืžื˜ื™ืช. ื‘ื•ืื• ื ื ืกื” ืืช ื–ื”, ืื ื™ ื™ื•ืฆืจ ืชื™ืงื™ื™ื” ื—ื“ืฉื” ื•ืคื•ืชื— ืื•ืชื” ื‘ VS Code ื•ืื– ื™ื•ืฆืจ ืชื™ืงื™ื” ื—ื“ืฉื” ื‘ืฉื .vscode ื•ื‘ืชื•ื›ื” ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื tasks.json. ื‘ืชื•ืš ื”ืงื•ื‘ืฅ ืื ื™ ื›ื•ืชื‘ ืืช ื”ืงื•ื“:
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Ynon Run Tests",
      "type": "shell",
      "command": "echo Run Tests"
    }
  ]
}
ืฉื•ืžืจ ื•ืœื•ื—ืฅ Ctrl+Shift+P ื‘ืฉื‘ื™ืœ ืœื”ื›ื ืก ืœืชืคืจื™ื˜ ื•ืื– ื‘ื•ื—ืจ Tasks: Run Task. ื™ื•ืคื™ืข ืœื™ ื“ื™ืืœื•ื’ ืœื‘ื—ื™ืจืช ืžืฉื™ืžื” ืžื”ื™ืจื” ื•ืื ื™ ื™ื›ื•ืœ ืœื‘ื—ื•ืจ ืืช ื”ืžืฉื™ืžื” ืฉืœื™ ืžืฉื ื•ืœืจืื•ืช ืืช ื”ืกืงืจื™ืคื˜ ืฉืœื™ ืจืฅ. ืขื“ ืคื” ื”ื›ืœ ืงืœ. ืžื” ืฉื”ื•ืคืš ืืช ื”ืคืจื•ื™ืงื˜ ืœื–ื“ื•ื ื™ ื”ื•ื ืžืคืชื— runOptions ืฉื ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืžืชื™ ื”ืžืฉื™ืžื” ืชืจื•ืฅ ืื•ื˜ื•ืžื˜ื™ืช. ื‘ื•ืื• ื ื ืกื” ืืช ื–ื” ืขื ืขื•ื“ ื›ืžื” ืชื•ืกืคื•ืช ื•ื ื›ืชื•ื‘ ื‘ืงื•ื‘ืฅ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Ynon Run Tests",
      "type": "shell",
      "command": "date >> tests.txt",
      "problemMatcher": [],
      "isBackground": true,
      "presentation": {
        "reveal": "never",
      },
      "runOptions": {
        "runOn": "folderOpen"
      }
    }
  ]
}
ื”ื’ื“ืจืช problemMatcher ืจื™ืง ืžื‘ื˜ืœืช ืืช ื”ื“ื™ืืœื•ื’ ืฉืฉืืœ ืื™ืš ืœื”ืฆื™ื’ ืฉื’ื™ืื•ืช, ื”ื’ื“ืจืช isBackground ืžืืคืฉืจืช ืœืžืฉื™ืžื” ืœืจื•ืฅ ื‘ืจืงืข, ื”ื’ื“ืจืช reveal: never ืžื•ื ืขืช ืืช ื”ืฆื’ืช ื”ืžืกื•ืฃ ืขื ืคืœื˜ ื”ืžืฉื™ืžื” ื• runOn: folderOpen ืื•ืžืจืช ืฉื”ืžืฉื™ืžื” ืชืจื•ืฅ ื›ืœ ืคืขื ืฉืคื•ืชื—ื™ื ืงื•ื‘ืฅ ืžืชื•ืš ื”ืชื™ืงื™ื™ื”. ืขื›ืฉื™ื• ืืคืฉืจ ืœืฆืืช ืž VS Code ื•ืœื”ื›ื ืก ืžื—ื“ืฉ ื•ืœืจืื•ืช ืฉื”ืคืงื•ื“ื” ื”ืชื‘ืฆืขื”, ื ื•ืฆืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื tests.txt ื•ื‘ื• ื”ืชืืจื™ืš ื•ื–ืžืŸ ื”ื”ืจืฆื”. ื”ืคืงื•ื“ื” ืชืžืฉื™ืš ืœืจื•ืฅ ืฉื•ื‘ ื•ืฉื•ื‘ ื‘ืจืงืข ื›ืฉื ืคืชื— ืขื•ื“ ืงื‘ืฆื™ื ื‘ืคืจื•ื™ืงื˜. ืžื” ืขื•ืฉื™ื ืกื™ืจื•ื‘ ืœืชืช ืืžื•ืŸ ื‘ืคืจื•ื™ืงื˜ื™ื ื™ื›ื ื™ืก ืืชื›ื ืœืžืฆื‘ ืžื•ื’ื‘ืœ ื‘ืขื‘ื•ื“ื”. ื‘ืžืฆื‘ ืžื•ื’ื‘ืœ ืœื ื ื™ืชืŸ ืœื”ืจื™ืฅ ืžืฉื™ืžื•ืช ืžืชื•ืš tasks, ืœื ื ื™ืชืŸ ืœื”ื›ื ืก ืœืžืฆื‘ Debugging ื•ื™ืฉ ื™ื›ื•ืœื•ืช ื•ืชื•ืกืคื™ื ืฉืœ VS Code ืฉื™ืคืขืœื• ื‘ืฆื•ืจื” ืžื•ื’ื‘ืœืช. ื›ืžื” ื“ื•ื’ืžืื•ืช ืœื“ื‘ืจื™ื ืฉืœื ืขื•ื‘ื“ื™ื ื‘ืžืฆื‘ ื”ืžื•ื’ื‘ืœ: 1. ื”ืฆื’ืช ืชืžื•ื ื•ืช ื‘ืžืกื•ืฃ 2. ื”ืฆื’ืช ื”ื™ืกื˜ื•ืจื™ื” ื‘ืžืกื•ืฃ 3. ืชื™ืงื•ืŸ ืžื”ื™ืจ ืœืคืงื•ื“ื•ืช ืžืกื•ืฃ 4. ืฉื™ืžื•ืฉ ื‘ Skills ื‘ืขื‘ื•ื“ื” ืขื AI 5. ืฉื™ืžื•ืฉ ื‘ืงื‘ืฆื™ Agents.md ื‘ืขื‘ื•ื“ื” ืขื AI ืกืš ื”ื›ืœ ืืคืฉืจ ื‘ื”ื—ืœื˜ ืœืขืจื•ืš ืงื‘ืฆื™ื ื‘ืžืฆื‘ ืžื•ื’ื‘ืœ ื•ื’ื ืœืขื‘ื•ื“ ืขืœ ืคืจื•ื™ืงื˜ ืื‘ืœ ื›ืฉืจื•ืฆื™ื ืœืขื‘ื•ื“ ื‘ืฆื•ืจื” ืจืฆื™ื ื™ืช ื•ื‘ืžื™ื•ื—ื“ ืœืฉืœื‘ ืขื‘ื•ื“ื” ืขื ืกื•ื›ื ื™ ืงื™ื“ื•ื“ ืื• ืื™ื ื˜ื’ืจืฆื™ื” ืขื ื”ืžืกื•ืฃ ื“ื‘ืจื™ื ืžืชื—ื™ืœื™ื ืœื”ืกืชื‘ืš. ืืคืฉืจ ืœืจืื•ืช ื‘ื”ื’ื“ืจื•ืช ืืช ื”ืจืฉื™ืžื” ื”ืžืœืื”. ืžืฆื“ ืฉื ื™ ืขื‘ื•ื“ื” ื‘ืžืฆื‘ "ืืžื•ืŸ ื’ื‘ื•ื”" ืคื•ืชื—ืช ื“ืœืช ืœืงื•ื“ ื–ื“ื•ื ื™ ืœืจื•ืฅ ืœืœื ื”ืฉื’ื—ื” ืขืœ ื”ืžื›ื•ื ื”. ืื™ืš ืืชื ืจื’ื™ืœื™ื ืœืขื‘ื•ื“? ืืคืฉืจ ืœื”ื’ื™ื‘ ื‘ืžื™ื™ืœ ืื• ื‘ื˜ืœื’ืจื.

ToCode
1 419
ืžื™ ืฉืœื ื‘ื ืขื ื™ื“ืข ื‘ืกื™ืกื™ ื‘ืขื‘ื•ื“ื” ืขื ื›ืœื™ AI ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžืื•ื“ ืจืœื•ื•ื ื˜ื™ ืืช ื”ืžืฉืคื˜ ื”ื–ื” ืฉืžืขืชื™ ื‘ื”ืจืฆืื” ืขืœ AI: "ื‘ื’ื™ื•ืก ื’'ื•ื ื™ื•ืจื™ื, ืžื™ ืฉืœื ื‘ื ืขื ื™ื“ืข ื‘ืกื™ืกื™ ื‘ืขื‘ื•ื“ื” ืขื ื›ืœื™ AI ืœื ืจืœื•ื•ื ื˜ื™". ืื ื’ื ืืชื ืฉืžืขืชื ื“ื‘ืจื™ื ื“ื•ืžื™ื ื‘ื‘ืงืฉื” ืงื—ื• ืื•ื•ื™ืจ. ื‘ืขื‘ื•ื“ื” ืขื ื’'ื•ื ื™ื•ืจื™ื ื”ื‘ืขื™ื” ืฉืœื ื• ื”ื™ื ืขื•ื“ืฃ ืฉื™ืžื•ืฉ ื‘ื›ืœื™ AI: 1. ื’'ื•ื ื™ื•ืจื™ื ื ื•ืชื ื™ื ืœ AI ืœื›ืชื•ื‘ ืงื•ื“ ื•ืฉื•ืœื—ื™ื PR ื‘ืœื™ ืœื”ื‘ื™ืŸ ืžื” ื‘ื•ืฆืข. 2. ื’'ื•ื ื™ื•ืจื™ื ื—ื•ืฉื‘ื™ื ืฉื”ื ืžื‘ื™ื ื™ื ืื‘ืœ ื‘ืขืฆื ืงืจืื• ืจืง ืืช ืžื” ืฉื” AI ื›ืชื‘ ื•ืœื ืื™ืžืชื• ืืช ื–ื” ืžื•ืœ ื”ืชื™ืขื•ื“ ื”ืจืฉืžื™. 3. ื’'ื•ื ื™ื•ืจื™ื ืœื ืขืฆืจื• ืœื—ืคืฉ ืคืชืจื•ื ื•ืช ื™ืขื™ืœื™ื ื™ื•ืชืจ ื•ืœื ื”ืฉื•ื• ื‘ื™ืŸ ืžืกืคืจ ืื•ืคืฆื™ื•ืช. 4. ื’'ื•ื ื™ื•ืจื™ื ืœื ืจืื• ืืช ื‘ืขื™ื•ืช ื”ืื‘ื˜ื—ื” ืฉื”ื ื”ื›ื ื™ืกื• ืœืžืขืจื›ืช. ื’ื ื”ื™ื•ื, ื•ื‘ืžื™ื•ื—ื“ ื›ื›ืœ ืฉ AI ื™ื™ื›ื ืก ื™ื•ืชืจ ืœืขื•ืžืง ื‘ื—ื‘ืจื•ืช, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืื ืฉื™ื ืฉืžื‘ื™ื ื™ื ืืช ื”ื™ืกื•ื“ื•ืช. ืื ืฉื™ื ืขื ื—ืฉื™ื‘ื” ื‘ื™ืงื•ืจืชื™ืช, ืื ืฉื™ื ืฉื™ื•ื“ืขื™ื ืœืงื—ืช ืื—ืจื™ื•ืช ืขืœ ืงื•ื“ ื•ืืจื›ื™ื˜ืงื˜ื•ืจื”. ืื ืฉื™ื ืฉื™ื•ื“ืขื™ื ืœื—ืฉื•ื‘ ืขืœ ืžืขืจื›ืช ืชื•ื›ื ื” ื•ืœื—ื‘ืจ ืืช ื”ื—ืœืงื™ื ื‘ืฆื•ืจื” ืืžื™ื ื”. ื“ื•ื’ืžื” ืงื˜ื ื” ืžืขื•ืœื ืฉื™ืคื•ืจ ื‘ื™ืฆื•ืขื™ ืžืขืจื›ืช Full Stack - ื”ืจื‘ื” ื™ื•ืชืจ ื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ืœืขื•ืžืง ืžื” ื’ื•ืจื ืœืื™ื˜ื™ื•ืช ื•ืžื” ื” Trade Offs ื”ืจืœื•ื•ื ื˜ื™ื ืžืืฉืจ ืœื”ื‘ื™ืŸ ืื™ืš ืœื—ื‘ืจ ืืช ืœื™ื™ื˜ื”ืื•ืก ื‘ MCP ื›ื“ื™ ืฉืงืœื•ื“ ื™ืฉืคืจ ื‘ื™ืฆื•ืขื™ื ื‘ืื•ื˜ื•ืžื˜.

ToCode
1 419
ื˜ื™ืค ื’ื™ื˜: ืฉื™ื ื•ื™ ืžืงื•ืžื™ ื‘ืœื™ ืงื•ืžื™ื˜ ืขืœ ืงื‘ืฆื™ื ื‘ืžืขืงื‘ ืืชื ื›ื‘ืจ ืžื›ื™ืจื™ื ืืช gitignore ื•ืืช .git/info/exclude ื•ื–ื•ื›ืจื™ื ืืช ื”ื‘ืขื™ื” ื”ืžืขืฆื‘ื ืช ื‘ืฉื ื™ื”ื: ืžื ื’ื ื•ืŸ ื”ื”ืชืขืœืžื•ืช ืžืืคืฉืจ ืœื”ืชืขืœื ืžืงื‘ืฆื™ื ืงื™ื™ืžื™ื ืขืœ ื”ื“ื™ืกืง ืฉืื™ื ื ื‘ืจื™ืคื•. ืื‘ืœ ืžืจื’ืข ืฉืงื•ื‘ืฅ ื ืžืฆื ื‘ืจื™ืคื• ืœื ืžืฉื ื” ื›ืžื” ืคืขืžื™ื ืชื›ืชื‘ื• ืื•ืชื• ื‘ gitignore ื”ืฉื™ื ื•ื™ื™ื ื‘ื• ืชืžื™ื“ ื™ื•ืคื™ืขื• ื‘ status. ืงื•ื‘ืฅ ืฉื ืžืฆื ื‘ืžืขืงื‘ ืขื•ืงืฃ ืืช ื” gitignore. ืื– ืžื” ืขื•ืฉื™ื ืขื ืฉื™ื ื•ื™ื™ื ืžืงื•ืžื™ื™ื ื‘ืงื‘ืฆื™ื ื‘ืžืขืงื‘ ืฉืœื ืฆืจื™ื›ื™ื ืœื”ื™ื›ื ืก ืœืจื™ืคื•? ืœื“ื•ื’ืžื” ืฉื™ื ื•ื™ ื‘ืงื•ื‘ืฅ docker-compose ืฉืžืฉื ื” ืืช ืžื™ืคื•ื™ื™ ื”ืคื•ืจื˜ื™ื ืกืคืฆื™ืคื™ืช ืขืœ ื”ืžื—ืฉื‘ ืฉืœื›ื. ื”ืชืฉื•ื‘ื” ื ืงืจืืช skip worktree bit ื•ืืคืฉืจ ืœืงืจื•ื ืขืœื™ื” ื‘ื“ืฃ ื”ืชื™ืขื•ื“ man git-update-index. ื‘ืงืฆืจื” ื–ื” ืžืชื’ ืฉื ืฉืžืจ ืžืงื•ืžื™ืช ืืฆืœื›ื ื•ืื•ืžืจ ืœื’ื™ื˜ ืœืฉืžื•ืจ ืขืœ ื”ืฉื™ื ื•ื™ื™ื ื”ืžืงื•ืžื™ื™ื ืฉืœื›ื ื›ืœ ืขื•ื“ ืืคืฉืจ. ืื ื—ื ื• ืžื“ืœื™ืงื™ื ืื•ืชื• ืœืงื•ื‘ืฅ ืžืกื•ื™ื ืขื:
git update-index --skip-worktree docker-compose.yml
ื•ืžื‘ื˜ืœื™ื ืขื:
git update-index --no-skip-worktree docker-compose.yml
ื“ื•ื’ืžื”? ื‘ื˜ื—. ื ื™ืฆื•ืจ ืจื™ืคื• ืขื ืฉื ื™ ืงื‘ืฆื™ื:
$ git init .
$ date > a.txt
$ date > b.txt
$ git add .
$ git commit -m 'initial commit'
ืขื›ืฉื™ื• ื ืฉื ื” ืืช b.txt ื•ื ืจืื” ื‘ืกื˜ื˜ื•ืก ืืช ื”ืฉื™ื ื•ื™:
$ date > b.txt
ynonp@ynons-MacBook-Air ~/tmp/blog/skipworktree (main*) $ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")
ื ื“ืœื™ืง ืืช skip worktree bit:
$ git update-index --skip-worktree b.txt
ynonp@ynons-MacBook-Air ~/tmp/blog/skipworktree (main) $ git status
On branch main
nothing to commit, working tree clean
ื•ืขื›ืฉื™ื• ื”ืฉื™ื ื•ื™ ื”ืžืงื•ืžื™ ืฉืœื™ ืœื ืžืคืจื™ืข ืœืขื‘ื•ื“ื” ื”ืฉื•ื˜ืคืช. ื ืกื™ื•ืŸ ืœืžื—ื•ืง ืืช ื”ืฉื™ื ื•ื™ ื”ืžืงื•ืžื™ ืฉืœื™ ืขื restore ืœื ืขื•ื‘ื“ ื•ื’ื™ื˜ ืื•ืžืจ ืฉื”ื•ื ืœื ืžื›ื™ืจ ืืช ื”ืงื•ื‘ืฅ:
$ git restore b.txt
error: pathspec 'b.txt' did not match any file(s) known to git
ื‘ ls-files ืœืขื•ืžืช ื–ืืช ื”ืงื•ื‘ืฅ ื›ืŸ ืžื•ืคื™ืข:
$ git ls-files
a.txt
b.txt
ื•ืื ื ื•ืกื™ืฃ -v ื ื•ื›ืœ ืœืจืื•ืช ืฉื”ื•ื ื‘ืžืฆื‘ S ื›ืœื•ืžืจ skip-worktree:
$ git ls-files -v
H a.txt
S b.txt
ื›ืฉืื ื™ ื™ื•ืฆืจ ืขื ืฃ ื—ื“ืฉ ื”ืงื•ื‘ืฅ ืขื“ื™ื™ืŸ ืฉื•ืžืจ ืขืœ ื”ืฉื™ื ื•ื™ ื”ืžืงื•ืžื™ ืฉืœื™ ื•ืื ืื ื™ ืžื ืกื” ืœืฉื ื•ืช ืื•ืชื• ื•ืœื”ื›ื ื™ืก ืœื’ื™ื˜ ืื ื™ ืืงื‘ืœ ื”ื•ื“ืขืช ืฉื’ื™ืื” ื‘ add. ืœืกื™ื›ื•ื ื”ืงื•ื‘ืฅ ืœืžืขืฉื” ืงื™ื‘ืœ "ื”ื’ื ืช ื’ื™ื˜" - ื’ื™ื˜ ื™ืขืฉื” ื”ื›ืœ ื›ื“ื™ ืœื ืœื“ืจื•ืก ืืช ื”ืฉื™ื ื•ื™ ื”ืžืงื•ืžื™ ืฉืœื™ ื•ืœื ืœืืคืฉืจ ืœื™ ืœื”ื›ื ื™ืก ืืช ื”ืฉื™ื ื•ื™ ื”ืžืงื•ืžื™ ืฉืœื™ ืœืจื™ืคื•. ืคื™ืฆ'ืจ ืžืื•ื“ ืฉื™ืžื•ืฉื™ ื›ืฉืจื•ืฆื™ื ืœื”ื’ืŸ ืขืœ ืงื‘ืฆื™ื ืขื ืฉื™ื ื•ื™ื™ื ืžืงื•ืžื™ื™ื, ื›ืœ ืขื•ื“ ืืชื ื–ื•ื›ืจื™ื ืฉื”ื“ืœืงืชื ืืช ื”ื‘ื™ื˜ ื•ืœื ืžืชื‘ืœื‘ืœื™ื ื›ืฉื’ื™ื˜ ืžื“ืœื’ ืขืœ ื”ืฉื™ื ื•ื™ื™ื.