今日已更新 281 条资讯 | 累计 21147 条内容
关于我们

标签:#product

找到 1411 篇相关文章

AI 资讯

CodeMeridian: Giving AI Coding Agents a Project Map Before They Edit

AI coding agents feel sharp when a project is small. They can scan a few files, understand the shape, and make useful changes. In that phase, the project still fits inside the agent’s short-term memory. The architecture is obvious. The dangerous files are nearby. The blast radius is small. But something changes when a project reaches MVP size. The agent still sounds confident, but it starts guessing. It finds a nearby file and assumes it is the right one. It trusts stale documentation. It misses hidden callers. It forgets architecture boundaries. It edits something that was not really part of the task. I kept running into that problem while building larger projects. Source-level guardrails help. A CONTRIBUTING.md, AGENTS.md, or project instruction file can tell the agent how to behave. But those are still instructions. They are not facts. That is where the idea for CodeMeridian came from. What CodeMeridian is CodeMeridian is a local code knowledge graph for AI coding tools. It indexes a codebase into Neo4j and exposes that graph through MCP, so tools like GitHub Copilot, Claude Code, Codex-style agents, or other MCP-compatible clients can ask better questions before editing. The basic idea is: The assistant is the AI. CodeMeridian is the project map. It does not replace the coding assistant. It gives the assistant a structured way to ask about the codebase. Examples: What calls this method? What tests cover this area? What files are likely in scope for this feature? Is the graph stale before I trust it? How is this frontend component connected to backend code? Why a graph? Code is already a graph. Methods call methods. Classes implement interfaces. Tests cover production paths. Frontend components call API clients. API handlers touch services. Services use repositories. Docs mention symbols. Projects depend on other projects. A normal file search can find text. A graph can answer relationship questions. That matters because many AI coding mistakes are relationship m

2026-06-09 原文 →
AI 资讯

Cách khôi phục Collections Postman khi bị khóa tài khoản

Tóm tắt Nếu thay đổi gói miễn phí của Postman khiến bạn mất quyền truy cập vào workspace được chia sẻ, dữ liệu của bạn chưa chắc đã bị xóa. Việc cần làm là phục hồi càng sớm càng tốt trước khi cache cục bộ, quyền API hoặc bản sao lưu còn sót lại không còn dùng được. Bài viết này hướng dẫn các cách lấy lại collection/environment từ Postman và nhập chúng sang Apidog để giảm rủi ro bị khóa dữ liệu trong tương lai. Dùng thử Apidog ngay hôm nay Bối cảnh Sau bản cập nhật gói miễn phí Quý 1 năm 2026 của Postman, nhiều developer dùng workspace chia sẻ với đồng nghiệp phát hiện rằng họ không còn truy cập được dữ liệu nhóm. Các collection nằm trong workspace team, thay vì workspace cá nhân, đột nhiên bị khóa sau paywall. Một developer mô tả trên Reddit: “Tôi đến làm việc vào thứ Hai và toàn bộ không gian làm việc của nhóm tôi đã biến mất. Ba tháng với các bộ sưu tập, môi trường được sắp xếp gọn gàng, tất cả đều biến mất. Chỉ còn cách trả tiền thì mới có lại.” Điểm quan trọng: dữ liệu thường không bị xóa ngay. Postman lưu dữ liệu workspace phía server, còn việc bạn không nhìn thấy collection là hạn chế quyền truy cập. Vì vậy, hãy xử lý theo thứ tự dưới đây, ưu tiên các nguồn có khả năng còn dữ liệu đầy đủ nhất. 1. Kiểm tra cache trong ứng dụng Postman desktop Trước tiên, mở Postman desktop app nếu bạn đã từng dùng nó. Không mở bản web tại app.getpostman.com . Ứng dụng desktop có thể còn cache cục bộ của collection và environment bạn truy cập gần đây. Cache này thường chỉ tồn tại trong thời gian ngắn, tùy hệ thống và cơ chế invalidation của Postman, nên hãy xuất dữ liệu ngay nếu còn nhìn thấy. Các bước thực hiện: Mở Postman desktop. Kiểm tra tab History để xem các request gần đây. Kiểm tra sidebar bên trái xem collection còn hiển thị không. Nếu collection còn hiển thị, xuất ngay từng collection. Cách export collection: Nhấp chuột phải vào collection hoặc bấm menu ba chấm. Chọn Export . Chọn định dạng Collection v2.1 . Lưu file .json ra thư mục an toàn. Nếu collection vẫn hiển t

2026-06-09 原文 →
AI 资讯

