关于 app-generation
app-generation 是根据需求创建 ServiceNow 作用域应用的技能。它指导开发者构建数据模型、访问控制、业务逻辑和导航,并验证应用组件。
主要功能
- 01创建应用作用域与元数据
- 02定义表和字段
- 03配置表单与导航
- 04设置 ACL 和应用角色
- 05构建业务规则并验证组件
适用场景
- 01根据业务需求制作应用原型
- 02创建可复用的作用域应用模板
- 03构建自定义资产跟踪应用
MCP 相关
该技能介绍通过 SN-Create-Record 创建应用组件,并用 SN-Query-Table 检查和验证组件的 MCP 工作流。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill app-generation安装后在 Claude Code 中输入/app-generation确认已加载。
详细介绍
ServiceNow 作用域应用生成
概述
本技能涵盖根据需求生成完整的 ServiceNow 作用域应用,包括:
- 创建应用作用域和元数据
- 定义自定义表及其字段、索引和关系
- 生成表单、列表和 UI 配置
- 创建基于角色的访问控制 ACL 规则
- 构建业务规则、客户端脚本和脚本包含
- 设置应用导航和模块
- 配置应用属性和系统设置
适用场景: 从头构建新的自定义应用、根据业务需求对解决方案进行原型设计,或自动创建标准化应用模板时。
先决条件
- 角色:
admin、maint(用于创建表)或application_creator - 访问权限: sys_scope、sys_app、sys_db_object、sys_dictionary、sys_security_acl、sys_script 表
- 知识: ServiceNow 应用模型、作用域应用、数据建模、ACL 架构
- 插件: 无需额外插件;建议使用 Studio (com.glide.studio)
- 相关技能: 完成
development/code-assist,了解脚本生成模式
流程
步骤 1:了解应用架构
sys_scope (Application Scope)
├── sys_app (Application Record)
├── sys_db_object (Tables)
│ └── sys_dictionary (Fields/Columns)
├── sys_ui_form (Forms)
│ └── sys_ui_form_section (Form Sections)
├── sys_ui_list (List Views)
├── sys_security_acl (ACL Rules)
├── sys_script (Business Rules)
├── sys_script_client (Client Scripts)
├── sys_script_include (Script Includes)
├── sys_app_module (Navigation Modules)
└── sys_properties (Application Properties)
主要表:
| 表 | 用途 |
|---|---|
| sys_scope | 应用作用域定义和命名空间 |
| sys_app | 应用元数据和版本信息 |
| sys_metadata | 所有应用构件的基础记录 |
| sys_db_object | 表定义 |
| sys_dictionary | 表的字段/列定义 |
| sys_security_acl | 访问控制规则 |
步骤 2:创建应用作用域
MCP 方式:
Tool: SN-Create-Record
Parameters:
table_name: sys_scope
data:
name: "Asset Tracking Pro"
scope: "x_happy_asset_trk"
short_description: "Custom asset tracking and lifecycle management application"
version: "1.0.0"
vendor: "Happy Technologies LLC"
vendor_prefix: "x_happy"
active: true
licensable: false
js_level: "helsinki_es6"
REST 替代方式:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_scope" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X POST \
-d '{
"name": "Asset Tracking Pro",
"scope": "x_happy_asset_trk",
"short_description": "Custom asset tracking and lifecycle management application",
"version": "1.0.0",
"vendor": "Happy Technologies LLC",
"active": true
}'
步骤 3:创建应用表
创建主表:
MCP 方式:
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_asset_trk_asset"
label: "Tracked Asset"
super_class: task
is_extendable: true
create_access: true
read_access: true
update_access: true
delete_access: true
sys_scope: [scope_sys_id]
REST 替代方式:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_db_object" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"name": "x_happy_asset_trk_asset",
"label": "Tracked Asset",
"super_class": "task",
"is_extendable": true,
"sys_scope": "[scope_sys_id]"
}'
创建辅助表:
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_asset_trk_asset_history"
label: "Asset History"
is_extendable: false
sys_scope: [scope_sys_id]
步骤 4:向表中添加字段
添加字符串字段:
MCP 方式:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "asset_tag"
column_label: "Asset Tag"
internal_type: "string"
max_length: 40
mandatory: true
unique: true
active: true
read_only: false
sys_scope: [scope_sys_id]
添加引用字段:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "assigned_user"
column_label: "Assigned User"
internal_type: "reference"
reference: "sys_user"
max_length: 32
mandatory: false
active: true
sys_scope: [scope_sys_id]
添加选项字段:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
column_label: "Asset Status"
internal_type: "string"
max_length: 40
choice: 1
mandatory: true
default_value: "available"
active: true
sys_scope: [scope_sys_id]
为选项字段添加选项:
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "Available"
value: "available"
sequence: 100
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "In Use"
value: "in_use"
sequence: 200
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "In Maintenance"
value: "in_maintenance"
sequence: 300
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "Retired"
value: "retired"
sequence: 400
inactive: false
添加日期字段:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "purchase_date"
column_label: "Purchase Date"
internal_type: "glide_date"
mandatory: false
active: true
sys_scope: [scope_sys_id]
添加货币字段:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "purchase_cost"
column_label: "Purchase Cost"
internal_type: "currency"
mandatory: false
active: true
sys_scope: [scope_sys_id]
步骤 5:创建 ACL 规则
创建表级读取 ACL:
MCP 方式:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl
data:
name: "x_happy_asset_trk_asset"
operation: "read"
type: "record"
active: true
admin_overrides: true
advanced: false
condition: ""
sys_scope: [scope_sys_id]
创建基于角色的 ACL:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl
data:
name: "x_happy_asset_trk_asset"
operation: "write"
type: "record"
active: true
admin_overrides: true
sys_scope: [scope_sys_id]
将角色关联到 ACL:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl_role
data:
sys_security_acl: [acl_sys_id]
sys_user_role: [role_sys_id]
创建自定义应用角色:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_role
data:
name: "x_happy_asset_trk.manager"
description: "Asset Tracking Manager - full CRUD access"
assignable_by: [admin_role_sys_id]
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_user_role
data:
name: "x_happy_asset_trk.user"
description: "Asset Tracking User - read and create access"
assignable_by: [admin_role_sys_id]
sys_scope: [scope_sys_id]
步骤 6:创建业务逻辑
插入前业务规则——自动生成资产标签:
Tool: SN-Create-Record
Parameters:
table_name: sys_script
data:
name: "Generate Asset Tag"
collection: "x_happy_asset_trk_asset"
when: "before"
order: 100
active: true
action_insert: true
sys_scope: [scope_sys_id]
script: |
(function executeRule(current, previous) {
if (!current.asset_tag) {
var prefix = 'AST';
var ga = new GlideAggregate('x_happy_asset_trk_asset');
ga.addAggregate('COUNT');
ga.query();
var count = 0;
if (ga.next()) {
count = parseInt(ga.getAggregate('COUNT'), 10);
}
current.asset_tag = prefix + '-' + gs.nowNoTZ().substring(0, 4) + '-' + String(count + 1).padStart(5, '0');
}
})(current, previous);
更新后业务规则——跟踪状态变更:
Tool: SN-Create-Record
Parameters:
table_name: sys_script
data:
name: "Track Asset Status Change"
collection: "x_happy_asset_trk_asset"
when: "after"
order: 200
active: true
action_update: true
sys_scope: [scope_sys_id]
script: |
(function executeRule(current, previous) {
if (current.asset_status.changes()) {
var history = new GlideRecord('x_happy_asset_trk_asset_history');
history.initialize();
history.asset = current.sys_id;
history.previous_status = previous.asset_status;
history.new_status = current.asset_status;
history.changed_by = gs.getUserID();
history.changed_on = new GlideDateTime();
history.insert();
}
})(current, previous);
步骤 7:创建应用导航
创建应用菜单:
Tool: SN-Create-Record
Parameters:
table_name: sys_app_application
data:
title: "Asset Tracking"
hint: "Asset Tracking Pro application"
device_type: "browser"
category: "custom"
active: true
sys_scope: [scope_sys_id]
创建导航模块:
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "All Assets"
application: [app_menu_sys_id]
hint: "View all tracked assets"
link_type: "LIST"
name: "x_happy_asset_trk_asset"
query: ""
order: 100
active: true
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "Create New Asset"
application: [app_menu_sys_id]
hint: "Create a new tracked asset"
link_type: "NEW"
name: "x_happy_asset_trk_asset"
order: 200
active: true
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "My Assigned Assets"
application: [app_menu_sys_id]
hint: "Assets assigned to me"
link_type: "LIST"
name: "x_happy_asset_trk_asset"
query: "assigned_user=javascript:gs.getUserID()"
order: 300
active: true
sys_scope: [scope_sys_id]
步骤 8:验证应用
检查所有应用构件:
MCP 方式:
Tool: SN-Query-Table
Parameters:
table_name: sys_metadata
query: sys_scope=[scope_sys_id]
fields: sys_id,sys_class_name,sys_name
limit: 200
REST 替代方式:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_metadata?sysparm_query=sys_scope=[scope_sys_id]&sysparm_fields=sys_id,sys_class_name,sys_name&sysparm_limit=200" \
-H "Accept: application/json"
工具用法
| 操作 | MCP 工具 | REST 端点 |
|---|---|---|
| 创建应用作用域 | SN-Create-Record | POST /api/now/table/sys_scope |
| 创建表 | SN-Create-Record | POST /api/now/table/sys_db_object |
| 添加字段 | SN-Create-Record | POST /api/now/table/sys_dictionary |
| 创建 ACL | SN-Create-Record | POST /api/now/table/sys_security_acl |
| 创建业务规则 | SN-Create-Record | POST /api/now/table/sys_script |
| 创建导航 | SN-Create-Record | POST /api/now/table/sys_app_module |
| 查询元数据 | SN-Query-Table | GET /api/now/table/sys_metadata |
| 验证应用 | SN-Query-Table | GET /api/now/table/sys_scope |
最佳实践
- 使用范围化应用: 始终在范围内创建应用,以确保可移植性和隔离性
- 遵循命名规范: 为所有构件添加范围命名空间前缀(例如,
x_vendor_app) - 围绕任务设计表: 为支持工作流的实体扩展
task表 - 尽早创建角色: 在创建 ACL 之前定义应用角色,以确保访问控制一致
- 使用应用属性: 将可配置值存储在
sys_properties中,而不是硬编码 - 逐步构建: 先创建表和字段,再创建 ACL,然后编写业务逻辑,最后构建 UI
- 边构建边编写文档: 为每个表、字段、ACL 和脚本添加说明
- 在开发者实例中测试: 始终先在个人开发者实例中进行原型设计,再部署到生产环境
- 为升级做好规划: 避免修改基线表;改为扩展或创建自定义表
- 包含数据清理脚本: 规划应用移除流程,并制定清理步骤
故障排除
表创建失败
症状: 创建 sys_db_object 记录时出错 原因:
- 缺少
maint角色 - 表名与范围前缀不匹配
- 表名已存在 解决方案:
Tool: SN-Query-Table
Parameters:
table_name: sys_db_object
query: name=x_happy_asset_trk_asset
fields: sys_id,name,label,sys_scope
ACL 未生效
症状: 尽管有 ACL 规则,用户仍可访问记录 原因:
- ACL 未启用
- 优先级更高的 ACL 授予了访问权限
- 用户拥有 admin 角色(admin_overrides = true) 解决方案: 检查 ACL 评估顺序:
Tool: SN-Query-Table
Parameters:
table_name: sys_security_acl
query: name=x_happy_asset_trk_asset^active=true
fields: sys_id,name,operation,type,admin_overrides,condition
limit: 20
范围访问错误
症状: 运行脚本时出现“Scope access denied” 原因: 未配置跨范围访问 解决方案: 检查范围访问设置:
Tool: SN-Query-Table
Parameters:
table_name: sys_scope_privilege
query: source_scope=[scope_sys_id]
fields: sys_id,source_scope,target_scope,type,operation,status
limit: 20
字段未显示在表单上
症状: 创建的字段未显示在表单上 原因: 字段已存在于字典中,但未添加到表单布局 解决方案: 创建表单分区条目或使用表单设计器。验证字段是否存在:
Tool: SN-Query-Table
Parameters:
table_name: sys_dictionary
query: name=x_happy_asset_trk_asset^active=true
fields: element,column_label,internal_type,mandatory
limit: 50
示例
示例:完整的访客管理应用
# 1. Create scope
Tool: SN-Create-Record
Parameters:
table_name: sys_scope
data:
name: "Visitor Management"
scope: "x_happy_visitor"
version: "1.0.0"
vendor: "Happy Technologies LLC"
# 2. Create visitor table extending task
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_visitor_visit"
label: "Visitor Request"
super_class: task
# 3. Add fields: visitor_name, company, host, visit_date, badge_number
# 4. Create ACLs for receptionist and host roles
# 5. Create business rule to auto-assign badge numbers
# 6. Create client script for date validation
# 7. Create navigation modules
# 8. Validate all artifacts via sys_metadata
相关技能
genai/app-summary- 分析并总结现有应用development/code-assist- AI 辅助生成脚本代码development/code-review- 审查生成的代码质量security/acl-management- ACL 配置详解admin/update-set-management- 打包应用以便部署
评论
支持 Markdown