关于 detect
detect 是 LaunchDarkly SDK 安装流程中的仓库检查技能,会在集成前识别技术栈、包管理器、应用入口和现有 SDK 配置,并据此引导后续步骤。
主要功能
- 01识别语言和框架
- 02检测包管理器与应用入口
- 03识别单体仓库布局
- 04判断应用证据是否充分
- 05搜索现有 LaunchDarkly 配置
适用场景
- 01安装 SDK 前检查项目
- 02选择单体仓库中的集成目标
- 03确认是否已有 LaunchDarkly 配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ launchdarkly/ ai-tooling --skill detect安装后在 Claude Code 中输入/detect确认已加载。
详细介绍
检测仓库技术栈(安装 SDK)
安装任何内容之前,必须先了解项目。确定项目使用的技术栈,以及是否已包含 LaunchDarkly。
此技能隶属于 LaunchDarkly SDK 安装(入门);父级的 Step 1 是 detect。下一步: 除非决策树指示执行其他操作,否则前往生成集成计划。
1. 语言和框架
查找下方的指示文件(以及相关的根目录布局),然后阅读相关清单文件,以推断语言和框架。
查找以下文件以识别技术栈:
| 文件 | 语言/框架 |
|---|---|
package.json | JavaScript/TypeScript(检查是否使用 React、Next.js、Vue、Angular、Express、React Native、Electron 等) |
requirements.txt、pyproject.toml、Pipfile、setup.py | Python(检查是否使用 Django、Flask、FastAPI) |
go.mod | Go(检查是否使用 Gin、Echo、Fiber、Chi) |
pom.xml、build.gradle、build.gradle.kts | Java/Kotlin(检查是否使用 Spring、Quarkus、Android) |
Gemfile | Ruby(检查是否使用 Rails、Sinatra) |
*.csproj、*.sln、*.fsproj | .NET/C#(检查是否使用 ASP.NET、MAUI、Xamarin、WPF、UWP) |
composer.json | PHP(检查是否使用 Laravel、Symfony) |
Cargo.toml | Rust(检查是否使用 Actix、Axum、Rocket) |
pubspec.yaml | Flutter/Dart |
Package.swift、Podfile、*.xcodeproj | Swift/iOS |
AndroidManifest.xml | Android(另检查 build.gradle 中是否包含 com.android) |
rebar.config、mix.exs | Erlang/Elixir |
CMakeLists.txt、Makefile(包含 C/C++ 特征) | C/C++(检查 #include 特征) |
*.cabal、stack.yaml | Haskell |
*.lua、rockspec | Lua |
manifest、*.brs | Roku(BrightScript) |
wrangler.toml | Cloudflare Workers(边缘 SDK) |
包含边缘函数的 vercel.json | Vercel Edge(边缘 SDK) |
阅读依赖文件以确定具体框架。对于 package.json,同时检查 dependencies 和 devDependencies。
如果无法识别语言或框架:
D5 -- 阻塞: 立即调用结构化提问工具。
- question: "我无法检测项目使用的语言或框架。你想使用哪个 SDK?"
- options: 将 SDK 配方 中提供的 SDK 作为可选项列出。
- STOP. 不要将问题作为文本写出。用户选择选项前不要继续。
2. 包管理器
确定项目如何安装依赖:
| 指示文件 | 包管理器 |
|---|---|
package-lock.json | npm |
yarn.lock | yarn |
pnpm-lock.yaml | pnpm |
bun.lockb | bun |
Pipfile.lock | pipenv |
poetry.lock | poetry |
go.sum | go modules |
Gemfile.lock | bundler |
所有安装命令都使用检测到的包管理器。如果存在多个锁文件,优先使用最近修改的那个。
3. 单体仓库布局
有些仓库包含多个包或服务。查找以下指示:
| 文件/模式 | 工具或布局 |
|---|---|
pnpm-workspace.yaml | pnpm 工作区 |
lerna.json | Lerna |
nx.json | Nx |
turbo.json | Turborepo |
rush.json | Rush |
包含多个 package.json 文件的 packages/ 目录 | 通用单体仓库 |
如果符合上述任一情况,不要假设仓库根目录就是集成目标:
D5 -- 阻塞: 立即调用结构化提问工具。
- question: "这是一个单体仓库。你希望将 LaunchDarkly 集成到哪个包、应用或服务中?"
- options: 将发现的包/应用作为可选项列出。
- STOP. 不要将问题作为文本写出。用户选择选项前不要继续。
然后,在该目标目录(及其子目录)中运行此检测步骤的其余部分——语言、包管理器、入口点和 SDK 搜索——而不是只在根目录中运行。
4. 应用入口点
找到应用启动的主文件。在单体仓库中,请在根据第 3 节 单体仓库布局选择的包内应用以下模式。常见模式:
- Node.js(服务端):检查
package.json中的"main"字段,或查找index.js、server.js、app.js、src/index.ts - NestJS:查找
src/main.ts或src/main.js - Python:查找
app.py、main.py、manage.py、wsgi.py,或[tool.poetry.scripts]部分 - Go:查找
main.go或cmd/*/main.go - Java:搜索
public static void main或@SpringBootApplication - Ruby:查找
config.ru、config/application.rb - React/Vue/Angular:查找
src/index.tsx、src/main.tsx、src/App.tsx、src/main.ts - Next.js:App Router——
app/layout.tsx或app/layout.js(根布局)。Pages Router——pages/_app.tsx或pages/_app.js - React Native:查找
App.tsx、App.js、index.js(其中包含AppRegistry.registerComponent) - Electron:检查
package.json中的"main";常见路径包括main.js或src/main.ts - JavaScript(浏览器):查找
index.html、src/index.js,或webpack.config.js/vite.config.ts中的打包工具入口 - Flutter:查找
lib/main.dart - Swift/iOS:查找
AppDelegate.swift、SceneDelegate.swift,或@main结构体 - Android:查找
MainActivity.java或MainActivity.kt
5a. 对工作区信心进行分类
完成第 1 至 4 节后,先将工作区分类为 三种状态之一,然后再继续。此分类决定后续流程。
| 状态 | 含义 | 标准 |
|---|---|---|
| 明确的应用 | 找到了可运行的应用 | 检测到语言/框架,存在实际入口点,并且有包含应用依赖项的依赖清单 |
| 不明确 / 证据不足 | 存在一些内容,但无法明确判断其是否代表可运行的应用 | 零散或最简的 package.json(例如只有 devDependencies,没有脚本)、孤立的配置/清单文件、仅包含主题或配置的文件夹、令牌/固件 JSON、没有对应源代码的锁定文件,或存在多个相互冲突的指标且没有明显的应用结构 |
| 未找到应用 | 未检测到可识别的应用结构 | 没有依赖清单、入口点、符合已知模式的源文件,或工作区为空/仅包含文档 |
不得将薄弱证据视为确认。 薄弱证据示例:
- 没有
scripts部分且没有应用源文件的package.json - 数据文件或笔记本目录中单独存在的
requirements.txt - 清单文件不代表可运行服务的配置、主题或固件目录
- 实际应用位于子目录、但尚未选择任何子目录的 monorepo 根目录
按状态分支:
-
明确的应用 → 继续执行第 6 节(现有 LaunchDarkly SDK),然后确认 SDK。
-
不明确 / 证据不足:
D5-UNCLEAR -- 阻塞: 立即调用结构化提问工具。
- question: "我找到了一些项目文件,但不确定是否已识别出要集成的正确应用。能否告诉我正确的应用文件夹?"
- context: 简要说明你发现的内容以及存在歧义的原因(例如:"根目录有一个
package.json,但它没有启动脚本,也没有应用源文件")。 - options:
- 将检测到的候选文件夹列为可选项
- "在其他地方——我会告诉你路径"
- "目前还没有应用——帮我创建一个演示应用"
- 停止。用户确认目标之前,不得更改代码、安装软件包或生成集成计划。用户选择一个选项之前,不得继续。
用户指出正确文件夹后,在该文件夹范围内重新运行检测(第 1 至 4 节)。
- 未找到应用:
明确告知用户:"我没有在此工作区中找到可运行的应用。" 然后提供两种方案:
D5-NOAPP -- 阻塞: 立即调用结构化提问工具。
- question: "我没有在此工作区中找到可运行的应用。你想如何继续?"
- options:
- "告诉我正确的文件夹——应用在其他地方"
- "创建一个最简演示应用,让我试用 LaunchDarkly"
- 停止。用户选择一个选项之前,不得继续。
如果用户选择“告诉我正确的文件夹”,则在其提供的路径范围内重新运行检测。如果用户选择“创建演示应用”,则使用最简单易搭建的技术栈(Node.js + Express 或静态 HTML 页面都是不错的默认选项),在新的子文件夹(例如 launchdarkly-demo/)中创建一个最简可运行应用,然后从该子文件夹继续检测。
除非已确认应用目标且应用确实可以运行,否则不得宣告引导流程已完成。
6. 现有 LaunchDarkly SDK
在代码库中搜索现有的 LaunchDarkly 用法:
Search for: launchdarkly, ldclient, ld-client, LDClient, @launchdarkly, launchdarkly-
检查:
- SDK 是否已在依赖文件中?
- 是否存在初始化代码?
- 配置是否正确,还是只完成了部分设置?
- 是否已有功能标志评估?
SDK 确认
检测到技术栈后,请与用户确认 SDK 选择:
- 如果有一个 SDK 明显最合适:给出推荐并征求确认:
**D5 —— 阻塞:**立即调用结构化提问工具。
-
问题:"根据我的发现,我推荐使用 [SDK name] SDK。您觉得合适吗?"
-
选项:
- "是,使用该 SDK 继续" → 继续制定计划
- "否,我想换一个" → 让用户指定
-
停止。不要将问题写成文本。用户选择选项前不要继续。
-
如果有多个 SDK 都适用(例如,同时使用服务端和客户端组件的 Next.js 项目):
- 如果用户已要求同时集成两者(例如,“前端和后端”、“服务端 + 浏览器端”、“API 和 SPA”):将其视为双 SDK范围。继续执行生成集成计划,并将两个 SDK 都纳入范围——不要只计划或实现其中一个,并假设另一个已被“涵盖”。
- 如果范围不明确:
**D5 —— 阻塞:**立即调用结构化提问工具。
- 问题:"此项目同时包含服务端和客户端部分。您想集成哪一部分?"
- 选项:
- "仅服务端"
- "仅客户端"
- "服务端和客户端都要"
- 停止。不要将问题写成文本。用户选择选项前不要继续。
如果用户选择两者,计划必须包含两个具体集成(参见计划:双 SDK 集成)。
- 如果无法确定合适的 SDK:在提问工具中将 SDK 配方中的可用选项作为可选项提供,并采用上述相同的阻塞模式。
决策树
检测并确认后:
- 未发现应用或情况不明确 --> 已在第 5a 节通过 D5-NOAPP / D5-UNCLEAR 处理。用户确认真实的应用目标前,不要继续制定计划。
- SDK 已安装并初始化 --> 跳转至父技能的步骤 4:首个标记
- SDK 已安装但尚未初始化 --> 跳转至应用代码更改(只需添加初始化代码)
- 尚未安装 SDK --> 继续生成集成计划
- 检测到多个目标(例如,前端 + 后端) --> 如果用户希望集成两个 SDK(已通过上述 D5 确认),则继续生成集成计划,范围设为双 SDK(两个包、两个入口点)。如果用户只想集成其中一个部分,则只为对应的 SDK 制定计划。
- 未检测到语言 --> 已在第 1 节通过 D5 阻塞性问题处理。
完成后(常规流程):生成集成计划