How to Recover Postman Collections After Being Locked Out

TL;DR If Postman’s 2026 Q1 free plan change blocked access to shared collections, your data may still be recoverable. Start with your Postman desktop cache, then check exports, admins, the Postman API, and logs. Once you recover the JSON files, import them into Apidog so your team has a safer workflow going forward. Try Apidog today Introduction After Postman’s 2026 Q1 free tier update, many developers found that shared workspaces were no longer accessible on the free plan. Collections that lived in team workspaces, instead of personal workspaces, became locked behind a paid plan. One developer described it on Reddit: “I came in on Monday and my whole team workspace was gone. Three months of organized collections, environments, all of it. Just gone unless we pay.” In most cases, the data is not immediately deleted. Postman stores workspace data server-side, and the issue is usually access restriction rather than deletion. That said, recovery is time-sensitive because local cache, API access, and workspace availability may not last. Use the steps below in order. 1. Check the Postman desktop app cache first Start with the Postman desktop app, not the web app. The desktop app may still have cached copies of recently opened collections and environments. Even if your server-side access is revoked, the local cache can sometimes keep enough data available to export. Steps Open the Postman desktop app. Do not use the web app at app.getpostman.com . Check the left sidebar for your collections. Open the History tab to confirm which endpoints you recently used. If collections are visible, export them immediately. To export a collection: Right-click the collection or open the three-dot menu. Select Export . Choose Collection v2.1 . Save the file locally. Repeat for every visible collection. If the collection appears but export fails, try working offline: Click your avatar in the top-right corner. Select Go Offline . Retry the export. Going offline can prevent the app from refre

2026-06-09 原文 →
AI 资讯

Why SQLite FTS5's default tokenizer drops your Japanese substrings (and the one-line fix)

If you're building any kind of personal-memory layer on top of SQLite — Claude Code conversation history, notes app, indexed knowledge base — there's a sharp edge in FTS5 that takes most people by surprise the first time they hit it. The default tokenizer ( unicode61 ) silently drops most Japanese substring queries. The fix is one line of SQL. But the failure mode is invisible enough that you can ship a personal search tool, use it for weeks, and never realize half your content is unreachable. This post walks through: The failure, reproducible in 20 lines of Python The one-line fix ( tokenize='trigram' ) and what it actually does under the hood A two-layer Git + SQLite design that uses this index in production for ~800 Claude Code conversations A separate FTS5 footgun around the - character that breaks time-blocking -style queries A free GitHub sample at the end if you want to run the same approach against your own data The failure, reproducible in 20 lines Spin up a fresh SQLite FTS5 table with the default settings and insert a single multilingual sentence: import sqlite3 conn = sqlite3 . connect ( " :memory: " ) conn . execute ( """ CREATE VIRTUAL TABLE notes USING fts5(content) """ ) conn . execute ( """ INSERT INTO notes(content) VALUES ( ' Tried time-blocking with the new 朝の運用フロー — ' ' the 9-11 slot worked but the 午後 part collapsed again. ' ) """ ) for q in [ " time " , " blocking " , " 朝の運用 " , " 午後 " ]: hits = conn . execute ( " SELECT count(*) FROM notes WHERE content MATCH ? " , ( q ,) ). fetchone ()[ 0 ] print ( f " { q !r} : { hits } hit(s) " ) Output: 'time': 1 hit(s) 'blocking': 1 hit(s) '朝の運用': 0 hit(s) '午後': 0 hit(s) Same row. Same content. English queries land, Japanese substring queries don't. That's not a bug, it's the default tokenizer behavior — and the default doesn't print a warning about it. The reason: unicode61 segments text on whitespace and unicode word-break properties. English words have spaces between them, so individual tokens are reco

2026-06-09 原文 →
AI 资讯

How I Configured Cursor to Stop Breaking My Codebase

If you use Cursor, Claude Code, or Windsurf daily, you've probably had this experience: You open a fresh chat, ask for a small fix, and twenty minutes later the AI has rewritten your API layer, added three new dependencies, and switched your data-fetching pattern "for consistency." The model isn't broken. It's contextless. Every new session starts from zero. It doesn't know your stack, your conventions, or the things it must never touch. So you spend the first ten minutes re-explaining — and the last hour undoing. Here's what fixed it for me. The real problem isn't prompts Most devs collect prompts. Notes app, Slack snippets, old chat threads. That helps for one-off tasks, but it doesn't solve the session problem. What you need is persistent context — rules that load automatically before you type anything. Two files do this: CLAUDE.md — read by Claude Code (and usable as project context elsewhere) .cursorrules — loaded by Cursor on every session (rename to .windsurfrules for Windsurf) Drop them in your project root. Done. What goes in a good config file A useful config is not ten lines of "use TypeScript and write clean code." That's too vague to change behavior. Mine include: Project structure — where pages, components, and API routes live Stack + versions — Next.js 14 App Router, not Pages; Zod; shadcn/ui Commands — npm run dev, npm run typecheck, npm run test Coding conventions — naming, import aliases, Server vs Client Components DO NOT section — the most important part (more on this below) Workflow notes — use @folder, prefer editing existing files, minimal diffs Here's an excerpt from the DO NOT section that saved me the most time: DO NOT — Critical Anti-Patterns Do NOT create a pages/ directory or use the Pages Router Do NOT rewrite the entire API layer — extend existing route handlers Do NOT add new npm dependencies without stating why Do NOT make drive-by refactors in unrelated files Do NOT fetch data in useEffect when Server Components can fetch directly T

2026-06-09 原文 →
AI 资讯

5 Claude API Errors That Cost Me Money (And How I Trapped Them)

Retry storms turned 1 timeout into 340 duplicate calls billed in 90 seconds Infinite tool loop ran 1,200 iterations before I noticed at 2am Partial stream cleanup stopped half-written DB writes corrupting records Trap every error class with a circuit breaker and a hard iteration cap Five Claude API errors quietly drained my account before I built guards around them. None of them threw a loud crash. They just kept billing while I slept. Here is exactly what broke, what it cost, and the traps I now run on every project. The Retry Storm That Billed 340 Times in 90 Seconds The most expensive mistake I made was naive retry logic. A single request timed out. My code caught the timeout and retried. The retry also timed out, so it retried again. Within 90 seconds I had fired 340 requests for one piece of work. The problem was that the Claude API had actually received and processed several of those requests. The timeout happened on my side waiting for the response, not on Anthropic's side. So I was paying for completed work I never saw, then paying again for the retry. My first version of the retry looked harmless. A while loop, a counter set to 5, a sleep of one second between attempts. The flaw was that the sleep was constant and the counter reset on every new job. Under load, jobs stacked, and each one spawned its own retry chain. That is how 1 timeout became 340 calls. The fix was exponential backoff with a hard ceiling and a request ID. I now generate a unique idempotency-style key per logical job and refuse to issue a second call for the same key until the first fully resolves or hard-fails. Backoff starts at 2 seconds and doubles up to 32 seconds, then gives up after 5 total attempts. attempt = 0 delay = 2 while attempt < 5 : try : return call_claude ( job_key ) except Timeout : attempt += 1 sleep ( delay + random_jitter ()) delay = min ( delay * 2 , 32 ) raise GiveUp ( job_key ) The jitter matters more than it looks. Without it, ten failed jobs all retry at the exact

2026-06-09 原文 →
AI 资讯

The Estimate That Became a Quote

I said "maybe a couple days" on a call last Tuesday. By Wednesday morning it was in a Jira ticket as "2 days." By Thursday afternoon somebody was checking in to see if we were tracking against the two day commitment. Nobody did anything wrong. The person who wrote it down was capturing what I said. The person checking in was doing their job. I was the one who said the words. The system worked exactly as designed. The system is the problem. Something Ive learned is that theres no such thing as a rough number in meetings today with all of the AI note takers... The moment you say a number out loud, it stops being a feeling and starts being a quote. The hedge in front of it doesnt survive the transcription. "Maybe" disappears. "Couple" gets rounded to a specific integer. "Give or take" is the first thing that hits the cutting room floor. What lands in the document is the number, naked, with no caveats and no error bars. Everyone in the meeting heard what you heard. They heard the hedge. They watched you wave your hands. They understood, in the moment, that you werent committing. But the document doesnt remember any of that. The document just remembers the number. And the document outlives the conversation, which is where all the nuance lived. Ive watched myself do this for years and I still get caught by it. Someone asks how long something will take. I want to be helpful. I want to seem confident. I want to keep the meeting moving. So I say a number. The number is approximately right, or at least I think it is, but I havent actually thought about it the way you would think about it if you were going to commit to it. By saying it out loud, Ive committed to it. The fix, if theres one, is to refuse the number. Not rudely. Just clearly. "I need to look at it before I give you a real number. I can have one for you by Friday." This works about half the time. The other half, somebody in the room is going to ask you for a ballpark anyway, and youre going to give them one, and t

2026-06-09 原文 →